当前位置: 首页 > news >正文

Traffic Signs Recognition with 95% Accuracy using CNNKeras

Traffic Signs Recognition

导读
本文采用CNN模型和Keras库
使用GTSRB数据集
构建模型可以分为四部分:1、先探索数据集 2、构建CNN模型 3、训练和验证模型 4、使用测试数据测试模型
保存模型并使用Python自带包tkinter实现GUI

一、数据集

在这里插入图片描述
下载完数据后,可以看出在Train文件夹中包含43个文件夹序号从0到42,每个文件夹代表不同的类。

载入所需要的库

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import cv2
import tensorflow as tf
from PIL import Image
import os
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from keras.models import Sequential, load_model
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout

如果在导入包的时候有报错,可以参考我之前发的几篇

开始探索数据集
关于遍历文件夹还有很多写法,这里就不一一举例了

data = []
labels = []
classes = 43  #共有43个文件夹
cur_path = os.getcwd()
for i in range(classes):
    path = os.path.join(cur_path,'Train',str(i))
    images = os.listdir(path)
    for a in images: # 迭代
        try:
            image = Image.open(path + '/'+ a)  #因为在macos上采用'/',windows改成'//'
            image = image.resize((30,30))
            image = np.array(image)
            #sim = Image.fromarray(image)
            data.append(image)
            labels.append(i)
        except:
            print("Error loading image")
#Converting lists into numpy arrays
data = np.array(data)
labels = np.array(labels)
print(data.shape, labels.shape) 

在这里插入图片描述
数据的形状是(39209、30、30、3),这意味着有39,209张尺寸为30×30像素的图像,最后的3表示数据包含彩色图像(RGB值)。

然后开始分割数据集

X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

在这里插入图片描述
将y_train和t_test 进行one-hot encoding
在这里插入图片描述

二、开始构造CNN模型

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=X_train.shape[1:]))
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(43, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

使用Adam优化器编译模型,该优化器性能良好,损失为“categorical_crossentropy”,因为有多个类要分类。

三、开始训练模型

可以选用batch_size=64或者32,64拟合效果好一点
在这里插入图片描述
可以看出epochs=10轮以后 开始稳定,模型在训练数据集上获得了98%的精度。使用matplotlib,我们绘制图表的准确性和损失。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、使用测试数据测试模型

数据集中包含一个测试文件夹,在Test.csv文件中,有与图像路径及其各自的类标签相关的详细信息。使用pandas提取图像路径和标签。然后,为了预测模型,必须将图像大小调整为30×30像素,并制作一个包含所有图像数据的数字数组。从sklearn.metrics中,导入accuracy_score,并观察了模型如何预测实际标签。在这个模型中,实现了96%的精度。
在这里插入图片描述

保存模型以便后续GUI做准备

在这里插入图片描述

五、Traffic Signs Classifier GUI

使用Tkinter将交通标志分类器构建成一个图形用户界面。Tkinter是标准python库中的GUI工具包。首先使用Keras加载了训练有素的模型“my_model.h5”,然后,构建用于上传图像的GUI,并使用一个按钮进行分类,该按钮调用classify()函数。classify()函数正在将图像转换为形状的维度(1、30、30、3)。这是因为为了预测交通标志,必须提供与构建模型时相同的维度。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整代码可以共享,需要请评论或私聊

相关文章:

  • axios中params和data的区别
  • 【QT】C++和QML使用多线程优化界面切换卡顿的方法
  • kob后端1
  • Kotlin~工厂方法、抽象工厂模式
  • C++继承(下)
  • PKI证书签发系统(2.0web版)
  • Ubuntu20.4下安装TensorFlow2.x
  • 【项目部署】Python Django部署到阿里云
  • MySQL数据库索引并没有你想的那么难之第一节
  • 数据结构与算法-单链表
  • 记一次git误操作, 合并冲突别人新增文件显示成“自己新增“绿色文件
  • Dubbo----------------------------配置信息整合SpringBoot的三种方式
  • 基于视觉的车道线识别技术在智能车导航中的应用研究
  • bleu-mp 多进程bleu评估工具
  • webpack多进程打包
  • 索尼IMX316 标定_ToF模块相机校准
  • 【Proteus仿真】【51单片机】智能鱼缸系统设计
  • 瑞吉外卖2.0 Redis 项目优化 Spring Cache MySQL主从复制 sharding-JDBC Nginx
  • 2023-02-04 Elasticsearch 倒排索引的理解 Trie前缀树原理
  • 【DIY小记】VMWare设置主机连接到的Ubuntu虚拟机的网络端口
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉