代码详解:轻巧!低廉!为自动驾驶汽车实施端到端学习

  • 日期:08-29
  • 点击:(804)


? n

全文为3507个单词,估计学习时间为7分钟

n n

n n

在过去的十年中,自动驾驶汽车标志着汽车行业的最大变化。所有主要的汽车公司都致力于开发自己的自动驾驶汽车。自动化技术将是一个价值高达7万亿美元的行业,并将在未来挽救许多生命。本文将深入介绍如何使用卷积神经网络开发自动驾驶汽车。

n n

开发方法

n n

在自动驾驶汽车方面,他们大多谈论激光雷达(LIDAR),雷达(RADAR),360度摄像机和昂贵的图形处理单元(GPU)。问题可以分为几个部分,例如车道检测,路径规划和控制。但在端到端自动驾驶汽车模型中,该模型仅使用汽车前置摄像头图像并预测转向角度。这里只使用最少的训练数据和计算,并且无论道路上是否有车道标记,汽车都会学会在路上行驶。

n n

这创造了一个轻巧且计算成本低廉的优秀模型,并为这种自动驾驶问题提供了端到端的解决方案。

n n

你为什么需要自动开车?

n n

*降低驾驶员成本。

n

*降低驾驶员压力。

n

*停车更有效率。

n

*节省时间,减少交通流量。

n

*减少事故。

n

*支持汽车共享。

n n

算法

n n

在下图中,该车配备了三个摄像头,全部安装在汽车挡风玻璃后面。他们及时录制视频并收集转向角数据。为了使汽车系统与形状无关,转向角数据设定为1/r,其中r表示以米为单位的转弯半径。使用1/r而不是r是为了防止在直线行驶时出现奇点。训练数据包含从视频中采样并与转向数据匹配的单个图像帧。

n n

n

CNN型端对端自动驾驶汽车

n n

上图显示在CNN模型中,视频作为图像帧被发送到CNN,并且模型输出预期的转向角。然后使用反向传播算法尝试最小化预期转向角和计算出的转向角之间的误差。

n n

n

测试CNN模型

n n

训练后,模型可以使用单个前置摄像头拍摄的视频图像预测转向角度。

n n

数据集驾驶汽车大约有45,000张图像,总计2.2G。该数据集由Sully Chen于2017年制作。数据记录在Rancho Palos Verdes和San Pedro,California。

n n n

网络架构该网络由9层组成,包括5个卷积层,1个归一化层和3个完全连接的层。

n n

n

网络架构

n n

将tensorflow导入为tf

n

导入scipy

n n

Def weight_variable(shape):

n

Initial=tf.truncated_normal(shape,stddev=0.1)

n

返回tf.Variable(初始)

n n

Def bias_variable(shape):

n

Initial=tf.constant(0.1,shape=shape)

n

返回tf.Variable(初始)

n n

Def conv2d(x,W,stride):

n

返回tf.nn.conv2d(x,W,strides=[1,stride,stride,1],padding='VALID')

n n

x=tf.placeholder(tf.float32,shape=[None,66,200,3])

n

Y_=tf.placeholder(tf.float32,shape=[None,1])

n n

X_image=x

n n

#first convolutional layer

n

W_conv1=weight_variable([5,5,3,24])

n

B_conv1=bias_variable([24])

H_conv1=tf.nn.relu(conv2d(x_image,W_conv1,2)+ b_conv1)

n n

#second卷积层

n

W_conv2=weight_variable([5,5,24,36])

n

B_conv2=bias_variable([36])

n n

H_conv2=tf.nn.relu(conv2d(h_conv1,W_conv2,2 + + b_conv2)

n n

#third卷积层

n

W_conv3=weight_variable([5,5,36,48])

n

B_conv3=bias_variable([48])

n n

H_conv3=tf.nn.relu(conv2d(h_conv2,W_conv3,2 + + b_conv3)

n n

#fourth卷积层

n

W_conv4=weight_variable([3,3,48,64])

n

B_conv4=bias_variable([64])

n n

n n

#fifth卷积层

n

W_conv5=weight_variable([3,3,64,64])

n

B_conv5=bias_variable([64])

n n

H_conv5=tf.nn.relu(conv2d(h_conv4,W_conv5,1 + + b_conv5)

n n

#FCL 1

n

W_fc1=weight_variable([1152,1164])

n

B_fc1=bias_variable([1164])

n n

H_conv5_flat=tf.reshape(h_conv5,[ - 1,1522)

n

H_fc1=tf.nn.relu(tf.matmul(h_conv5_flat,W_fc1)+ b_fc1)

n n

Keep_prob=tf.placeholder(tf.float32)

n

H_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)

n n

#FCL 2

n

W_fc2=weight_variable([1164,100])

n

B_fc2=bias_variable([100])

H_fc2=tf.nn.relu(tf.matmul(h_fc1_drop,W_fc2)+ b_fc2)

n n

H_fc2_drop=tf.nn.dropout(h_fc2,keep_prob)

n n

#FCL 3

n

W_fc3=weight_variable([100,50])

n

B_fc3=bias_variable([50])

n n

H_fc3=tf.nn.relu(tf.matmul(h_fc2_drop,W_fc3)+ b_fc3)

n n

H_fc3_drop=tf.nn.dropout(h_fc3,keep_prob)

n n

#FCL 3

n

W_fc4=weight_variable([50,10])

n

B_fc4=bias_variable([10])

n n

H_fc4=tf.nn.relu(tf.matmul(h_fc3_drop,W_fc4)+ b_fc4)

n n

H_fc4_drop=tf.nn.dropout(h_fc4,keep_prob)

n n

#Output

n

W_fc5=weight_variable([10,1])

n

n n

#linear

n

#y=tf.multiply((tf.matmul(h_fc4_drop,W_fc5)+ b_fc5),2)

n

## atan

n

y=tf.multiply(tf.atan(tf.matmul(h_fc4_drop,W_fc5)+ b_fc5),2)#scale atan输出

n n

该网络的第一层包括图像规范化。这是硬编码的,因为模型学习过程中没有涉及这部分。通过GPU处理进行标准化有助于加快速度。

n n

卷积层用于特征提取,其基于在卷积层配置上的实验之后的观察来选择。步幅卷积用于前三个卷积层,步长为2x2,内核大小为5x5。最后两层使用非阶梯卷积,内核大小为3x3。

n n

五个卷积层后面是三个完全连接的层,它们输出转弯半径的倒数。

n n

培训细节

n n

要训练卷积神经网络,必须选择输入图像帧。视频以10 FPS的速率在这里采样。这是因为较高的采样率会导致类似的图像包含结果中无用的信息。

n n

通过向图像框架添加转换,旋转等来增强图像,以便汽车了解如何从意外情况中恢复。从正态分布中随机选择图像增强扰动。正态分布的平均值为0,测量的标准误差是人类驾驶员测量的标准误差的两倍。

n n

可视化

n n

森林道路。可以在未铺砌的道路地图中看到特征地图激活,显示道路的轮廓。但是,在森林路线图中,模型找不到任何有用的信息,而且大部分都是嘈杂的。

n n

可以看出,CNN可以检测道路的轮廓,但是CNN从未被明确地训练以检测道路的轮廓。

n n

n

CNN特征图激活(左下角:第一层特征图激活。右下角:第二层特征图激活)

n n

n

CNN特征图激活(左下角:激活第一层特征图,主要包含噪声。右下角:激活第二层特征图,主要包含噪声。)

n n

件,例如未铺砌的道路,晴朗的天气和下雨天)。该模型能够在不清楚地标记数据的情况下检测道路的轮廓。

n n

问题的稳健性仍然需要改进,并且需要找到一种方法来确定鲁棒性并优化网络内流程的可视化。

n

n n

发表评论喜欢

n

让我们分享AI学习和发展的干货

n

欢迎来到完整平台AI垂直类媒体“阅读核心”

n n