Jetbot系列12-图像分类法实现找路功能

避撞功能是智能车的最基本保护能力,Jetbot使用深度学习的图像分类技术来模拟人眼习惯实现这个功能,但这只是智能车所展现的最入门应用而已,接下去就要提升到“循路”的功能,跟着指定路线去前进,才是真正进入有实用价值的应用。

避撞功能是智能车的最基本保护能力,Jetbot使用深度学习的图像分类技术来模拟人眼习惯实现这个功能,但这只是智能车所展现的最入门应用而已,接下去就要提升到“循路”的功能,跟着指定路线去前进,才是真正进入有实用价值的应用。

https://developer.nvidia.com/embedded/community/jetson-projects里有非常多精选的项目,其中的“TRANSFER LEARNING WITH JETBOT & TRAFFIC CONES”项目就是前面避撞应用的延伸,模拟无人驾驶车在道路上识别路锥所规划出的道路(如下图),然后驱动机电控制系统执行智能驾驶的功能。

Jetbot系列12-图像分类法实现找路功能

有能力的读者可以访问https://www.youtube.com/watch?v=YwxSwXEjd4c,观看整个项目的构思逻辑,事实上这个项目使用的与避撞项目相同的深度学习图像分类技术来进行路锥的识别,在”blocked””free”与两个分类之上再添加“left”“right”两个分类,其他的执行逻辑与避撞项目几乎完全一样。

Jetbot系列12-图像分类法实现找路功能

请访问https://github.com/dvillevald/Finding-path-in-maze-of-traffic-cones,在traffic_cones_driving目录下有三个脚本,分别执行数据收集、模型训练与现场演示三部分,与避撞应用的节奏是一样的,最关键的环节也是在数据收集(data_collection)”部分,至于模型训练(train_model)的部分则添加迁移学习的功能,而现场演示(live_demo)的部分则增加比较细腻的判断,并且提供运行过程的记录功能,便于后面进行矫正的任务。

现在根据三个步骤所需要注意的重点,提供一些参考的说明,至于执行代码的细节直接对照避撞项目的脚本就可以。

  1. 数据收集:使用data_collection_cones.ipynb

这个环境同样是整个应用中最关键与最繁琐的步骤,与避撞项目相同的,我们必须使用Jetbot上面的CSI摄像头进行数据采集,并且同时进行分类,主要有以下三件需要注意的事项:

  1. 虽然原创团队使用小红锥(如上图)作为分道物体去部署行进的路线,但其实也可以使用任何物体来进行体验,包括跳棋子围棋子或用非透明的定位胶带(如下图),只要颜色与地面(板)有明显反差的就行,例如浅色地板就用深色物体或胶带、深色地板就用浅色物体或胶带。

Jetbot系列12-图像分类法实现找路功能

或者在下图这种印好赛道的板子或者塑料布上也可以,重点并不在于是否为立体物,而是能在图像中识别出的明显边界,这样就能用来执行这个数据收集的任务。

Jetbot系列12-图像分类法实现找路功能

  1. 执行图像收集的时候,并不需要将分道物体按照指定路线进行排列,只需要排成半个圆形或方形就可以。这里需要识别的边界状况是固定的立体物或线条,比前面避撞项目所需要面对众多未知物更加简单,因此4个分类大约各收集20~30张图片也就够了。
  2. 采集数据的分类,请根据摄像头所看到的画面去进行分类,避免从人眼去判断目前镜头图像可能是哪个类别,这样才不会造成误差而影响最终的识别效果。下面列出几种分道物所采集分类的图像,提供作参考。

Jetbot系列12-图像分类法实现找路功能

Jetbot系列12-图像分类法实现找路功能

Jetbot系列12-图像分类法实现找路功能

  1. 模型训练:使用train_model_cones.ipynb

这个项目名称里虽然有Transfer Learning在里面,不过只是在Define the neural network第一个步骤的model = models.alexnet(pretrained=True)用到PyTorch预训练好的AlexNet 1000类的分类器模型,但是这些分类与我们所使用的分道物基本没有关联,因此以这个使用这个模型为基础的迁移学习并没有明显的帮助。

如果想将前面的避撞功能加到这个循路应用里,有两种方法可以实现:

  1. 将避撞项目收集好的 ”blocked” ”free” 类别图像数据,分别加到这个项目的对应目录中一起进行模型训练。
  2. 运用“迁移学习”技巧,在执行模型训练之前将避障项目的best_model.pth导进来作为训练的基础,当然您得先把避撞的best_model.pth模型文件复制到这个目录下。不过这个做法需要在代码上做些小幅度的修改,将Define the neural network第一个步骤进行以下的调整:

[ ]

# 关闭原本的pretrained设置

model = models.alexnet(pretrained=False)

# 添加下面代码

model.load_state_dict(torch.load('best_model.pth'))

这种做法的好处是,未来面向更多不同分道物的时候,可以不断往上叠加以增加Jetbot适合的使用场景。

例如第一次使用红锥做分道物,进行数据采集并训练出best_model_cones_1.pth,等后面用要使用定位胶带做分道物的时候,就能在best_model_cones_1.pth的基础上去训练能识别红锥与定位胶带两种分道物的best_model_cones_2.pth模型,真正发挥迁移学习的效果。

  1. 现场演示:使用live_demo_cones.ipynb

这个脚本与避撞的live_demo基本逻辑是一样的,项目提供一个完整的决策流程图(如下)可以参考一下。

Jetbot系列12-图像分类法实现找路功能

另外这里面还添加一个“第一视角(FPV, Fisrt Person View)”的视频记录功能,将循路的行进过程完整记录下来,呈现的方式如下图:

Jetbot系列12-图像分类法实现找路功能

这个功能在校正过程是非常有用的,但是视频存储的工作会占用Jetbot不少的CPU计算资源与以及非常紧凑的存储空间,因此完成校正之后就建议将这个功能关闭,这个功能的函数名是 ”save_frames_with_telemetry” ,请使用网页搜索功能在脚本里找到位置,只要在前面加上 ”#” 关闭调用就可以。

剩下的工作就是按部就班去执行,有了这个循路的功能之后,才是让Jetbot真正进入智能车应用的起点。【完】

来源:业界供稿

0赞

好文章,需要你的鼓励

2022

02/15

14:15

分享

点赞

邮件订阅
白皮书