Traffic Signs Recognition with 95% Accuracy using CNN&Keras

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

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

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

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
针对 traffic-signs-data 数据集进行多分预测,同样可以使用卷积神经网络 (Convolutional Neural Network, CNN)。以下是基于 Keras 和 TensorFlow 框架实现的 Python 代码: ```python import os import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 数据集路径 data_dir = '/path/to/traffic-signs-data' train_dir = os.path.join(data_dir, 'train') val_dir = os.path.join(data_dir, 'val') test_dir = os.path.join(data_dir, 'test') # 数据预处理 train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') val_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) # 训练集、验证集、测试集 train_generator = train_datagen.flow_from_directory( train_dir, target_size=(32, 32), batch_size=32, color_mode='grayscale', class_mode='categorical') val_generator = val_datagen.flow_from_directory( val_dir, target_size=(32, 32), batch_size=32, color_mode='grayscale', class_mode='categorical') test_generator = test_datagen.flow_from_directory( test_dir, target_size=(32, 32), batch_size=32, color_mode='grayscale', class_mode='categorical') # 搭建模型 model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,1)), tf.keras.layers.MaxPooling2D((2,2)), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D((2,2)), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D((2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(43, activation='softmax') ]) # 编译模型 model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit_generator( train_generator, steps_per_epoch=100, epochs=50, validation_data=val_generator, validation_steps=50) # 评估模型 test_loss, test_acc = model.evaluate_generator(test_generator, steps=50) print('test acc:', test_acc) ``` 在上述代码中,我们同样使用了 ImageDataGenerator 对数据进行了数据增强,并利用 flow_from_directory() 方法从文件夹中读取数据,分别构建了训练集、验证集、测试集。基于 Sequential 模型搭建了卷积神经网络模型,并使用 compile() 方法对模型进行编译。最后使用 fit_generator() 方法训练模型,evaluate_generator() 方法评估模型。需要注意的是,traffic-signs-data 数据集中的图片是灰度图,因此需要将 color_mode 设置为 'grayscale'。另外,输出层的神经元个数为 43,对应数据集中的 43 种交通标识。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一城山水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值