课 程 设 计
交通标志识别
姓 名
院(系)
专业班级
学 号
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