文字检测与识别3-字符合并
2015-12-21 19:55
239 查看
1导语
前两节我们分别解释了字符提取和字符过滤,在这过程中主要有=两个原因需要我们将单个字符组合成一个文字行或者段落之类(如图1)。一个重要的原因是出来不管是由于MSER的原因还是分类器的原因,有些真的字符并没有找出来,比如i和j上面的点等等,当然实际中情况要远比这些严重的多,我们需要靠字符合并来恢复这些漏掉的字符。另外一个原因是在识别的时候有上下文会大大增加识别的精度,比如一个0,有时候很难区别它是数字0还是字母哦o,但是通过上下文的联系,难度就没这么大了,本节主要介绍字符合并,文本二值化,并会在结尾顺带特别简要地介绍下怎么去做OCR,在后面的章节中再会找个好玩的算法具体解释。
![](http://img.blog.csdn.net/20151221195713021)
2 字符合并
在讨论这个问题之前呢,有一个问题需要说明的是,不是所有的算法都是先找字符再合并成文本行的,例如文献[1]中就是类似于物体识别,利用edgebox先去找word框,文献[2]也是先找框,不过其中的算法论文很快带过,文献[3]就更标新立异了,利用对称特征先去找文本行.所以,本章节讨论的是针对那些先找字符然后再合并的算法。最基本的字符合从结果上分可以分为水平合并和任意方向合并。任意方向更复杂,效果也相对较差。这其实跟我们生活中的道理是一样的,问题越简单,知道的先验知识越多,处理起来也就越简单,结果也会更准确。在这里我们只介绍水平合并,多方向合并的可以参考[3]。
文献[6]模拟底部和顶部直线,如下图,个人感觉对于中文不是很通用,中文经常可以分为上下两个部分。
![](http://img.blog.csdn.net/20151221195718651)
个人还是比较喜欢文献[5]中的算法,它利用两字符的颜色,位置,stroke等特征判断字符是否可以合并,比较直观上比较符合人的感受,因此下面着重介绍它。
假设我们有两字符u和v,我们就利用两字符的一些特征差别,然后为每个特征差训练一个权重,看最后的得分是否大于0,大于0说明差别比较大,不应该合并,小于0就可以合并。
![](http://img.blog.csdn.net/20151221195724376)
论文中主要采用了这么几个特征:
interval,也就是两字符的间隔与字符的最大宽度的比例(对于这个特征,由于mser有可能把几个字符框在了一起,因此高度作为分母是不是会更好些?)
Widthand height differences,非常直观,字符宽度和高度差。
Top和bottom
alignment,其实有点类似于文献[6]中的直线模拟
Colordifference,颜色差
Strokewidth difference,笔画宽度差
![](http://img.blog.csdn.net/20151221195729857)
![](http://img.blog.csdn.net/20151221195738287)
如果对权重的训练过程不是很感兴趣,那可以直接用论文的结果,其中的theshold类似于神经网络的bias
![](http://img.blog.csdn.net/20151221195743751)
如果对训练过程感兴趣,那我们接着往下看。训练的过程其实跟一般的并没有什么很特殊的区别,个人觉得比较麻烦的就是标注数据,不过ICDAR有一些可以利用。
首先我们有一些单词或文本行的cluster(看你希望合并成单词还是文本行),其中包含最基本的元素是字符,我们需要做的就是想让cluster内部的字符特征差与权重的内积小于0,而不同clusters的字符特征差与权重的内积大于0,这里采用迭代的方法。首先初始化一个w,然后选出所有cluster内部字符特征差异最小的(个人有点不太理解为什么不选最大的?),和不同cluster间的字符特征差x最小的
![](http://img.blog.csdn.net/20151221195749074)
这个就有点类似于正负样本了,接下来我们需要去定义损失函数,
![](http://img.blog.csdn.net/20151221195754434)
其实很好理解,用的是逻辑回归的东西,同一个cluster的特征差异越大,损失越大,不同cluster特征差异越大,损失越小。论文中用的是LBFGS,这部分可以参考维基百科.
一次迭代后,再用新的w值再去寻找C,M中的样本重新训练。
![](http://img.blog.csdn.net/20151221195808531)
3 文本二值化
二值化能很大程度上提高OCR的精度。现在用的最多的应当是是大金算法,tesseract[8]默认的也用的是这个,opencv里也有现成,文献[2]用的是Niblackbinarization,大家如果有兴趣,可以参照[9]跑一跑代码实际测试下,其中实现了几种二值化的算法。这里我们要介绍的文献[6][12]中的grabcut算法,显得要高大上些。另外非常抱歉的是由于本人没做实验,只能用论文中的图片先代替,后面做完实验后会更新这部分的内容。
前面的章节已经分析了Grabcut,现在假设大家都看过了这部分的内容。
如果要用grabcut进行二值化,就是要找到字的前景。在这里我们可以把一个文本行中找到的字符点作为前景来训练,但是有可能这部分点有些噪点,文献[6]是用了SSP作为DF(确定是前景),并且也是采用了一个迭代过程来向外扩展文本框,4,5,6这几部opencv的grabcut函数已经覆盖了。PF是可能是前景的意思
![](http://img.blog.csdn.net/20151221195813882)
最后的结果就类似于
![](http://img.blog.csdn.net/20151221195818048)
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.
前两节我们分别解释了字符提取和字符过滤,在这过程中主要有=两个原因需要我们将单个字符组合成一个文字行或者段落之类(如图1)。一个重要的原因是出来不管是由于MSER的原因还是分类器的原因,有些真的字符并没有找出来,比如i和j上面的点等等,当然实际中情况要远比这些严重的多,我们需要靠字符合并来恢复这些漏掉的字符。另外一个原因是在识别的时候有上下文会大大增加识别的精度,比如一个0,有时候很难区别它是数字0还是字母哦o,但是通过上下文的联系,难度就没这么大了,本节主要介绍字符合并,文本二值化,并会在结尾顺带特别简要地介绍下怎么去做OCR,在后面的章节中再会找个好玩的算法具体解释。
2 字符合并
在讨论这个问题之前呢,有一个问题需要说明的是,不是所有的算法都是先找字符再合并成文本行的,例如文献[1]中就是类似于物体识别,利用edgebox先去找word框,文献[2]也是先找框,不过其中的算法论文很快带过,文献[3]就更标新立异了,利用对称特征先去找文本行.所以,本章节讨论的是针对那些先找字符然后再合并的算法。最基本的字符合从结果上分可以分为水平合并和任意方向合并。任意方向更复杂,效果也相对较差。这其实跟我们生活中的道理是一样的,问题越简单,知道的先验知识越多,处理起来也就越简单,结果也会更准确。在这里我们只介绍水平合并,多方向合并的可以参考[3]。
文献[6]模拟底部和顶部直线,如下图,个人感觉对于中文不是很通用,中文经常可以分为上下两个部分。
个人还是比较喜欢文献[5]中的算法,它利用两字符的颜色,位置,stroke等特征判断字符是否可以合并,比较直观上比较符合人的感受,因此下面着重介绍它。
假设我们有两字符u和v,我们就利用两字符的一些特征差别,然后为每个特征差训练一个权重,看最后的得分是否大于0,大于0说明差别比较大,不应该合并,小于0就可以合并。
论文中主要采用了这么几个特征:
interval,也就是两字符的间隔与字符的最大宽度的比例(对于这个特征,由于mser有可能把几个字符框在了一起,因此高度作为分母是不是会更好些?)
Widthand height differences,非常直观,字符宽度和高度差。
Top和bottom
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这几部opencv的grabcut函数已经覆盖了。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.
相关文章推荐
- hdu1078FatMouse and Cheese【记忆化搜索】
- MySQL执行计划解读 转他人文章
- 群集中Hyper-V管理器无法远程管理其他节点VM/迁移异常
- 2015.12.19比赛总结
- 解决MySQL服务无法启动及MySQL5.4.10更改root密码
- Https双向验证证书:Android+OpenSSL
- 11-Angular的自定义指令以及实例
- zstu 4215 多起点bfs
- socket编程的select模型
- 美团2015笔试题以及最优解(一)
- Joda-Time 用法
- 数据库 对表增加触发器 控制修改,删除不能超过指定数目,比如不能修改超过1条数据
- FLV科普6 FLV Tag以及Tag头信息解析
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- linux命令学习(3)
- swift 新功能介绍
- 我的vimrc
- 第十四周 项目五-是否二叉树?
- Allocation Tracker(Android Studio) 分析应用内存问题
- 创建计算字段