菜单

识别引擎

相关源文件

此页面提供了 Tesseract OCR 中使用的识别引擎的全面概述。识别引擎是负责将文档图像中的视觉信息转换为实际文本的核心组件。Tesseract 目前拥有两个不同的识别引擎,它们基于不同的原理运行:LSTM 神经网络引擎和传统/遗留引擎。有关 OCR 管道的整体信息,请参阅 OCR 管道

概述

Tesseract 的识别功能分为两个不同的引擎,它们在字符识别方面采用不同的方法

LSTM 引擎:更现代的方法,使用深度学习和长短期记忆神经网络直接从图像特征识别字符序列。该引擎通常对大多数语言提供更高的准确性。

传统/遗留引擎:原始的 Tesseract 引擎,使用基于特征的方法和自适应分类。它通过提取字符图像的几何特征并将其与原型进行匹配来工作。

来源: src/lstm/recodebeam.cpp src/classify/adaptmatch.cpp src/classify/intproto.cpp

LSTM 引擎

LSTM(长短期记忆)引擎是一个基于神经网络的识别系统,它将文档图像作为特征序列进行处理,因此对于连笔脚本和复杂布局特别有效。

架构

LSTM 引擎通过以下方式处理图像

  1. 将图像转换为特征序列
  2. 将这些特征输入神经网络
  3. 在每个位置生成代表字符概率的输出
  4. 使用束搜索(beam search)解码最可能的字符序列

来源: src/lstm/recodebeam.cpp82-90 src/lstm/recodebeam.cpp200-219

束搜索解码

LSTM 引擎使用一种称为束搜索的复杂技术,将网络的原始输出转换为连贯的文本。这在 RecodeBeamSearch 类中实现,该类维护对文本的多种可能解释(即“束”),并选择最有可能的一种。

束搜索

  • 按顺序处理网络输出
  • 在每个步骤维护 N 个最佳部分序列的束
  • 同时考虑字符和空(分隔符)的概率
  • 在可用时使用语言模型和字典来提高识别率
  • 处理字符重复等特殊情况

控制束搜索的关键参数包括

  • kBeamWidths:控制搜索束的大小
  • 置信度阈值:过滤掉低置信度的字符预测
  • 字典参数:引导搜索选择字典词

来源: src/lstm/recodebeam.cpp30-33 src/lstm/recodebeam.cpp82-90 src/lstm/recodebeam.cpp742-884

传统引擎

传统引擎使用基于特征的方法和自适应分类来识别文本。它由两个主要组件组成:整数匹配器(Integer Matcher)和自适应分类器(Adaptive Classifier)。

整数匹配器和特征分类

整数匹配器

  • 从字符图像中提取几何特征
  • 量化这些特征以进行高效匹配
  • 使用剪枝(pruning)技术将特征与原型进行匹配以提高效率
  • 使用配置将原型分组为字符类
  • 计算距离度量以确定最佳匹配

来源: src/classify/intmatcher.cpp src/classify/intproto.cpp220-238

自适应分类器

自适应分类器

  1. 从预训练的模板开始
  2. 在识别过程中适应文档的特定字体/样式
  3. 为已自信识别的字符创建新模板
  4. 使用这些已适应的模板进行后续识别
  5. 可以随着处理更多文本来提高准确性

关键函数和结构

  • AdaptiveClassifier():自适应识别的主入口点
  • DoAdaptiveMatch():执行实际的模板匹配
  • AdaptToChar():使用新示例更新模板
  • ADAPT_TEMPLATES_STRUCT:存储已适应的模板
  • INT_CLASS_STRUCT:表示带有原型的字符类

来源: src/classify/adaptmatch.cpp src/classify/adaptmatch.cpp685-765

特征提取和表示

两种引擎都依赖于特征提取,尽管它们使用不同的方法

传统引擎特征

传统引擎使用

  • 从字符轮廓中提取的几何特征
  • 用于高效匹配的整数特征
  • 多种特征类型(微特征、皮米特征等)
  • 用于尺度不变匹配的归一化坐标系统

来源: src/classify/intproto.cpp src/classify/adaptmatch.cpp778-797

LSTM 引擎特征

LSTM 引擎

  • 处理特征序列
  • 采用更集成的方法,特征提取是神经网络的一部分
  • 可以通过其神经网络架构学习更复杂的特征
  • 将整个单词或行作为序列进行处理,而不是单个字符

引擎选择与集成

Tesseract 根据以下因素智能地选择合适的引擎

  • 用户配置
  • 语言要求
  • 可用训练数据
  • OCR 任务复杂度

结果处理

识别后,结果通过以下方式处理

  1. ResultIteratorLTRResultIterator 类,它们提供对识别结果的访问
  2. 渲染器类,将结果转换为各种输出格式(纯文本、hOCR、ALTO 等)
  3. 后处理步骤,例如字典校正和布局分析

识别结果包括

  • 字符/单词文本
  • 边界框
  • 置信度分数
  • 字体信息
  • 替代解释(选择)

来源: src/ccmain/ltrresultiterator.cpp src/api/hocrrenderer.cpp119-145 src/api/altorenderer.cpp132-156

性能特征

LSTM 引擎

  • 优势
    • 对大多数语言和脚本有更高的准确性
    • 对于连笔脚本、退化文档和非常规字体效果更好
    • 对噪声和图像质量问题更具鲁棒性
    • 更好地处理上下文(例如,根据上下文区分相似字符)
  • 局限性
    • 需要更多内存
    • 对某些应用程序来说可能较慢
    • 依赖高质量的训练数据

传统引擎

  • 优势
    • 在某些用例中更快
    • 对于清晰打印的文本效果很好
    • 识别过程中的自适应学习
    • 可以使用有限的训练数据
  • 局限性
    • 通常准确性低于 LSTM
    • 对字体和图像质量的变化不太鲁棒
    • 难以处理连笔脚本和复杂布局

引擎选择注意事项

  • 对于现代应用程序,通常首选 LSTM 引擎
  • 保留传统引擎是为了兼容性和特定用例
  • 组合模式可以通过利用两种引擎在某些场景下提供优势

来源: src/classify/adaptmatch.cpp src/lstm/recodebeam.cpp82-90

结论

Tesseract 的双引擎方法为不同的 OCR 任务提供了灵活性。LSTM 引擎以其神经网络基础代表了 OCR 技术的尖端水平,而传统引擎则为旧应用程序和特定用例提供了兼容性。

了解这些引擎的工作原理对于通过引擎选择、参数调整或自定义训练来获得 Tesseract 的最佳结果至关重要。有关特定引擎的更多详细信息,请参阅 LSTM 引擎传统引擎