这是之前做过的一个红绿灯检测的小小实践,现以“软件工程文档”的形式整理以下。只是一个总体的流程,不会面面俱到,介绍太多的细节,有问题的朋友,欢迎交流,也请大神不吝赐教。
在无人驾驶中,路口红绿灯的识别问题十分关键,无人驾驶汽车根据识别的结果采取不同的措施,比如:如果检测到红灯,则在路口等待,直到绿灯亮起后继续行驶;如果检测到绿灯,则直接通过路口。因此,能否准确识别红绿灯的状态,决定着无人驾驶汽车的安全。
鉴于以上需求,需要开发一套红绿灯识别的解决方案,通过摄像头采集图像,然后设计算法对图像进行处理,识别出图像的类别,最后将分类结果发送给决策段进行判断,进而控制无人驾驶汽车的行为。
硬件开发平台:NVIDIA Jetson TX2
工业相机:AVT GigE
操作系统:Ubuntu 16.04
开发平台:ROS
编程语言:Python
红路灯识别系统主要包括:摄像头数据采集,红绿灯识别,识别结果的发送三个部分。总体框架如下图所示。
首先在硬件开发平台NVIDIA Jetson TX2上安装Ubuntu16.04操作系统,然后安装ROS(Robot Operating System),最后安装AVT GigE的驱动包,此时便可以读取相机采集的图像。
深度学习在计算机视觉领域取得了巨大的成功,其中Faster-RCNN框架具有准确率高等优点,因此本设计采用Faster-RCNN框架对图像进行识别。
Faster-RCNN框架如下图所示,主要步骤依次为:输入图像、生成候选区域、特征提取、分类、位置精修。
在本设计中,不同模块间的通信借助ROS完成,红绿灯识别模块将测试结果发布一个话题,决策模块订阅这个话题,这样决策模块就得到了红绿灯识别模块的检测结果。模块间的通信如下图所示。
talker
为红绿灯识别模块的节点,
listener
为决策模块的节点,
light_state
为
talker
节点发布的话题,
listener
节点订阅话题
light_state
。
由于需要对摄像头实时采集的图像进行处理,因此使用ROS或OpenCV获取输入的每帧图像,然后将图像输入到红绿灯识别程序,输出识别结果,最后将结果以界面的形式显示出来,并以视频和图片的形式保存,方便调试。这里需要使用OpenCV对文件进行操作。
使用ROS将整个红绿灯识别模块封装成一个节点,检测结果为话题,并将其发布出去,供其他节点订阅。
程序流程如下图所示。
集成包括内部模块的集成和与外部其他模块的集成。
内部模块的集成,主要包括实时采集图像,输入到检测模块处理,然后保存结果供调试使用,最后将检测结果发送出去。
与外部模块的集成,即决策模块,是通过ROS完成的,红绿灯识别模块和决策模块分别为两个节点,红绿灯识别节点发布带有检测结果的话题,决策节点订阅这个话题就可以获取检测结果。
测试分为离线测试和在线测试。
离线测试为搭建环境,训练模型,编程实现,测试结果,主要是在线测试前的准备过程。
在线测试需要在真实场景下进行实车测试,检验方案的有效性。
写这篇博客时,硬件设备已经上交,而且当初也没留下截图,只好放出在笔记本电脑上运行的截图。
(这也提醒我,做完实验要尽快记录下来)
此方案主要针对特定地点路口红绿灯的识别问题,如果场景变化,还要重新采集数据集进行训练。
目前版本对GPU依赖较高,同时存在实时性不高的问题,后期会优化模型,使用或研发性能更好的框架进行模型的训练。
由于某种原因,源码暂不公开,有特殊需求的朋友请评论,欢迎交流。