跳至內容。

關於訓練基於神經網路 LSTM 的 Tesseract 4.00,請參閱 訓練 Tesseract 4.00


如何使用提供的工具來為新語言訓練 Tesseract 3.03–3.05。

重要提示:在您投入時間和精力訓練 Tesseract 之前,強烈建議您閱讀 提高品質 頁面。

Tesseract 3.04 和 3.05 提供一個 腳本,方便執行 Tesseract 訓練的各個階段。有關使用它的更多資訊,請參閱 tesstrain.sh 頁面。

關於訓練過程的問題

訓練程序

附錄

關於訓練過程的問題

如果您在訓練過程中遇到任何問題並需要協助,請使用 tesseract-ocr 郵件列表提出您的問題。

請勿將您的問題和關於訓練的疑問作為 issues 回報!

簡介

Tesseract 3.0x 是完全可訓練的。此頁面描述了訓練過程,提供了一些關於適用於各種語言的指南,以及對結果的期望。

在開始訓練之前,請檢查 traineddata 的語言列表,該列表截至 3.04 版本已提供。

也有 第三方訓練工具 可用於訓練。

背景和限制

Tesseract 最初設計為僅辨識英文文本。已經努力修改引擎及其訓練系統,使其能夠處理其他語言和 UTF-8 字元。Tesseract 3.0 可以處理任何 Unicode 字元(使用 UTF-8 編碼),但它在成功處理的語言範圍方面存在限制,因此請在對它在您的特定語言上能良好運作抱持期望之前,考慮這個部分!

Tesseract 3.01 新增了由上到下的語言,而 Tesseract 3.02 新增了希伯來語(由右到左)。

Tesseract 目前使用一個稱為 cube 的輔助引擎(包含在 Tesseract 3.01 及更新版本中)來處理阿拉伯語和印地語等腳本。請勿嘗試訓練 Tesseract 4.0 之前的版本來辨識阿拉伯語(波斯語、烏爾都語等也是如此)。這是徒勞的。對於 4.0,僅使用 LSTM 方法進行訓練。

Google 為 3.04 版本提供了其他語言的 Traineddata

Tesseract 在處理大型字元集語言(如中文)時速度較慢,但似乎可以正常運作。

Tesseract 需要透過明確區分不同的字體來了解相同字元的不同形狀。字體數量限制為 64 種。請注意,執行時間很大程度取決於提供的字體數量,訓練超過 32 種字體將導致明顯的速度減慢。

所需的其他函式庫

從 3.03 版本開始,需要額外的函式庫來建置訓練工具。

sudo apt-get install libicu-dev
sudo apt-get install libpango1.0-dev
sudo apt-get install libcairo2-dev

建置訓練工具

從 3.03 版本開始,如果您是從原始碼編譯 Tesseract,則需要使用單獨的 make 指令來製作和安裝訓練工具。一旦安裝了上述額外的函式庫,請從 tesseract 原始碼目錄執行以下命令

make training
sudo make training-install

所需的資料檔案

若要為另一種語言進行訓練,您必須在 tessdata 子目錄中建立一些資料檔案,然後使用 combine_tessdata 將它們壓縮成單個檔案。命名慣例是 語言代碼.檔案名稱。發布檔案的語言代碼遵循 ISO 639-3 標準,但可以使用任何字串。用於英文 (3.0x) 的檔案是

… 以及最終壓縮的檔案是

traineddata 檔案只是輸入檔案的串連,其中包含一個目錄,其中包含已知檔案類型的偏移量。有關目前接受的檔案名稱列表,請參閱原始碼中的 ccutil/tessdatamanager.h。

文字輸入檔案的要求

文字輸入檔案 (lang.config、lang.unicharambigs、font_properties、box 檔案、字典的單字列表...) 需要滿足以下條件

最少需要多少資料才能成功訓練?

必須使用下面描述的程序建立 unicharsetinttempnormprotopffmtable。如果您只是嘗試辨識有限範圍的字體(例如,單一字體),則單個訓練頁面可能就足夠了。其他檔案不需要提供,但很可能會提高準確性,具體取決於您的應用。

訓練程序

部分程序必然是手動的。提供了盡可能多的自動化協助。下面引用的工具都在訓練子目錄中建置。

您需要在輸入檔案所在的相同資料夾中執行所有命令。

產生訓練影像和 Box 檔案

準備文字檔案

第一步是確定要使用的完整字元集,並準備一個包含一組範例的文字或文書處理器檔案。建立訓練檔案時,最重要的注意事項是

確保每個字元都有最少數量的範例。10 個很好,但稀有字元 5 個也可以。

頻繁出現的字元應有更多範例 - 至少 20 個。

不要犯將所有非字母的字元組合在一起的錯誤。使文字更真實。
例如

The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.{}<>/?

很糟糕!更好的是

The (quick) brown {fox} jumps! over the $3,456.78 <lazy> #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam?

這使文字行尋找程式碼更有可能為特殊字元獲得合理的基準指標。

自動化方法

3.03 中的新增功能

根據上述規範,準備一個包含您的訓練文字的 UTF-8 文字檔案(training_text.txt)。取得您希望辨識的字體的 trueType/openType 字體檔案。依次執行以下命令,為每種字體建立相符的 tif/box 檔案對。

training/text2image --text=training_text.txt --outputbase=[lang].[fontname].exp0 --font='Font Name' --fonts_dir=/path/to/your/fonts

請注意,–font 的引數可能包含空格,因此必須用引號引起來。例如

training/text2image --text=training_text.txt --outputbase=eng.TimesNewRomanBold.exp0 --font='Times New Roman Bold' --fonts_dir=/usr/share/fonts

若要列出系統中所有可以呈現訓練文字的字體,請執行

training/text2image --text=training_text.txt --outputbase=eng --fonts_dir=/usr/share/fonts  --find_fonts --min_coverage=1.0 --render_per_font=false

在本範例中,training_text.txt 檔案包含以英文書寫的文字。將建立一個 ‘eng.fontlist.txt’ 檔案。

還有許多其他可供 text2image 使用的命令列引數。執行 text2image --help 以取得更多資訊。

如果您使用 text2image,您可以跳到 執行 Tesseract 進行訓練 步驟。

舊的手動方法

接下來,列印和掃描(或使用一些電子呈現方法)來建立訓練頁面的影像。可以使用多達 64 個訓練檔案(多頁)。最好建立字體和樣式(但在單獨的檔案中)的混合,包括斜體和粗體。

您還需要將訓練文字另存為 UTF-8 文字檔案,以便在下一步中將代碼插入另一個檔案中使用。

針對大量訓練資料的說明 64 個影像的限制是針對字體。每種字體應放置在單個多頁 tiff 中,並且可以修改 box 檔案以在座標後指定每個字元的頁碼。因此,可以為任何給定的字體建立任意大量的訓練資料,從而允許訓練大型字元集語言。多頁 tiff 的替代方法是為單個字體建立許多單頁 tiff,然後您必須將每種字體的 tr 檔案串連到幾個單一字體的 tr 檔案中。在任何情況下,mftraining 的輸入 tr 檔案都必須包含單個字體。

製作 Box 檔案

請參閱單獨的 製作 Box 檔案 頁面。

執行 Tesseract 進行訓練

對於您的每個訓練影像、box 檔案對,在訓練模式下執行 Tesseract

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train.stderr

注意,雖然 tesseract 需要存在語言資料才能執行此步驟,但不會使用語言資料,因此無論您訓練何種語言,英文都可以。

第一種形式將所有錯誤傳送到名為 tesseract.log 的檔案。第二種形式將所有錯誤傳送到 stderr。

請注意,box 檔案名稱必須與 tif 檔案名稱匹配(包括路徑),否則 Tesseract 將找不到它。此步驟的輸出是 fontfile.tr,其中包含訓練頁面中每個字元的特徵。[lang].[fontname].exp[num].txt 也會寫入,其中包含單個換行符號且沒有文字。

重要提示 檢查 apply_box 輸出的錯誤。如果報告了 FATALITIES,則在修復 box 檔案之前,繼續訓練過程毫無意義。新的 box.train.stderr 組態檔案可以更輕鬆地選擇輸出位置。FATALITY 通常表示此步驟無法找到 box 檔案中列出的其中一個字元的任何訓練範例。座標錯誤,或者所涉及字元的影像有問題。如果沒有字元的可行範例,則無法辨識它,並且稍後產生的 inttemp 檔案將與 unicharset 檔案不匹配,並且 Tesseract 將中止。

可能會發生的另一個錯誤也是致命的並且需要注意,是關於「Box file format error on line n」的錯誤。如果前面有「Bad utf-8 char…」,則 UTF-8 代碼不正確,需要修復。錯誤「utf-8 string too long…」表示您已超過字元描述的 24 位元組限制。如果您需要超過 24 位元組的描述,請提交問題。

不需要編輯 [lang].[fontname].exp[num].tr 檔案的內容。其中的字型名稱也不需要設定。

若您好奇,這裡有一些關於格式的資訊。

產生 unicharset 檔案

Tesseract 的 unicharset 檔案包含了 Tesseract OCR 引擎訓練來辨識的每個符號 (unichar) 的資訊。

目前,產生 unicharset 檔案需要兩個步驟,使用以下指令:unicharset_extractorset_unicharset_properties

注意:每當產生 inttempnormprotopffmtable 時,都必須重新產生 unicharset 檔案(也就是說,當 box 檔案變更時,它們全部都必須重新建立),因為它們必須保持同步。

關於 unicharset 檔案格式的更多詳細資訊,請參閱此附錄

unicharset_extractor

Tesseract 需要知道它可以輸出的可能字元集合。若要產生 unicharset 資料檔案,請在上方產生的 box 檔案上使用 unicharset_extractor 程式。

unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box ...

set_unicharset_properties

3.03 中的新增功能

這個工具,連同一組資料檔案,允許在 unicharset 中加入額外的屬性,主要是從字型取得的大小。

training/set_unicharset_properties -U input_unicharset -O output_unicharset --script_dir=training/langdata

--script_dir 應該指向一個目錄,其中包含您訓練字元集的相關 .unicharset 檔案。這些檔案可以從 https://github.com/tesseract-ocr/langdata 下載。

執行 unicharset_extractorset_unicharset_properties 後,您應該會得到一個 unicharset 檔案,其中所有欄位都設定為正確的值,如這個範例

font_properties 檔案

現在您需要建立一個 font_properties 文字檔案。這個檔案的目的是提供字型樣式資訊,在辨識到字型時會出現在輸出中。

font_properties 檔案的每一行格式如下:fontname italic bold fixed serif fraktur
其中 fontname 是一個字串,命名字型(不允許有空格!),而 italicboldfixedseriffraktur 都是簡單的 01 旗標,指示字型是否具有指定的屬性。

範例:

timesitalic 1 0 0 1 0

font_properties 檔案將由 shapeclusteringmftraining 指令使用。

當執行 mftraining 時,*.tr 檔案中的每個 fontname 欄位都必須與 font_properties 檔案中的 fontname 項目相符,否則 mftraining 將會中止。

注意:有一個預設的 font_properties 檔案,涵蓋了 3000 個字型(不一定準確),位於 langdata 儲存庫中。

分群

當所有訓練頁面的字元特徵都已提取出來後,我們需要將它們叢集以建立原型。

字元形狀特徵可以使用 shapeclusteringmftrainingcntraining 程式叢集。

shapeclustering

shapeclustering 通常不應使用,除非是針對印度語系。 (對於拉丁字母語言,基本字元與兩個或多個非間隔修飾符號組合時,可能需要使用 shapeclustering,例如 ḗ、ɔ̄́、r̥̄:這包括但不限於拉丁轉寫的印度語系。若不這樣做,會導致 mftraining 出現 Assert failed:in file unicharset.cpp 錯誤。)

shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...

shapeclustering 會透過形狀叢集建立主要形狀表,並將其寫入名為 shapetable 的檔案。

mftraining

mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...

-U 檔案是上方 unicharset_extractor 產生的 unicharset,而 lang.unicharset 是將提供給 combine_tessdata 的輸出 unicharset。

mftraining 將輸出另外兩個資料檔案:inttemp(形狀原型)和 pffmtable(每個字元的預期特徵數量)。

注意:如果您沒有執行 shapeclusteringmftraining 會產生 shapetable 檔案。無論是否使用 shapeclustering,您必須將這個 shapetable 包含在您的 traineddata 檔案中。

cntraining

cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr ...

這將輸出 normproto 資料檔案(字元正規化敏感度原型)。

字典資料(選用)

Tesseract 為每個語言使用最多 8 個字典檔案。這些都是可選的,並協助 Tesseract 判斷不同可能字元組合的可能性。

七個檔案編碼為有向無環字圖 (DAWG),另一個是純 UTF-8 文字檔案。

名稱 類型 描述
word-dawg dawg 由該語言的字典單字建立的 dawg。
freq-dawg dawg 由原本會進入 word-dawg 的最常用單字建立的 dawg。
punc-dawg dawg 由單字周圍找到的標點符號模式建立的 dawg。「單字」 部分會被單一空格取代。
number-dawg dawg 由原本包含數字的符記建立的 dawg。每個數字都會被空格字元取代。
bigram-dawg dawg 單字雙字母組的 dawg,其中單字以空格分隔,每個數字都以 ? 取代。
user-words text 要新增到字典的額外單字清單。通常會留空,讓使用者在需要時新增;請參閱 tesseract(1)

若要建立 DAWG 字典檔案,您首先需要您語言的單字清單。您可能會找到合適的字典檔案,作為拼字檢查器的單字清單基礎(例如 ispellaspellhunspell)- 請注意授權。單字清單的格式為 UTF-8 文字檔案,每行一個單字。將單字清單分割成需要的集合,例如:常用單字和其餘單字,然後使用 wordlist2dawg 來建立 DAWG 檔案。

wordlist2dawg frequent_words_list lang.freq-dawg lang.unicharset
wordlist2dawg words_list lang.word-dawg lang.unicharset

對於從右到左 (RTL) 書寫的語言(如阿拉伯語和希伯來語),請將 -r 1 新增到 wordlist2dawg 指令中。

其他選項可以在 wordlist2dawg 手冊頁中找到

注意: 如果 combined traineddata 中包含字典檔案,則它必須包含至少一個項目。對於 combine_tessdata 步驟,否則會是空的字典檔案不是必需的。

拼寫不尋常的單字應該新增到字典檔案中。不尋常的拼寫可能包括字母字元與標點符號或數字字元的混合。(例如 i18n、l10n、google.com、news.bbc.co.uk、io9.com、utf8、ucs2)

如果您需要字典單字清單的範例檔案,請使用 combine_tessdata 解組合現有的語言資料檔案(例如 eng.traineddata),然後使用 dawg2wordlist 提取單字清單

unicharambigs 檔案

unicharambigs 檔案是一個文字檔案,描述字元或字元集合之間可能存在的歧義,並且是手動產生的。

若要瞭解檔案格式,請查看以下範例

v1
2       ' '     1       "       1
1       m       2       r n     0
3       i i i   1       m       0

第一行是版本識別碼。

剩餘的行是跳格分隔的欄位,格式如下

<number of characters for match source> <characters for match source> <number of characters for match target> <characters for match target> <type indicator>

類型指示符 可能具有下列值

類型 描述
0 非強制性替換。 這會通知 tesseract 將歧義視為區隔搜尋的提示,如果將「來源」替換為「目標」從非字典單字建立字典單字,則應繼續運作。可以透過歧義轉換為另一個字典單字的字典單字不會用於訓練適應性分類器。
1 強制性替換。 這會通知 tesseract 始終將匹配的「來源」替換為「目標」字串。
範例行 說明
2 ‘ ‘ 1 “ 1 每當看到 2 個連續的單引號 (') 時,都替換為雙引號 (")。
1 m 2 r n 0 字元 'rn' 有時可能會被錯誤地辨識為 'm'。
3 i i i 1 m 0 字元 'm' 有時可能會被錯誤地辨識為序列 'iii'。

每個單獨的字元都必須包含在 unicharset 中。也就是說,使用的所有字元都必須是正在訓練的語言的一部分。

規則不是雙向的,因此如果您希望在偵測到 'm' 時考慮 'rn',反之亦然,則需要為每個規則建立一個規則。

3.03 及更高版本支援 unicharambigs 檔案的新、更簡單的格式

v2
'' " 1
m rn 0
iii m 0

在此格式中,「錯誤」和「更正」是以空格分隔的簡單 UTF-8 字串,在另一個空格之後,與 v1 相同的類型指定符(0 表示選用,1 表示強制替換)。請注意,這種更簡單格式的缺點是 Tesseract 必須將 UTF-8 字串編碼到 unicharset 的元件中。在複雜的腳本中,此編碼可能會有歧義。在這種情況下,選擇編碼的方式是為每個元件使用最少的 UTF-8 字元,也就是說,最短的 unicharset 元件將組成編碼。

與大多數用於訓練的其他檔案一樣,unicharambigs 檔案必須以 UTF-8 編碼,並且必須以換行符號結尾。

unicharambigs 格式也在 unicharambigs(5) 手冊頁中描述。

unicharambigs 檔案也可能不存在。

將所有內容整合在一起

這就是全部!您現在需要做的就是將所有檔案(shapetablenormprotointtemppffmtableunicharset)收集在一起,並使用 lang. 前綴重新命名(例如 eng.),然後在它們上執行 combine_tessdata,如下所示

combine_tessdata lang.

雖然您可以使用任何字串作為語言代碼,但我們建議您使用符合 ISO 639-2 代碼之一的 3 個字母代碼作為您的語言。

產生的 lang.traineddata 檔案會放在您的 tessdata 目錄中。接著,Tesseract 理論上就可以使用以下方式辨識您的語言文字:

tesseract image.tif output -l lang

combine_tessdata 的更多選項可以在其手冊頁面或其原始碼註解中找到。

您可以使用第三方線上Traineddata 檢視器來檢查 traineddata 檔案的一些內部資訊。

附錄

*.tr 檔案格式

box 檔案中的每個字元在 .tr 檔案中都有一組對應的條目(依序),如下所示:

<fontname> <character> <left> <top> <right> <bottom> <pagenum>
 4
mf <number of features>
<x> <y> <length> <dir> 0 0
...
cn 1
<ypos> <length> <x2ndmoment> <y2ndmoment>
if <number of features>
<x> <y> <dir>
...
tb 1
<bottom> <top> <width>

微特徵(mf)是輪廓的正規化多邊形線段,以第一和第二動差進行正規化。mf 行之後會跟著一組由「特徵數量」決定的行。
x 是 x 位置 [-0.5,0.5]
y 是 y 位置 [-0.25,0.75]
length 是多邊形線段的長度 [0,1.0]
dir 是線段的方向 [0,1.0]

字元正規化特徵(cn)用於校正動差正規化,以區分位置和大小(例如 cC 以及 ,')。

if - 整數特徵

tb - 幾何特徵

unicharset 檔案格式

Tesseract 的 unicharset 檔案包含了 Tesseract OCR 引擎訓練來辨識的每個符號 (unichar) 的資訊。

unicharset 檔案的第一行包含檔案中的字元總數。

在此行之後,後續的每一行都提供單個字元的資訊。第一行是為空格字元保留的佔位符。

每個字元在 Tesseract 中都由其 Unichar ID 引用,該 ID 是 unicharset 檔案中的行號(減 1)。因此,空格的 Unichar ID 為 0。

unicharset 檔案中的每個字元行都應具有這些以空格分隔的欄位:
字元 屬性 字形度量 腳本 其他大小寫 方向 鏡像 正規化形式

unicharset 檔案的範例

110
NULL 0 NULL 0
N 5 59,68,216,255,87,236,0,27,104,227 Latin 11 0 1 N
Y 5 59,68,216,255,91,205,0,47,91,223 Latin 33 0 2 Y
1 8 59,69,203,255,45,128,0,66,74,173 Common 3 2 3 1
9 8 18,66,203,255,89,156,0,39,104,173 Common 4 2 4 9
a 3 58,65,186,198,85,164,0,26,97,185 Latin 56 0 5 a
...

關於 屬性 欄位的更多資訊

這裡有另一個範例。為簡單起見,在此範例中僅顯示每行的前兩個欄位。其他欄位已省略。

...
; 10 ...
b 3 ...
W 5 ...
7 8 ...
= 0 ...
...
字元 標點符號 數字 大寫 小寫 字母 二進制數 十六進制。
; 1 0 0 0 0 10000 10
b 0 0 0 1 1 00011 3
W 0 0 1 0 1 00101 5
7 0 1 0 0 0 01000 8
= 0 0 0 0 0 00000 0

在第 2-6 列中,0 表示「否」,1 表示「是」。