cnn卷积网络解决尺寸大小不确定的图片分类问题--银行凭证印章检查

简 介

      CNN卷积神经网络进行图像识别分类的技术很简单,一般神经网络初学者都做过mnist分类实验,简单的分类任务准确率跑到99%已经不成问题,这里不做过多的介绍。但是想用卷积神经网络解决实际问题,往往会碰见一些问题和痛点。整理如下:

      1、Mnist数据集包括网上公开的很多用于图像分类的数据集尺寸固定,我们做实验的时候很容易搭建针对输入输出纬度和形状固定的网络,但是实际情况是识别图片来源来自于扫描仪、照片等,往往图像的尺寸是不固定的。而缩放到统一大小的话又难免使得物体的形状失真,造成识别率下降。比如印章本来是圆的,强行缩放成统一尺寸,造成印章大小不一而且成为椭圆形,难免影响识别效果。

      2、图像很大、目标却很小且位置不固定。比如一张关于小狗的照片,照片1000*1000  小狗所在区域可能只有60*30这么大,直接用来分类很难训练,效率很低。图片一张一张裁剪缩放又是一个很耗时的工作。

      3、针对第2个问题,用目标定位算法难度较高,而且有些任务我们仅仅是为了解决分类问题或者目标检出问题,用目标检测算法增加了任务的复杂度,难免降低分类的准确度和识别效率。

      针对以上三个问题,本文介绍一种解决思路,并提供相关的数据集标注工具,可以较好的解决cnn实际应用中出现的以上问题。

思 路

1、解决图片尺寸不一的问题。

      针对第一个问题,输入图片尺寸不固定的情况,CNN卷积神经网络分为CNN卷积层和全连接层,卷积层的主要任务是,提取特征,降低输入纬度,而全连接层的任务就是分类了。卷积层的特点是利用卷积核对图像进行移步提取,并不关心图像的具体尺寸,而全连接层的输入纬度必须是固定的。那么我们能不能把具体的分类任务当成是一组特征,去掉全连接层只用卷积层,从而满足我们输入尺寸不固定的需求呢?答案是肯定的。具体如何操作:

       比如Mnist数据集中的一张图片 尺寸是28*28 经过一次卷积池化特征图尺寸减半14*14,经过多次卷积池化7*7,4*4(池化补0策略),2*2。一般卷积到2*2这种尺寸,我们就可以把它展开然后接全连接层进行softmax分类了。这里我们改一下,最后2*2再进行一次池化操作变为1*1的特征图,而特征图的数量改为10,这时候获取到了10个1*1的特征图。一共10个值,对这10个数值直接进行softmax分类,这样整个cnn网络实际是没有全连接层的。经过试验,这种方法完全可行,准确率略微下降一点。这样做有什么好处呢?28*28的图片经过了5次池化以后变成了1*1,17*17的经过5次池化一样是1*1,32*32的经过5次池化也是1*1,这样我们的图片输入尺寸的范围就变成了1~32以内的都能经过5次池化后softmax分类,输入的图片尺寸更加灵活了一些。能不能更灵活呢?答案也是肯定的,把最后一层池化改成降维,降维规则是reduce_max。这样你就完全不用关心输入图片的尺寸了。这里面牵涉到一个卷积网络视野的问题,读者可以自行搜索,这里不做详细讲解。只要你的卷积层视野能够满足物体大小,最后接上reduce_max,在做分类即可。

2、解决图片背景大物体小的问题。

      如果你比较了解目标检测算法的话,这里一点就通了。目标检测算法比较多,有的把定位和分类分两步进行,也有一次进行,比如yolo,ssd。把目标检测算法的定位损失去掉,只保留分类任务即可,这个思路有点像fcn网络。

      如果不了解目标检测算法那的话,这里介绍一种思路。比如银行业务凭条,前台办完业务以后,凭条要加盖印章才是合法凭证,在入库之前,需要进行合规性的监督。经过扫描的凭证图片小的有900*1500(200dpi)的,大的有2400*1500的,印章的大小也就300*300左右,我们的任务是判断这些凭证里面有没有印章。

       首先,有没有印章我们没有必要用这么高的像素的图,对像素先进行压缩大概三分之一。压缩的好处就是网络训练快,识别效率高。压缩后的印章大小100*100。那么我们就可以把整个图片分成64*64的格子,300*500的图片就可以分成5*8的格子,800*500的图片就可以分成13*8的格子。然后对每个格子进行标注,0背景,1印章(印章中心点落在格子里的)。如果印章中心点正好在格子的边界或者定点上的话,就把相邻的格子也标注成1。然后对图片进行多次卷积6次maxpool。pool6次的原因是2^6=64。最终输出5*8*1(300*500的图片,1个目标检测任务)。然后对每个输出和标注值求sigmod交叉熵损失就行了,这里用sigmod交叉熵而不用softmax交叉熵,因为目标的位置不固定,可能出现同一个cell格子里面多个目标的情况,sigmod交叉熵损失对每个目标的损失是独立的。最后对输出做一次reducemax就可以检测出图片是否包含印章。如果加上是否有客户签字的识别,输出就是5*8*2即可。因为一张图上面大多数都是背景,可能印章只有一个甚至没有。所以需要对有目标的损失加上一个权重。10~20倍的权重即可。

上一张本人成功实践的效果图。普通cpu每秒钟20张凭证的印章和签名检索,准确率99%,效果很不错:

cnn卷积网络解决尺寸大小不确定的图片分类问题--银行凭证印章检查_第1张图片

  本人QQ306128847,希望一起学习,共同进步的朋友加我。

你可能感兴趣的:(神经网络,CNN卷积)