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深度学习实战——交通标志识别

猜你喜欢

转载自blog.csdn.net/LOVEmy134611/article/details/125831045
今日推荐