自动驾驶技术—如何训练自己的神经网络来驾驶汽车

神经网络,特别是深度学习的研究最近在计算机视觉的领域和计算机科学的其他重要领域取得了许多突破。在这些技术的应用中,自动驾驶技术十分火热。几乎每个人都听说过它,许多大公司都为此投入巨额资金。由人工智能的控制汽车能够带你去任何地方,让你不必再把时间浪费在开车上。

在这篇文章中,我会告诉你怎样训练一个使用前面道路图像的进行自动驾驶的神经网络。你可以在Jupyter Notebook找到所有的代码和每一步的解释,也可以访问下面链接阅读详细的文章。

代码:https://github.com/normandipalo/self-driving-car-beta/blob/master/self-drivng-car-beta-clean.ipynb 文章:https://github.com/normandipalo/self-driving-car-beta/blob/master/selfdrivingcar _latex.pdf

深层神经网络,特别是在计算机视觉领域,对象识别等领域,往往有数以百万的参数。这意味着它们运算量非常大,设备需要的很大的运行内存。如果你是学术实验室或大型公司,并且拥有数据中心和大量GPU,那没问题。但是,如果你只有一个汽车上需要实时驱动的嵌入式系统,那么问题就大了。这就是为什么我会追求轻量,快速和高效的特定架构。我使用的主要模型是SqueezeNet架构。这是一个最近在个别参数的对象识别任务上有卓越表现的模型,并且权重仅仅几兆字节。我建议阅读这篇文章的同时看着代码,这已经足够详细到让那个你可以进一步了解这些概念。

我们首先需要一个数据集,这是大多数深度学习项目的核心。幸运的是,有几个现成的数据集可以让我们使用。我们主要需要我们最需要的是记录在数小时的司机驾驶在不同环境(高速公路,城市)图像。你可以在Jupyter Notebook中找到一个。拥有数据集后,我们需要对数据进行预处理,让算法更好的完成工作。例如,我们当然无法将整个数据集加载到RAM中,因此我们需要设计一个生成器,这是Python中非常有用的一种函数,它允许动态加载一小批数据并预处理它,然后将它直接输送到我们的神经网络中。为了帮助网络更好地适应各种天气和光线条件,我们可以随机修改图像的亮度。此外,我们可以裁剪掉图像的顶部,因为它主要包含天空和其他与驾驶信息无关的信息。这样有助于提升计算速度。

NVIDIA模型

预处理后,我们可以开始设计网络。我使用了Keras使它易读性非常好。第一个模型是NVIDIA模型,一个很经典的CNN。经过一些卷积层从我们的图像中提取视觉特征,我们有一个扁平的层然后充分连接这些层,输出一个实数值:我们的转向角。你可以在代码中看到网络的详细信息。

如果你在笔记本电脑上训练这个网络,尤其是在没有GPU加速的情况下,你可能需要一整天的时间进行训练。经过相对较小的训练,你可以看到验证损失显著降低,因此网络正在学习如何驾驶。

该架构可以在笔记本电脑上实时工作,具有约50万个参数。但是我们可以做得更好,甚至更小的网络。那就需要SqueezeNet。虽然原本的架构已经很“苗条”了,但仍然我通过降低卷积特征的数量进行进一步缩小。这个架构的核心是Fire模块,这是一个非常精巧的过滤模块,它可以使用非常少的参数来提取语义上的重要特征,并且输出量很小。你可以在代码中看到网络实现的细节。最后一层也被修改,因为我们的任务是在图像空间中的回归,而网络最初被设计用于对象识别。

Fire模块

使用与以前相同的训练设置,我们可以看到训练更快,网络在大约十次迭代之后实现了更好的表现。

你可能会说,在这里我们仅基于当前帧来预测转向角,而驾驶本身是动态任务取决于前一帧。那么现在我在这里展示的最后一个模型:循环模型。我向SqueezeNet的第一个密集连接层之一的输出添加了一个复发层:网络将连续5帧作为输入,然后复发层输出一个实数值,即转向角。令人惊讶的是,与以前所看到的架构相比,这种新架构的表现虽然与人类决定如何引导的方式更为紧密相关,但没有比先前所见的架构更好。因此,无内存和无状态的架构可以非常好地驱动,从单独的帧独立计算转向角。

终于,我们网络在一个小视频中模拟驾驶。它显示实时驾驶汽车,他完全能够通过它看到的街道来驾驶汽车。

脚本获取链接:https://github.com/SullyChen/Autopilot-TensorFlow

我们的网络在驾驶汽车

我们已经训练了我们的自动驾驶汽车,使用了相当简单的架构和技术来引导,并取得了显着的成果。我希望你从这篇文章中学到了一两招。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

silverlight向服务器post数据类

using System; using System.Net; using System.Windows; using System.Windows.Co...

1995
来自专栏谈补锅

记录C#常用的代码片段

using Newtonsoft.Json; using Newtonsoft.Json.Linq;

962
来自专栏xingoo, 一个梦想做发明家的程序员

windows程序设计-第四章 system1.c

/*---------------------------------------------------- SYSMETS1.C -- System M...

24010
来自专栏闻道于事

商城项目整理(三)JDBC增删改查

商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: 1 create table TEST.GOODS_TABL...

5525
来自专栏互联网开发者交流社区

WinForm之窗体应用程序

1873
来自专栏Pulsar-V

C#下各种获取时间的姿势

直接贴代码吧 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21...

3246
来自专栏c#开发者

C# : row-clickable GridView and get and set gridview rows using JavaScript

Complete C# code: ---------------- using System; using System.ComponentModel; ...

3016
来自专栏菩提树下的杨过

遍历文件夹所有文件(示例)

//要引用 using System.Collections.Specialized; public StringCollection GetAllFile...

2159
来自专栏飞扬的花生

日志帮助类

 1.代码 using System; using System.Collections.Generic; using System.Linq; using S...

1919
来自专栏菩提树下的杨过

MSDN官方的ASP.Net异步页面的经典示例代码

示例1.演示异步获取一个网址的内容,处理后显示在OutPut这一Label上 using System; using System.Web; using S...

2015

扫码关注云+社区