菜单

核心数据结构

相关源文件

本文档提供了 Tesseract OCR 系统中使用的核心数据结构的概览。这些基础组件构成了系统其余部分的基础,从基本容器到文本元素和文档组件的专门表示。有关序列化和文件处理的信息,请参阅 API 参考,有关图像数据管理的详细信息,请参阅图像数据管理

核心容器类

Tesseract 实现了几种专门的容器类,它们在整个系统中提供核心功能。

通用容器

GenericVector

GenericVector 是一个模板类,它提供类似于 std::vector 的动态数组功能,但具有 Tesseract 所需的专门方法,例如简单和复杂类型的序列化和反序列化。

GenericVector 的主要特性

  • 动态大小管理
  • 类似数组的索引访问
  • 序列化和反序列化支持
  • 内存管理,具有元素删除的回调
  • 排序能力

PointerVector 是一个指针的子类,它提供自动删除指向的对象以及正确的序列化/反序列化。

来源: src/ccutil/genericvector.h38-802

UnicityTable

UnicityTable 提供了一种使对象唯一的方法,通过整数 ID 来操作它们。它本质上是 GenericVector 的包装器,可确保元素的唯一性。

主要功能

  • 通过维护每个对象的单个副本使对象唯一
  • 提供整数 ID 来引用对象
  • 允许按 ID 或对象进行查找

来源: src/ccutil/unicity_table.h37-123

链表实现

Tesseract 实现三种具有不同特性的链表。这些列表在系统中被广泛使用。

  1. ConsList (CLIST):一个单向链表,具有单独的“cons 单元”来包含列表指针和数据指针。这使得一个对象可以同时存在于多个列表中。

  2. IntrusiveForwardList (ELIST):一个单向链表,其中链接数据嵌入在对象本身中。每个元素一次只能存在于一个列表中。

  3. IntrusiveList (ELIST2):一个双向链表,具有嵌入的链接,允许双向遍历。

每种列表类型都提供

  • 用于遍历的迭代器
  • 用于插入、提取和操作的方法
  • 对元素进行排序的能力

它们之间的区别在于链接的存储方式(单独或嵌入)以及遍历能力(仅前向或双向)。

来源

序列化框架

序列化框架提供了一种将 Tesseract 数据结构读取和写入文件的一致方法。

TFile 类

TFile 是一个简单的文件类,它提供从内存和外部文件系统中可移植的文件输入。它处理字节序(endianness)的字节交换,并提供读取和写入各种数据类型的方法。

主要功能

  • 从文件或内存缓冲区读取
  • 写入文件或内存缓冲区
  • 处理字节序差异
  • 各种数据类型的序列化和反序列化
  • 支持外部 FileReader 和 FileWriter 函数

来源

图像和文档管理

Tesseract 在 OCR 处理过程中使用一系列类来管理图像数据和文档。

ImageData

ImageData 包含有关单个图像的信息,包括

  • 图像文件数据(PNG/PNM 编码)
  • 页码
  • 语言代码
  • 文本转录(地面实况)
  • 字符边界框

DocumentData

DocumentData 管理构成文档的 ImageData 实例的集合,具有以下功能:

  • 内存管理
  • 后台加载页面
  • 在内存限制范围内缓存页面

DocumentCache

DocumentCache 管理多个 DocumentData 实例,提供

  • 从文件加载文档的方法
  • 在内存限制范围内缓存文档的策略
  • 通过序列号访问页面(使用不同的策略:轮循或顺序)

来源

文本元素结构

这些结构表示和管理不同级别的分析中的文本元素。

WERD

WERD 代表 OCR 系统中的一个单词,包含

  • 一个连接组件块列表(C_BLOB
  • 一个被拒绝的块列表
  • 各种单词属性的标志(斜体、粗体等)
  • 正确的文本(用于训练)
  • 单词前的空格数

BLOBNBOX

BLOBNBOX 包装了一个连接组件块(C_BLOB),并附带用于文本排序的附加信息

  • 边界框
  • 区域类型(文本、图像、噪声、线条等)
  • 文本流信息
  • 左右两侧的制表符类型
  • 指向相邻块的指针

ColPartition

ColPartition 包含页面分区,这些分区大致对应于文本行或其他逻辑单元

  • BLOBNBOX 对象的集合
  • 布局信息(边距、中值尺寸)
  • 与其他分区的关系(上方/下方伙伴)
  • 类型和流程特性

这些结构从基本的块元素到文本行和列形成一个层次结构,支持 OCR 和布局分析过程。

来源

TabVector

TabVector 表示一个近乎垂直的向量,对应于制表符,用于检测和分析表格结构。

歧义管理

歧义管理结构在 OCR 过程中处理字符歧义。

歧义管理系统处理 OCR 过程中的歧义字符,包括

  • 替换歧义(应替换的字符)
  • 明确歧义(应考虑的替代解释)
  • 相似歧义(需要专门分类)

来源

内存管理和性能考虑

Tesseract 的许多核心数据结构都经过了特定的内存管理和性能考量设计

  1. 基于内存的缓存DocumentCacheDocumentData 实现复杂的内存管理,以平衡性能和资源使用

    • 限制总内存使用量
    • 后台加载页面
    • 在不再需要时从内存中移除页面
  2. 自定义容器与 STL:Tesseract 出于多种原因实现了自定义容器,而不是使用 STL 等效物

    • 历史开发早于成熟的 STL 实现
    • 专门的序列化功能
    • 领域特定的优化和行为
  3. 侵入式列表ELISTELIST2(侵入式列表)类将链接直接嵌入对象中,而不是使用单独的节点,从而节省内存并提高局部性。

  4. 对象所有权:对象所有权需要特别注意

    • 一些容器拥有其元素并负责删除它们
    • 其他容器仅引用其他地方拥有的元素
    • 对于指针,PointerVector 提供自动删除
  5. 序列化效率:序列化框架针对复杂数据结构的有效读写进行了优化,并对字节序差异进行了特殊处理。

来源

与其他系统组件的关系

本文档中介绍的核心数据结构构成了 Tesseract OCR 系统的其余部分的基础

核心数据结构为 OCR 管道的所有阶段提供了基本功能

  1. 容器类在处理的各个阶段广泛用于管理数据集合。

  2. 图像和文档结构是输入处理阶段和训练数据管理的核心。

  3. 文本元素结构构成了布局分析和文本识别的基础。

  4. 序列化框架支持模型、配置和结果的加载和保存。

理解这些核心数据结构对于使用或扩展 Tesseract OCR 系统至关重要。

来源

  • 源自整体代码库结构和关系