zoukankan      html  css  js  c++  java
  • [转]tesseract OCR Engine overview字符识别学习

    原文地址:http://blog.csdn.net/viewcode/article/details/7790065

    正文:

    原文: 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,即可演化的神经网络分类器(每一个结果都作为神经网络的输入,能提供反馈)。 esseract_srccubeconv_net_classifier.h 是分类器的描述。

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

    esseract_srccubeclassifier_factory.cpp

    esseract_srcccmaincube_reco_context.cpp

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

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

  • 相关阅读:
    C++常用工具收集
    Ubuntu禁用触摸板
    Vim简本
    JS原型链模式和继承模式
    JS原型链模式
    JS中的单例模式/工厂模式/构造函数模式(并非完全意义上的设计模式)
    JS中一道关于this和闭包的题
    JS中的this关键字
    JS闭包
    JS作用域和作用域链
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6094602.html
Copyright © 2011-2022 走看看