Tesseract 4.00 中新的神經網路系統概述
簡介
Tesseract 4.00 包含一個新的神經網路子系統,配置為文字行辨識器。它起源於 OCRopus 的 基於 Python 的 LSTM 實作,但已在 Tesseract 中以 C++ 完全重新設計。 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 的機器上,簡單的英文圖像可能需要兩倍的實際時間,並使用 7 倍於基本 Tesseract 的 CPU,而印地語則比基本 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
。