今天在 Tensorflow公号看到推文Pixelopolis:由 TensorFlow Lite 构建无人驾驶微型汽车,作者介绍了他们在今年Google I/O大会上展示的TensorFlot Lite构建的无人驾驶微型汽车的展品:Pixcelopolis。
▲ TensorFlow Lite构建的无人驾驶微型车
每辆微型汽车都装配有一部Pixel手机,使用手机上的摄像头检测和理解周围的信号。手机使用了Pixel Neural Core边缘计算芯片(Edge TPU支持的机器学习),可感应车道、避免碰撞和读取交通标志。
相比于基于云计算来实现视频处理和物体检测,边缘计算可以减少延迟对控制的影响(也许在5G下延迟影响小一点)。
▲ 通过手机识别各种目标的Pixelpolis
下图是整个展品的布局,模仿了一个小型城镇广场周围的交通环境。参观者可以通过手机端的一个应用模拟“站点”来选择出现的目的地。展品中的微型车就可以驾驶到目的地,整个过程用户可以查看车辆周围以及所检测到的物体。
▲ 演示区的道路设计
车模所有对外界的感知都来自于微型车膜前面的手机摄像头,有它获取前方的图片并手机内部署的神经网络完成车道保持、停车定位、障碍检测等。通过手机底部的USB-C接口扩展来与底层控制板通讯,完成电机控制等。
▲ 手机应用程序与Pixelopolis交互
▲ 手机端可以查看车辆周围所检测到的物品
展品作者采取了与论文:End-to-end Learning for Self-Driving Cars中相类似的技术录像,使用卷积神经网络(CNN)来检测每帧图像内的交通指示线,并给出方向盘的调整量。增加了LSTM利用前期拍摄的多个图像帧进行改进。
▲ CNN 模型的输入和输出
控制器的模型很简单,下面代码就给出了网络的结构构成。net_in = Input(shape = (80, 120, 3))x = Lambda(lambda x: x/127.5 - 1.0)(net_in)x = Conv2D(24, (5, 5), strides=(2, 2),padding="same", activation='elu')(x) x = Conv2D(36, (5, 5), strides=(2, 2),padding="same", activation='elu')(x)x = Conv2D(48, (5, 5), strides=(2, 2),padding="same", activation='elu')(x)x = Conv2D(64, (3, 3), padding="same",activation='elu')(x) x = Conv2D(64, (3, 3), padding="same",activation='elu')(x)x = Dropout(0.3)(x)x = Flatten()(x)x = Dense(100, activation='elu')(x)x = Dense(50, activation='elu')(x)x = Dense(10, activation='elu')(x) net_out = Dense(1, name='net_out')(x)model = Model(inputs=net_in, outputs=net_out)1234567891011121314
一个神经网络是否能够达到很好的性能,关键在于如何准备好让它学习的训练样本。为此。作者使用Unity, Udacity来构建了模拟器,自动生成训练车辆的图像数据。
通过在轨道上设置多个路径点,微型汽车可以行驶到不同的地点,并从中收集数据。在此模拟器中,我们每 50 毫秒收集一次图像数据和转角数据。
▲ 模拟器中的轨道中上设有多个路径点
大家都知道,软件虚拟出的场景图片和实际拍摄到的图片会有很大的差别,包括光线、周围环境以及其他的噪声。为了使得训练的神经网络能够适应实际要求,需要对数据进行增强。
他们将以下变量添加到场景中:随机的 HDRI 球体(具有不同的旋转模式和曝光值)、随机的环境亮度和颜色以及随机出现的车辆。
▲ 各种环境下的数据增强
下图给出了经过训练之后,卷积神经网络的第一层对于输入图片的输出。可以看出,它已经能够很好地将图片中道路信息边缘信息能够很好的提取,对于背景可以进行有效的压制。
▲ 第一层神经网络的输出
使用神经网络进行控制的一个最大的问题,就是车模有时会出现莫名其妙的动作。比如下面这个场景,明明已经成功的拐过弯道,进入平坦顺直的道路,车模则抽风地冲出跑道了。
这主要是因为所训练的样本没有能够均匀包含各种道路情况,模型比较脆弱。
▲ 早期版本中玩具车偏离了轨道
为此,在场景中添加了各种形状的曲线,以丰富原来训练数据库中大多数的直线轨道数据。
▲ (左)方形轨道与(右)弯曲轨道
功夫不负有心人,修正数据集不均衡的问题后,车辆便开始能够在弯道处正确转向。
▲ 车辆在弯道可以成功撰文
似乎理性的增加数据可以提高车模的性能,但有时候仅仅采用小的技巧便可以解决大问题。比如当微型车模运行到展品边缘时,就会看到很多展台外面的场景。外面的场景多变,很难通过数据来表征这些变化。怎么办?
作者就用了一个字:切!
将输入图像的下面四分之一切出来,送入神经网络进行训练,就有效化解了上述的问题。
▲ 展品上的轨道,以及在展品边缘看到的图像
为了能够进行车辆定位以及检测其它干扰车辆,在手机Pixcel 4上的Neural Core Edge TPU上运行了ssd_mobilenet_edgetpu模型,这是来自TensorFlow 目标检测模型库。每帧检测时间仅用6.6毫秒,在实时应用中游刃有余。
为了是检测神经网络模型能够适应展品场景需要,作者同样使用了模拟器和真实场景中的数据来训练模型。为了提高检测鲁棒性,使用了Unreal Engine 4来随机生成物体和背景。使用 labelImg 工具进行对样本进行了手动标注。
▲ 进行目标识别的数据库
使用神经网络最大的工作量是在准备训练数据集合。之后的网络搭建和训练则非常容易,分分钟搞定。检查一下,网络识别交通标志的效果还是很不错的。
▲ 网络识别效果
最后一个工作,就是需要将网络部署到手机平台上。这需要借助于TensorFlow Lite 将模型进行个数转换,并在Android下编写相应的Python脚本来进行部署。
作者还设想着,通过视觉SLAM能够为他们的这个展品增加车辆全程定位。真的是一个手机平台可以练习很多算法。
▲ 视觉SLAM定位
为了实现一个顶着手机运行的微型车膜,作者也是费力不断改进机械结构,经过了五代设计最终得到了一个合理的机械设计。可以将手机、控制板、电池、电机等集成在一个小巧乖致的微型车模中。
▲ 第一代设计
▲ 第二代设计
▲ 第三代设计
▲ 第四代设计
▲ 第五代设计
下面给出了嵌入在车体内不的控制板、电机、电池等配件。
▲ 底层运动控制单片机板
▲ (左)屏蔽罩和电机,(右)电源插座、电源开关、电机启动按钮、电机重置按钮、开发板状态 LED、电机状态 LED
▲ 3000mAh 锂离子电池(左)与 18650 锂离子电池(右)
的确,一辆小小的微型车膜,包括了计算机视觉、深度学习、传感器融合、定位、路径规划、控制、系统集成等多个学科内容。通过这个环节几乎可以将一个专业所需要学习的多个课程集成在一起。这不,在Udacity平台上,还真的提供了无人驾驶汽车纳米学位项目供希望获得全面培训的工程师和学生学习。