Tesseract OCR 引擎概述


Ray Smith
摘要
Tesseract OCR引擎,最初是HP在UNLV第四次OCR精度测试年会上提出的一个研究原型,本文对此作一个综合性的概述。文中会对OCR引擎中一些新奇可不同寻常的地方加上强调标记,包括行发现,特征/分类方法,自适应分类器

1. 引言——动机和历史
Tesseract是一个开源的OCR引擎,最初由HP在1984到1994年开发,它在1995年UNLV的OCR精度测试年会上横空出世,惊艳全场,之后又迅速消失在人们的视野中 。至到现在有关它的架构和算法细节才第一次被披露出来
Tesseract最初是HPBristol 实验室的一个博士研究项目,因为可能可以为HP的平板扫描仪提供一个软件或硬件的附加物,该项目获得了快速的发展。而当时商业的OCR引擎还处于起步阶段,除了对高质量的印刷品外,其他文本都不能识别。这给了他们很大的动力。
在HP的Bristol实验室和HP在科罗拉多的扫描仪部门进行了一个联合项目之后 ,Tesseract在精度上已经大大领先于商业引擎,但是还是没有变成一个独立产品。它下一个阶段的开发又回到了Bristol实验室,开始研究OCR在压缩上的应用。主要的工作是改进拒绝高效而不是基础的识别精度 。这个项目的后期,在1994年底,开发完全停止。引擎送往UNLV参加 1995年的OCR精度 测试年会,在那它证明了在对抗当时商业引擎方面的价值。到2005年,HP将tesseract开源,现在可以从http://code.google.com/p/tesseract-ocr上获得

2. 架构
因为HP有一个独立的页布局分析技术(已经应用在产品中因此没有开源),tesseeract从来不需要它自己的页分析逻辑。tessearact因此假定它的输入是一个二进制的图像,可以附带一个多边形的区域定义
处理过程遵循传统的一步一步处理,但是某些阶段在当时是很不寻常的,有些可能到现在也是如此。第一步是连通组件分析,在这一步组件的轮廓被存储下来。这在当时 是一个很耗计算资源的设计方案,但是有一个非常大的好处:对轮廓及子轮廓、孙轮廓数量的递归检测,将会使文本的反转和识别,像黑底白字文本一样容易。tesseract可能是第一个可以轻松处理黑底白字的OCR引擎,在这个阶段,轮廓将被聚合在一起,放到Blob中
Blob组织成文本行,分析这些行和区域以决定是等宽文本还是比例文本。文本行根据字符空间类型,分割成不同的单词。等宽文本根据字符单元被立即分割,比例文本将根据固定空格和模糊的空格进行分割
之后是识别,分成两次处理。第一次,尝试轮流识别出每一个单词,每一个满意的单词都被传给一个自适当分类器作为一个训练数据,这样自适应分类器将有机会在该页的后面得到更精确的识别结果
因为这种自适应分类器学到的有用东西可能对页面顶部的内容来说太迟了,所以需要对整个页面再运行一次识别过程,前一次识别不太好的单词会在这次重新识别
最后阶段是解决模糊空格,检查对x-高度的另一种假定来定位小字母文本

3. 行和单词发现
3.1 行发现
行发现算法是tesseract之前已经公开的少数几个算法之一[3],这个算法可以处理倾斜的页面,而不需要将倾斜页面进行校正,因此不会损失图像的质量。这一过程的关键是Blob过滤和行建构。
假设页布局分析已经提供了一个文字大小大致相同的文本区域,一个简单的百分比高度过滤器去除掉下沉的字母以及垂直方向上互相接触的字符。中间高度近似于这个区域文本的大小,所以过滤掉比中间高度的片断更小的Blob是安全的,它们更可能是标点符号、变音符号和噪音
过滤后的Blob更可能拟合到一个无重叠的,平行但倾斜的线的模型。把这些块按x坐标排序并处理,使它可能将一些块指派到唯一的行。文本行可以跟踪整个页的倾斜,这将大大减小在页面倾斜时将Blob指定到错误文本行的风险。一旦这些过滤后的Blob已经被指定到了行,就可以用最小中位数平方法来估算基线,那些被过滤掉的块会被重新安排到合适的行
创建行的最后一个步骤,是合并水平方向上重叠至少一半的块,将变音符和正确的基线放在一起,和将破碎的字符正确相联在一起

3.2 基线拟合
一旦文本行已经被发现,就可以用二次样条法来拟合出更精确的基线。这是一个OCR系统 的另外一个首创,这使得Tesseract可以处理带弯曲基线的页面,这通常是扫描过程中人为的影响,而不仅仅是因为书籍装订的原因
基线拟合依据的是将Blob分区成组,用一个合理的、连续线代替原来笔直的基线。使用最小中值平方法来拟合二次样条到最稠密的区域(假定是基线)。二次样条有一个好处是计算相当稳定,但是坏处是要求多个样条段时,会出现不连续性。一个更传统的三次样条可能会更好
图1 一个拟合的弯曲基线
图1显示了一个文本行的例子,这个文本行带有一个拟合的基线,下行,中值行和上行。所有这些行是平行的(在整个长度之上y间距是一个常量,)并且轻微的弯曲。上行线是蓝绿色(印刷得有点灰)其上的黑线实际上是直的。仔细观察可以看到,蓝绿线/灰线相对于其上的黑线是弯曲的

3.3 等宽字符检测和分割
Tesseract检测文本行来判断它们是不是等宽字符。一旦它发现了等宽文本,Tesseract用固定的宽度把单词分割成一个个字符,并且在单词识别阶段不再进行分割与聚合操作。图2显示了一个典型等宽单词的例子

3.4 非等宽单词发现
非等宽或比例文本的分隔是一个非常艰巨的任务。图3显示了一些典型的问题。图中'ned'和'11.9%'之间的间隔和一般的间隔大小相同,而比“erated'和'junk'之间的间隔则要大得多,而‘of’和‘financial'之间则完全没有水平间隔。Tesseract在基线与平均线之间一个有限的垂直范围内,测量字符间隔,以此来解决大多数的这类问题。这一阶段,那些接近阈值的间隔就会产生一些模糊,所以只有在单词识别之后,才能做出一个最终的决定

4. 单词识别
任何字符识别引擎识别过程的一部分工作,就是找出一个单词应该如何分割成字符。在行发现中最初的分割输出被首先进行分类,单词识别的剩余步骤只对非等宽文本适用

4.1 分割相连字符
当一个单词的识别结果(参见第6部分)不令人满意时,Tesseract将尝试改进结果:以字符分类器中最不可信的结果来对Blob进行分割,候选的分割点可以从轮廓的多边形近似图的凹顶点中选取,可能有相反的凹顶点,或者一个线段。要成功地从ASCII集中分割一个连接在一起的字符,它可能占用3对分割点才能成功
图4用箭头标示了一组候选的分割点,以及选择的点,这些点作一条线穿过r和m轮廓线
分割执行的优先级较高。任何没有改进结果可信度的分割将被恢复,但并不是完全丢弃,这样分割可以在后面聚合过程如果需要的话,可以被重复使用

4.2 聚合分散的字符
当分割的潜能已经挖掘完,如果这个单词还是不够好,它就会被传给聚合器。聚合器开始一个A*搜索(最佳优先搜索),对最大化分割的blob组合成可能的字符图形片段。它做这些并没有实际建立片断图,但是维护一个可访问状态的hash表。A*搜索过程靠从一个优先级队列中抽取候选的新状态,并且依靠对它们非分类的段组合进行分类,对它们进行评估
这种完全分割-聚合的方法是以最低的效率,以最坏的倾向来错过重要的分割,这可能是这种情况。好处是:这种分割-聚合方案简化了数据结构,这种数据结构在维护全段图时被要求
1989年A*分段搜索第一次实现时,Tesseract在破损字符上的准确度大大超过了商业引擎。图5是一个典型的例子。这一成功的本质是字符分类器可以轻易识别出破损的字符

5. 静态字符分类
5.1 特征
Tesseract早期的版本使用拓扑特征,这是从Shilman. al.[7-8]的工作发展而来。虽然它可以与字体与大小无关,这些特征对真实生活中图片仍不够健壮,如Bokser在[9]描述的那样。一个中间方案是引入近似多边形分段作为特征,但这种方法对破损的图像也不够健壮,例如,在图6(a)中,右边的字符是分成两边的,但是在图6(b)中,只有单独的一片
终极的解决方案是:那些未知图像的特征不需要和训练数据中的已知特征相同。在训练过程中,近似多边形的分段被用作特征项,但是在识别时,小的,固定长度(以统一的单位)的特征从轮廓 中抽取出来,并匹配多对一而不是一簇训练数据中的原型。在图6(c)中,短粗线代表从未知图像中抽取出来的特征,而细长的线代表作为原型的近似多边形的一簇片断。一个带两片的原型是完全不匹配的。三个特征在一侧,而二个特征在另一侧是不匹配,但是,撇开这些不看,每一个原型和每一个特征是非常匹配的。这个例子显示 ,小特征匹配大原型过程,是可以很容易 复制 到破损图像的识别中。它的主要问题是:计算一个原型与未知原型之间的距离,非常耗计算资源
从未知中抽取的特征因此是三维的(x,y位置和角度),一个字符一般有50-100个特征,而原型特征有4个维度(x,y位置,角度 ,长度),一般一个原型配置有10-20个特征

5.2 分类
分类 过程是一个二步过程。第一步,一个类修剪器创建一个可能匹配字符的短名单。每一个特征,从一个粗糙的3维查找 表中,获取一个类的 比特向量,代表它可能匹配的类,之后这个比特向量在所有特征上累计,得到最高分的类(在修改了特征的期望值之后)变成一个短名单,传给下一步
每个未知 的特征查看一个给定类原型的比特向量它可能匹配的。然后计算一个实际 的相似度,每一个原型字符 类用一个逻辑产器总数 代表,表示每一个术语,叫一个配置。所以距离 计算过程保持了一个总相似度的证据,也就是每个原型。最佳的距离 ,是最好的

5.3 训练数据
因为分类 器能轻易识别破损的字符,分类器没有在破损字符上进行训练。事实上,分类器只在仅仅94个字符的20个上进行了训练,从8个字体,相同的大小,但带有4个属性(正常,粗体,斜体,粗斜体),生成了总共60160个训练样本。相比于其它已公开的分类器来说,这一点非常有意义,如Calera分类 器使用了超过一百万的样本,而Baird的100种字体分类器则使用了1175000个训练样本

6 语言分析
Tesseract中语言分析相对较小。单词识别模块无论何时都被认为是一个新的分段,语言模块(换码器的一个错误命名)选择最可能的单词字符串在下面的分类 :最频繁单词,字典单词,数字单词,大写字母单词,小写字母单词,分类器选择单词。对一个给定的分段最终的选择是拥有最低的总距离比例,每一个之上的分类 都被乘一个不同的常数
来自不同分段的单词可能有不同数目的特征,它很难直接比较这些单词,即使一个分类 器声称是产品概率,而Tesseract不是。这个问题在Tesseract中靠创建两个数字为每一个字符分类来解决。首先,是减去一个正则化的距离 从原型中,这使得它是可信的在更大的场景,但是还是一个距离 ,第二个输出,叫作比例,乘以正则化距离 。一个单词中的字符比例可以是有意义的,因为一个单词中所有字符总的轮廓 长度总是相同的

7. 自适应分类器
文献[11]和[12]中建议,OCR引擎可以通过使用自适应分类器来获益。因为统计分类器必须对所有字体都是好的,它对不同字符的识别或字符与非字符的识别能力被减弱。一个字体敏感的自适应 分类器是由统计分类器输出训练的,通常可以获得更大的识别率在一个文档内,在那字体 的数量 是有限的
Tesseract并不使用一个模板分类 器,但是使用和统计分类器相同的特征和分类 器。统计分类 器和自适应分类 器唯一显著的区别在于,自适应 分类器使用各向同性的基线/x高度规一归,而统计分类 器使用位置的几何中心来归一化字符,第二次使用各向异性大小来归一化
基线/x高度归一化使得区分大小写字符更容易,同是也改进了对噪声斑点的抗干扰。字符瞬间归一化的主要好处是字体方面比例的移除和字体宽度。它也下标和上标识别更容易 ,但是要求 另外的分类特征来区分上标和下标字符。图7显示了一个3字符的例子对比了基线/x高度归一化和瞬间归一化

8. 结果
Tesseract以”HP实验室OCR“身份参加了第4次UNLV年度OCR精度测试,但是自那之后代码已经作了很大的修改,从转到Unicode字符集到再训练。表1比较了一个最近的Tesseract版本和最初1995年的结果。全部4个300DPI二进制测试集显示如下,列了错误数,错误率和百分比变化率。更新的结果可以参考http://code.google.com/p/tesseract-ocr

9. 结论与后续工作
在沉寂了十多年之后,Tesseract在它的精确度方面现在在领先的商业引擎之后。它的主要力量可能是它的不同寻常的特征选择。它的主要弱项可能 是它使用了多边形近似作为分类器的输入,而不是原始的轮廓
随着国际化进程,随着隐马尔可夫模型的字符n-gram模型的加入,精度可能被大幅提高,同时也可能使用一个改进的分割器

10. 鸣谢
感谢John Burns和Tom Nartker在使Tesseract开源过程作的努力,感谢UNLV的ISRI组分享了他们的工具和数据,还有Luc Vincent, Igor Krivokon, DarShyang Lee和Tomas Kielbus对这篇文章的指点

11. 参考文献
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值