首页 > 其他分享 >【课设】交通标志识别

【课设】交通标志识别

时间:2023-06-12 13:34:07浏览次数:36  
标签:layers ... 课设 keras data image 识别 交通标志

课 程 设 计  

交通标志识别  

姓    名    

院(系)    

专业班级    

学    号   

Gitee网址:机器学习课设: machine-learning用于机器学习课程的课程设计作业 (gitee.com)


摘要

在人工智能发展下,无人汽车愈发成为研发的焦点,而想要实现5级无人汽车自动驾驶,必须拥有自动识别交通标志的功能,而基于机器学习和人工智能的交通标志识别,要求更好的神经网络构建和数据处理速度,且车辆必须解释交通标识并错处相应的决策。本设计使用了CNN卷积神经网络,在kaggle在线平台上运行,使用德国交通标志数据集German Traffic Sign Recognition Benchmark进行训练,在改进后的CNN神经网络,经过30次训练后使用乱序的数据集进行验证可以达到99%的准确率。本设计还提供了基于Python的GUI前台展示画面,用户可以通过上传交通标志图片来获取识别结果。

本设计功能完备,没有老师要求额外添加的功能。

关键字:CNN 交通标志 Python

目        录

1     数据集分析... 4

1.1  数据特点... 4

1.2  数据统计... 4

1.3  识别任务... 5

1.4  采用模型... 5

1.5 硬软件与设备... 5

2     模型构建... 6

2.1  数据集载入... 6

2.2  CNN卷积神经网络构建... 7

2.3  训练过程... 9

2.4  注意事项... 10

3  模型结果... 10

3.1  模型学习结果... 10

3.2  训练集测试集验证结果... 11

3.3  混淆矩阵分析... 12

3.4  分类报告分析... 14

 

1      数据集分析

1.1 数据特点

       德国交通标志数据集German Traffic Sign Recognition Benchmark,来自Kaggle的公共数据集,包含超过50,000张不同的交通标志图片。在交通标志数据集中,分为训练数据集Train和测试数据集Test,在模型训练种,将训练数据集拆分为训练集和测试集,按7:3划分。

1.2 数据统计

数据集共有43个类别,如图 1所示。从0~42编号,在训练数据集Train中,共有43个文件夹,每个文件夹下是各个类别的交通标志图片,每张交通标志图片分为30种不同的大小缩放或放大的图片,每一类图片还有不同的明亮强度,不同场景背景,不同的倾斜角度,不同的光照效果,如图 2所示。

 

图 1 43种标志类别直方图

 

图 2 数据集图片

1.3 识别任务

本设计的任务是识别提供的交通标识图片,由于数据集存在不同尺寸、不同光照强度、不同倾斜角度的图片,所以要正确识别存在一定难度,特别是对于整体偏暗,且尺寸小的图片,容易误识别。

1.4 采用模型

本设计采用的是CNN卷积神经网络,共有4层卷积层,两层池化层,两层全连接层。

1.5 硬软件与设备

硬件设备:

联想小新ARE 15

处理器:AMD Ryzen 7 4800U with Radeon Graphics 1.80 GHz

基带RAM:8.00GB

软件:

PyCharm 2021.2

平台:

Kaggle。Kaggle公司是由联合创始人兼首席执行官AnthonyGoldbloom2010年在墨尔本创立的,主要是为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台。现Kaggle已被谷歌收购。

2      模型构建

2.1 数据集载入

数据集分为训练数据集Train和测试数据集Test,数据集提供了相应的路径文件Test.csv和Test.csv,只需要载入csv文件就可以获取相应的path路径,在获取数据集后还需要将其转化为numpy数据,这样才可以被python调用。

数据集载入代码:

 1 image_data = []
 2 
 3 image_labels = []
 4 
 5 for i in range(NUM_CATEGORIES):
 6 
 7     path = data_dir + '/Train/' + str(i)
 8 
 9     images = os.listdir(path)
10 
11     for img in images:
12 
13         try:
14 
15             image = cv2.imread(path + '/' + img)
16 
17             image_fromarray = Image.fromarray(image, 'RGB')
18 
19             resize_image = image_fromarray.resize((IMG_HEIGHT, IMG_WIDTH))
20 
21             image_data.append(np.array(resize_image))
22 
23             image_labels.append(i)
24 
25         except:
26 
27             print("Error in " + img)
28 
29 # 将 list 更改为 numpy 数组
30 
31 image_data = np.array(image_data)
32 
33 image_labels = np.array(image_labels)

 

2.2 CNN卷积神经网络构建

卷积层Conv2D,规格为16*3*3,为输入层,输入为图片本身的大小,激活函数为'relu';

卷积层Conv2D,规格为,激活函数为'relu';

池化层,规格为2*2;

BatchNormalization归一化,每一层都要归一化;

卷积层64*3*3;

卷积层128*3*3;

池化层2*2;

BatchNormalization归一化;

Flatten 3维变1维, 展平 --> 降维

全连接层 512*128

Dropout,随机丢弃,防止过拟合提高效果,丢弃概率为50%

全连接层 43*512,激活函数为'softmax'

最终输出的是43种概率分布,取概率最大的为最终结果。

模型概述如图 3 所示。

  

图 3 模型概述

模型构建代码:

 1 model = keras.models.Sequential([   
 2 
 3     #卷积层 输入层 16 * 3 * 3输入为图形的大小
 4 
 5     #卷积层 32 * 3 * 3 activation='relu'激活函数
 6 
 7     #池化层2*2
 8 
 9     #BatchNormalization 归一化  每一层都要归一化
10 
11     keras.layers.Conv2D(filters=16, kernel_size=(3,3), activation='relu', input_shape=(IMG_HEIGHT,IMG_WIDTH,channels)),
12 
13     keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu'),
14 
15     keras.layers.MaxPool2D(pool_size=(2, 2)),
16 
17     keras.layers.BatchNormalization(axis=-1),
18 
19    
20 
21     #卷积层 64 * 3 * 3
22 
23     #卷积层 128 * 3 * 3
24 
25     #池化层2*2
26 
27     keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'),
28 
29     keras.layers.Conv2D(filters=128, kernel_size=(3,3), activation='relu'),
30 
31     keras.layers.MaxPool2D(pool_size=(2, 2)),
32 
33     keras.layers.BatchNormalization(axis=-1),
34 
35     # Flatten 3维变1维, 展平 --> 降维
36 
37     # 全连接层 512 * 128
38 
39     # Dropout 随机丢弃 防止过拟合提高效果
40 
41     keras.layers.Flatten(),
42 
43     keras.layers.Dense(512, activation='relu'),
44 
45     keras.layers.BatchNormalization(),
46 
47     keras.layers.Dropout(rate=0.5),
48 
49     # 全连接层 43 * 512
50 
51     keras.layers.Dense(43, activation='softmax')
52 
53 ])

 

2.3 训练过程

训练过程如图 3 所示,在训练到第6轮的时候,模型趋于稳定。

 

图 4 训练过程

2.4 注意事项

在载入训练数据集后,由于训练数据集本身有43个文件,分别归属不同的类别,所以训练数据集是有序的,在划分数据集之前需要将其打乱顺序,才符合随机性。

打乱数据集代码:

1 shuffle_indexes = np.arange(image_data.shape[0])
2 
3 np.random.shuffle(shuffle_indexes)
4 
5 image_data = image_data[shuffle_indexes]
6 
7 image_labels = image_labels[shuffle_indexes]

 

3      模型结果

3.1 模型学习结果

验证模型的准确性,采用数据集中的测试数据集,测试数据集是完全乱序的,同样的通过Test.csv获取数据集的路径path和图片所属类别classId。模型验证准确率如图 5 所示。

 

 

图 5 模型准确率

验证模型代码:

 1 test = pd.read_csv(data_dir + '/Test.csv')
 2 
 3 labels = test["ClassId"].values
 4 
 5 imgs = test["Path"].values
 6 
 7 data =[
 8 
 9 for img in imgs:
10 
11     try:
12 
13         image = cv2.imread(data_dir + '/' +img)
14 
15         image_fromarray = Image.fromarray(image, 'RGB')
16 
17         resize_image = image_fromarray.resize((IMG_HEIGHT, IMG_WIDTH))
18 
19         data.append(np.array(resize_image))
20 
21     except:
22 
23         print("Error in " + img)
24 
25 X_test = np.array(data)
26 
27 X_test = X_test/255
28 
29 pred = model.predict(X_test)
30 
31 #Accuracy with the test data
32 
33 print('Test Data accuracy: ',accuracy_score(labels, pred)*100)

 

3.2 训练集测试集验证结果

训练集和测试集验证模型结果如图 6 所示,可以看到模型在训练到第6次之后便趋于稳定。

 

图 6 模型验证结果

 

3.3 混淆矩阵分析

混淆矩阵可视化如图 7所示

图 7 混淆矩阵可视化

混淆矩阵代码:

 1 import seaborn as sns
 2 
 3 df_cm = pd.DataFrame(cf, index = classes,  columns = classes)
 4 
 5 plt.figure(figsize = (20,20))
 6 
 7 sns.heatmap(df_cm, annot=True)
 8 
 9 plt.savefig('混淆矩阵可视化.png')#保存图片
10 
11 plt.show()

 

3.4 分类报告分析

分类报告如图 8、图 9所示,可以看到模型能够对每一类的交通标志有着较高的识别率,识别的准确率,召回率、f1-得分都比较优秀,但23、29、40类别的识别率低于平均值,通过分析数据集可以得知这三个标志的图片均为比较特殊且复杂的图案,23、29为三角图形,40为带有花纹的圆形,所以本设计还需要加强对复杂图形的识别效果。

图 8 分别报

 

图 9分类报告2

3.5 识别错误显示

采用测试数据集进行测试,进行1000次迭代,打印分类错误的例子,分类错误结果如图 10所示。

 

图 10 分类错误

分类错误代码:

 1 plt.figure(figsize = (25, 25))
 2 
 3 start_index = 0
 4 
 5 ins = labels == pred
 6 
 7 for i in range(1000):
 8 
 9     plt.subplot(5, 5, (i)%25+1)
10 
11     plt.grid(False)
12 
13     plt.xticks([])
14 
15     plt.yticks([])
16 
17     prediction = pred[start_index + i]
18 
19     actual = labels[start_index + i]
20 
21     col = 'r'
22 
23     if prediction == actual:
24 
25         #col = 'r'
26 
27         i = i - 1
28 
29         continue
30 
31     print(i)
32 
33     plt.xlabel('Actual={} || Pred={}'.format(actual, prediction), color = col)
34 
35     plt.imshow(X_test[start_index + i%25])
36 
37 plt.savefig('测试集分类结果.png')#保存图片
38 
39 plt.show()

结论与展望

设计在交通标志识别中获得了识别准确率为99%的成绩,本设计可以作为自动驾驶中汽车自动识别交通标志的参考,但本设计在面对比较复杂的交通标志识别中就存在识别率低于其他类型的标志的情况,尤其是三角、特殊圆形的标志。

本设计应该更多地聚焦于特殊地标志识别上,加强对模糊图形地识别。

参考文献

[1]    张广宇. 一种基于深度学习的交通标志识别算法研究[D].长春大学,2021.DOI:10.27912/d.cnki.gcdcx.2021.000036.

[2]    赵子婧,刘宏哲,曹东璞.基于Libra R-CNN改进的交通标志检测算法[J].机械工程学报,2021,57(22):255-265.

[3]    宋中山,汪进,郑禄,帖军,朱祖桐.基于二值化的Faster R-CNN柑橘病虫害识别研究[J].中国农机化学报,2022,43(06):150-158.DOI:10.13733/j.jcam.issn.2095-5553.2022.06.020.

[4]    马瑶,智敏,殷雁君,萍萍.CNN和Transformer在细粒度图像识别中的应用综述[J/OL].计算机工程与应用:1-13[2022-07-03].http://kns.cnki.net/kcms/detail/11.2127.TP.20220618.0947.002.html

[5]    黄晓红,李铁锋,刘祥鑫,李伟.基于改进Faster R-CNN算法的岩石裂隙发展方向跟踪预测研究[J].河南理工大学学报(自然科学版),2022,41(04):134-141.DOI:10.16186/j.cnki.1673-9787.2020100031.

[6]    昌宏哲,杜红静,袁洋.基于CNN的公路路网自动提取方法研究[J].计算技术与自动化,2022,41(02):164-167.DOI:10.16339/j.cnki.jsjsyzdh.202202030.

 

标签:layers,...,课设,keras,data,image,识别,交通标志
From: https://www.cnblogs.com/ZKU-CZB/p/17474782.html

相关文章

  • 论文解读 | IROS 2022:基于三维激光雷达的语义位置识别和姿态估计
    原创|文BFT机器人01研究背景这篇论文的背景是在自动驾驶和机器人导航等领域,需要实现高精度、高效率的定位和地点识别。然而,传统的基于GPS或视觉的方法存在一些局限性,尤其在城市峡谷等环境中无法提供准确的位置信息。为了解决这一问题,使用3DLiDAR进行定位和地点识别已经成为一......
  • Dlib+OpenCV深度学习人脸识别
    Dlib+OpenCV深度学习人脸识别 前言人脸识别在LWF(LabeledFacesintheWild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观。现在虽然有一些商业应用如员工......
  • 常用的表格检测识别方法-表格内容识别方法
    常用的表格检测识别方法3.3表格内容识别方法表格识别的研究主要涉及两个方面,一方面是对单元格内的文本进行识别,这一步通常是在确定单元格区域后,利用较为稳定的光学字符识别方法(OCR)来实现,这一方面不是表格识别研究的重点,不在此展开;另一方面是基于整个表格内容进行的表格分类、单......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分3)
    基于ZYNQ的摄像头显示系统本文介绍了如何使用ZYNQ开发板、OV5640摄像头和HDMI显示器搭建一个摄像头显示系统本文的内容主要分为以下几个部分:硬件介绍Vivado工程创建Vitis工程创建实验结果展示硬件介绍ZYNQ开发板使用的是ZINC7100芯片,具有双核ARMCortex-A9处理器......
  • 高考答题卡怎么被机器识别?基于OpenCV答题卡识别模拟-米尔ARM+FPGA异构开发板
    本篇测评由优秀测评者“筑梦者与梦同行”提供。 01.前言MYD-JX8MMA7SDK发布说明 根据下图文件内容可以知道myir-image-full系统支持的功能,其支持OpenCV,也就不用在格外安装相关驱动包等,省了很多事情。02.MYD-JX8MMA7软件评估指南本文介绍了Python的基本操作,在文档中10......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分2)
    认识神经网络1.认识神经网络中的神经元神经网络是模仿生物神经网络的结构和功能的数学模型或计算模型,由大量的节点或称神经元相互连接构成。神经元是神经网络的基本成分,它接收来自其他神经元的输入信号,通过权重、偏置和激活函数来产生输出信号。权重(weight)是表示输入信号的......
  • YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)
    YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)目录YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)1.前言2.佩戴安全帽检测和识别的方法(1)基于目标检测的佩戴安全帽识别方法(2)基于头部检测+佩戴安全帽分类识别方法3.佩戴安全帽数据集说明(1)佩戴安全......
  • 【计算机视觉】基于纹理特征的指纹识别位置与姿态算法
    简介计算机视觉基于纹理特征的指纹识别中的位置和姿态估计是指确定指纹图像中指纹的位置和方向的过程。这些信息对于后续的特征提取和匹配非常重要。下面介绍两个常用的算法来实现位置和姿态的估计:方向图和边界框。方向图(OrientationMap)方向图(OrientationMap)是用来表示指纹图像中......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(笔记)
    PS与PL使用Axi4-lite进行数据交互内容概述如何在PS和PL之间使用Axi4-lite接口进行数据交互Axi4-lite是一种简单的总线协议,适用于低吞吐量的数据传输,例如PS发送加速相关的命令给PL内容分为以下几个部分:PS和PL之间的数据交互方案介绍Axi4-lite接口的使用方法和示例代码Ax......
  • 深度学习项目之mnist手写数字识别实战(TensorFlow框架)
    mnist手写数字识别是所有深度学习开发者的必经之路,mnist数据集的图片十分简单,是二值化图像,像素个数为28x28。所以对于所有研究深度学习的开发者来说学会mnist数据集的模型十分有必要。以此为实例进行计算机视觉如何进行识别出图片中的数据。MNIST手写数字数据集来自美国国家标准与......