项目实战:自动驾驶之方向盘操纵
项目介绍
基于汽车前方摄像头捕捉的画面信息, 调节汽车方向盘转动的方向和角度, 这是自动驾驶系统的核心任务之一。该系统主要运用深度神经网络来解决一个连续变量预测的问题, 而与分类识别的任务不同, 回归问题中神经网络输出的是一个连续的数值结果。通过这一项目的学习, 我们能够掌握深度神经网络在年龄判定、美颜指数计算等多种实际应用场景中的应用方法, 同时也能学到图像增强技术, 并显著提升网络性能。
思维导图
深度学习的核心要素在于数据,在汽车方向盘区域安装了一种类似于USB接口的装置,该设备能够检测出方向盘转动的具体角度是多少?同时,我们在车辆周围布置了三颗摄像头,分别安装于车辆左侧、正中和右侧位置,将这些摄像头获取的数据作为卷积神经网络的输入信息,卷积神经网络会产生相应的输出结果(这一结果可以根据输入的数据反馈出车辆行驶方向及转向幅度),将这一误差信息反向传输回去,持续地对这一模型进行优化训练以提高准确性

训练好网络后 ,我们只需要一个摄像头 ,安在车中间的摄像头 ,作为输入 。

CNN输出结果通过steering wheel interface被发送至steering wheel系统中(根据...传输的数据值控制steering wheel转向),从而实现自动驾驶功能。
网络结构详解:
源图像是一个分辨率分别为66×200像素且具有RGB通道(即^{3}_{@}^{66}_{×}^{200})的空间彩色图像;随后进行如下预处理流程:将像素值范围从整数型[0, 255]转换为浮点型[−1.0, 1.0]区间内的数据,并将其归一化至[−1.0, −1.999…]或[−1.4…, −1.7]区间内以适应深度学习算法的需求;接着通过三个连续应用的^{5}_{×}^{5}卷积层分别输出^{24}、^{36}和^{48}个特征图;随后再通过两个连续应用的^{3}_{×}^{3}卷积层生成大小分别为^{64}和^{64}特征图;随后执行展平操作将所有空间信息压缩为一维向量序列;最后经过四层全连接层降维得到大小为[1164, 110, 50, 1]的空间向量序列,并采用单神经元回归模型作为最终分类器(其中左边界标记赋予负值右边界标记赋予正值并附加一个标量数值以增强判别能力)。
以后再工作中遇到的问题,可以找一篇论文具体分析以下原理。
重点
自动驾驶之方向盘角度预测
学习目标
根据车载摄像头的画面,自动判断如何打方向盘:
- 采用基于端到端(end-to-end)技术的深度学习模型
其核心思想:无需从输入图像中 人工 提取中间特征(如 道路边界 处理、路面分割线识别等)。我们只需提供一幅待分析的道路场景图,在模型训练完成后的推理阶段即可直接输出相应的判断结果。
补充
遇到特殊情况的道路(如玻璃状的桥横跨江河),CNN可能会出现误判。
总结:
在真实的场景中是一个综合的结果;下图展示了数据收集系统:CAN bus作为汽车的控制总线应用;该设备能够将摄像头捕获的数据传输至硬盘存储。

参考论文
End to End Learning For Self-Driving Cars
补充项目中用到的代码
def get_model(shape):
'''
预测方向盘角度:以图像为输入,预测方向盘转动角度。
shape:输入图像尺寸,例如(128,128,3)
'''
model=Sequential()
model.add(Conv2D(24,(5,5),strides=(2,2),padding='valid',activation='relu',input_shape=shape))
model.add(Conv2D(36,(5,5),strides=(2,2),padding='valid',activation='relu'))
model.add(Conv2D(48,(5,5),strides=(2,2),padding='valid',activation='relu'))
model.add(Conv2D(64,(3,3),strides=(1,1),padding='valid',activation='relu'))
model.add(Conv2D(64,(3,3),strides=(1,1),padding='valid',activation='relu'))
model.add(Flatten()) #卷积和全连接层不能直接链接
model.add(Dense(1164,activation='relu'))
model.add(Dense(110,activation='relu'))
model.add(Dense(50,activation='relu'))
model.add(Dense(10,activation='relu'))
model.add(Dense(1,activation='linear'))
model.compile(optimizer=Adam(lr=0.01),loss='mean_squared_error')
return model
