无人驾驶实训营100小时回忆录

无人驾驶实训营100小时回忆录

曾经有一份真挚的机会摆在我面前,我珍惜了,等到我码稿的时候已是回忆满溢,人世间最快乐的事莫过于此……如果能够给我再来一次的机会,我会对那个实训基地说三个字: 我愿意。如果非要在这份快乐上加个期限,我希望是...再多几天!

实训基地

北纬26.7,东经106.6,请记住这个地址,如果有机会,你会爱上它……

没错,它就是位于贵阳市白云区贵州科学城的PIX无人驾驶工厂。作为全球首个无人驾驶工程师实训基地,于2018年9月启用之后,已经承办了两期无人驾驶线下实训营,包括此次七叔在12月份参加的Bootcamp。七叔在报到当天就去了期待已久的实训基地逛了逛,第一次近距离接触无人驾驶车,hǐn激动啊!而且缘分难以言喻,第一眼看到的这辆本田思域,后来成了我们队的战车。

PIX改装的第一辆无人驾驶车
实训基地全景(实训开始前一天)
全球首个无人驾驶实训基地牌匾

稍等,无人驾驶线下实训营?对,你提取到了这句话的feature,线下!

作为Udacity招牌课程《Self-Driving Car Engineer》的学员(也是参加实训营的前提条件之一),同学们都是在自己的计算机上或者在Udacity提供的线上Workspace中学习实践具体项目,与模拟器和键盘为伍。而2018年启动的线下实训营,是让学员将所知所学应用到真车的实际项目中,一切都是自己动手去完成。线下实训营的项目有点类似SDC纳米学位的毕业项目“Capstone”,但是绝对更甚一筹,打个不太恰当的比方:完成“Capstone”算是看过猪跑,而完成线下实训营应该算是吃上了猪肉吧。说到这里,七叔莫名想点份夜宵🤔️

喏,文末有无人驾驶工程师真车实训营的报名链接,收好不谢!

此次无人驾驶线下实训营仍由优达学城(Udacity)、PIX、TierIV联合主办。Udacity提供线下实训课程总体设计及项目实践;PIX提供实训基地环境、3台无人驾驶真车以及车辆线控套件的知识学习;TierIV提供全球首个无人驾驶开源软件Autoware的学习、实践和真车测试,由Autoware的核心开发者——日本名古屋大学教授/TierIV公司研究顾问Alexander Carballo现场授课指导。此外,包括Alex在内的导师团阵容堪称强壮💪:Alex、杨博士(腿哥)、曾sir(二师兄)、王博士,这几位男猪脚将陆续在下文的故事中出现,哈哈哈,七叔预感要得罪大神们了😱

导师简介

参加本次线下实训营的学员,包括七叔在内共9人(据说本次有200多人报名),有高学历海龟,有技术公司的算法牛人,有车企的专业工程师,以及像七叔这样的“等等”,🤓

导师团、学员组、辅助位小伙伴们,20余人在贵阳实训基地济济一堂,开始5天的…呃…折腾……


深夜男团

主办方在实训的第一天就将三位大龄学员(当然七叔也在内😅)强行拆成三组,然后剩下的六位鲜肉学员自行与各位大叔组队。七叔有幸与马博士和浩然组队,开启一段难忘的旅程。

  • 马博士:上海交大博士后,英国谢菲尔德大学海龟,SDC Term2
  • 浩然:纽约大学海龟,SDC Term3
  • 七叔:IT男,浙江大学土鳖,SDC Term2


另外两队的成员以汽车行业“嫡系”工程师为主,相对来说,我们组显得有些“外行”。他们两队的队名也是呼之欲出:Sub-Zero和Triple S。具体的信息我就不做过多介绍了,留给他们自己写回忆录的时候揭开谜底啦😏。

那么现在,请猜猜我们队叫什么?不不,不是深夜男团,这个梗在本段后面讲。

我们队取队名的过程,是在掩耳盗铃响铃铛之势中完成:“我们队叫‘图灵’好不好?” “好好!” “AI先驱之名,听着就洋气!” “图灵机器人,体面!” “那英文单词怎么拼?” “T-U-R-N-I-N-G” “好的,我去写到黑板上” “为啥感觉这个词读起来别扭” “啊……好像多了一个N” “怎么办,打脸了” “没事,我去加括号,一会儿圆回来”……

“大家好,我们队叫图灵,Turing,借用了人工智能先驱的名字,很符合我们无人驾驶的气质。大家可能注意到了这里有个(n),这个单词可以毫(qiáng)无(cí)违(duó)和(lǐ)地变成Turning,应景我们这次实训的最终测评项目的目标,要在每一个拐口完成指定的启停任务,同时,对我们这些参加线下实训的学员来说,这5天也可能是人生的一次转折。所以,这个队名一词双关,我们叫Turing,我们为Turning而战!”

……这可能是七叔近些年圆过的最好的场🤦‍♂️

从左至右:马博士、David、七叔、浩然

David ?!嗯,他是本期实训营的神秘嘉宾,Emm……,现在也不神秘了。Never mind,七叔会在下一段介绍院长,是的,再不刹车,话题就拉不回来了😂

Tur(n)ing是我们队的官方名字,但圈内更熟悉的是我们队的昵称:深夜男团

Day1 ≈ 6.5小时; Day2 ≈ 5小时; Day3 ≈ 4小时; Day4 ≈ 4.5小时; Day5 ≈ 2.5小时

哦哦,这是我们队在实训基地那5天睡觉的时长,总计约22.5小时。每天都混迹后半夜的我们,深夜男团称号当之无愧……(为什么写到这里感觉有点困🤔)

从另一个角度讲,5天 × 24小时 - 睡觉 ≈ 100小时


100小时

  • Day 1

第一天,Alex教授准时出现在我们入住酒店的会议室(其实是个套房),在短暂的启动会后开门见山,直接讲解无人驾驶技术与Autoware的基础原理。

Safety is the most important thing of self-driving cars.” Alex说,这几天他所有讲的内容都可以忘记或者不听,但必须要记住这一句话。

Alex教授讲授Autoware基础原理

首个半天的课程结束,9位学员进行分组,分组情况七叔在前一段有简述。午餐后,大家兴致勃勃地前往距酒店不到1公里的实训基地厂房,选车并进驻玻璃房工作室(炫酷的工作室可移动、可组合,是由PIX的首席美女设计师设计的)。

PIX无人驾驶实训基地
曾sir仔细讲解用电安全须知

根据实训计划,第一天建议完成无人车计算节点的环境部署和红绿灯数据采集。

由于我们队在实训开始前进行了预习,都已各自安装部署过Autoware环境,因此对于无人车计算节点的环境部署环节没有出现大的问题,从裸机的ubuntu安装启动,依赖包安装更新,CUDA、cuDNN、TF,到Autoware的安装测试,一路顺畅。传说中的第一道坎好像并没有难住我们。

但安装部署总免不了时间的消耗,即使是七叔借了台无线路由器部署了小局域网方便队内成员ssh登录进行操作,在我们队确认环境安装完成后,天色已暗,红绿灯数据采集的最佳时间已错过。

我们果断选择先进行第二天的实操部分,安装TF API以及label工具,并且测试深度学习部分的整个程序调用过程是否成功,以便我们在第二天完成红绿灯数据采集之后能否尽快地开始训练。

但事情从第一天开始就不那么顺利,否则也不会有深夜男团的殊荣了😏。

我们卡在了深度学习模型训练的启动环节,cuDNN启动失败,因此TF无法调用GPU资源,怎么办?如果你学过Udacity的无人驾驶工程师纳米学位课程中的《Behavioral Cloning》项目,而且是在自己的计算机上用GPU训练的,你一定知道为了配置GPU,整个安装部署过程有多坑,哈哈。

所以,我们很耐心地一步一步排查,显卡驱动正常,CUDA测试正常,cuDNN安装过程正确,这些问题点都排除之后,就只剩下TF自身了。而最终的结果也确实是因为TF版本的兼容问题。

pip install tensorflow-gpu 会自动安装最新版本1.12,而此版本不兼容我们在环境部署时安装的CUDA和cuDNN版本,因此需要降低TF的版本。

✔️ pip install tensorflow-gpu==1.9 降版安装之后,成功启动深度学习模型的训练过程。

踩坑、填坑、开心收工、睡觉!贵阳冬天的晚上真冷……

  • Day 2

第二天的课程在实训基地旁的培训教室进行,继续由Alex为我们讲授Autoware的准分布式框架结构,以及如何通过Autoware采集地图数据并规划路径。

Alex讲授激光雷达基础原理

午餐后,大家陆续回到实训基地开始第二天的实操任务。

由于当天讲授的是激光雷达地图构建和waypoint的相关内容,我们队决定现学现用,实操计划调整为红绿灯数据采集、激光雷达数据采集、点云地图构建、waypoint构建,将打标签和深度学习训练任务推迟到第三天。

调整车载摄像机镜头进行红绿灯数据采集
采集激光雷达数据生成点云地图

当天大部分的时间耗费在了地图生成、路径规划修正、重新采集激光雷达数据、数据融合更新、参数测试调整这样的循环工作上。这个环节很像SDC纳米学位的《Model Predictive Control》项目,但其实做的事其实是两个不同的部分,MPC项目是用C++实现控制算法,而线下实训中做的是为MPC算法采集地图数据并通过Autoware设定waypoint及其相关参数。

直至次日凌晨,我们终于调试完成,车辆可以通过激光雷达的点云匹配根据规划的路径自动行驶和过弯。

激光雷达路径规划自动驾驶https://www.zhihu.com/video/1072798501435383808

踩坑、填坑、开心收工、睡觉!贵阳冬天的晚上依然冷……

  • Day 3

第三天,Alex继续为大家讲授ROS的节点通信原理及Autoware的核心组件使用。学员们认真听讲,全神贯注。SDC纳米学位第三学期的课程中也会有ROS相关部分的教学。

“居然还有这种操作,Alex讲得太好了”
“这个知识点得赶紧记下来”

虽然熬了两夜,但我们队目前的进展符合预期,第三天的主要实操任务就放在了打标签和训练神经网络上。

在第二天的红绿灯数据采集环节中,我们队共采集生成了3k多张图片,每张图片都需要人工圈出红绿灯区域并标注该灯的结果标签。这里要感谢我们的班主任——Udacity的Daisy小姐姐,临时加入我们队,帮助一起打标签。约4个小时之后,完成了所有图片的人工标注。

“金牌辅助”Daisy小姐姐专心协助打标签

虽然图片数量不算太多,但为了最大程度节省时间,七叔用python写了一个数据清理的小脚本,剔除无红绿灯的图片、将红灯和绿灯的图片数量进行均衡、8/2分训练集数据和测试集数据,最终清洗生成了约2K张图片和相应标签的数据集。之前我们在学习SDC的感知类项目时,使用的都是事先整理好的数据,比如German Traffic Signs数据,而线下实训需要自己采集整理数据,因此我们对数据的重要性有了更深刻的认知,也对这份数据集有了更深的感情。这份数据集,之后又分享给了另外两队,在短短5天实训期间,想要拿出时间好好地打份标签,着实是件奢侈的事情。

在这期间,杨博士Aron给学员们提供了很多在算法、训练和调参等方面的帮助和指导。杨博士人称腿哥,没有全腿照怎么介绍他?但是抱歉,确实没找到全腿照,大家凑合着看吧😂。

腿哥和Daisy在现场工作中

我们队选择了SSD框架进行训练和识别,在GPU上执行了约3K多次迭代之后,损失率下降至1.0以下。当晚我们趁热打铁,将训练结果网络部署到无人车上,通过车载摄像头准确识别了红绿灯状态。

SSD准确识别红绿灯状态https://www.zhihu.com/video/1072815730604544000

貌似没踩坑、分享数据、开心收工、睡觉!贵阳冬天的晚上……好像习惯了

  • Day 4

第四天,也是课程部分的最后一天,神秘嘉宾出现,现任Udacity人工智能与自动化学院院长的David风趣幽默,带领学员们以热身操开场(地板情何以堪),并在随后的专题分享中与学员们积极互动打成一片。

David来到实训现场与学员互动

Alex也在剩下的时间里,倾囊相授,为学员们讲授了例如KML等,在Autoware的很多开源资料中未尽讲述的几个关键技术。

Alex细心讲解关键技术原理

午饭过后,David随大家一起前往实训基地厂房,他在听说我们队已完成了基于激光雷达路径规划的自动驾驶之后,很激动地约我们上车兜个风🤠,然后就有了下面这个YouTube上的视频以及medium.com上的博文:

David乘坐无人驾驶车贵阳兜风https://www.zhihu.com/video/1073296584757800960Visiting Udacity’s Self-Driving Car Training Center in Chinamedium.com

继续回到我们的实操时间,因为前3天的进展相对顺利,我们队信心满满地开始控制程序的代码开发,而真正的打击才刚刚开始……

马博士研究Autoware控制节点和调整参数,浩然研究控制程序文件的函数调用关系与变量传递,七叔我研究应对最终测评项目所需的控制逻辑的伪代码,怎么看怎么都像一个进展有序的项目团队。

代码完成后,第一次编译,试跑,失败……

修改代码后,第二次编译,试跑,失败……

再次调整代码,第三次,第四次,第……,失败,失败,失败……

改写刹车信号代码……改写红绿灯状态回调函数……改写车速控制变量……,每一次代码调整和编译都要话费20+分钟的时间,每一次我们都在期待编译完成后能出现好的结果,每一次我们都以为在朝着正确的方向前进。但是我们错了,因为我们在一开始就错了……

在事后的全面复盘中,我们认识到造成这个结果的几个问题:

  1. 自信心小爆棚,没有采纳实训建议,甚至没有仔细看建议项,捡起控制程序的cpp文件就是干,以为在半天的时间里可以迅速搞定,实际被狠狠打脸。
  2. ROS作为准分布式系统虽然相对解藕,但是对于我们队这样ROS开发经验相对薄弱的情况,很难在短时间内理清各个类、函数、变量的调用关系和执行逻辑,更何况我们还没有理清楚,任何一个未理清的点都会影响实测的效果,甚至是Core Down。
  3. 没有及时止损,时间如此珍贵,我们却还在朝着一个没有头绪的目标不断前进,方向错,更多的努力就是大错特错,应该及时改变策略,想新的出路和办法。


踩坑、踩坑、踩……、貌似还没填上、天快亮了、先睡、明天一定能解决!

  • Day 5

决战日,最刺激的一天。

你一定好奇最终的测评项目是什么,这里七叔借助当时拍下的激光雷达点云地图照片做个简单的介绍:

基于激光雷达点云的测评项目路线示意图

上图就是我们最终测评项目全路径的点云地图,是一条围绕无人驾驶实训基地厂房的环形路线,七叔在这个图上面共标了四个位置。

  • 0 位置:无人驾驶车的启动位置,可远可近,这个比较随意,各队按自己最合适的位置启动无人驾驶模式即可。
  • 1 位置:若转角处的红绿灯为红灯,无人驾驶车需自动停止在由三条线组成的指定区域内,车辆行驶方向的前两条线按距离计算得分,后两条线内停止的记满分;停止后待转为绿灯后需尽快左转驶离。该位置在停止线附近是有个坡起的路段。
  • 2 位置:无论转角的红绿灯什么颜色,必须在停止线停3秒;3秒之后若是红灯,继续等待,若是绿灯,左转驶离。
  • 3 位置:要求同2位置,并回到0位置。


相信你已经大概了解我们的最终测评项目了,七叔在前文中也提到了最终测评和SDC纳米学位的毕业项目《Capstone》类似,是不是觉得其实挺简单,但在实际的操作调试过程中并没有那么容易。

回到我们队在昨天欠下的债,由于最后一天没有授课环节,在短暂休息后我们又回到基地,决定改变代码策略,这里需要感谢导师王博士,耐心听取我们的代码思路并给出了合适的指导建议。

王博士(右二)听取思路并提出建议

之后我们彻底更新了代码计划,修改另一个Python程序文件,已期赶在最终测评开始前完成所有任务。马博士继续研究Autoware控制节点和调整参数并确保除控制代码外的其他功能一切正常,浩然和七叔启动“结对编程”模式,两人以该Python文件为核心,一起梳理它所有的对外调用关系,之后七叔开始全速编写代码修改Python文件。

终于在中午1点左右,完成了代码部分,开始路测(期间,我们队的车因没油了,跑去几公里外的加油站加油,说实话,七叔的内心是焦绿的……),终于出现了大的转机,无人驾驶模式可正常启动,红绿灯正常识别,刹车信号有了响应,一切朝着好的方向发展了。

在困扰我们队最大的问题解决之后,我们又遇到了诸如传感器频率慢于CPU时钟、SSD框架吃CPU资源等问题,但都在多次调试优化以及导师们的指导帮助下陆续解决。

与此同时,另外两个队也在紧张的测试调整进程中,而全体导师和辅助位小伙伴们都纷纷出动,为最终测评提供帮助。

Sub-Zero和Triple S两队正在紧张调试中
导师们现场提供帮助

你有没有发现照片中少了一位导师的身影,对,曾sir,他是深夜男团要特别感谢的人。俗话说得好,每一个男团背后总有个累爆肝的真爱!噗哈哈哈,这句话是七叔瞎编的,但曾sir每天晚上陪我们熬到深夜,最后一个离开厂房,累到爆肝是真的。

曾sir的“二师兄”激活状态和连续熬夜爆肝累趴状态

深夜男团没有辜负曾sir的这份“真爱”以及各位导师的悉心指导,在接近傍晚开始的正式测评中,冲破1位置的坡起阻碍,停在了满分停止线区域,并在绿灯状态迅速驶离,而后的2、3位置也全部完成相应的红绿灯路口启停要求。想不到吧,一路折腾起伏,最终我们队还是逆转了。

无人驾驶车红绿灯路口满分启停https://www.zhihu.com/video/1073024970388471808

此时,好像有Sebastian校长的社会恭喜"Congratulations!"萦绕耳边,你懂的😝。

另外两队也在之后陆续完成了全部或部分任务,由于1位置的停止线满分成绩只由我们队拿到,深夜男团成为了此次实训最终测评的冠军。

最后一个夜晚,本期实训营在大家的总结分享和音乐轰趴中渐渐落下帷幕……

主办方、导师、学员们的总结分享
本期线下实训营圆满结束

无名之辈的感悟

  • Patient Persistence Practice

3个P是七叔在执行层面的感悟:多一份耐心,再复杂的事情也能化解为可handle的简单事,就算简单事也很花时间,就请让时间给你答案;多一份坚持,即使看不到希望也不要轻易放弃,笑到最后的可能就是你;多一点实践,纸上得来终觉浅,绝知此事要躬行,尽可能地自己动手去做,实践之后会有意想不到的成长,线下实训营就是个很棒的实践方式。

  • Learning in Failure

从失败中学习是七叔在认知层面的感悟:要积极地拥抱失败,在失败中学习其实是种成本很低而受益很明显的学习过程,如果没有环境安装的坑,我们可能会忽略软件组合版本兼容的重要性,如果没有waypoint调参的坑,我们不会那么深刻理解MPC的原理,如果没有ROS控制代码编写的坑,我们可能不会那么用心去梳理那些底层函数的调用关系和逻辑,而这些知识又是我们队在这5天里的意外收获。当然,吃一堑长一智,七叔回杭州之后首先要开始补的就是ROS🤣。


从2018,到2019

转眼,七叔参加的这期线下实训营已经过去整整一个月了。

2018年底的这5天,将成为我人生中非常有意义的一次旅程,这5天里的每一个人、每一件事都会存在我深深的脑海里。

  • 非常难得的实操环境,零距离接触行业,真实感受无人驾驶是个什么,而不是单纯地在计算机上敲敲代码;
  • 与业内顶尖的专家导师面对面,学习到了一些核心思想、看待问题的专业角度、处理问题的方式方法;
  • 与行业内外的各路学霸并肩作战,我作为行外人结识了很多朋友,扩宽了视野,得到了很多职业发展规划的建议;
  • 安排周密又具有挑战的实操项目,深入浅出,是对自己的基础知识、专业技术、团队合作、解决问题能力的一次检验,一次自我评估的过程,也更坚定了我继续深入学习无人驾驶技术的信心。


马博士用了一个很巧妙的词形容我们自己,iceberg,这个词也成为了我们队战车的名字。可能我们的能力,我们所学到的、看到的,以及无人驾驶技术的发展和应用落地,都还是冰山一角,略带焦虑但仍充满机遇,略带憧憬但需披荆斩棘。

就我个人而言,在浙江移动云计算中心这些年打下的Linux和Python基础,以及在Udacity上的学习成长,没有给深夜男团拖后腿,甚至在某些关键时刻能够挺身而出,为我们队最终夺冠贡献力量,已足够欣慰。

插播一个硬广🤗:七叔隶属的浙江移动云计算中心是传统行业IT技术走在前列的团队,理念上不受体制束缚,一直积极实践技术创新。如果有兴趣可关注微信公众号:三墩IT人

Alex教授作为无人驾驶业内的资深专家曾说,相对成熟的无人驾驶技术落地可能要等到2025年之后,但我觉得,随着人工智能和5G等前沿技术的快速发展,我相信无人驾驶也将以更快的速度走入人们的生活。

感谢Udacity的无人驾驶工程师课程带我走入这个能做梦的世界,感谢主办方让我有机会参加线下实训,收获满满,成长漫漫。2019,我们一起去追梦。

这么长一篇拖泥带水的文章,能读到这里的都是真爱,下面放出福利:深夜男团最新同名专辑封面图😎

《Tur(n)ing late at night》

哈哈哈,开玩笑啦~

提前祝大家新春快乐,万事佩奇!🐷

'''
以下代码含有Udacity优惠码,可在Python3环境下执行查看,Good Luck!
'''

referral = '38B66055'
for important in range(3):
    print('据说报七叔的邀请码:%s 购优达学城的课有优惠😎' % referral)

无人驾驶工程师真车实训营 预报名申请udacity.jinshuju.com图标

编辑于 2019-01-29

文章被以下专栏收录