[转]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-OCR4.0版本在VS2015上的编译与运行(转)
Python调用Tesseract-OCR完成图片OCR识别