基于python深度学习的交通标志图像识别设计与实现,卷积神经网络(CNN)作为主要架构

摘要

随着自动驾驶技术的发展,交通标志的识别与理解在智能交通系统中扮演着越来越重要的角色。本文设计并实现了一个基于深度学习的交通标志图像识别系统,通过对交通标志识别基准数据集的分析与处理,建立了一套完整的图像识别流程。使用Python及其相关库(如Keras、OpenCV、NumPy等)对交通标志图像进行预处理。通过自定义的图像处理函数,对原始图像进行直方图均衡化,以增强图像的对比度,并将图像统一调整为48x48的大小,以便于后续的模型输入。同时,利用标签信息,从文件路径中提取出每个图像对应的类别标签,并进行独热编码处理,以适应深度学习模型的需求。在模型建立方面,我们采用了卷积神经网络(CNN)作为主要架构。该模型包括多个卷积层、池化层和全连接层,旨在提取图像的特征并进行分类。通过搭建Sequential模型,并使用ReLU激活函数,保证了模型的非线性表达能力。为了防止过拟合,模型中引入了Dropout层,并配置了合适的学习率和优化器(SGD),以提高训练的稳定性和收敛速度。在训练过程中,使用了数据增强技术,通过旋转、平移、剪切和缩放等手段,扩展了训练数据集,从而提高模型的泛化能力。模型在训练集上进行了30个epoch的训练,并通过验证集监控训练过程中的性能变化,利用Learning Rate Scheduler动态调整学习率,确保模型在训练后期的细致优化。训练完成后,我们在测试集上评估了模型的性能。经过测试,模型的准确率达到较高水平,表明其在交通标志识别任务上的有效性和可靠性。最终,通过可视化工具展示了训练与验证过程中的损失和准确率变化,清晰呈现了模型的学习曲线和收敛情况。

本项目通过深度学习技术成功实现了对交通标志的自动识别,为未来智能交通系统的构建提供了技术支持。未来的工作可以进一步探索模型的轻量化设计与实时识别能力,以适应实际应用场景的需求。此外,结合更多种类的交通标志数据与其他传感器数据,将为深度学习在自动驾驶领域的应用开辟更广阔的前景。

数据集介绍

数据集里面的图像具有不同大小,光照条件,遮挡情况下的43种不同交通标志符号,图像的成像情况与你实际在真实环境中不同时间路边开车走路时看到的交通标志的情形非常相似。训练集包括大约39,000个图像,而测试集大约有12,000个图像。图像不能保证是固定的尺寸,标志不一定在每个图像中都是居中。每个图像包含实际交通标志周围10%左右的边界。

图像亮度直方图均衡化 (Histogram equalization)处理

从上面的代表性图像可以看出,图像在亮度上(illumination)有很大的差异不同。他们也有不同的大小。所以,我们来编写一个函数,在HSV颜色空间中进行直方图均衡,并将图像调整为成一样的标准大小。

"直方图均衡化"是图像处理领域中利用图像直方图对比度进行调整的方法。

这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用, 而且它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。 但是这种方法的一个缺点是它可能会增加背景杂质的对比度并且降低有用信息的对比度。

图像大小的修改 (Image Resizing)处理

由于图像具有不同的形状和大小,因此我们必须对图像进行归一化(normalize)处理以便可以决定模型的輸入。
在这个范例我们选择使用48x48的图像大小。你也可以尝试使用比较小的图像比如32x32或24x24看看是不是也可得到类似的准确率。

图像处理并转换成numpy ndarray处理

让我们预处理所有的训练图像并以numpy数组来存储到档案系统中。过程中我们还会从图像的档案路径中获取图片的标签。我们会将标签(label)数据进行one-hot编码:


try:with h5py.File('X.h5') as hf:X, Y = hf['imgs'][:], hf['labels'][:]print("Loaded images from X.h5")except(IOError, OSError, KeyError):print("Error in reading X.h5. Processing all images...")root_dir = 'GTSRB/Final_Training/Images/'imgs = []labels = []all_img_paths = glob.glob(os.path.join(root_dir, '*/*.ppm')) np.random.shuffle(all_img_paths) for img_path in all_img_paths:try:img = preprocess_img(io.imread(img_path))label = get_class(img_path)imgs.append(img) labels.append(label) if len(imgs)%1000 == 0:print("Processed {}/{}".format(len(imgs), len(all_img_paths))) except(IOError, OSError):print('missed', img_path)passX = np.array(imgs, dtype='float32') Y = np.eye(NUM_CLASSES, dtype='uint8')[labels] with h5py.File('X.h5', 'w') as hf:hf.create_dataset('imgs', data=X)hf.create_dataset('labels', data=Y)

模型构建

现在我们来定义我们的模型架构。我们将使用具有6个卷积层的前馈网络,然后是全连接的隐藏层。我们也将在两者之间使用Dropout层来防止网络"过拟合(overfitting)"。

在训练模型之前,我们需要将模型配置为学习算法并进行编译。我们需要指定:

  • loss: 我们要优化的损失函数。我们不能使用MSE,因为它是不连续的数值。因此,我们使用:categorical_crossentropy
  • optimizer: 我们使用标准随机梯度下降(Stochastic gradient descent)与涅斯捷罗夫动量(Nesterov momentum)
  • metric: 由于我们正在处理一个分类问题,评价标准是accuracy

训练 (Training)

现在,我们的模型已经准备好了。在训练期间,我们的模型将进行迭代批量训练,每批次的训练资料的大小为batch_size。对于每批次,模型将会计算出梯度(gradient),并自动更新网络的权重。对所有训练集的一次迭代被称为一次的循环(epoch)。训练通常会一直进行到损失收敛于一个常数。

我们将增加一些功能到我们的训练设定:

  • Learning rate scheduler: 随着训练循环的次数逐渐增加的过程中对权重调整的学习率进行衰减通常有助于让模型学习更好
  • Model checkpoint: 我们将比对每个训练循环的验证准确度并只保存模型表现最好的模型。这对深度学度来说是很有用的设定,因为我们的网络可能在一定数量的训练循环后开始过拟合(overfitting),但是我们需要在整个训练过程中将表现最好的模型保存下来。

这些设定不是必须的,但它们的确可以提高模型的准确性。这些功能是通过Keras的callback功能来实现的。callback是一组函式,将在训练过程的特定阶段被应用,比如将训练结束。 Keras提供内置的学习速率调度(learning rate scheduling )和模型检查点功能(model checkpointing)。

 

验证评估 (Evaluation)

加载测试数据并评估模型。训练出一个准确率达到97%的模型。与人类的平均表现相差不远了(98.84%)

y_pred = model.predict_classes(X_test)
acc = np.sum(y_pred==y_test)/np.size(y_pred)
print("Test accuracy = {}".format(acc))

图像增强 (Data Augmentation)

你可能会认为40,000图像是很多的图像。再想一想,我们的模型里有1,358,155个参数。这是训练图像的数量的40多倍。如果我们可以从现有的图像生成新的训练图像,这将是一个很好的方式来增加训练数据集的大小。直接使用keras的内置功能来完成图像增强 (Data Augmentation)。

from sklearn.model_selection import train_test_splitX_train, X_val, Y_train, Y_val = train_test_split(X, Y, test_size=0.2, random_state=42)datagen = ImageDataGenerator(featurewise_center=False, featurewise_std_normalization=False, rotation_range=10.,width_shift_range=0.1,height_shift_range=0.1,                             shear_range=0.1,zoom_range=0.2,)datagen.fit(X_train)

验证评估 (Evaluation)

通过图像增强 (Data Augmentation)后再训练的这个模型,在测试集上获得了98.7%的准确度。

以下列出一些可以尝试改进模型的东西:

  • 尝试不同的网络架构。尝试更深和更浅的网络。
  • 尝试添加BatchNormalization层到网络。
  • 尝试不同的权重初始化
  • 尝试不同的学习速度和时间表
  • 制作一个集成模型(ensemble models)
  • 尝试输入图像的正则化
  • 更好的数据增强(Data Augmentation)

总结

在这篇文章中有一些个人学习到的一些有趣的重点:

  • 对于图像的成像亮度通过直方图均衡化(Histogram equalization)可以轻松的调整
  • 深度学习的卷积网络真的对图像的识别有很好的效果
  • 通过使用Keras的callback可以对模型的训练过程有更多的监控与控制

 完整代码可联系我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464821.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js WebAPI黑马笔记(万字速通)

此笔记来自于黑马程序员,pink老师yyds 复习: splice() 方法用于添加或删除数组中的元素。 注意: 这种方法会改变原始数组。 删除数组: splice(起始位置, 删除的个数) 比如:1 let arr [red, green, b…

跟李沐学AI:BERT

什么是NLP中的迁移学习 使用预训练好的模型来抽取词、句子的特征:Word2Vec或者预训练好的语言模型。 使用预训练好的语言模型,一般不会再对语言模型进行微调,即不进行更新。 Word2Vec一般用于替代embedding层 但是Word2Vec往往忽略了时序…

【ArcGIS】绘制各省碳排放分布的中国地图

首先,准备好各省、自治区、直辖市及特别行政区(包括九段线)的shp文件: 通过百度网盘分享的文件:GS(2022)1873 链接:https://pan.baidu.com/s/1wq8-XM99LXG_P8q-jNgPJA 提取码&#…

Unity照片墙效果

Unity照片墙效果,如下效果展示 。 工程源码

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异&a…

计算机网络:网络层 —— 路由信息协议 RIP

文章目录 路由选择协议动态路由协议路由信息协议 RIPRIP 的重要特点RIP的基本工作过程RIP的距离向量算法RIP存在的问题RIP版本和相关报文的封装 路由选择协议 因特网是全球最大的互联网,它所采取的路由选择协议具有以下三个主要特点: 自适应&#xff1a…

算法:图的相关算法

图的相关算法 1. 图的遍历算法1.1 深度优先搜索1.2 广度优先搜索 2. 最小生成树求解算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 3. 拓扑排序4. 最短路径算法 1. 图的遍历算法 图的遍历是指从某个顶点出发,沿着某条搜索路径对图中的所有顶点进行访问且只访问次的…

PowerCat反弹Shell

PowerCat介绍 PowerCat是一个powershell写的tcp/ip瑞士军刀,可以看成ncat的powershell的实现,然后里面也 加入了众多好用的功能,如文件上传,smb协议支持,中继模式,生成payload,端口扫描等等。 …

A014-基于Spring Boot的家电销售展示平台设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

蓬勃发展:移动开发——关于软件开发你需要知道些什么

一、前言 移动开发一直都是软件开发领域中最有趣的领域之一,这是因为: 1、移动开发为“只有一个人”的开发团队提供了一个非常独特的机会,让他可以在相对较短的时间内建立一个实际的、可用的、有意义的应用程序; 2、移动开发也代…

RK3568平台开发系列讲解(字符设备驱动篇)注册字符设备

🚀返回专栏总目录 文章目录 一、字符设备初始化二、字符设备的注册和注销沉淀、分享、成长,让自己和他人都能有所收获!😄 📢注册字符设备可以分为两个步骤: 字符设备初始化字符设备的添加一、字符设备初始化 字符设备初始化所用到的函数为 cdev_init(…),在对该函数讲…

软件测试面试题个人总结

前面看到了一些面试题,总感觉会用得到,但是看一遍又记不住,所以我把面试题都整合在一起,都是来自各路大佬的分享,为了方便以后自己需要的时候刷一刷,不用再到处找题,今天把自己整理的这些面试题…

【Java语言】继承和多态(一)

继承 继承就是实现代码的复用;简而言之就是重复的代码作为父类(基类或超类),而不同的可以作为子类(派生类)。如果子类想要继承父类的成员就一定需要extends进行修饰(如:(…

关于我的编程语言——C/C++——第四篇(深入1)

(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过) 字符类型介绍 char…

Golang | Leetcode Golang题解之第535题TinyURL的加密与解密

题目: 题解: import "math/rand"type Codec map[int]stringfunc Constructor() Codec {return Codec{} }func (c Codec) encode(longUrl string) string {for {key : rand.Int()if c[key] "" {c[key] longUrlreturn "http:/…

群控系统服务端开发模式-应用开发-业务架构逻辑开发第一轮测试

整个系统的第一个层次已经开发完毕,已经有简单的中控,登录、退出、延迟登录时长、黑名单、数据层封装、验证层封装、RSA加解密、Redis等功能,还缺获取个人、角色按钮权限、角色菜单权限功能。角色按钮权限以及角色菜单权限等明后天开发&#…

「C/C++」C/C++的区别

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

PySpark 本地开发环境搭建与实践

目录 一、PySpark 本地开发环境搭建 (一)Windows 本地 JDK 和 Hadoop 的安装 (二)Windows 安装 Anaconda (三)Anaconda 中安装 PySpark (四)Pycharm 中创建工程 二、编写代码 …

筋膜枪哪个牌子好?深入探索国产筋膜枪品牌的口碑之选

​双11购物狂欢节即将来临,面对市面上琳琅满目的筋膜枪品牌,是否感到无从选择?别担心,我们为你带来了倍益康X Max、有品H1、飞利浦mini小金刚、SKG F7和Artsmith AS300这五款迷你筋膜枪的全方位测评,帮你找到性价比最高…

java.io.FileNotFoundException: Could not locate Hadoop executable: (详细解决方案)

1,当你在pycharm 上运行spark代码时候出现下面这个报错。 解决方案 我们要先去hadoop的bin目录下去看看里面是否有 winutils.exe 这个错误 就是缺少winutils.exe 所以报这个错误,把它放到你的hadoop的bin目录下问题就解决了