• 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    创建训练和测试数据集,并使用直方图统计训练和测试数据集中的输出转向角值:

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    转向角统计
    我们删除训练数据集图片中前 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    数据预处理

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出层使用线性激活函数,该模型的简要模型信息如下:

    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
    _________________________________________________________________
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    将构建完成的模型进行编译,并训练模型。在训练过程中,将训练数据集除以训练数据的最大值,以进行归一化:

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    模型训练过程中,训练数据和测试数据的损失值变换情况如下:

    模型训练过程检测

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    模型测试
    需要注意的是,由于自动驾驶属于安全关键应用,在将模型应用于实践中时,应当在多种光照条件下对模型进行测试。

    相关链接

    Keras深度学习实战(1)——神经网络基础与模型训练过程详解
    Keras深度学习实战(2)——使用Keras构建神经网络
    Keras深度学习实战(7)——卷积神经网络详解与实现
    Keras深度学习实战——交通标志识别

  • 相关阅读:
    【Qt之QMap】介绍及示例
    java字符串数组中是否包含元素,忽略大小写
    Spring Boot、Nacos配置文件的优先级
    VMware虚拟机linux无法使用ifconfig的解决方法
    java建造者模式
    JavaScript_Pig Game切换当前玩家
    解决 MISCONF Redis is configured to save RDB snapshots 异常详解
    【组成原理 九 CPU】
    洛谷题解 | AT_arc069_b [ABC055D] Menagerie
    【Spring】Spring的创建和使用手术刀剖析
  • 原文地址:https://blog.csdn.net/LOVEmy134611/article/details/125831045