Traffic Signs Recognition with 95% Accuracy using CNNKeras

2023/9/30 17:24:06

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)。这是因为为了预测交通标志,必须提供与构建模型时相同的维度。
在这里插入图片描述

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

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


http://www.jnnr.cn/a/272986.html

相关文章

使用redisson实现分布式锁

在微服务项目中使用redisson实现一个分布式锁 一、引入依赖 spring-boot版本2.3.12.RELEASE <dependencies><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.6.5</version></dep…

【HTML】HTML 标签 ② ( 排版标签 | 标题标签 | 段落标签 | 水平线标签 | 换行标签 | div 标签 | span 标签 )

文章目录一、排版标签1、标题标签2、段落标签3、水平线标签4、换行标签5、div 标签 和 span 标签HTML 常用的标签有如下类型 : 排版标签文本格式化标签图像标签链接标签 , 其中 链接涉及到 相对路径 与 绝对路径问题 ; 一、排版标签 排版标签 是 网页布局 中 , 最常用的标签 …

Anaconda搭建TensorFlow2.x(win环境)

本篇文章介绍如何使用Anaconda快速搭建Python环境下的TensorFlow2.x开发框架 Anaconda搭建TensorFlow2.x过程 关于 Anaconda Anaconda就是可以便捷获取包且对包能够进行管理&#xff0c;同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包…

【每日一题Day109】LC1210穿过迷宫的最少移动次数 | BFS+dp

穿过迷宫的最少移动次数【LC1210】 你还记得那条风靡全球的贪吃蛇吗&#xff1f; 我们在一个 n*n 的网格上构建了新的迷宫地图&#xff0c;蛇的长度为 2&#xff0c;也就是说它会占去两个单元格。蛇会从左上角&#xff08;(0, 0) 和 (0, 1)&#xff09;开始移动。我们用 0 表示…

Mysql高级部分学习笔记(四)——锁理论

一、MVCC 1. 概念 多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来&#xff0c;这样读锁就和写锁不冲突了&#xff0c;不同的事务session会看到自己特定版本的数据&#xff0c;版本链。 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有 乐观…

【谷粒商城高级篇】商品服务 商品上架

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建Elasticsearch项目简介与分布式概念&#xff08;第一、二章&#xff09;Elasticsearch&#xff1a;全文检索&#xff08;第一章&#xff09;基础环境搭建&#xff08;第三章&#xff09;商品服务开发整…

node\npm问题

一、npm问题 解决办法: 0、有必要可以考虑先清理一下&#xff1a; npm cache clean --force 1、先执行 npm config set registry http://registry.cnpmjs.org 2、再执行 npm install 成功解决 二、出现问题 gulp : 无法将“gulp”项识别为 cmdlet、函数、脚本文件或可运行…

Java面试Web篇

目录 一、JavaWeb基础 1.jsp 2.servlet 二、JavaWeb框架 1.Spring #SpringMVC的工作流程&#xff1f; 三、Mybatis 今天给大家分享 JavaWeb篇的面试题&#xff0c;小编给大家稍微整理了一下&#xff0c;希望即将面试的朋友们看了后能有帮助。 一、JavaWeb基础 1.jsp 指令…

《从0开始学大数据》之知名大厂大数据平台介绍

今天我们来看一下淘宝、美团和滴滴的大数据平台&#xff0c;一方面进一步学习大厂大数据平台的架构&#xff0c;另一方面也学习大厂的工程师如何画架构图。通过大厂的这些架构图&#xff0c;你就会发现&#xff0c;不但这些知名大厂的大数据平台设计方案大同小异&#xff0c;架…

MySQL数据库索引并没有你想的那么难之第一节

从今天开始我将会为大家讲解MySQL的数据库索引&#xff0c;通过对行存储结构&#xff0c;数据页结构的理论学习&#xff0c;彻底掌握索引结构存储。为索引优化提供扎实的理论基础。 下面是我将要讲解的内容如下&#xff1a; 行存储结构数据页结构索引结构索引的优化查找案例 …

前端系列 HTML5+CSS3

标签 01-标题标签&#xff1a; <h1>1级标题</h1> 02-段落标签&#xff1a; <p>这是一段文字</p> 03-文本格式化标签&#xff1a; <b>加粗</b> <strong>加粗</strong> <u>下划线</u> <ins>下划…

【谷粒商城高级篇】缓存与分布式锁

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建Elasticsearch项目简介与分布式概念&#xff08;第一、二章&#xff09;Elasticsearch&#xff1a;全文检索&#xff08;第一章&#xff09;基础环境搭建&#xff08;第三章&#xff09;商品服务开发整…

【Java学习】JUC并发编程

目录1.JUC是什么1.1 JUC简介1.2 线程和进程概念1.2.1 进程和线程1.3 线程的状态1.3.1 线程状态枚举类1.3.2 wait和sleep的区别1.3.3 使用范围不同1.4 并发和并行1.4.1 串行模式1.4.2 并行模式1.4.3 并发模式1.4.4 小结1.5 管程1.6 用户线程和守护线程1.6.1 用户线程1.6.2 守护线…

前端工程化详解——理解与实践前端工程化

前言&#xff1a; 前端工程化一直是一个老生常谈的问题&#xff0c;不管是面试还是我们在公司做基建都会经常提到前端工程化&#xff0c;那么为什么经常会说到前端工程化&#xff0c;并没有听过后端工程化、Java工程化或者Python工程化呢&#xff1f;我们理解的前端工程化是不是…

柔性印刷线路板缺陷检测方法研究

基于模板匹配的 FPC 缺陷检测方法研究模板匹配作为最直观、最基本的模式识别方式&#xff0c;被广泛应用于目标识别、人工智能等领域&#xff0c;是实现线路板缺陷检测的一种有效方式&#xff0c;其实质是度量注册 FPC 图像与登录 FPC 图像之间的相似度问题。本章从模板匹配角度…

Ubuntu20.4下安装TensorFlow2.x

Ubuntu20.4下安装TensorFlow2.x 基本配置 系统&#xff1a;Ubuntu20.04 显卡&#xff1a;GTX 960M 1、显卡驱动安装 首先检查一下系统配置&#xff0c;使用uname -a查看系统版本 $ uname -a Linux bing-Lenovo-Y50p-70 5.15.0-58-generic #64~20.04.1-Ubuntu SMP Fri Jan 6…

Docker - 13. 容器卷常用操作

目录 1. 宿主和容器之间映射添加容器卷 2. 查看容器卷是否挂载成功 3. 容器卷 ro 和 rw 读写规则 4. 卷的继承与共享 1. 宿主和容器之间映射添加容器卷 公式&#xff1a;docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名 docker run -it --p…

论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》

更深的图卷积神经网络&#xff0c;相当于residual在CNN中的应用&#xff0c;使得可以构建更深层次的卷积网络而不会造成梯度消失无法训练的问题。 算法原理&#xff1a; 学习过Resnet去理解DeepGCNs就会很容易&#xff0c;看图片基本就能明白。 提出了用于点云语义分割的GCN…

外设驱动库开发笔记51:SDP800差压传感器驱动

检测流量数据的方法有很多种&#xff0c;这一次我们就是使用SDP800差压传感器来测量流量数据。所以在这一篇中&#xff0c;我们将讨论如何实现SDP800差压传感器的驱动&#xff0c;并使用它实现流量数据的检测。 1、功能概述 SDP800差压传感器系列是Sensirion为大批量应用设计的…

【C++】入门(下)

继续来学习吧&#xff1a;一、引用1.1 引用的概念&#x1f4cc;引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。比如&#xff1a;李逵&#xff0c;在家称为&qu…
最新文章