原作者 Priya Dwivedi 编译 CDA 编译团队 本文为 CDA 数据分析师原创作品,转载需授权
自动驾驶已经迎来发展的热潮。自动驾驶车在行驶时,需要正确识别路上的交通标志。在这篇文章中,我们将教你如何使用深度学习,来训练汽车对交通信号进行分类,准确度高达 93% 。
完整的 Python 的代码已经分享在 GitHub 上。
用于练习的数据集由德国道路上常见的 43 种不同的交通标志组成。交通标志图像是从实际道路图像中裁剪出来的,因此处于不同的照明条件下,如下图所示。
共有 5 万张图片。图像为 32x32 像素,彩色。
任何建模练习的第一步应该是熟悉当中所涉及的数据。这里有 43 种不同的交通标志。数据分布不均匀,如下所示。有些标志对应只有 200 张图像,而有些则有超过1200 张图像。
数据集中的图像如下所示,我们可以看到图像很小,亮度不同,有些很模糊。此外,一些交通标志并不位于图像中心。
在将图像输入到神经网络之前,我将图像规范化,使像素值处于 0 和 0.5 之间。为此,我将所有像素值下降了 255 。这是因为当原始数据介于 0 和 1 之间时,神经网络表现更好。我决定使用彩色交通标志,而不是将其转换为灰色,因为人类会通过符号的颜色对其进行分类,机器也可以利用这点。最后,我将数据集分为训练集,验证集和测试集。测试集为模型没有接触过的 30% 样本。
在这个项目中,我决定使用 LeNet 架构,这是一个简单的卷积神经网络 (CNN) ,它在 MNIST 数据集中表现良好。如下所示,该模型具有两个卷积层,其后是两个最大的池层。第一个卷积层使用的图像大小为 5x5 ,过滤器深度为 6 。第二个卷积层还使用 5x5 的图像大小,但使用深度为 16 的过滤器。在卷积之后,我们平铺输出,然后使用两个完全连接的层。第一个有 120 个神经元,第二个有 84 个神经元。所有层之间都使用 RELU 激活。最后,我们使用 Softmax 的输出层来对 43 种的图像进行分类。
LeNet 架构在这个问题上出人意料地出色,在 30 个时间点中,对于验证样本准确性为 98% 。下图为精确性和错误性:
对模型从未接触过的测试样本时,准确度约为 93% ,这是非常可靠的。
如果我们对图像进行增强,改变亮度,旋转,平移等增加样本大小,则可以进一步提高准确率。
虽然神经网络可以是一个很好的学习设备,但它们通常被称为黑盒子。我们可以通过绘制其特征图(过滤器的输出)来了解神经网络的学习情况。从这些特征图,可以发现神经网络觉得有趣的图像特征。对于一个标志,也许内部网络的特征映射对符号的边界轮廓,或者符号的着色符号有强烈反应。
让我们看看第一个卷积层的 6 个不同的过滤器对于“禁止驶入”标志有何反应。这里亮点反映了神经元被激活的地方。可以看到,神经网络正聚焦于符号的圆形形状和中间的平行线。
与此相对,对于特征图中不含交通标志的天空图像。大多数的过滤器是黑色的,这意味着神经网络在该图像中没有识别出值得注意的标志。
这不是超级有趣!
德国交通标志数据集:
http : //benchmark.ini.rub.de/?section=gtsrb&subsection= dataset
GitHub完整代码:
https://github.com/priya-dwivedi/CarND/blob/master/CarND-Traffic-Sign-Classifier-P2/Traffic_Sign_Classifier_pd.ipynb
ref:
https://medium.com/towards-data-science/traffic-signs-classification-for-self-driving-car-67ce57877c33