2018年5月8日

无人车马拉松学员笔记(二)

无人车马拉松学员笔记(二)

无人车马拉松学员笔记

导语:在首届 move it 无人驾驶全球挑战赛, Udacity 学员申泽邦和全球 20 多位顶尖无人驾驶工程师一起,在 5 天内 打造无人驾驶汽车,并在交警手势识别方面取得突破。

文/ 申泽邦

编辑/Allen

Hi~大家好,我叫申泽邦,目前在兰州大学攻读计算机视觉方向硕士,同时也是 Udacity 无人驾驶工程师纳米学位的学员(目前是第三学期,马上就要毕业啦~)。很高兴参加这次 Hackathon,和全球 20 多位无人驾驶工程师一起 coding,打造无人驾驶汽车。

本次 Hackathon中,我处理并开源了一套规范的交警手势数据集这是目前**北京路测新规出台以后唯一开源**的数据集,可以供更多的人进行后续的交警手势识别深度学习模型研究。

无人车马拉松学员笔记

初识

最初是通过 Udacity 无人驾驶工程师学员群里面发的文章了解到这次活动的,主办方推动无人车开发民主化,去中心化的理念吸引了我报名参加这次活动,我本人以及我现在的团队都是开源软件的狂热者和开源社区的贡献者,我希望能够通过这次 hackathon 解决无人车开发在开源社区的一些 common issues,惠及更多开发者和 startup 。

在参加活动之前我们在 slack 上讨论了目前对于个人开发者而言无人车开发的一些急需解决的问题,并且总结了三个 hack 的目标:

1)CAN-BUS Hack;

2)拥有基本的循迹,避障能力的场内测试无人驾驶系统,真车测试;

3)交通警察手势检测识别。

通常来说,获得一辆能够被控制的汽车是从事开发无人驾驶汽车的第一步,然而传统车企出于多方面的考虑不会向个人开发者和小的团队开放其 CAN-BUS 控制接口,开源的 CAN 控制项目(如 OSCC )支持的车型偏少,所以线控汽车是目前个人和Startup普遍面临的问题,本次的 CAN-BUS Hack的对象分别是由主办方提供的一辆原型车—— Coffee-Car 以及一台全新的顶配思域。

在获得可以线控的车辆以后,接下来就是无人驾驶的整个顶层软件栈,包括感知,定位,决策,控制等多个模块的算法,在本次Hackathon中,我们主要目的是赋予测试车辆场地内的驾驶能力,目前来说有两套相对成熟的开源方案可供我们选择,分别是:

1)Apollo

2)Autoware

这两个开源框架都能够快速的实现场内无人驾驶,但就我个人而言,我更加熟悉 Autoware(碰巧本次 Hackathon 也采用了 Autoware 作为无人驾驶的顶层软件栈)。

最后一个目标的提出则是因为北京近日提出的自动驾驶路测新规(《北京市自动驾驶道路测试能力评估内容与方法(试行)》)中明确提出路测车辆应当具备交通指挥手势的理解能力,目前来说该课题还没有完善的开源方案,让无人车理解交警的八组指挥手势在中国显然是非常有必要的。

紧张筹备

在明确了 hackathon 的目标以后,针对这些问题我做了一些前期的准备。我本身是 CV 出身,显然在交警手势识别这一块我能做出更大的贡献,同时我也读过 Autoware 一些模块的源代码,拥有丰富的 ROS 开发经验,再加上在 Udacity 无人驾驶课程中学习的理论知识,实践的 project 等等,在去贵阳之前我对本次黑客马拉松充满信心。

实际 Hackathon 的过程也和我预想的一样——大家都非常的给力!一群来自十几个国家,涵盖泛无人驾驶领域各个方向的工程师,在初次见面不到几个小时就完成了任务的细分,分组分工,整个过程非常自由民主。

所有人大致分成了三个小组:CAN 控制组,Autoware 组,交警手势识别组。

其中 CAN 控制组需要 Hack 进原型车 Coffee-Car 和本田思域的CAN-BUS ,线控车辆的油门刹车和转向,最终做到使用 Autoware 组提供的 twist 消息控制车辆。

Autoware 组则需要完成整个系统的集成和测试,包括各类传感器的驱动(在本次 Hackathon 中最终我们只使用了 VLP-32c 激光雷达和工业相机作为传感器),采集和绘制测试场地高精度3D地图, waypoint 的绘制,相机和激光雷达的联合校准,场内测试等等。

手势识别组需要完成交警手势数据集的采集,模型的训练,手势识别 ROS 节点等等。我和另外两名 Udacity 的学员(杨健,张迪)加入了交警手势识别组,同组还有一个叫 Kunal 的印度小哥。

挑战

通过一些前期的研究我们发现目前交警手势识别有效的方案仍然不足,仅有的几篇相关论文都没有开放其数据集和相关代码。要基于视觉来检测交警手势大致有两种思路:

第一是先对交警进行 poseestimation,得到其骨架( skeleton )关键点信息,然后将序列动作的 skeleton 信息输入到一种模型中,对序列手势进行分类;

第二是直接跳过 poseestimation,将序列的动作图像输入到一种模型中,对序列图像的手势进行识别。

无论采用哪一种思路,都有两个重要的前提:第一,要准确的识别出交警,将交警和一般的行人区分开来;第二,要有丰富多样的手势数据集。所以,团队首先的任务就是完成相关数据集的采集和准备。

对于交警的识别,我们使用 Python 写的爬虫在网络中抓取了 10000 张包含交警关键词的图像,我们使用 YOLO2 对抓取的图像进行了检测,从而将所有图片中的人单独截出并保存,通过我们自己以及现场当地的大学生志愿者的人工标注,我们得到了用于交警识别的数据集,包含 10000 余张中国交警的图像和 10000 余张行人的图像。通过这些数据我们训练了相应的卷积神经网络,实现了交警和行人的区分,这一部分运用了 Udacity 无人驾驶工程师第一学期中交通信号识别项目的内容,达到了理想的识别精度。

对于交通手势数据,由于目前没有相对规范的公开数据集,我们不得不自行采集,我们尝试建立第一个相对标准的交警手势数据集并将其开源,以便更多的开发者和研究者基于该数据集开展交通手势识别的研究,我们使用 6 台相机从不同的角度拍摄了来自 20 多位志愿者共计 180 余组交警手势动作,同时还使用了两台激光雷达全程记录了手势的点云数据,我们使用了绿幕作为采集数据时的背景以便使用者对背景进行填充从而实现数据扩充。

我们使用人工标注时间点文件的方式将所有交通手势从视频中以 30FPS 的帧率逐帧提出并以图片的形式保存,最后我们使用 YOLO2 对所有的图像中的人形进行了提取,得到了一个包含 170000 张交通手势图像的序列图像数据集。

大展身手

在得到数据集以后,我们开始具体模型的训练,我们最终选择直接使用图像而非 skeleton 来训练模型(即前文提到的第二种思路),其原因在于 pose estimation 是一个计算密集型的任务,并且 pose estimation 之后得到的 skeleton 相比于原图像其信息量变得更小了,深度学习方法完全可以直接使用原图像作为输入由神经网络自行建立抽象表示。

由于活动时间有限,我们没有能够成功训练出序列模型,而是直接使用 Inception-v4 进行了特征提取和单帧图像的手势识别,这一部分的工作和 Udacity 无人驾驶课程中的行为克隆项目颇为相似。

最后步骤就是编写 ROS 节点将模型部署到我们的 Autoware 软件中,我们订阅了 Autoware 本身的行人检测模块的输出 topic (仍然是 YOLO2 ),并且将检测识别结果发布到 /police_gesture topic 上供决策模块订阅,我们的节点在整车上通过了集成测试,这一部分我们主要应用了 Udacity 无人驾驶工程师第三学期中 ROS 相关的知识。

结语

最终,我们和其他小组一道,完成了所有的设定目标以及一些额外的目标,实现了无人车的场内测试!再次感谢这次活动的主办方 pixmoving 以及 Udacity 的帮助和关怀,在活动的开幕式上,主办方特意强调了 Udacity 学员的贡献,很骄傲能过作为 Udacity 队的一员参加这次活动,这样的线下 Hackathon 给了我们一个很好的机会去接触真车,接触无人驾驶完整的技术栈,去应用 Udacity 纳米学位中学习到的知识,去认识更多无人驾驶开发者和爱好者。

希望今后国内能够有更多类似的活动,也祝愿 pixmoving-moveit 社区能够发展壮大,用开源的力量推动无人驾驶的发展进步!

Hack with love!

无人车马拉松学员笔记