深入浅出自动驾驶(四):模拟自动驾驶

简单的介绍下如何用卷积神经网络来实现模拟自动驾驶,事实上并不难,还是挺浅显易懂的。

Udacity专门为这门课程开发了一款小游戏,如图所示,类似于极品飞车吧,还挺好玩的,就是难度小了点:)

Paste_Image.png

首先操作这辆汽车,类似于玩赛车游戏,过程中会事实记录你的照片,例如上图,以及照片对应的车辆角度。而后你的训练数据就是照片,目标就是角度。最后运行你的训练模型,得出车辆的角度,小车就自己跑起来拉。

最困难的并非模型的选择,卷积模型已经比较成熟了,而且有很多现成的模型可以选择,最困难的是在图像的预处理和数据的剪裁。以下分为图片识别、模型和数据选取分别来叙述。

一 图像预处理

人眼能完美的识别图像,但计算机能,显然不行的,图片在计算机里由像素组成,表现为一个数组,如下图所示:

Paste_Image.png

而且图片长成这个样子

Paste_Image.png

除了道路外还有其它信息,用什么才是用来判断角度的呢?是树木吗?还是天空,或者是土地,等等。虽然我们有深度学习网络,但也应该对图片进行一些剪裁。

1 翻转

我们的图片数据并不多,总共4000多幅,那么可以把图片做一下左右翻转,角度也同时翻转一下,这样就有8000多的数据了。

Paste_Image.png

2 亮度

为了模拟现实中的真实情况,我们可以给图像加上亮度。同时,也可以让神经网络真正识别出有用的部分,这里有个例子,据说一次神经网络识别猫狗大赛,最后发现神经网络其实是通过背景来识别的,为了避免这种情况发生,我们需要加上一些噪音。

Paste_Image.png

3 蒙板

同样,为了避免背景噪音干扰

Paste_Image.png

4 缩放、裁剪

原图片太大了,包含的信息过多,直接使用的话会对机器性能造成非常大的负担,这里我把图片缩小了等比例缩小了四倍,而且事实上对最后结果并没有很大影响。

Paste_Image.png

当然,还有很多其它的处理方法,比如用kera的图片预处理模块通过一张图片衍生出许多图片,如下图所示,都是第一张图片的变种。

Paste_Image.png

二 卷积模型

NVIDIA在论文中给出了一个自动驾驶的模型,论文地址

https://arxiv.org/abs/1604.07316

Paste_Image.png

有5层卷积,每一层卷积都是对图片递进的识别,比如第一层识别一个点,第二层某个元器件,第三层就是一个车门,第四层识别车辆,第五层识别路上的车辆....等等,之类。这里就不再详述,在第二篇也有详细介绍,大家可以去查查。

把数据塞到这个模型中,好拉,这样就玩起来了,开始训练,训练完后导入真实环境,小车跑起来。但并非如此简单,数据集本身存在一些问题,下面详细叙述。

三 数据集的迭代

首先用代码看了下角度的分布,结果角度分布是这样的

Paste_Image.png

0角度这里一柱擎天:)其它角度基本看不到。车辆直行的太多,导致0角度太多,这个数据是不能直接拿来训练的,否则车辆会一直直行。

而后用代码做了一个random,0角度只读取一部分,将数据集调整成这个样子

Paste_Image.png

好了,这样看起来就比较漂亮了,比较均匀,还有点类似正态分布,我们就采取这个测试集训练,训练完后正式跑模型,结果车撞墙了,如下图所示

Paste_Image.png

在普通地面上都能正常行驶,但很不幸,撞到了黑墙上面,当时就想,是不是图片信息不够明确,为啥普通路段能行驶,黑墙就挂了?于是我灵机一动,将图片做了下HSV变换,

代码:cv2.cvtColor(image,cv2.COLOR_RGB2HSV)

图片:

HSV

而后继续训练,跑模型,完美通过黑路路段。但是,在一个尖锐的拐弯处,冲出弯道,到水里去了

Paste_Image.png

回头看了下角度的分布,发现角度普遍比较小

Paste_Image.png

所以又想是不是能够加入一些剧烈转弯的数据,于是我又运行模拟器,生成了一些角度比较大的数据,如下图所示

Paste_Image.png

然后,跑起来!于是,我们的小车就能够完整的跑起来拉。

作者:方老司

链接:https://www.jianshu.com/p/1fed10cb0379

來源:

著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(深入浅出自动驾驶(四):模拟自动驾驶)