无人车到底是怎样一步一步学会开车的?
与人类用双眼去观察路面、用手去操控方向盘类似,无人车用一排摄像机去感知环境,用深度学习模型指导驾驶。大体来说,这个过程分为五步:
- 记录环境数据
- 分析并处理数据
- 构建理解环境的模型
- 训练模型
- 精炼出可以随时间改进的模型
如果你想了解无人车的原理,那这篇文章不容错过。
记录环境数据
一辆无人车首先需要具备记录环境数据的能力。
具体来说,我们的目标是得到左右转向角度的均匀分布。这倒也不难操作,可以以顺时针和逆时针方向在测试场地内绕圈的方式实现。这种训练有助于减少转向偏差,避免长时间驾驶后汽车从道路一边慢慢漂移到道路另一边的尴尬情境。
此外,以慢速(例如每小时10英里)行驶也有助于在转弯时记录平滑的转向角,在这里驾驶行为被分类为:
- 直线行驶:0<=X<0.2
- 小转弯:0.2<=X<0.4
- 急转:X>=0.4
- 恢复到中心
其中,X为转向角,r为旋转半径(单位为米),计算转向角的公式为X=1/r。上面提到的“恢复到中心”在数据记录过程中很重要,它帮助车辆学会在即将撞上,马路崖子时回到车道中心。这些记录数据保存在driving_log.csv中,其中每一行都包含:
- 文件路径到镜头前中央相机图像
- 文件路径到前左相机图像
- 文件路径到前右相机图像
- 转向角
在记录环境数据的过程中,我们需要记录约100000个转向角的图像,以便提供足够的数据训练模型,避免因样本数据不足导致的过拟合。通过在数据记录过程中定期绘制转向角直方图,可以检查转向角是否为对称分布。
分析处理数据
第二步是为构建模型分析和准备刚刚记录的数据,此时的目标是为模型生成更多的训练样本。
下面这张图片由前中央相机拍摄,分辨率为320*160像素,包含红色、绿色和蓝色的channel。在Python中,可以将其表示为一个三维数组,其中每个像素值的范围在0到255之间。
司机视线以下的区域和两边的车道标志一直是自动驾驶技术中研究的重点。这两部分可以使用Keras中的Cropping2D裁剪图像,减少输入到模型中的噪声。
我们可以用开源的计算机视觉库OpenCV从文件中读取图像,然后沿垂直轴翻转,生成一个新的样本。OpenCV非常适合自动驾驶汽车用例,因为它是用C++语言编写的。像倾斜和旋转这样的其他图像增强技术,也有助于产生更多的训练样本。
此外,还需要通过乘以-1.0翻转其转向角。
之后,可以用Numpy开源库将图像重新塑造成一个三维数组,方便下一步的建模。
构建理解环境的模型
图像数据搞定后,我们需要为无人车构建理解环境信息的深度学习模型,从记录的图像中提取特征。
具体来说,我们的目标是将包含153600像素的输入图像映射到包含单个浮点值的输出。英伟达之前提出的模型的每一层都提供了特定的功能,作为基础架构效果应该不错。
英伟达模型相关论文地址:
https://arxiv.org/pdf/1604.07316v1.pdf
之后,我们需要将三维数组规范化为单位长度,防止模型中较大的值偏差。注意我们将其除以255.0,因为这是一个像素的最大可能值。
还要适当减少人类视野以下的车前场景和车前上方图像的像素,以减少噪音。
之后,我们需要将车道标记等三维数组进行卷积,提取关键特征,这些信息对于预测转向角至关重要。
我们想让开发的模型能够驾驭任何道路类型,因此需要用dropout减少过拟合。
最后,我们需要将转向角输出为float。
训练模型
构建了模型后,我们需要训练模型自己学习开车了。
从技术角度上讲,现阶段的目标是尽量准确地预测转向角。在此,我们将损失定义为预测和实际转向角之间的均方误差。
从driving_log.csv中随机抽取样例减少顺序偏差。
可以将样本的80%设为训练集,20%设为验证集,这样我们就能看到模型在预测转向角时的精确程度。
之后,需要用Adam(自适应矩估计)将平均平方误差最小化。与梯度下降相比,Adam的一大优势是借用了物理中的动量概念收敛到全局最优值。
最后,我们用生成器来适应模型。由于图像数量庞大,我们无法一次性将整个训练集输入到内训中。因此,需要用生成器批量生产图像以进行训练。
随时间精炼模型
完善模型是我们的最后一步,需要让模型的准确性和稳健性随着时间的推移而提高。我们的实验采用不同的体系结构和超参数,观察其对减少均方误差的影响。什么样的模型最好?不好意思,这个问题没有一个统一的答案,因为大部分改进都需要牺牲其他的一些东西,比如:
- 用更好的图形处理单元(GPU)减少训练时间,需要注意这样会增加成本
- 通过降低训练时间来降低学习速度,增加最佳值收敛的概率
- 通过使用灰度图像减少训练时间,需要注意这样会损失红色、绿色和蓝色通道提供的颜色信息
- 通过较大的batch size提高梯度估计的准确性,这会以牺牲使用的内存为代价
- 每个阶段都选用大量样例来减少损失的波动
概览全文,其实可以发现,自动驾驶汽车开发的过程,也是我们了解计算机视觉和深度学习的优势和局限性的过程。
我坚信,未来是属于自动驾驶的。