因爱智能

tesseract OCR的多语言,多字体字符识别

识别多种字体、多种语言的字符,在实际应用中是很常见的问题。

经过测试,及查看tesseract3.01的源码,tesseract 3.01版本是不支持多语言、多种字体OCR识别的。
tesseract3.01版本不支持新训练的数据,加入原有字符集,并不支持多个训练库的联合使用方式。


如何利用tesseract进行多语言或多字体识别哪?

一种方法是自己训练字符集,将所有的字体、语言的训练数据放入一个训练数据文件内。这种方法需要庞大的训练样本数据,工作量大,而且舍弃原有的google的训练库,实在是太可惜了。


另外一种方法就是升级tesseract到3.02版本。目前3.02版本还没有release,需要自行下载源码,编译,生成。 tesseract3.02支持多个训练库联合使用的方式,这样就能支持多语言、多字体识别,并且tesseract3.02版本的固有数据集应该增加了大量的样本,因为其体积比3.01版本的数据文件大了很多。


tesseract多语言识别的原理及算法在文章Adapting the Tesseract Open Source OCR Engine for Multilingual OCR有专门的介绍。这里记录下自己对这篇文章的理解。


OCR字符识别的热点趋势:
拉丁文-> 中文、日文、韩文 -> 阿拉伯文 -> 印度语
这几种语言字符有各自的特征。


汉字、日文:有一些相同文字,但文字有上千种形状结构。
韩文:自己特有的文字结构,而且数量更多。
阿拉伯文:字母都连起来书写,且字母处在不同的位置,其形状也不同。
印度文:将字符连起来形成上千种形状,来表示不同的音节。其包含了阿拉伯文和韩文面临的问题。

汉字、韩文和印度文都有部首和词根的结构。相比韩文,汉字的词根在不同的字里,其形状也是不固定的,且常和其他部首连写。而印度文更复杂些。

拉丁文字符识别在另外一篇文章中有介绍,这里写些思路与未提到的问题。
1. 在连通区域分析后,找出blob,即单个字母块。
2. 行检测。利用等间距检测与分割算法,包括识别词与字母的空白区别。
3. 单个字符识别,并对初次识别效果不佳的字符进行分割与联想,对于多种可能,就应用词典的距离计算,选择出最好的可能性。

4. 多次识别:识别效果好的字符作为训练样本,对其他不好的字符进行再次识别。(自适应分类器)


问题: 
一般一个字母是单连通区域,但也有例外,一个字母有多个连通区域,或嵌套孔洞,如圆圈中有一个c或R的字符。


--------------

文章的排版:

1. 横排、竖排、混合排列

tesseract最初支持处理横排的情况,若处理各种排列,tesseract需要考虑更多的特征检测。

段落缩进的检测; 字符间距检测(竖排字符的间距中值小于字符大小的均值);文本行(列)检测

另外,对于竖排占多数的页面,可以旋转90度,这样大部分文本可转换为横排,减少竖排区域误检率。


混合排列在各种文字中都存在且常见,所以,tesseract要处理这些情况。


2. 文本行、列检测

行检测算法:
每行文本中的字符直接的间距比较小,一般比行间距小,且一般字符大小都差不多,除了个别特殊位置上的字符。利用这个特征,将邻近字符串起来,就形成了一条线。多条线形成后,就有了多条线平行的特征,多条平行线就形成了一个模块。
不同的平行线形成的排版,就能将整个页面分割开来。


行检测完成后,就能检测行内的单个字符了。对于拉丁字符,空格是最小识别单位的特征,而一些语言的空格特征不明显,如中文字符,字、词之间空格没差别,词根之间也有空格,将一个连通区域作为一个独立的识别单位,这种识别方法缺少整体的识别能力,如字典等。一种解决方法是,先识别标点符号(punctuations),但对长句子,还是有局限性。


若存在多种语言混合编排的情况,字符的大小特征可能不一样,如拉丁与汉字。这就需要不同的语言字符,应用不同的阈值进行过滤。


3. 古斯拉夫语Cyrillic,类似俄语之类吧,小写字母x字符高度的估计
拉丁字符检测的方法,不适用于这种语言。
俄语的检测需要应用其他的特征。这里对俄语不熟悉,就忽略不看了。


4. 字、词的识别

包括分割、搜索及形状分类
字母语言的识别,与象形文字的识别,有很多不同。象形文字的词汇的边界不如字母文字清晰。
对于象形文字间的关联,tesseract应用最优优先搜索方法(best-first-search),在词典中寻找匹配的词汇,这个比字母词汇搜索需要更深的搜索层次。


形状分类
线宽、线长都可以作为字符的形状特征。对于一个字或字符,可以先粗略的分类,多选几个近似的分类,然后,再仔细的分类,从候选的类别选出可能的类别。


6. 上下文关联后处理
字典搜索

评论