Pixelopolis,由TensorFlow-Lite构建的来自Google I/O的自动驾驶汽车演示

2020-07-14 13:42:46

Pixelopolis是一个互动装置,展示了由TensorFlow Lite提供动力的自动驾驶微型汽车。每辆车都配备了自己的Pixel手机,它使用摄像头来探测和理解来自周围世界的信号。为了感知车道、避免碰撞和阅读交通标志,这款手机使用了运行在像素神经核心上的机器学习,该核心包含一个版本的Edge TPU。要使这样的项目成为可能,边缘计算实现是一个很好的选择。由于延迟,使用基于云的方法处理视频和检测对象要困难得多。如果可以,在设备上操作要快得多。用户可以通过“车站”(手机上运行的应用程序)与Pixelopolis互动,在那里他们可以选择汽车将行驶到的目的地。汽车将导航到目的地,在旅途中,这款应用程序会显示汽车的实时流媒体视频--这使得用户可以看到汽车看到和检测到的东西。正如你可能从下面的gif中注意到的,Pixelopolis也有内置的多语言支持。使用移动设备上的前置摄像头,我们可以在设备上实时执行车道保持、定位和目标检测。不仅如此,在我们的情况下,Pixel 4还通过USB-C控制发动机和其他电子元件,因此汽车可以在检测到其他汽车时停止,或者在需要时以正确的交互方式转弯。如果您对技术细节感兴趣,本文的其余部分将介绍汽车的主要组件,以及我们制造它的过程。我们探索了多种车道保持模式。作为基线,我们使用CNN来检测每一帧中的交通线,并在每一帧中调整方向盘,效果很好。我们通过添加LSTM并使用多个以前的帧改进了这一点。在进行了更多的实验之后,我们遵循了与本文类似的模型体系结构。NET_IN=输入(形状=(80,120,3))x=λ(λx:x/127.5-1)(NET_IN)x=Conv2D(24,(5,5),STRIDES=(2,2),填充=";相同";,激活=';ELU';)(X)x=CONV2D(36,(5,5),STRIDES=(2,2),填充=";)(X)x=Conv2D(48,(5,5),跨度=(2,2),填充=";相同";,激活=';elu';)(X)x=Conv2D(64,(3,3),填充=";相同";,激活=';elu';)(X)x=Conv2D(64,(3,3),填充=";)(X)x=Dropout(0.3)(X)x=Flatten()(X)x=Dense(100,ACTIVATION=';ELU';)(X)x=Dense(50,ACTIVATION=';ELU&39;)(X)x=Dense(10,ACTIVATION=';ELU';)(X)NET_OUT=Dense(1,Name=';NET_OUT';)(X)model=Model(。

在我们能够使用这个模型之前,我们需要找到一种方法来收集要训练的汽车的图像数据。问题是我们当时没有车或跑道可用。因此,我们决定使用模拟器。我们选择了来自Udacity的Unity和这个模拟器项目来进行车道保持数据采集。通过在赛道上设置多个路点,汽车机器人能够行驶到不同的位置,还可以为我们收集数据。在该模拟器中,我们每50ms采集一次图像数据和转向角。由于我们在模拟器中进行所有数据收集,因此需要在场景中创建各种环境,因为我们希望我们的模型能够处理不同的照明、背景环境和其他噪声。我们将这些变量添加到场景中:随机HDRI球体(具有不同的旋转和曝光值)、随机亮度和颜色以及随机汽车。仅使用模拟器训练ML模型并不意味着它将在真实世界中实际工作,至少不是第一次尝试。汽车在轨道上跑了几秒钟,然后由于各种原因就冲出了轨道。后来,我们发现我们只使用直道来训练模型。为了解决此不平衡数据问题,我们添加了各种形状的曲线。在修复了不平衡的数据集后,汽车开始正确导航弯道。我们开始为赛车创造更复杂的情况,比如在赛道上添加多个交叉点。我们还添加了更多路由路径,使汽车能够处理这些新情况。然而,我们马上遇到了新的问题,那就是汽车在十字路口转弯时撞上了侧轨,因为它看到了轨道外的一些随机物体。我们测试了许多解决方案,并选择了最简单、最有效的解决方案。我们只裁剪了图像的底部1/4,并将其提供给车道保持模型,然后将模型输入大小调整为120x40,效果非常出色。我们使用对象检测有两个目的。一个是本地化。每辆车都需要通过检测其环境中的对象来知道它在城市中的位置(在本例中,我们检测城市中的交通标志)。另一个目的是检测其他汽车,这样它们就不会相撞。对于目标探测器模型的选择,已经有很多模型可供选择