可以在这里找到代码。它可能比文章更新;

介绍

这是自动驾驶系列的第二篇文章。如果想知道为什么我要分享这个以及更多关于我的经历,请阅读这篇博客

目标

使用简单的卷积神经网络对交通标志进行分类。

机器学习

想象一下,你需要建立一个识别手写体数字的程序。

这是5。但也可以说是3。

你会用什么规则来判断它是3还是5呢?

研究人员决定向计算机展示成千上万的例子,并试图通过经验来解决问题,而不是试图挑选所有规则并构建一个非常复杂的程序。这是机器学习的开始。

机器学习的主要问题之一是特征提取。尽管我们向计算机展示了成千上万的例子,但我们仍然需要告诉他应该关注哪些特征。对于复杂问题,这还不够好。

深度学习模型绕过了这一点。它们自己学习应该关注哪些特征。

深度学习

为了简洁起见,我不打算深入深度学习的数学解释。我花了大约20个小时来理解这些概念并使用它们。相反,我会尝试解释深度学习背后的原因。如果你想要更深入,我会发布一些我用过的视频和讲座。

作为人类,识别物体似乎是一项非常简单的任务。我们几乎不用做任何努力,至少不是有意识的。但在我们真正了解我们正在看的东西之前,我们的大脑实际上已经完成了很多工作。

在20世纪50年代后期,两位著名的神经生理学家,David Hubel和Torsten Wiesel,在一只猫身上进行了实验,以显示视觉皮层中的神经元是如何工作的。

首先,他们表明附近的细胞处理来自附近视野的信息,形成地形图。此外,他们的工作确定具有相似功能的神经元被组织成列,微小的计算机器将信息传递到大脑的更高区域,并逐渐形成视觉图像。

大脑简单地结合低级特征,如基本形状,曲线,并构建更复杂的形状。

深度学习卷积神经网络是类似的。它首先识别低级特征,然后学习识别并组合这些特征以学习更复杂的模式。这些不同层次的特征来自网络的不同层。

深度学习是一个迷人的领域,我希望给你一个足够清晰的介绍。我鼓励你观看关于这个非常棒的斯坦福大学课程

如果你更喜欢阅读,我推荐 Goodfellow,Bengio和Courville的

交通标志项目

如果我们想要自动驾驶车辆,检测和分类交通标志是一个必须解决的问题。

我们将使用的数据集是在线提供的德国交通标志数据集

它共包含超过50,000张图像,分为43个不同的类别:速度限制(speed limits),危险曲线(dangerous curves),湿滑路面(slippery road)……以下是其中一些:

该数据集在几年前曾用于竞赛。比赛的最佳结果正确地猜出了99.46%的标志。相比之下,人类表现确定为98.84%。是的,机器比人类准确率更高,因为它能更好地处理最困难的情况,例如速度限制标志的模糊图像,这可能被误认为是不同的速度限制。

数据增量

在我们开始构建深度学习网络之前,让我们分析一下数据。

这是不同类的分布:

正如您所看到的,类之间存在太大差异。我们将创建一些数据来平衡输入数量,并减少网络可能对某些类别产生的偏差。它还将帮助我们向网络提供更多数据。

一种简单的方法是将图像图像旋转一定的角度。通过旋转5度,-5度,10度和-10度,我们已经可以将某些类的输入增加了五倍。

这是我们在此操作后获得的分布。

数据更加平衡,每个类至少有500个图像。

网络结构

本文的这一部分详细介绍了网络架构。如果您不熟悉深度学习,可以跳到结果部分。

第一层是卷积核大小为3*3,步长为1,SAME填充,深度为64的CNN。

第二层和第三层是宽度为512全连接层。

最后一层是一个宽度为43(类的数量)的全连接层。

我使用了Adam优化器及其默认参数,因为它目前被认为是最有效的。

我使用了250的批量大小和100个训练周期(epoch)。

我尝试添加更多的卷积网络,但它们没有改善结果并且大大增加了计算时间。没有必要添加它们,因为我们使用的图片之间的统计不变性很低。它们中的大多数已经中心化并在标志周围进行了裁剪。

我因为标志的形状和颜色总体上非常简单,使用了一个中等大小的网络,但是全连接层很宽,因为标志的形状,颜色和整体外观有一些变化。

我没有使用超过100个周期,因为之后准确性没有提高。我还希望保持网络清晰,因此在AWS上训练它不会花费太多时间,并且结果令人满意。

结果

到目前为止,我只授权自己查看验证准确性。当我高于99%且对结果感到满意时,我决定针对测试集进行计算。

最终验证准确率: 0.9938

最终测试准确率: 0.9110

验证集和测试集之间的8%下降表明我的模型过拟合了。

以下列出了一些技巧可以避免过拟合:

  • L2正规化
  • 提前终止
  • Dropout

查看混淆矩阵还可以帮助我们查看错误最多的类别:

如你所见,大多数错误位于左上角。这些都是速度限制。似乎模型可以检测到它是速度限制,但很难识别标志中值之间的差异。

附录

我测试了从互联网上下载的一些随机标志,看看模型会如何反应:

最后两个标志在我们的数据集中。

前三个的标志被正确识别,置信度为99+%

第四个标志(显然)识别错误,80%的置信度作为禁止进入标志。

第五个标志(显然)以99%的置信度错误识别为速度限制。该模型应该做得更好。

思考

从零深度学习的知识到能够实现简单的小型网络,我花了大约20个小时。几个小时后,我得到了令人满意的结果。

深度学习真的令人印象深刻。我迫不及待地想看看我还能在这个领域学到多少东西。

下次我们将讨论行为克隆。我们将在模拟器中驾驶汽车,看看我们的深度学习模型能够从中学到如何自动驾驶。听起来很刺激吧?!敬请关注!

此外,请随时发表评论,提出问题并提出建议。