tiantianheheaa1995 / tianchi_CV_SVHN

23 stars 5 forks source link

代码使用

实践总结

这次实践是天池上的一个字符识别比赛mchar,数据集使用的是Google街景图像门牌号数据集SVHM,任务是识别不定长街景门牌字符。

解决这个问题的思路可以有多种。一是当作图像分类问题,首先固定字符的长度,然后在CNN后添加多个全连接分支进行多字符分类,按顺序把多个分支的结果连接,作为最终的结果输出。二是当作目标检测问题,首先检测出每张图片中的多个字符,然后按顺序把字符连接起来,作为最终的结果输出。

master分支中实现的是图像分类的解决思路,SSD分支中实现的是SSD目标检测的解决思路。

baseline图像分类

这个比赛给了一个baseline基础代码,格式是jupyter notebook。我把整个代码改为了pycharm工程的格式。
整体提交的结果如下:

整体提交score.PNG

第一次按照baseline进行训练,batch_size=40,epoch=10,提交的结果是score=0.3396,是比较低的。
我们发现baseline中训练集和验证集图片的处理是resize成(64,128),然后随机裁剪为(60,120)。但是测试集图片处理是resize为(70,140)。
由于训练模型适应的图片尺寸和测试集输入的图片尺寸不符,尺寸偏差不大,但是了超过10%,而我们这个任务对于字符位置是很敏感的,造成最终测试集得分比较低。修改这个baseline中的bug后,后续的测试集得分就比较高了。

ResNet18 学习率调节

baseline中使用的是Pytorch中ResNet18的预训练模型。我们就在这个模型上进行调节。

ResNet18 数据增强

baseline中训练集的数据增强是先resize到(64,128),然后随机裁剪为(60,120)。验证集和测试集没有数据增强,只是resize到(60,120)。
随机裁剪已经是一个十分有效的数据增强手段,下面进行其他的数据增强。

数据读取、显示、变换和处理可以使用的库有matplotlib、OpenCV、skimage和Pytorch中的torchvision等。

ResNet34

基于上面ResNet18网络进行各种单一变量实验和综合实验的结果,我们进一步增大模型的复杂度,使用ResNet34的预训练模型,期望获得val_acc精度的提高。

改变学习任务:4字符

baseline固定的字符长度是5,但是在随机查看训练集图片是,几乎没有发现字符长度是5的样本。我统计了一下训练集中的样本的字符长度,字符长度为1:2:3:4:5:6的样本数量为4636:16262:7813:1280:8:1。所以,我决定把字符长度固定为4。
固定字符长度为5,意味着很多图片都需要学习后2个或后3个字符为X(空,非0-9字符),而这个预测过程是容易出错的。
我们把字符长度固定为4,就是直接预测错误8个5字符样本和1个6字符样本,但是同时由于大多数的1字符、2字符和3字符样本,需要预测的X字符少了很多,所以可以降低后几位预测X字符的错误,预期可以提高val_acc。

改变数据集:样本加权

通过查看提交的测试集预测结果,人工查验了一下测试集前100个样本和前100个预测结果,发现了一个明显的主要出错现象-3字符样本的预测结果容易丢最后一个字符,即把3字符样本的第3位预测为X空字符,从而预测结果是2位,预测错误。
前100个样本中,一共预测错误19个,其中字符预测出错7个,字符丢失出错10个(2字符样本丢失第2位出错2个,3字符样本丢失第3位出错8个)。
下面主要围绕3字符样本丢失第3位的问题进行解决。

集成学习

SSD 目标检测