CNN训练模型自动驾驶仿真

1. 摘要

本文讲解如何根据开源项目[1]和Udacity的自动驾驶仿真工具[2],训练一个CNN自动驾驶模型,并在仿真器中看到自己模型的自动驾驶效果。

2. 自动驾驶仿真原理

自动驾驶仿真的“硬件”原理图如下:

在这里插入图片描述

从原理图中,我们需要知道,人在开车的时候,有检测系统采集了如下参数

  • 三个摄像机采集的图像:Left,Center,Right
  • 转向角,速度,油门,刹车

摄像机的图像,代表有监督学习的输入;转向角,速度,油门,刹车作为有监督学习的输出

下面讲解自动驾驶仿真的具体步骤,本文的系统为Win-10。

3. 收集自动驾驶数据

在[2]中下载最新的模拟器,下载beta-simulator-windows.zip,解压后,双击打开beta_simulator.exe,直接点play按钮,进入模拟器,如下。

在这里插入图片描述

选择训练模式“TRAINING MODE”,进入训练模式,如下图所示。

在这里插入图片描述

此时,可以用键盘的上下左右按键来控制小车的移动,相当于驾驶员在驾驶小车。

但是,我们控制小车,并不会记录数据。要记录我们驾驶小车的数据,需要按R键,选择数据存储目录,并按Select按钮结束,如下图所示。

在这里插入图片描述

接下来,我们用键盘的上下左右按键来控制小车的移动,就当玩游戏。从这时开始,模拟器就记录小车的移动。

在驾驶模拟小车时,务必好好操作,不要撞墙或驶出边界,因为最终模型学习的就是你的假设经验。

如果想停止驾驶,需要按两次R键,等待模拟器将记录的数据都dump到数据存储目录,最终我们得到模拟器输出的一个csv文件driving_log.csvIMG文件夹,文件夹中记录了三个摄像机采集的各个时刻的图像。

至此,数据获取完毕,接下来用这些数据训练模型。

4. 训练模型

用git clone [1]中的项目,并执行如下步骤:

(1) 在项目中创建文件夹data,并将模拟器输出的csv文件driving_log.csv复制到data目录下

(2) 安装Anaconda[4],并根据项目[1]中的yml文件创建虚拟环境,执行如下命令

conda env create -f environments.yml 

打开environments.yml文件,可以看到创建的虚拟环境名为car-behavioral-cloning
这个步骤下载安装一些module会比较费时,若出现安装失败的情况,可能是网络环境的问题,需要把创建的虚拟环境car-behavioral-cloning删除,再重新执行conda env create -f environments.yml命令,笔者也是创建了好几次才创建成功的。

(3)训练模型

python model.py

打开model.py可以看到,项目中的模型是一个由5层CONV加4个隐层组成的简单CNN模型。我们可以修改这个文件,训练自己的模型。

    model = Sequential()
    model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))
    model.add(Conv2D(24, 5, 5, activation='elu', subsample=(2, 2)))
    model.add(Conv2D(36, 5, 5, activation='elu', subsample=(2, 2)))
    model.add(Conv2D(48, 5, 5, activation='elu', subsample=(2, 2)))
    model.add(Conv2D(64, 3, 3, activation='elu'))
    model.add(Conv2D(64, 3, 3, activation='elu'))
    model.add(Dropout(args.keep_prob))
    model.add(Flatten())
    model.add(Dense(100, activation='elu'))
    model.add(Dense(50, activation='elu'))
    model.add(Dense(10, activation='elu'))
    model.add(Dense(1))

5. 仿真运行

(1)在项目[1]中运行模型

python drive.py model.h5

drive.py中,其实是启动了一个socketio的server,与仿真器通信(仿真器是一个socketio的client)。

从这个py文件中,我们可以看到,要控制仿真器中小车的运动,需要向仿真器发送如下两个参数

  • steering_angle:转向角
  • throttle:油门
def send_control(steering_angle, throttle):
    sio.emit(
        "steer",
        data={
            'steering_angle': steering_angle.__str__(),
            'throttle': throttle.__str__()
        },
        skip_sid=True)

在小车运动过程中,会通过’telemetry’ event发送小车当前的转向角、油门、车速,以及当前摄像机拍摄的照片到drive.py中如下代码

#registering event handler for the server
@sio.on('telemetry')
def telemetry(sid, data):
    if data:
        # The current steering angle of the car
        steering_angle = float(data["steering_angle"])
        # The current throttle of the car, how hard to push peddle
        throttle = float(data["throttle"])
        # The current speed of the car
        speed = float(data["speed"])
        # The current image from the center camera of the car
        image = Image.open(BytesIO(base64.b64decode(data["image"])))

仿真器发送过来的数据中,只有小车处于中央位置摄像机拍摄的图像,如下所示

在这里插入图片描述

这就是模型的输入(当然作者还对图像做了简单的预处理,比如去掉顶部的蓝天和图像下方的车头)。

因为在真实仿真中,只能看到一张图像。而在数据收集步骤中,能看到三张图像,所以在训练模型的过程中,作者在代码中只随机取出三张图像中的一张作为训练集。

(2)打开仿真器,双击打开beta_simulator.exe,就能看到小车被算法运行起来了。

参考

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值