[转]tesseract OCR Engine overview字符识别学习

Posted viewcode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转]tesseract OCR Engine overview字符识别学习相关的知识,希望对你有一定的参考价值。

原文: An Overview of the Tesseract OCR Engine 

下载地址http://code.google.com/p/tesseract-ocr/wiki/Documentation


Tesseract的识别步骤大致如下:

1. 连通区域分析;

2. 检测出字符区域区域(轮廓外形),以及子轮廓;

3. 由字符轮廓,得出文本行,以及通过空格识别出单词,通过字符单元分割出单个字符,而对百分号的文本(Proportional text)通过fuzzy空格来分割为单词;

4. 每个单词进行分析,采用自适应分类器,分类器有学习能力,先分析的且满足条件的字母也作为训练样本,所以后面的字符(比如页尾)的字符识别更精确;此时,页首的字符识别比较吃亏,所以tesseract会对整页的识别不太好的字符,再次进行识别。

5.最后,识别含糊不清的空格,及用其他方法,如由笔画高度(x-height),识别小写字母的文本。



small-cap:小写字母?


利用第四个步骤的特性,对单个字符识别,选用能识别的比较好的字符放在页首,将待识别的字符放在页尾,是否能提高识别率?待测试...

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

1. line and word finding

a. 假定文本区域能大致确定,将跨行大写字母及纵向粘连一起的字符过滤掉,可以利用字符的高度信息,选取所有字符的中值高度

b. 对字符的x坐标排序,利用坐标拟合直线,拟合方法:中位数最小方差拟合(least median of squares fit)

c. 进一步,拟合文本行的形状,利用四次多项式,将文本行看成螺线形,采用最小方差拟合

d. 检测出等距文本(fixed pitch text),对粘连的文本进行分割(chopping)

e. 对非等距字体如百分号,斜体等问题,利用中线、基准线之间的空白大小,来分割字符

Drop-caps: 段落的首个字母,大写且跨越两行。

vertical touching character:纵向粘连一起的字符。

Proportional text:含百分号的文本

2. word recognition

a. 分割粘连的字符,将凹进去的轮廓点作为备选分割点,分割后,进行识别,如果都失败,就认为字符破损不全,修补字符

b. 对破碎的字符,利用A*算法搜索最优的字符组合,直到达到满意的识别结果


3. Static Character Classifier

特征

a. 拓扑特征:与字体及大小无关,但问题是(引用文章看不到)?

b. 将字符近似为多边形作为特征:对破碎不连通的字符无效

c. 突破性方案:训练阶段的特征与识别的特征可以不尽相同。在训练阶段,将近似多边形作为特征,而在识别阶段,抽取字符的轮廓特征并归一化,然后将训练集中的原型特征再与之,进行多对一的方式匹配

The features extracted from the unknown:待识别字符的特征,3维数据(x, y坐标,角度),每个字符一般有50-100个特征

the prototype features:原型特征(训练集中的字符特征),4维数据(x, y坐标,角度,长度)一般有10-20个特征


分类,分为两个步骤:

a. 粗分,多个特征,将每个特征相近的字符列举出来

b. 细分,对相近的字符,用特征距离进行细分


训练数据

94个字符,8种大小,4种字体(正常,粗体,斜体,斜粗体),每种20个样本,共60160个样本。

    

4. 语法分析

训练集中有最常用的高频词,字典中的常用词,常用数字,常用大写、小写。

将分割出的、待识别的词与这些词进行比较计算,算法采用加权最小距离。

问题:不同的分割,会识别出不同的结果。两种结果都有可能,原因在于分割的不确定。用两个指标进行量化,一个是confidence,将未知字符到原型的归一化距离为指标;第二是将未知字符的轮廓长度(归一化后的)作为指标。


5. Adaptive Classifier 自适应分类器

由于静态分类器涉及到多种字体(generalizing to any kind of font),其区分相近字符、字符与非字符的能力被削弱。此时,由于每页文档内的字符的个数有限,利用静态分类器的结果可以训练出对字体更敏感的自适应分类器,可以提高分类能力。

tesseract不用模板分类器,但使用相同的特征和分类作为静态分类器(uses the same features and classifier as the static classifier. 不解?)。静态与自适应的区别,除了训练集外,还有自适应分类器会将一行字符的基线(baseline)/x-高度(小写字母x的高度) 归一化。 归一化后,很容易区分字母大小写及噪声;而静态分类器仅利用字符归一化的一阶矩确定位置,二阶矩确定字符大小。

将字符的距 归一化最大的好处是 去除 高宽比( aspect ratio )和字体笔画宽度(stroke width)的影响,且使上标、下标的区分简单。但需要额外的分类特征来区分字母大小写。

(两种归一化:基线/x行高的归一化,单个字符距的归一化)

tesseract还有学习能力,一般来说,整页的文章的识别率要比单个字符的识别率要高,而且速度要比单个字符识别(累加时间)要好。


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

在tesseract源码里,tesseract默认选取的特征是 bmp,分类器是Convolutional Neural Net classifier,即可演化的神经网络分类器(每一个结果都作为神经网络的输入,能提供反馈)。\\tesseract_src\\cube\\conv_net_classifier.h 是分类器的描述。

不仅如此,tesseract还提供了Hybrid Neural Net Char Classifier分类器,使用Hybrid特征数据。

\\tesseract_src\\cube\\classifier_factory.cpp

\\tesseract_src\\ccmain\\cube_reco_context.cpp

里包含了tesseract分类器的实现。


文章比较拗口,英语功底不够,后面慢慢理解修正。

以上是关于[转]tesseract OCR Engine overview字符识别学习的主要内容,如果未能解决你的问题,请参考以下文章

[转]Tesseract-OCR学习系列

Tesseract-OCR4.0版本在VS2015上的编译与运行(转)

Python调用Tesseract-OCR完成图片OCR识别

tesseract-ocr

如何通过Tesseract开源OCR引擎创建Android OCR应用

Python图片文字识别——Windows下Tesseract-OCR的安装与使用