准确率98%的深度学习交通标志识别是如何做到的?

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 我们可以创建一个能够对交通标志进行分类的模型,并且让模型自己学习识别这些交通标志中最关键的特征。在这篇文章中,我将演示如何创建一个深度学习架构,这个架构在交通标志测试集上的识别准确率达到了98%。

1.jpeg

交通标志是道路基础设施的重要组成部分,它们为道路使用者提供了一些关键信息,并要求驾驶员及时调整驾驶行为,以确保遵守道路安全规定。如果没有交通标志,可能会发生更多的事故,因为司机无法获知最高安全速度是多少,不了解道路状况,比如急转弯、学校路口等等。现在,每年大约有130万人死在道路上。如果没有这些道路标志,这个数字肯定会更高。

当然,自动驾驶车辆也必须遵守交通法规,因此需要_识别_和_理解_交通标志。

从传统上来说,可以使用标准的计算机视觉的方法来对交通标志进行检测和分类,但同时也需要耗费相当多的时间来手工处理图像中的重要特征。现在,我们引入深度学习技术来解决这个问题。我们可以创建一个能够对交通标志进行分类的模型,并且让模型自己学习识别这些交通标志中最关键的特征。在这篇文章中,我将演示如何创建一个深度学习架构,这个架构在交通标志测试集上的识别准确率达到了98%。

项目设置

数据集可分为训练集、测试集和验证集,具有以下特点:

  • 图像为32(宽)×32(高)×3(RGB彩色通道)
  • 训练集由34799张图片组成
  • 验证集由4410个图像组成
  • 测试集由12630个图像组成
  • 共有43个种类(例如限速20公里/小时、禁止进入、颠簸路等等)

此外,我们将使用Python 3.5与Tensorflow来编写代码。

图像及其分布

你可以在下图中看到数据集中的一些示例图像,图像的标签显示在相应行的上方。其中一些非常暗,稍后我们会调整它们的对比度。

2.png

训练集中各个种类图像的数量明显不平衡,如下图所示。某些种类的图片少于200张,而其他的则有2000多张。这意味着我们的模型可能会偏向于代表性过高的种类,特别是当它的预测无法确定时。我们稍后会看到如何使用数据增强来缓解这个问题。

3.png

预处理步骤

我们首先要对图像应用两个预处理步骤:

灰度化

把三通道的图像转换为单通道灰度图像,如下图所示。

4.png

归一化

我们通过用数据集平均值减去每个图像并除以其标准偏差来确定图像数据集分布的中心。这有助于提高模型在处理图像时的一致性。生成的图像如下所示:

5.png

模型的架构

交通标志分类器架构的灵感来自于Yann Le Cun的这篇论文。我们在他的基础上做了一些调整,并创建了一个模块化的代码库,它允许我们尝试不同的过滤器大小、深度和卷积层的数量,以及完全连接层的维度。为了向Le Cun致敬,我们称这样的网络为EdLeNet :)。

我们将主要尝试5x5和3x3大小的过滤器(又名内核),并且卷积层的深度从32开始。 _EdLeNet_的3x3架构如下所示:

6.png

该网络由3个卷积层组成,内核大小为3x3,下一层的深度加倍,使用ReLU作为激活函数,每一层的后面是最大2×2的池操作。最后3层完全连接,最后一层能产生43个结果(可能的标签总数),使用SoftMax作为激活函数。这个网络使用附带Adam优化器的迷你批次随机梯度下降算法进行训练。我们编写了高度模块化的基础代码,这使得我们能够_动态_创建模型,示例代码片段如下:

mc_3x3 = ModelConfig(EdLeNet, "EdLeNet_Norm_Grayscale_3x3_Dropout_0.50", [32, 32, 1], [3, 32, 3], [120, 84], n_classes, [0.75, 0.5])
mc_5x5 = ModelConfig(EdLeNet, "EdLeNet_Norm_Grayscale_5x5_Dropout_0.50", [32, 32, 1], [5, 32, 2], [120, 84], n_classes, [0.75, 0.5])

me_g_norm_drpt_0_50_3x3 = ModelExecutor(mc_3x3)
me_g_norm_drpt_0_50_5x5 = ModelExecutor(mc_5x5)

ModelConfig包含了模型的相关信息,比如:

  • 模型的函数(例如:EdLeNet
  • 模型的名称
  • 输入的格式(例如:灰度等级为[32,32,1]),
  • 卷积层的配置[过滤器大小、起始深度、层数],
  • 完全连接层的大小(例如:[120,84])
  • 种类的数量
  • dropout(丢弃)百分比值[p-conv,p-fc]

ModelExecutor负责_训练_、_评估_、_预测_,以及生成_激活_映射的可视化效果。

为了更好地隔离模型,并确保它们不是全部都在相同的Tensorflow图下,我们使用下面这个比较有用的结构:

self.graph = tf.Graph()
with self.graph.as_default() as g:
    with g.name_scope( self.model_config.name ) as scope:

...

with tf.Session(graph = self.graph) as sess:

这样,我们就能为_每个_模型创建单独的图,并确保没有混入变量、占位符。这为我解决了很多麻烦。

我们实际上是以卷积深度为16开始的,但在深度为32的时候获得了更好的结果并最终确定了这个值。我们还比较了彩色与灰度图像、标准和归一化的图像,最后发现灰度图往往优于彩色图。不幸的是,我们在3x3或5x5的模型上最高勉强达到了93%的测试准确率,而后来一直没有达到这个准确率。你可以在下图中看到针对不同模型配置的一些指标图。

7.png
在颜色归一化图像上的模型性能

8.png
在灰度归一化图像上的模型性能

Dropout(丢弃)算法

为了提高模型的可靠性,我们需要使用dropout算法,这个算法是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。这样可以防止模型过度拟合。Dropout算法最早是由深度学习领域的先驱Geoffrey Hinton提出来的。要更好地理解背后地动机,务必阅读一下这篇论文

在论文中,作者根据层类型的不同应用不同概率值进行丢弃。因此,我决定采用类似的方法,定义两个级别的dropout,一个用于卷积层,另一个用于完全连接层:

p-conv: probability of keep weight in convolutional layer
p-fc: probability of keeping weight in fully connected layer

此外,随着进入到更深层次的网络,作者逐渐开始采用更积极的dropout值。所以我也决定这样:

p-conv >= p-fc

这样做的原因是,我们把网络看作是一个漏斗,当我们深入到层中时,希望逐渐收紧它:我们不想在开始的时候丢弃太多的信息,因为其中的一些相当有价值。此外,在卷积层中应用MaxPooling的时候,我们已经失去了一些信息。

我们尝试过不同的参数,但最终结果是_p-conv = 0.75_和_p-fc = 0.5_,这使得我们可以使用3x3的模型在归一化灰度图上实现97.55%的测试集准确率。有趣的是,我们在验证集上的准确率达到了98.3%以上:

Training EdLeNet_Norm_Grayscale_3x3_Dropout_0.50 [epochs=100, batch_size=512]...

[1]    total=5.222s | train: time=3.139s, loss=3.4993, acc=0.1047 | val: time=2.083s, loss=3.5613, acc=0.1007
[10]    total=5.190s | train: time=3.122s, loss=0.2589, acc=0.9360 | val: time=2.067s, loss=0.3260, acc=0.8973
...
[90]    total=5.193s | train: time=3.120s, loss=0.0006, acc=0.9999 | val: time=2.074s, loss=0.0747, acc=0.9841
[100]    total=5.191s | train: time=3.123s, loss=0.0004, acc=1.0000 | val: time=2.068s, loss=0.0849, acc=0.9832
Model ./models/EdLeNet_Norm_Grayscale_3x3_Dropout_0.50.chkpt saved
[EdLeNet_Norm_Grayscale_3x3_Dropout_0.50 - Test Set]    time=0.686s, loss=0.1119, acc=0.9755

9.png
引入dropout算法后,在灰度归一化图像上的模型性能

上面的图表显示,这个模型更为_平滑_。我们已经在测试集上实现了准确率超过93%这个目标分数。下面,我们将探索一些用于处理每一个点的技术。

直方图均衡化

直方图均衡化是一种计算机视觉技术,用于增强图像的对比度。由于一些图像受到了低对比度(模糊、黑暗)的影响,因此我们将通过应用OpenCV的对比度限制自适应直方图均衡来提高可视性。

我们再次尝试了各种配置,并找到了最好的结果,测试精度达到了97.75%,在3x3的模型上使用以下dropout值:_p-conv = 0.6_,_p-fc = 0.5_。

Training EdLeNet_Grayscale_CLAHE_Norm_Take-2_3x3_Dropout_0.50 [epochs=500, batch_size=512]...
[1]    total=5.194s | train: time=3.137s, loss=3.6254, acc=0.0662 | val: time=2.058s, loss=3.6405, acc=0.0655
[10]    total=5.155s | train: time=3.115s, loss=0.8645, acc=0.7121 | val: time=2.040s, loss=0.9159, acc=0.6819
...
[480]    total=5.149s | train: time=3.106s, loss=0.0009, acc=0.9998 | val: time=2.042s, loss=0.0355, acc=0.9884
[490]    total=5.148s | train: time=3.106s, loss=0.0007, acc=0.9998 | val: time=2.042s, loss=0.0390, acc=0.9884
[500]    total=5.148s | train: time=3.104s, loss=0.0006, acc=0.9999 | val: time=2.044s, loss=0.0420, acc=0.9862
Model ./models/EdLeNet_Grayscale_CLAHE_Norm_Take-2_3x3_Dropout_0.50.chkpt saved
[EdLeNet_Grayscale_CLAHE_Norm_Take-2_3x3_Dropout_0.50 - Test Set]    time=0.675s, loss=0.0890, acc=0.9775

尽管做了直方图均衡化,但有些图像仍然非常模糊,并且有些图像似乎是失真的。在我们的测试集中没有足够的图像示例来改进模型的预测。另外,虽然97.75%的测试准确率已经相当不错,但我们还有另外一个杀手锏:数据增强。

数据增强

我们在早些时候曾经发现,43个种类的数据明显不平衡。然而,它似乎并不是一个棘手的问题,因为即使这样,我们也能够达到非常高的准确度。我们也注意到测试集中有一些图像是失真的。因此,我们将使用数据增强技术来尝试:

  1. 扩展数据集,并在不同的照明条件和方向上提供其他图片
  2. 提高模型的通用性
  3. 提高测试和验证的准确性,特别是对失真的图像

我们使用了一个名为imgaug的库来创建扩展数据。我们主要应用仿射变换来增强图像。代码如下:

def augment_imgs(imgs, p):
    """
    Performs a set of augmentations with with a probability p
    """
    augs =  iaa.SomeOf((2, 4),
          [
              iaa.Crop(px=(0, 4)), # crop images from each side by 0 to 4px (randomly chosen)
              iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}),
              iaa.Affine(translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}),
              iaa.Affine(rotate=(-45, 45)), # rotate by -45 to +45 degrees)
              iaa.Affine(shear=(-10, 10)) # shear by -10 to +10 degrees
          ])
    
    seq = iaa.Sequential([iaa.Sometimes(p, augs)])
    
    return seq.augment_images(imgs)

虽然种类数量的不平衡可能会在模型中引入偏差,但我们决定在现阶段不解决这个问题,因为这会导致数据集数量的增加,延长训练时间。相反,我们决定为每个种类增加10%的图像。我们的新数据集如下。

12.png

图像的分布当然不会发生显著的变化,但是我们确实对图像应用了灰度化、直方图均衡化,以及归一化等预处理步骤。我们训练2000次,附加dropout算法(_p-conv = 0.6_,_p-fc = 0.5_),并在测试集上达到97.86%的准确率:

[EdLeNet] Building neural network [conv layers=3, conv filter size=3, conv start depth=32, fc layers=2]
Training EdLeNet_Augs_Grayscale_CLAHE_Norm_Take4_Bis_3x3_Dropout_0.50 [epochs=2000, batch_size=512]...

[1]    total=5.824s | train: time=3.594s, loss=3.6283, acc=0.0797 | val: time=2.231s, loss=3.6463, acc=0.0687
...
[1970]    total=5.627s | train: time=3.408s, loss=0.0525, acc=0.9870 | val: time=2.219s, loss=0.0315, acc=0.9914
[1980]    total=5.627s | train: time=3.409s, loss=0.0530, acc=0.9862 | val: time=2.218s, loss=0.0309, acc=0.9902
[1990]    total=5.628s | train: time=3.412s, loss=0.0521, acc=0.9869 | val: time=2.216s, loss=0.0302, acc=0.9900
[2000]    total=5.632s | train: time=3.415s, loss=0.0521, acc=0.9869 | val: time=2.217s, loss=0.0311, acc=0.9902
Model ./models/EdLeNet_Augs_Grayscale_CLAHE_Norm_Take4_Bis_3x3_Dropout_0.50.chkpt saved

[EdLeNet_Augs_Grayscale_CLAHE_Norm_Take4_Bis_3x3_Dropout_0.50 - Test Set]    time=0.678s, loss=0.0842, acc=0.9786

这是迄今为止最好的结果!!!

13.gif

但是,看看训练集上的损失指标,0.0521,我们很有可能还有一些改进的空间。未来,我们将执行更多的训练次数,我们会报告最新成果的。

结论

本文探讨了如何将深度学习应用于分类交通标志,其中包含了各种预处理和归一化技术,以及尝试了不同的模型架构。我们的模型在测试集上达到了接近98%的准确率,在验证集上达到了99%的准确率。你可以在这里访问代码库。

文章原标题《Recognising Traffic Signs With 98% Accuracy Using Deep-Learning》,作者:Eddie Forson,译者:夏天,审校:主题曲。

文章为简译,更为详细的你容,请查看原文

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
6月前
|
机器学习/深度学习 存储 Serverless
【动手学深度学习】深入浅出深度学习之利用神经网络识别螺旋状数据集
【动手学深度学习】深入浅出深度学习之利用神经网络识别螺旋状数据集
104 27
|
6月前
|
机器学习/深度学习 自然语言处理
利用深度学习技术改进自然语言处理中的命名实体识别
命名实体识别(Named Entity Recognition, NER)在自然语言处理领域扮演着重要角色,但传统方法在处理复杂语境和多样化实体时存在局限性。本文将探讨如何利用深度学习技术,特别是基于预训练模型的方法,来改进命名实体识别,提高其在现实场景中的性能和适用性。
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
102 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
6月前
|
机器学习/深度学习 计算机视觉 异构计算
构建高效图像分类器:深度学习在视觉识别中的应用
【5月更文挑战第30天】 在计算机视觉领域,图像分类任务是基础且关键的一环。随着深度学习技术的兴起,卷积神经网络(CNN)已成为图像识别的强有力工具。本文将探讨如何构建一个高效的图像分类器,着重分析CNN架构、训练技巧以及优化策略。通过实验对比和案例研究,我们揭示了深度学习模型在处理复杂视觉数据时的优势和挑战,并提出了改进方向,以期达到更高的准确率和更快的处理速度。
|
4月前
|
机器学习/深度学习 TensorFlow 数据处理
使用Python实现深度学习模型:医学影像识别与疾病预测
【7月更文挑战第24天】 使用Python实现深度学习模型:医学影像识别与疾病预测
68 4
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
使用Python实现深度学习模型:智能城市交通管控与优化
【8月更文挑战第17天】 使用Python实现深度学习模型:智能城市交通管控与优化
159 0
|
4月前
|
机器学习/深度学习 算法 BI
基于深度学习网络的USB摄像头实时视频采集与手势检测识别matlab仿真
**摘要:** 本文介绍了使用MATLAB2022a实现的基于GoogLeNet的USB摄像头手势识别系统。系统通过摄像头捕获视频,利用深度学习的卷积神经网络进行手势检测与识别。GoogLeNet网络的Inception模块优化了计算效率,避免过拟合。手势检测涉及RPN生成候选框,送入网络进行分类。系统架构包括视频采集、手势检测与识别、以及决策反馈。通过GPU加速和模型优化保证实时性能,应用于智能家居等场景。
|
5月前
|
机器学习/深度学习 算法
深度学习在医学影像识别中的应用与挑战
传统的医学影像识别技术在面对复杂疾病和图像异常时存在一定局限性,而深度学习作为一种新兴的人工智能技术,为医学影像识别带来了革命性的变革。本文将介绍深度学习在医学影像识别中的应用现状,并探讨应用中面临的挑战和未来发展方向。
55 3
|
6月前
|
机器学习/深度学习 数据安全/隐私保护
深度学习在医学影像识别中的应用与挑战
传统的医学影像识别方法在面对复杂的医学图像时存在一定局限性,而深度学习技术的快速发展为医学影像识别带来了新的希望。本文探讨了深度学习在医学影像识别中的应用现状,分析了其面临的挑战,并展望了未来发展的趋势。
|
5月前
|
机器学习/深度学习 算法 数据可视化
基于googlenet深度学习网络的睁眼闭眼识别算法matlab仿真
**算法预览图展示睁眼闭眼识别效果;使用Matlab2022a,基于GoogLeNet的CNN模型,对图像进行分类预测并可视化。核心代码包括图像分类及随机样本显示。理论概述中,GoogLeNet以高效Inception模块实现眼部状态的深度学习识别,确保准确性与计算效率。附带三张相关图像。**