Keras深度学习实战——车辆转弯角度预测
Posted 盼小辉丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras深度学习实战——车辆转弯角度预测相关的知识,希望对你有一定的参考价值。
Keras深度学习实战——车辆转弯角度预测
0. 前言
自动驾驶已经引发了各界的广泛关注,无人驾驶在快递等行业进入了落地阶段。在车辆行驶过程中,频繁发生的交通事故严重危害着乘车人的生命安全,自动驾驶车辆转弯角度控制的研究,能有效避免交通事故的发生。在本节,我们将构建神经网络模型根据提供的图像预测汽车需要转弯的角度。
1. 数据集与模型分析
1.1 模型分析
为了根据提供的图像预测汽车需要转弯的角度,我们建立转向角预测模型的策略如下:
- 获取具有道路图像和相应需要转弯角度的数据集
- 预处理图像
- 通过预训练
VGG16
模型处理输入图像以提取图像特征 - 建立神经网络模型执行回归任务以预测转弯角度(转弯角度是要预测的连续值)
1.2 数据集分析
我们用于训练预测转向角模型的数据集中大约包含 45500
张图像,并且每张图片都包含标记的转向角度记录。该数据集可从以下链接下载:https://pan.baidu.com/s/1WGguoIvzmb252QGT2tx0Dw,提取码: kpj9
。
2. 车辆转弯角度预测
2.1 数据集读取与预处理
导入相关的软件包,读取数据集,将图像及其对应的转向角(弧度制)存储到列表中:
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy import pi
import cv2
x = []
y = []
train_batch_pointer = 0
test_batch_pointer = 0
with open(DATA_FILE, 'r') as f:
for line in f:
image_name, angle = line.split()
image_path = os.path.join(DATA_FOLDER, image_name)
x.append(image_path)
angle_radians = float(angle) * (pi / 180)
y.append(angle_radians)
y = np.array(y)
创建训练和测试数据集,并使用直方图统计训练和测试数据集中的输出转向角值:
split_ratio = int(len(x) * 0.8)
train_x = x[:split_ratio]
train_y = y[:split_ratio]
test_x = x[split_ratio:]
test_y = y[split_ratio:]
fig = plt.figure(figsize=(10,7))
plt.hist(train_y,bins=50,histtype='step',color='r')
plt.hist(test_y,bins=50,histtype='step',color='b')
plt.title("Steering Wheel angle in train and test")
plt.xlabel("Angle")
plt.ylabel("Bin count")
plt.show()
我们删除训练数据集图片中前 100
行中的像素,因为它们与道路图像关系并不大,然后将生成的图像输入到预训练的 VGG19
模型。为了简单起见,作为示例,我们仅处理数据集中的前 12000
张图像,以便能够更快地训练模型(为了获得性能更加优异的模型,可以使用全部数据集,同时利用数据增强扩充数据集):
x = []
y = []
for i in range(12000):
im = cv2.imread(train_x[i])
# 删除图像中前100行中的像素
im = im[100:, :, :]
im = vgg19.preprocess_input(im.reshape(1, im.shape[0], im.shape[1], 3))
vgg_im = vgg19_model.predict(im)
x.append(vgg_im)
y.append(train_y[i])
x1 = np.array(x)
x1 = x1.reshape(x1.shape[0], x1.shape[2], x1.shape[3], x1.shape[4])
y1 = np.array(y)
2.2 模型构建预训练
利用预训练模型提取的图像特征,构建微调模型预测转向角度:
model = Sequential()
model.add(Flatten(input_shape=(x1.shape[1], x1.shape[2], x1.shape[3])))
model.add(Dense(512))
model.add(BatchNormalization())
model.add(ReLU())
model.add(Dropout(0.5))
model.add(Dense(128))
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(64))
model.add(BatchNormalization())
model.add(Dropout(0.3))
model.add(Dense(1, activation='linear'))
model.summary()
输出层使用线性激活函数,该模型的简要模型信息如下:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 28672) 0
_________________________________________________________________
dense (Dense) (None, 512) 14680576
_________________________________________________________________
batch_normalization (BatchNo (None, 512) 2048
_________________________________________________________________
re_lu (ReLU) (None, 512) 0
_________________________________________________________________
dropout (Dropout) (None, 512) 0
_________________________________________________________________
dense_1 (Dense) (None, 128) 65664
_________________________________________________________________
batch_normalization_1 (Batch (None, 128) 512
_________________________________________________________________
dropout_1 (Dropout) (None, 128) 0
_________________________________________________________________
dense_2 (Dense) (None, 64) 8256
_________________________________________________________________
batch_normalization_2 (Batch (None, 64) 256
_________________________________________________________________
dropout_2 (Dropout) (None, 64) 0
_________________________________________________________________
dense_3 (Dense) (None, 16) 1040
_________________________________________________________________
batch_normalization_3 (Batch (None, 16) 64
_________________________________________________________________
dropout_3 (Dropout) (None, 16) 0
_________________________________________________________________
dense_4 (Dense) (None, 1) 17
=================================================================
Total params: 14,758,433
Trainable params: 14,756,993
Non-trainable params: 1,440
_________________________________________________________________
将构建完成的模型进行编译,并训练模型。在训练过程中,将训练数据集除以训练数据的最大值,以进行归一化:
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(x1/np.max(x1), y1,
batch_size=32,
epochs=10,
validation_split=0.1,
verbose=1)
模型训练过程中,训练数据和测试数据的损失值变换情况如下:
2.3 模型测试
接下来,我们应该根据训练完成的模型预测汽车的转向角度。我们将输入数据集除以训练数据的最大值,以将其缩放到 0 - 1
之间,该模型根据图像样本得到的转向角预测如下:
k=-450
model.predict(x1[k].reshape(1,4,14,512)/np.max(x1))
plt.subplot(211)
im = cv2.imread(train_x[k])
plt.imshow(cv2.cvtColor(im[100:,:,:], cv2.COLOR_BGR2RGB))
plt.title('Predicted angle: , actual angle:'.format(str(round(model.predict(x1[k].reshape(1,4,14,512)/np.max(x1))[0][0],2)), str(round(y1[k],2))))
k=-550
model.predict(x1[k].reshape(1,4,14,512)/np.max(x1))
plt.subplot(212)
im = cv2.imread(train_x[k])
plt.imshow(cv2.cvtColor(im[100:,:,:], cv2.COLOR_BGR2RGB))
plt.title('Predicted angle: , actual angle:'.format(str(round(model.predict(x1[k].reshape(1,4,14,512)/np.max(x1))[0][0],2)), str(round(y1[k],2))))
plt.show()
需要注意的是,由于自动驾驶属于安全关键应用,在将模型应用于实践中时,应当在多种光照条件下对模型进行测试。
相关链接
Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(2)——使用Keras构建神经网络
Keras深度学习实战(7)——卷积神经网络详解与实现
Keras深度学习实战——交通标志识别
以上是关于Keras深度学习实战——车辆转弯角度预测的主要内容,如果未能解决你的问题,请参考以下文章