本章节的例程对应到NVIDAI JetBot项目的collision-avoidnce项目。 Collision-avoidance JetBot 的自主避障功能分为三个步骤。收集数据,训练模型和自主避障。这里我们分三部分讲。 收集数据 打开Notebooks/collision_avoidance/ 目录下的data_collection.ipynb文件。如果你没有在目录下找到这三个文件,请回到JetBot系列教程之安装镜像和配置中再照着更新程序部分操作一遍。 如果是前面章节讲过的代码,这里不会详细说。 单元1,这里是创建摄像头连接,将摄像头画面显示在网页上,注意不要修改摄像头的分辨率设置。 单元2, 创建一个dataset目录,用来存放我们接下来收集的图片。dataset目录下创建两个文件夹,分别是blocked和free。blocked文件夹将用来存放避障场景图片,而free文件将用来存放畅通场景图片。什么?不知道什么是避障场景,什么是畅通场景?好吧,简而言之呢,避障场景,就是小车需要转向避开障碍物的场景,畅通场景就是小车可以直接直行的场景。这里使用一个try/except的结构来避开文件覆盖,如果路径下已经有了这两个文件夹,程序会报错说文件夹已经存在了,并不会覆盖掉老的目录。 单元3,创建两个按钮和两个显示框,按钮用来操作添加避障场景图片和畅通场景图片的。显示框分别显示的是当前已存放的图片数量,如果你是第一次运行脚本,那你的图片数量应该都是0。不用使劲按按钮,这里的按钮只是用来演示,还没有实际效果。 单元4,这里分别写了三个函数。第一个save_snapshot(directory), 这个函数是用来保存图片,会被按键触发程序调用,函数将当前的摄像头图像保存到对应的路径下。 第二个save_free()函数,对应到上面的add free 绿色按钮,函数中调用保存图片函数,将当前摄像头图像保存到free文件夹中,并更新free的图片数量。 同理,第三个save_blocked()函数是将当前的图像保存到blocked文件夹中,并更新图片数量。 最后两个语句是将函数和按键关联起来, 让你在点击按钮的时候执行相应的函数。 单元5,这里将按钮和摄像头图像显示在一起,方便你操作。 OK现在开始你就可以将JetBot小车放到你准备做避障的场景中去,分别收集避障场景图和畅通场景图。 如果当前的场景有障碍物,需要小车转弯的地方,就按下add blocked 红色按键。 如果当前的场景是畅通的,小车可以直行,就按下add free绿色按钮。就这样分别收集各种图片数据。为了保持较好的避障效果。建议你每种场景至少收集100张图片。(注意不是让你在同一个画面里面狂按100下,拍100张一样的图片,是要你收集100种需要避障和100种可以直走的场景图!!!) 最后一单元,在收集结束之后,运行该单元将你的图片打包。这里打包的目的是因为有的用户可能会使用不同的小车去做后面的模型训练,或者你想将你们的图片数据备份一下。如果你是在同一辆小车上把三个步骤都做完的,那你也可以不打包,直接跳过这个单元。 数据收集到这里就结束了。有什么问题请留评论哦。^_^ 题外话 今天的题外话很短哦。你可能感觉每次要按一下,然后跑过去换一下小车的位置,再回来按一下,非常非常非常麻烦和低效,那么看过来。在保持这个程序运行的同时,你可以打开上一章节我们讲到的手柄遥控程序,运行遥控程序,然后用你的手柄去操作小车运行,然后你在电脑端做操作就行了。不用跑来跑去。(没错,小车可以同时运行两个kernel),当然,你也可以复制遥控部分的代码过来这个程序上面一起运行,都是可行的。这里就自由发挥吧。 模型训练 打开/train_model.ipynb文件,注意该文件是在Notebooks/collision_avoidance模型下。
单元1, 导入PyTorch函数库。PyTorch是比较通用的一个深度学习库,有兴趣的伙伴可以自行百度或者谷歌了解。 单元2,将数据包解压。注意,如果你是跟我一样在同个小车上做的模型训练,就直接跳过这个单元就可以了。因为你的数据已经是保存在当前的目录下,如果再运行这个单元2,会一直卡住。 那如果你是在不同的小车上做的训练的话,你需要把你之前收集打包的那个数据包复制到当前的目录下,然后再运行这个单元2去解压出来。 单元3,这里使用ImgeFolder类,将我们的数据包转化,方便后面做训练 单元4,将数据包分成两组,分别是训练组和测试组. 测试组用来验证模型的精确度 单元5, 这里会创建两个实例,用于后面混排数据并生成图片。 单元6,定义神经网络。在转移学习(transfer learning)中,我们可以使用预训练的模型来训练新的任务,这样我们可以直接使用预训练的模型中一些已经学习到的功能,然后训练新的任务,这样会节省很多功夫。总结来说呢,就是好比教导一个中学生高中知识,会比教导一个小学知识都没有的小孩子高中知识会来得简单和快速的道理一样(小编纯属瞎掰,O(∩_∩)O哈哈~)。 单元6运行之后,会自动下载Alexnet模型,这里会花费一点时间,需要耐心等一下。(目前好像出现下载中断报错的情况,你可以选择根据提示里面的网址直接下载,然后再手动复制到提示里面提到的路径中去) 单元7,下载的模型是有1000个labels,但是我们需要判断的就只有两种情况,避障和直行,也就是我们只需要两个label.所以这里需要处理一下。 单元8,将模型转换,以便在GPU上运行。 单元9,最后一单元就是模型训练了,这里会做30组训练,训练结束之后会生成一个best_model.pth的模型文件。等待训练完成即可。 自主避障 做完前面的准备工作之后,这里我们就可以来做避障的测试,检验一下你的数据和模型做的如何。 打开Notebooks/collision_avoidance路径下的live_demo.ipynb文件 单元1, 还是初始化PyTorch模型。 单元2,加载前面训练好的模型文件 单元3,将模型加载到CPU内存,准备传入GPU设备中做计算 单元4,处理摄像头图像数据,便于后面做运算 单元5,将摄像头图像显示在网页上,并同时用一个滑动条来显示当前图片的避障值 单元6,调用Robot库,准备小车的运动 单元7,根据避障值,来操作小车是直行还是转弯(避障)。如果你在做避障的时候,觉得小车速度太快可以降低robot.forward()里面的参数值来降低小车的前行速度,降低robot.left()里面的参数值来降低小车的转弯幅度。 单元8,实时更新摄像头数据,便于观察 最后几个单元,如果你的小车运行不正常,或者你想要停下小车,可以接着运行。 最后这里演示一下避障效果吧: |