交通标志识别

交通标志识别实际上包括交通标志的检测和识别两个过程,检测是在图像中寻找到感兴趣目标并定位,识别是对感兴趣目标进行分类。现在R-CNN系列、YOLO、SSD能够很好的将检测和分类两个过程融合到一起,并且在PASCAL VOC等数据集上取得了很好的效果,但对像交通标志这种小目标的检测效果并不好。就交通标志检测而言,如果在Faster RCNN的anchor中,将scale调小一点,ratio调下再做训练,是可以很好的检测到图像中尺寸较小的交通标志;也可以训练级联CNN,将目标检测问题转化为分类问题。传统的检测方法中,可以人工设计特征来检测感兴趣目标,例如可以利用交通标志的颜色和形状等信息来检测并定位到交通标志;然后对检测到的标志进行识别或分类,判断它是哪种交通标志。
我们暂时先不考虑检测问题,先做分类实验。利用卷积神经网络来试试交通标志识别的效果如何。
The German Traffic Sign Recognition Benchmark是IJCNN 2011举办的一个图像分类挑战赛,其提供了GTSRB数据集,共包含了43类交通标志,训练样本39209张,测试样本12630张。提供的样本图像中包含了标志区域及其周围10%的区域(这是为采用边缘方法者所考虑),样本图像尺寸范围为15x15到250x250,当然它不一定是正方形。
这里写图片描述
该挑战赛的冠军是IDSIA团队所采用的Multi-column Deep Neural Network即多列深度神经网络的方法来进行交通标志识别,最后在43类交通标志的识别准确率达到了99.46%,超过了人类表现的98.84%。该方法采用了25个具有完全相同网络结构的DNN(实际上是总共9层的卷积神经网络) Paper地址
这25个DNN分别对应了五种输入数据,包括原图像以及原图经过四种不同的预处理后得到的图像共五种;然后每种都采用五个不同的随机网络初始值来训练,得到网络结构和参数相同但训练得到的网络权重不同的DNN模型。
测试时将每张图像做四种预处理得到共五张输入图像,再将每张图象都送入到其对应的五种网络初始值不同的DNN中,然后将求得的共25个分数做平均得到最后的识别结果。
其DNN结构实际上是在三个卷积层后面跟上两个全连接层做分类,输入图像固定尺寸为48x48。GTSRB数据集下载地址如下,分别下载训练集和测试集。数据集下载地址
下载得到的GTSRB数据集的格式是ppm格式,需要转换成jpg格式。注解标签存放在csv文件中,包括了位置标签(包围标志的最小矩形框位置)和类别标签,通过位置标签进行裁剪并缩放到固定尺寸,固定尺寸大小48x48,下图为裁剪缩放后测试集的部分图像,有的标志人眼都很难分辨,若将其进行直方图均衡等预处理则可能会更容易识别。IDSIA团队采用的多列DNN方法所达到的99.46%的超过人眼的识别水平确实很高。
接下来我们来做交通标志的识别实验,暂时先不考虑多列问题。这里提供 项目下载地址
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

1.数据集准备

暂时先不考虑数据增广(后面会提到有关预处理)。
如果你对数据集的制作不感兴趣,可以跳过后面的制作过程,项目中提供已经转换好的可以直接作为caffe输入,解压‘GTSRB数据集’文件夹,包含了tran_lmdb文件夹、val_lmdb文件夹和mean.binaryproto文件,将上述三个文件放在data\gtsrb文件夹下
这里写图片描述
下面简单介绍数据集的制作过程。
由于GTSRB提供的下载数据集格式是ppm格式,需要转化成jpg格式,数据集中的图像是带有周围背景的,需要根据提供的csv文件裁剪出感兴趣区域即最小包围框,然后缩放到固定尺寸(这一步也可以在用caffe转换成lmdb格式时来归一化尺寸)。可以用下图所示的matlab脚本实现之,包括如何读取csv中图像标签信息、转换PPM文件为jpg格式,三种图像预处理(后面会提到),以及生成train.txt、val.txt。
这里写图片描述
这里也提供转化后的图片数据集以及制作好的类别标注文本,下载链接,解压得到‘GTSRB数据集’文件夹,将其放在data\gtsrb目录下。需要注意的是,如果是在windows下使用caffe,train.txt中的’/’要替换成反斜杠’\’。
这里写图片描述
这里写图片描述
这样就准备好了训练和测试数据集以及对应的train.txt、val.txt。
因为博主的前期预处理在windows下进行的,所以只介绍windows系统下转化成lmdb文件。首先在caffe-master/data/gtsrb目录下新建了一个create_gtsrb.txt,打开后加入以下代码,其中包括了转化训练集、测试集(直接将测试集作为验证集,在验证模型好坏的同时得到测试效果)、生成均值向量文件三个过程,关闭保存,修改后缀名为.bat得到create_gtsrb.bat文件,直接双击执行就可以了。完成后会发现data/gtsrb文件夹下多出了tran_lmdb文件夹、val_lmdb文件夹和mean.binaryproto文件。

2.训练卷积神经网络

在models\gtsrb文件夹下,准备好网络模型文件train_val.prototxt、训练超参数文件solver.prototxt,测试时还需要用到deploy.prototxt,需要注意的是不要在prototxt中对样本进行镜像。卷积神经网络结构如下图:
这里写图片描述
经过多次调整参数实验后确定,我的训练超参数solver.prototxt文件内容如图,学习率0.001,步进式衰减,4000次迭代衰减10倍,最大迭代20000次,train_val.prototxt中训练集和验证集batchsize分别为50和20,test_iter为632次(12630/20),每次20个刚好能覆盖12630个测试样本,每5000次打印一次快照。
这里写图片描述

3 实验初步效果

以不做预处理的原图训练单列DNN最后的测试(验证),迭代20000次后,准确率可以达到96%左右,由于随机初始化最后的结果会稍有差异。

这里写图片描述
下图给出了部分识别出错的标志图像,可以发现,部分图像中标志人眼很好识别但算法识别出错,说明网络在极端情况还有提升空间,还有一些倾斜严重、图像质量太差、最小包围框不够准确等情况。
这里写图片描述

4 实验改进

考虑两种改进思路:
(1)对数据集进行数据增广,例如部分交通标志具有水平镜像或垂直镜像的不变性,还可以对训练样本图像随机旋转一个较小的角度来应对真实场景下图像中的标志倾斜问题(上图中就有因标志倾斜而出现识别出错),训练耗时增加而测试时耗时不变,泛化能力提高。
(2)采用多列深度网络的思路,对原始数据集进行多种预处理得到多个数据集,对每个数据集采用同样的网络结构进行训练,在测试时对测试图像进行多种预处理,分别送入到各自的卷积神经网络中,最后将输出结果取平均。

博主首先对数据进行了增广,对具有水平镜像或垂直镜像的不变性的标志进行了镜像,对所有标志额外进行了随机旋转某个小角度,单列DNN的测试结果提高到96.79%。
然后采用了原数据集和经过三种预处理(图像调整、直方图均衡、自适应直方图均衡)共四种数据源,每种采用两个不同初始化的DNN网络构成了的8列DNN,对8列DNN求平均的结果作为输出,最后将准确率提高到了97.88%(也牺牲了速度),12630张测试图像中有268张识别出错,相比于人类表现还有一段距离。
其中在做图像预处理时,对彩色图像进行对比度拉伸、直方图均衡化和自适应直方图均衡化,实际上先将RGB空间转换到Lab颜色空间,其中L为图像亮度,取值范围0~100,表示从纯黑到纯白,然后对亮度通道L进行对比度拉伸、直方图均衡化和自适应直方图均衡化,然后再转回到RGB空间。
另外也曾尝试在网络中加入Relu层、Norm层和dropout层但效果均不理想,大家也可以试试改改网络参数来刷准确率。

你可能感兴趣的:(caffe)