1.概述
本文简要介绍基于深度学习的OCR技术,主要分为整体框架流程介绍,文字检测CTPN,文字识别CRNN+CTC,基于windows平台的项目实战,以及遇到的一些问题和解决方案,最后展示一下胜利的果实!对于一些相关的概念介绍的深度,只满足于顺利地理解本文的程度。尽量的做到 深入浅出,如有不周,敬请谅解!文章参考深度学习在OCR中的应用-美团团队!
2.整体流程
我们假设能够读到本文的人,都知道OCR(把图像中的文字提取出来)是做什么的,在此不再赘述。其实OCR和图像分类是比较像的,只是难度会更大而已。问如何找到一副图像中的目标动物,第一步找到目标动物在哪儿,第二步判断其具体是哪种动物。OCR要找到图像中的文字,那也一样,第一步找到文字在哪儿,第二步判断具体是什么字。如下图所示,找到文字在哪儿就是文字检测,判断具体是什么字就是文字行识别。最后把结果输出就行了。
是不是很简单,大道至简,最高级的思想往往总是这么朴实无华。可是奈何人类总是千变万化,千奇百怪!难点在于文字表达形式和场景的复杂性、多样性,拿汉字来说,就有宋体、行书、楷书、手写体等等各种字体,广告牌、衣服、菜单等各种场景,这就给文字检测和识别带来了很大的困难!
所以直接使用原始的图像分类框架是不行的,但我们可以先使用其提取图像中的特征信息,然后使用RNN进行序列学习,对于RNN输出的序列我们再做一些处理就可以得到最终的结果了。这就是CRNN的思想。
3.文字检测CTPN(Connectionist Text Proposal Network)
3.1 整体介绍
我们来讨论一种比较流行的文字检测框架CTPN,其整体的流程如下所示。首先使用传统的VGG16进行特征提取,选取VGG16 conv5的输出(该层输出将原始图像缩小了16倍);然后使用3*3的滑动窗口进行提取,以max(W)作为序列长度,3*3*C作为每一时刻的长度输入到Bilstm;然后经过FC层,FC输出特征图的每一个点会预测10个anchor,最后使用RPN进行回归框的预测,就得到了b图。
3.2 Vertical Anchor
与Faster Rcnn中的回归框预测不同的是,CTPN只预测anchor的中心点的Y坐标和anchor的高Y。anchor的宽统一设定为16(跟conv5对原图的缩小比例相同),anchor的高共10个比例(11...273,每个数为前一个数除以0.7)。因为对于文本来说,字与字之间水平方向的边界是难以区分的。所以最后进行nms抑制的时候其使用的也是只有垂直方向的IOU。
3.3 文本线构造算法
当预测出来了多个稠密的框,我们在将多个框合并为一个大的框。如下图所示,我们简单介绍一下合并的流程。总共分为三步:1.排序 2.找pair,生成graph矩阵 3 遍历graph合并。
1.排序: 按照已经提取出来的text proposals的水平位置进行排序
2.找pair:正向寻找:当前框i向右找50个像素(1.76厘米,这就是一个定义的距离,因为横向为16所以就是3个proposals),找到IOU>0.7的(垂直IOU,可以保证尽量在同一行),取softmax score最大的一个框j(尽量使的一个pair组开头和结尾都是字);反向寻找:从框j位置向左找,条件和正向寻找一样,找到框k;判断:如果当前框i的softmax score大于反向找到的框k的softmax score,则graph(i,j)=True 是一个长连接,否则graph(i,j)=false,不是长连接(该连接包含在其它的连接里面);
这样可以尽量保证一个pair对的两端都是字,并且尽量在同一行。找到每一对,生成下面的graph矩阵(N*N 横纵坐标为anchor的数量)。
3.遍历graph 矩阵,将邻接的长连接再连起来
如下面蓝色1(0,3),蓝色2(3,7)(前面的y等于后面的x,就可以相连),没有以7为横坐标的框。则连成的大框就是(0,7)
最后将所有小的矩形连接起来就是大的矩形了。
3.4 文本行的side-refinement
因为预测anchor的时候固定宽度为16,所以多多少少会和真实框有一些差距。所以在最后要使用边界完善的方式,使回归框的x位置更加准确。
下图黄色为未调整之前,红色框为调整之后的框的。明显使用了微调之后会更加的准确一些。
表达式如下:Xside表示预测的边界x坐标,Cx表示anchor的中心点x,W表示宽度为16.