一、理论知识
参考NVIDIA的论文 https://arxiv.org/pdf/1604.07316.pdf
这个实验的目的是使用卷积神经网络(CNN)将从前向摄像机得到的原始图像映射成自动驾驶汽车的驾驶命令。
这个过程需要先采集数据,原理是这样的:
一共有左、中、右3个摄像头,负责采集视频数据。在训练后我们只需要中间的摄像头采集的数据用于驾驶决策,那为什么需要3个采集训练数据呢,因为左右两个采集特定偏离中心的变化图像,这样只有来自人类驾驶员的数据是不足以用来训练的;网络还必须学习如何从任何错误中恢复,否则该汽车就将慢慢偏移道路。因此训练数据还扩充了额外的图像,这些图像显示了远离车道中心的偏离程度以及不同道路方向上的转动。左右两个摄像头采集负责特定偏离中心的变化图像,用这个方法来扩充额外图像数据
下面是训练系统框图。训练用图像被送入一个卷积神经网络,然后计算一个被预测出的转向命令。这个被转向命令会与该图像的期望命令相比较,卷积神经网络的权重就会被调整以使其实际输出更接近期望输出。
一旦训练完成,网络就能够从中摄像机的视频图像中生成转向命令
图像数据需要从RGB转成YUV格式,传入一个9 层网络架构的神经网络,其中包括一个归一化层、5 个卷积层和 3 个完全连接的层。
二、无人驾驶模拟环境搭建
这里我们使用Udacity的自动驾驶汽车模拟器,下载地址是 https://github.com/udacity/self-driving-car-sim
下载后运行程序选择Training Mode,就可以开始模拟驾驶了,玩得差不多了,就可以录制训练数据了
决定录制的时候在训练模式下点Record进行录制,第一次需要选择用于存放3个摄像头的图片与driving_log.csv数据
这是中间摄像头的图像
找两张分别是左、右摄像头的图像
好吧,看得出来我开得不好,其实我是让他帮我开的
三、训练程序
数据预处理
csv文件的各个字段含义是:center,left,right,steering,throttle,reverse,speed,我们需要的训练数据(center,left,right)和标签数据(steering)都在里面
#加载训练数据并将其分解为训练和验证集
def load_data(self):
#从csv读取数据
data_df = pd.read_csv(os.path.join(os.getcwd(), self.data_path, 'driving_log.csv')
,names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])
X = data_df[['center', 'left', 'right']].values
y = data_df['steering'].values
#随机划分训练集和测试集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=self.test_size, random_state=0)
return X_train, X_valid, y_train, y_valid
图片的处理
首先需要取一部分图片进行增强处理(这里是60%的概率)
进行增强处理流程是:先平均概率随机取一个摄像头的图片,如果取得的不是中间的摄像头,对于的steering angle也进行相应的调整
#从中心、左或右随机选择一个图像,并进行调整
def choose_image(self, center, left, right, steering_angle):
choice = np.random.choice(3)
if choice == 0:
return self.load_image(left), steering_angle + 0.2
elif choice == 1:
return self.load_image(right), steering_an