Tesseract 4.00 中新的神经网络系统概述
介绍
Tesseract 4.00 包含一个新的神经网络子系统,配置为文本行识别器。它起源于 OCRopus 的 基于 Python 的 LSTM 实现,但已在 C++ 中为 Tesseract 进行了完全重新设计。Tesseract 中的神经网络系统早于 TensorFlow,但与其兼容,因为存在一种名为 变量图规范语言 (VGSL) 的网络描述语言,它也适用于 TensorFlow。请参阅 https://github.com/tensorflow/models/tree/master/research/street
VGSL 的理念是可以构建神经网络并进行训练,而无需学习很多东西。无需学习 Python、TensorFlow,甚至无需编写任何 C++ 代码。只需充分了解 VGSL 规范语言以构建语法正确的网络描述即可。对各种神经网络层类型及其组合方式的一些基本了解将非常有帮助。
与 Tesseract 集成
Tesseract 4.00 神经网络子系统已集成到 Tesseract 中,作为行识别器。它可以与现有的布局分析一起使用来识别大型文档中的文本,也可以与外部文本检测器一起使用来识别单个文本行图像中的文本。
神经网络引擎是 4.00 的默认引擎。要识别单个文本行图像中的文本,请使用 SetPageSegMode(PSM_RAW_LINE)
。这可以在命令行中使用 -psm 13
神经网络引擎已集成以启用与 Tesseract 3.04 协作的多语言模式,但将在未来的版本中进行改进。现在支持中文、日文和韩文的垂直文本,应自动检测到。
硬件和 CPU 要求
Tesseract 4.00 神经网络子系统对计算要求很高,使用的 CPU 资源是基本 Tesseract 的十倍左右,但如果您的平台支持,则可以通过以下方式缓解影响
- 如果您的机器具有多个核心,OpenMP 允许并行使用四个核心。
- 支持 SSE 和/或 AVX 的 Intel/AMD 处理器可以从核心矩阵乘法的 SIMD 并行化中受益。
在具有多个核心和 AVX 的机器上,一个简单的英文图像可能需要两倍的实际时间,并且使用的 CPU 是基本 Tesseract 的 7 倍,而印地语则比基本 Tesseract 使用更多的 CPU,但实际上在实际运行时间上更快。
如果缺少上述组件,则存在一个更慢的纯 C++ 实现,使代码仍然能够工作。
支持小端和大端系统。
面向开源贡献者
初始实现缺少以下内容
- 如果硬件没有 SSE 和/或 AVX,则存在一个 C++ 实现,但代码可以从针对其他硬件(如 ARM)的 SIMD 实现中受益。请参阅新的
arch
目录,了解插入代码的位置。
实现基础
所有网络层类型都源自 Network
基类。 Plumbing
子类是用于以某种方式操作其他层的层的基类,例如通过重新整形其输入/输出或组织一组层。
输入/输出数据“张量”是 NetworkIO
,权重存储在 WeightMatrix
中,两者都包含 Tesseract GENERIC_2D_ARRAY
来保存数据。 LSTMRecognizer
提供将文本行图像转换为一系列 Tesseract WERD_RES
类的更高级别的抽象。同样, LSTMTrainer
处理在具有 UTF-8 字符串“真值”的文本行图像上训练网络的抽象。 NetworkBuilder
负责将 VGSL 规范语言转换为网络元素图。
添加新的层类型
新的层类必须从 Network
或 Plumbing
派生,并至少实现以下虚方法
spec
,它返回与生成层的字符串相对应的字符串。Serialize/DeSerialize
用于将层保存到/从 TFile 中还原。Forward
用于在正向方向上运行层。Backward
用于在训练期间在反向方向上运行层。
具有权重的层还必须实现 Update
,以使用一组梯度更新权重。可能还需要实现一些其他方法,具体取决于新层的特定要求。有关可能需要实现的方法的更多信息,请参阅 network.h
。
- 必须修改
NetworkBuilder
以解析新类型的规范。 - 必须扩展
NetworkType
枚举以包含新类型。 - 必须为新类型在
Network::kTypeNames
中添加相应的条目。 - 必须修改
Network::CreateFromFile
以在反序列化时构造适当的类型。 - 与任何新代码一样,需要使用新文件名更新
lstm/Makefile.am
。