Keras实例教程(五)- 使用 GTSRB 用于交通标志识别

2023-10-07 20:32

本文主要是介绍Keras实例教程(五)- 使用 GTSRB 用于交通标志识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据集

GTSRB dataset :
http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset#Downloads

该数据集包含43类交通标志,提供的资料中包含标注信息。

【0】 数据准备

  • 根据标注裁剪图像
    在每类的文件夹中,包含若干.ppm格式的图片及一个.csv文件,csv中包含每个ppm图像的标注信息,根据标注信息进行图片裁剪.
    将43类放到同一文件夹Final_Training下,裁剪示例代码:
import os
import sys
from PIL import Image
path = 'C:/Users/Documents/Dataset/GTSRB/Final_Training'csv_files = []
for dirpath, dirnames, filenames in os.walk(path, topdown=False):for filename in filenames:if filename.endswith('.csv'):csv_files.append(os.path.join(dirpath, filename))class TrafficSign:trafficSign_name = ''left_top_x = 0,left_top_y = 0,right_bottom_x = 0,right_bottom_y = 0,width = 0,height = 0,label = ''def tostring(self):print([self.trafficSign_name,self.width, self.height,self.left_top_x, self.left_top_y,self.right_bottom_x, self.right_bottom_y,self.label])for csv in csv_files:base_path = os.path.dirname(csv)# read csv datatrafficSigns = []with open(csv) as file:for line in file:if line.find('.ppm') == -1:continueraw_data = line.split(';')trafficSign = TrafficSign()trafficSign.trafficSign_name = raw_data[0]trafficSign.width = int(raw_data[1])trafficSign.height = int(raw_data[2])trafficSign.left_top_x = int(raw_data[3])trafficSign.left_top_y = int(raw_data[4])trafficSign.right_bottom_x = int(raw_data[5])trafficSign.right_bottom_y = int(raw_data[6])# trafficSign.label = raw_data[7]trafficSigns.append(trafficSign)# crop each image according to the csv in this folderfor dirpath, dirnames, filenames in os.walk(base_path, topdown=False):for filename in filenames:if not filename.endswith('.ppm'):continuefullPath = os.path.join(dirpath, filename)for sign in trafficSigns:if filename == sign.trafficSign_name:image = Image.open(fullPath)# start cropping according to this signregion = (sign.left_top_x, sign.left_top_y, sign.right_bottom_x, sign.right_bottom_y)image_crop = image.crop(region)# update the new image pathnewFullPath = fullPath.replace('GTSRB', 'GTSRB_img_Crop')newFullPath = newFullPath.replace('.ppm', '.bmp')if not os.path.exists(os.path.dirname(newFullPath)):os.makedirs(os.path.dirname(newFullPath))# save the imagesimage_crop.save(newFullPath)break

裁剪后的图片如下所示:
[外链图片转存失败(img-3vH99RSt-1563292422090)(https://note.youdao.com/yws/api/personal/file/907B91B4FD5A4474BE70166DF441E487?method=download&shareKey=86bfa606c65fbdbe99c36ba08d039d69)]

  • 划分训练集和测试集
    观察可以发现,交通标志应该是由远至近的序列中标注裁剪出来的,所以会呈现由小到大的规律,所以在准备训练集和测试集时,随机选择一定比例的方式(我选择80%训练,20%测试),示例代码:
import os
import random
import shutil
path = 'C:/Users/Documents/Dataset/GTSRB_img_Crop/Final_Training'
dirs = []
split_percentage = 0.2
for dirpath, dirnames, filenames in os.walk(path, topdown=False):for dirname in dirnames:fullpath = os.path.join(dirpath, dirname)fileCount = len([name for name in os.listdir(fullpath) if os.path.isfile(os.path.join(fullpath, name))])files = os.listdir(fullpath)for index in range((int)(split_percentage * fileCount)):newIndex = random.randint(0, fileCount - 1)fullFilePath = os.path.join(fullpath, files[newIndex])newFullFilePath = fullFilePath.replace('Final_Training', 'Final_Validation')base_new_path = os.path.dirname(newFullFilePath)if not os.path.exists(base_new_path):os.makedirs(base_new_path)# move the filetry:shutil.move(fullFilePath, newFullFilePath)except IOError as error:print('skip moving from %s => %s' % (fullFilePath, newFullFilePath))

【1】训练和验证

结构十分简单,四个卷积层加上全连接层输出即可。其中的个别的超参数选择,我是参照了GTSRB比赛中成绩最好的那篇文章中提到的一些配置:

CNN with 3 Spatial Transformers, DeepKnowledge Seville, Álvaro Arcos-García and Juan A. Álvarez-García and Luis M. Soria-Morillo, Neural Networks
link

在这篇文章中,提到使用48*48的归一化尺寸以及一些其他的建议,可以详细参阅。如下示例代码简单跑一下():

import shutil
import os
import matplotlib.pyplot as plttrain_set_base_dir = 'C:/Users/Documents/Dataset/GTSRB_img_Crop/Final_Training'
validation_set_base_dir = 'C:/Users/Documents/Dataset/GTSRB_img_Crop/Final_Validation'# start image preprocess
from keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale=1. / 255
)
train_data_generator = train_datagen.flow_from_directory(directory=train_set_base_dir,target_size=(48, 48),batch_size=32,class_mode='categorical')validation_datagen = ImageDataGenerator(rescale=1. /255
)validation_data_generator = validation_datagen.flow_from_directory(directory=validation_set_base_dir,target_size=(48, 48),batch_size=32,class_mode='categorical'
)# define a simple CNN network
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropoutmodel = Sequential()# add Con2D layers
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(48, 48, 3)))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))# flatten
model.add(Flatten())# dropOut layer
model.add(Dropout(0.2))# add one simple layer for classification
model.add(Dense(units=512, activation='relu'))# add output layer
model.add(Dense(units=43, activation='softmax'))# compile model
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])# print model info
model.summary()
json_str = model.to_json()
print(json_str)
# fit_generator to fill in the dataset
history = model.fit_generator(generator=train_data_generator,steps_per_epoch=100,epochs=30,validation_data=validation_data_generator,validation_steps=50)# train done, save the models
model.save('C:/test/WorkingLogs/20181214/traffic_signs.h5')# plot the roc curve
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()plt.figure()plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()plt.show()

简易的网络结构及参与训练测试的样本信息如下:

Found 32117 images belonging to 43 classes.
Found 7092 images belonging to 43 classes.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 46, 46, 32)        896       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 23, 23, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 21, 21, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 10, 10, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 8, 8, 128)         73856     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 128)         0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 2, 2, 128)         147584    
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 1, 1, 128)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 128)               0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               66048     
_________________________________________________________________
dense_2 (Dense)              (None, 43)                22059     
=================================================================
Total params: 328,939
Trainable params: 328,939
Non-trainable params: 0
_________________________________________________________________

30 epochs的结果是:

100/100 [==============================] - 164s 2s/step - loss: 0.2009 - acc: 0.9556 - val_loss: 0.1103 - val_acc: 0.9755

[外链图片转存失败(img-ZboIncn5-1563292422092)(https://note.youdao.com/yws/api/personal/file/F3EDD169650C4688A3E488C78C1DBBE0?method=download&shareKey=3de2a6edc55e615c5cb07debdde37e0b)]
[外链图片转存失败(img-70alovNI-1563292422092)(https://note.youdao.com/yws/api/personal/file/29793553083A4AC2B59FC0F6E5A4B434?method=download&shareKey=fa5fd03cb56f6db8441b7795732be4be)]

【3】结论

从结果可以看出,即使是简单的网络结构,在精确标注的大量数据下可以获得很好的效果。同时还可以通过pre-trained模型如VGG-16等提取特征再加入某些层进行fine-tuned等。
在上面推荐的那片论文中,还提出使用spatial-transformer层进行优化,也很值得尝试。

这篇关于Keras实例教程(五)- 使用 GTSRB 用于交通标志识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160265

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti