Combined Character

转载自:http://blog.csdn.net/peaceinmind/article/details/50374089


1导语

前两节我们分别解释了字符提取和字符过滤,在这过程中主要有=两个原因需要我们将单个字符组合成一个文字行或者段落之类(如图1)。一个重要的原因是出来不管是由于MSER的原因还是分类器的原因,有些真的字符并没有找出来,比如ij上面的点等等,当然实际中情况要远比这些严重的多,我们需要靠字符合并来恢复这些漏掉的字符。另外一个原因是在识别的时候有上下文会大大增加识别的精度,比如一个0,有时候很难区别它是数字0还是字母哦o,但是通过上下文的联系,难度就没这么大了,本节主要介绍字符合并,文本二值化,并会在结尾顺带特别简要地介绍下怎么去做OCR,在后面的章节中再会找个好玩的算法具体解释。


 

2 字符合并

在讨论这个问题之前呢,有一个问题需要说明的是,不是所有的算法都是先找字符再合并成文本行的,例如文献[1]中就是类似于物体识别,利用edgebox先去找word框,文献[2]也是先找框,不过其中的算法论文很快带过,文献[3]就更标新立异了,利用对称特征先去找文本行.所以,本章节讨论的是针对那些先找字符然后再合并的算法。最基本的字符合从结果上分可以分为水平合并和任意方向合并。任意方向更复杂,效果也相对较差。这其实跟我们生活中的道理是一样的,问题越简单,知道的先验知识越多,处理起来也就越简单,结果也会更准确。在这里我们只介绍水平合并,多方向合并的可以参考[3]

文献[6]模拟底部和顶部直线,如下图,个人感觉对于中文不是很通用,中文经常可以分为上下两个部分。


个人还是比较喜欢文献[5]中的算法,它利用两字符的颜色,位置,stroke等特征判断字符是否可以合并,比较直观上比较符合人的感受,因此下面着重介绍它。

假设我们有两字符uv,我们就利用两字符的一些特征差别,然后为每个特征差训练一个权重,看最后的得分是否大于0,大于0说明差别比较大,不应该合并,小于0就可以合并。


论文中主要采用了这么几个特征:

interval,也就是两字符的间隔与字符的最大宽度的比例(对于这个特征,由于mser有可能把几个字符框在了一起,因此高度作为分母是不是会更好些?)

Widthand height differences,非常直观,字符宽度和高度差。

Topbottom alignment,其实有点类似于文献[6]中的直线模拟

Colordifference,颜色差

Strokewidth difference,笔画宽度差



如果对权重的训练过程不是很感兴趣,那可以直接用论文的结果,其中的theshold类似于神经网络的bias


如果对训练过程感兴趣,那我们接着往下看。训练的过程其实跟一般的并没有什么很特殊的区别,个人觉得比较麻烦的就是标注数据,不过ICDAR有一些可以利用。

首先我们有一些单词或文本行的cluster(看你希望合并成单词还是文本行),其中包含最基本的元素是字符,我们需要做的就是想让cluster内部的字符特征差与权重的内积小于0,而不同clusters的字符特征差与权重的内积大于0,这里采用迭代的方法。首先初始化一个w,然后选出所有cluster内部字符特征差异最小的(个人有点不太理解为什么不选最大的?),和不同cluster间的字符特征差x最小的


这个就有点类似于正负样本了,接下来我们需要去定义损失函数,


 

其实很好理解,用的是逻辑回归的东西,同一个cluster的特征差异越大,损失越大,不同cluster特征差异越大,损失越小。论文中用的是LBFGS,这部分可以参考维基百科.

一次迭代后,再用新的w值再去寻找C,M中的样本重新训练。


3 文本二值化

二值化能很大程度上提高OCR的精度。现在用的最多的应当是是大金算法,tesseract[8]默认的也用的是这个,opencv里也有现成,文献[2]用的是Niblackbinarization,大家如果有兴趣,可以参照[9]跑一跑代码实际测试下,其中实现了几种二值化的算法。这里我们要介绍的文献[6][12]中的grabcut算法,显得要高大上些。另外非常抱歉的是由于本人没做实验,只能用论文中的图片先代替,后面做完实验后会更新这部分的内容。

 

前面的章节已经分析了Grabcut,现在假设大家都看过了这部分的内容。

如果要用grabcut进行二值化,就是要找到字的前景。在这里我们可以把一个文本行中找到的字符点作为前景来训练,但是有可能这部分点有些噪点,文献[6]是用了SSP作为DF(确定是前景),并且也是采用了一个迭代过程来向外扩展文本框,4,5,6这几部opencvgrabcut函数已经覆盖了。PF是可能是前景的意思


最后的结果就类似于


 

4文字识别

由于文字识别很复杂,最简单的方法是调用开源库tesseract[8],当应用场景不是很复杂,文字定位也做的比较好时,精度还过得去。另外一种如果场景特别干净,你可以自己去分割,然后用分类器去识别,这种的缺点也比较明显,先不说分割的准确度,由于缺少了上下文,一些字容易识别错。现在越来越多的论文引入BLSTM或者Multi Dimensional LSTM去做文字识别[10][11],我们后面的章节应该会着重介绍LSTM

 

这节就囫囵吞枣的讲到这里。由于个人水平有限,错误与疏漏还请批评与指正。

 

[1]Reading text in the wildwith convolutional Neural Networks.

[2]PhotoOCR: Reading Text inUncontrolled Conditions

[3]Symmetry-Based Text LineDetection in Natural Scenes

[4]Multi-orientation scene textdetection with adaptive clustering

[5]Yin X C, Yin X, Huang K, etal. Robust text detection in natural scene images[J]. Pattern Analysis andMachine Intelligence, IEEE Transactions on, 2014, 36(5): 970-983.

[6]Neumann L, Matas J.Efficient Scene Text Localization and Recognition with Local Character

[7]https://en.wikipedia.org/wiki/Limited-memory_BFGS

[8]https://code.google.com/p/tesseract-ocr/

[9]https://github.com/caiosba/binarization

[10]Can we buildlanguage-independent OCR using LSTM networks?

[11]Segmentation-freeHandwritten Chinese Characters Recognition with LSTM-RNN

[12]Milyaev S, Barinova O, Novikova T, et al. Image binarization for end-to-end text understanding in natural images[C]//Document Analysis and Recognition (ICDAR), 2013 12th International Conference on. IEEE, 2013: 128-132.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章