jetson小助理 发表于 2022-4-12 09:23:19

NVIDIA Jetson Nano 2GB 系列文章(51):图像分类法实现找路功能



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

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




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



请访问https://github.com/dvillevald/Fi ... ze-of-traffic-cones,

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

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

1.数据收集:

使用data_collection_cones.ipynb

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

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



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



(2)执行图像收集的时候,并不需要将分道物体按照指定路线进行排列,只需要排成半个圆形或方形就可以。这里需要识别的“边界状况”是固定的立体物或线条,比前面避撞项目所需要面对众多“未知物”更加简单,因此 4 个分类大约各收集 20~30 张图片也就够了。

(3)采集数据的分类,请根据“摄像头所看到的画面”去进行分类,避免从人眼去判断目前镜头图像“可能”是哪个类别,这样才不会造成误差而影响最终的识别效果。下面列出几种分道物所采集分类的图像,提供作参考。







2.模型训练:使用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 模型,真正发挥迁移学习的效果。

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

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




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



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

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

页: [1]
查看完整版本: NVIDIA Jetson Nano 2GB 系列文章(51):图像分类法实现找路功能