跳至內容。

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


如何使用提供的工具來訓練 Tesseract 3.00–3.02 以支援新的語言?

注意:這些說明適用於 較舊 版本的 Tesseract。較新版本的訓練說明請參閱 [[這裡 Training-Tesseract]]。

簡介

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

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

在開始訓練之前,請檢查已發布 3.04 版的 traineddata 語言列表。

背景與限制

Tesseract 最初僅設計為識別英文文字。已努力修改引擎及其訓練系統,使其能夠處理其他語言和 UTF-8 字元。 Tesseract 3.0 可以處理任何 Unicode 字元(使用 UTF-8 編碼),但其成功處理的語言範圍有限,因此在您希望它能順利處理您的特定語言之前,請考慮本節的內容!

Tesseract 3.01 加入了由上而下的語言,而 Tesseract 3.02 加入了希伯來語(由右至左)。 Tesseract 目前使用一個名為 cube 的輔助引擎(包含在 Tesseract 3.0+ 中)來處理阿拉伯語和印地語等腳本。 Google 已為 3.04 版本提供了其他[語言] 的 traineddata(https://github.com/tesseract-ocr/tesseract/blob/3.02.02/doc/tesseract.1.asc#languages)。

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

Tesseract 需要知道同一字元的不同形狀,方法是明確分隔不同的字體。字體的數量限制為 64 種。請注意,執行時間在很大程度上取決於所提供的字體數量,訓練超過 32 種字體會導致速度明顯下降。

對於 3.00/3.01 版本,任何具有不同標點符號和數字的語言都會因一些假設 ASCII 標點符號和數字的硬編碼演算法而處於劣勢。[已在 3.02 版本中修正]

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

所需資料檔案

若要訓練其他語言,您必須在 tessdata 子目錄中建立一些資料檔案,然後使用 combine_tessdata 將這些檔案壓縮成單一檔案。命名慣例為 languagecode.file_name。已發布檔案的語言代碼遵循 ISO 639-3 標準,但可以使用任何字串。用於英文 (3.00) 的檔案為

... 以及最後壓縮的檔案為

並且

traineddata 檔案只是輸入檔案的串聯,帶有一個目錄表,其中包含已知檔案類型的偏移量。請參閱原始程式碼中的 ccutil/tessdatamanager.h 以取得目前接受的檔案名稱清單。注意 traineddata 檔案中的檔案與 3.00 版之前使用的清單不同,並且很可能會在未來的版本中發生變化,甚至可能會發生巨大變化。

文字輸入檔案的需求

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

最低限度的要求為何?

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

訓練程序

某些程序不可避免地是手動的。我們會盡可能提供自動化協助。下面引用的工具都在 training 子目錄中建置。

產生訓練影像

第一步是決定要使用的完整字符集,並準備一個包含一組範例的文字或文字處理器檔案。建立訓練檔案時,請記住最重要的幾點是

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

注意:[僅與 3.00 版相關,已在 3.01 版中修正] 由於間隔要求,從真實影像進行訓練實際上相當困難。如果您可以列印/掃描自己的訓練文字,則會容易得多。

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

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

製作 Box 檔案

對於下面的下一個步驟,Tesseract 需要一個「box」檔案來搭配每個訓練影像。box 檔案是一個文字檔案,其中列出訓練影像中的字元,依序排列,每行一個,以及影像周圍邊界框的座標。Tesseract 3.0 具有一種模式,它可以輸出所需格式的文字檔案,但如果字符集與其目前的訓練不同,則其文字自然會不正確。因此,此處的關鍵流程是手動編輯檔案,以將正確的字元放入其中。

使用此命令列在每個訓練影像上執行 Tesseract

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

例如

tesseract eng.timesitalic.exp0.tif eng.timesitalic.exp0 batch.nochop makebox

現在是困難的部分。您必須編輯檔案 [lang].[fontname].exp[num].box,並將檔案中每個字元的 UTF-8 程式碼放在每行的開頭,以取代 Tesseract 放置在那裡的錯誤字元。範例:發行版本包含影像 eurotext.tif。執行上述命令會產生一個文字檔案,其中包含以下行(第 141-154 行)

s 734 494 751 519 0
p 753 486 776 518 0
r 779 494 796 518 0
i 799 494 810 527 0
n 814 494 837 518 0
g 839 485 862 518 0
t 865 492 878 521 0
u 101 453 122 484 0
b 126 453 146 486 0
e 149 452 168 477 0
r 172 453 187 476 0
d 211 451 232 484 0
e 236 451 255 475 0
n 259 452 281 475 0

由於 Tesseract 是以英文模式執行,因此無法正確辨識變音符號。這個字元需要使用支援 UTF-8 的編輯器進行修正。在這個情況下,需要將 u 改為 ü

建議使用支援 UTF-8 的編輯器:Notepad++、gedit、KWrite、Geany、Vim、Emacs、Atom、TextMate、Sublime Text。選擇一個即可!Linux 和 Windows 都有字元對應表,可用於複製無法輸入的字元。

理論上,box 檔案中的每一行都應代表訓練檔案中的一個字元,但如果您有水平斷開的字元,例如下雙引號「„」,則可能會出現需要合併的 2 個框!

範例:第 116-129 行

D 101 504 131 535 0
e 135 502 154 528 0
r 158 503 173 526 0
, 197 498 206 510 0
, 206 497 214 509 0
s 220 501 236 526 0
c 239 501 258 525 0
h 262 502 284 534 0
n 288 501 310 525 0
e 313 500 332 524 0
l 336 501 347 534 0
l 352 500 363 532 0
e 367 499 386 524 0
” 389 520 407 532 0

如您所見,下雙引號字元已表示為兩個單引號。邊界框必須按如下方式合併

這樣會得到

D 101 504 131 535 0
e 135 502 154 528 0
r 158 503 173 526 0
„ 197 497 214 510 0
s 220 501 236 526 0
c 239 501 258 525 0
h 262 502 284 534 0
n 288 501 310 525 0
e 313 500 332 524 0
l 336 501 347 534 0
l 352 500 363 532 0
e 367 499 386 524 0
” 389 520 407 532 0

如果您沒有成功地在訓練影像上將字元分開,某些字元可能會被合併到一個框中。在這種情況下,您可以重新製作具有更好間距的影像並重新開始,或者如果該對字元很常見,則將這兩個字元放在該行的開頭,並保留邊界框來表示它們兩者。(截至 3.00 版,一個「字元」的描述限制為 24 個位元組。這將允許您使用 6 到 24 個 Unicode 來描述該字元,具體取決於您的代碼在 Unicode 集中所處的位置。如果有人遇到此限制,請提交問題描述您的情況。)

請注意,box 檔案中使用的座標系統以左下角為 (0,0)。

每行最後一個數字是多頁 tiff 檔案中該字元的頁碼(從 0 開始)。

有幾種視覺工具可以編輯 box 檔案。請查看AddOns 文件。

啟動新的字符集

如果您嘗試訓練新的字元集,最好在單一字型上投入精力,以獲得一個良好的 box 檔案,執行其餘的訓練過程,然後在您的新語言中使用 Tesseract 來製作其餘的 box 檔案,如下所示

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] -l yournewlanguage batch.nochop makebox

這應該會使第二個 box 檔案更容易製作,因為 Tesseract 很有可能會正確識別大部分文字。您可以隨時重複此序列,在訓練集中新增更多字型(即,在下面的 mftrainingcntraining 的命令列中),但請注意,沒有增量訓練模式允許您將新的訓練資料新增到現有集中。這表示每次您執行 mftrainingcntraining 時,都是從您在命令列中提供的 tr 檔案從頭開始製作新的資料檔案,而且這些程式無法使用現有的 intproto / pffmtable / normproto 並直接新增到它們。

已提供 Tif/Box 配對!

某些 Tif/Box 檔案對位於下載頁面上。(請注意,tiff 檔案會經過 G4 壓縮以節省空間,因此您必須先擁有 libtiff 或將它們解壓縮)。您可以按照以下流程,為您自己的語言或現有語言的子集製作更好的訓練資料,或者在現有語言中新增不同的字元/形狀

  1. 篩選 box 檔案,僅保留您想要的字元的行。
  2. 執行 Tesseract 進行訓練(如下)。
  3. 針對每個字型,從多種語言串聯 .tr 檔案,以取得您想要的字元集,並新增您自己的字型或字元的 .tr 檔案。
  4. 以與 .tr 檔案相同的方式串聯已篩選的 box 檔案,以交給 unicharset_extractor。
  5. 執行其餘的訓練過程。小心!這並不像聽起來那麼簡單!cntraining 和 mftraining 最多只能接受 64 個 .tr 檔案,因此您必須將來自多種語言的相同字型的所有檔案串聯在一起,以製作 64 個語言合併但字型個別的檔案。給定 unicharset_extractor 時,tr 檔案中找到的字元必須與 box 檔案中找到的字元順序相符,因此您必須以與 tr 檔案相同的順序串聯 box 檔案。cn/mftraining 和 unicharset_extractor 的命令列必須依相同順序提供 .tr 和 .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 檔案的內容。其中的字型名稱無需設定。

對於好奇的人,以下是關於格式的一些資訊。box 檔案中的每個字元在 .tr 檔案中都有對應的一組條目(依順序),如下所示

UnknownFont <UTF-8 code(s)> 2
mf <number of features>
x y length dir 0 0
... (there are a set of these determined by <number of features>
above)
cn 1
ypos length x2ndmoment y2ndmoment

mf 特徵是輪廓的多邊形線段,已正規化為一階和二階動差。x = x 位置 [-0.5,0.5] y = y 位置 [-0.25,0.75] 長度是多邊形線段的長度 [0,1.0] dir 是線段的方向 [0,1.0]

cn 特徵是用於校正動差正規化,以區分位置和大小(例如 c 與 C 和 , 與 ‘)

計算字符集

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

unicharset_extractor [lang].[fontname].exp[num].box lang.fontname.exp1.box ...

Tesseract 需要存取字元屬性 isalpha、isdigit、isupper、islower、ispunctuation。此資料必須編碼在 unicharset 資料檔案中。此檔案的每一行對應一個字元。UTF-8 中的字元後面跟著一個十六進位數字,表示編碼屬性的二進位遮罩。每個位元對應一個屬性。如果位元設定為 1,則表示該屬性為 true。位元順序為(從最低有效位元到最高有效位元):isalpha、islower、isupper、isdigit。

範例

; 10 Common 46
b 3 Latin 59
W 5 Latin 40
7 8 Common 66
= 0 Common 93

日文或中文的字母字元屬性由二進位數字 00001(十六進位中的 1)表示。

如果您的系統支援 wctype 函式,這些值將由 unicharset_extractor 自動設定,無需編輯 unicharset 檔案。在某些非常舊的系統(例如 Windows 95)上,必須手動編輯 unicharset 檔案,以新增這些屬性描述代碼。

最後兩欄表示指令碼類型(拉丁文、通用、希臘文、西里爾文、漢字、NULL)和給定語言的字元 ID 代碼。

請注意:每次產生 inttempnormprotopffmtable 時,都必須重新產生 unicharset 檔案(即,當 box 檔案變更時,所有檔案都必須重新建立),因為它們必須同步。

font_properties(3.01 版新增)

3.01 版中訓練的新需求是 font_properties 檔案。此檔案的目的是提供字型樣式資訊,這些資訊將在辨識字型時出現在輸出中。font_properties 檔案是由 mftraining-F filename 選項指定的文字檔案。

font_properties 檔案的每一行格式如下

<fontname> <italic> <bold> <fixed> <serif> <fraktur>

其中 <fontname> 是命名字型的字串(不允許空格!),而 <italic><bold><fixed><serif><fraktur> 都是簡單的 0 或 1 旗標,表示字型是否具有指定的屬性。

當執行 mftraining 時,每個 .tr 檔名必須與 font_properties 檔案中的條目相符,否則 mftraining 將會中止。在某個時間點,可能在 3.01 版發布之前,此匹配要求可能會轉移到 .tr 檔案本身中的字體名稱。 .tr 檔案的名稱可以是 fontname.tr[lang].[fontname].exp[num].tr

範例

font_properties 檔案

timesitalic 1 0 0 1 0
shapeclustering -F font_properties -U unicharset eng.timesitalic.exp0.tr
mftraining -F font_properties -U unicharset -O eng.unicharset eng.timesitalic.exp0.tr

請注意,在 3.03 版中,有一個預設的 font_properties 檔案,涵蓋了 3000 種字體(不一定準確),位於此儲存庫:https://github.com/tesseract-ocr/langdata

分群

當所有訓練頁面的字元特徵都提取完成後,我們需要對它們進行分群,以建立原型。

字元形狀特徵可以使用 shapeclusteringmftrainingcntraining 程式來進行分群

shapeclustering (3.02 版新增)

除了印度語言外不應使用 shapeclustering

shapeclustering -F font_properties -U unicharset [lang].[fontname].exp[num].tr lang.fontname.exp1.tr ...

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

mftraining

mftraining -F font_properties -U unicharset -O [lang].unicharset [lang].[fontname].exp[num].tr lang.fontname.exp1.tr ...

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

mftraining 將輸出另外兩個資料檔案:inttemp(形狀原型)和 pffmtable(每個字元預期的特徵數量)。在 3.00/3.01 版本中,此程式也會寫入第三個檔案,名為 Microfeat,但它並未使用。後續版本不會產生此檔案。

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

cntraining

cntraining [lang].[fontname].exp[num].tr lang.fontname.exp1.tr ...

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

字典資料(可選)

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

其中七個檔案編碼為有向非循環詞圖 (DAWG),另一個檔案是純 UTF-8 文字檔案

名稱 類型 描述
word-dawg dawg 從該語言的字典單字製作的 dawg。
freq-dawg dawg 從最常使用的單字製作的 dawg,這些單字會放入 word-dawg 中。
punc-dawg dawg 從單字周圍找到的標點符號模式製作的 dawg。 「單字」部分會被單個空格取代。
number-dawg dawg 從原本包含數字的符號製作的 dawg。每個數字都會被一個空格字元取代。
fixed-length-dawgs dawg 幾個不同固定長度的 dawg —— 對於像中文這樣的語言很有用。[自 3.03 版以來未使用]
bigram-dawg dawg 單字雙連詞的 dawg,其中單字以空格分隔,且每個數字都被?取代。
unambig-dawg dawg 待辦:描述。
user-words 文字 要新增至字典的額外單字清單。通常保留空白,由使用者在需要時新增;請參閱 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) 書寫的語言(如阿拉伯語和希伯來語),請在 wordlist2dawg 命令中新增 -r 1

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

注意: 如果組合的 traineddata 中包含字典檔案,則它必須包含至少一個條目。在 combine_tessdata 步驟中,不需要原本為空的字典檔案。

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

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

最後一個檔案 (unicharambigs)

Tesseract 使用的最終資料檔案稱為 unicharambigs。它描述了字元或字元集之間可能存在的歧義,並且是手動產生的。若要了解檔案格式,請查看以下範例

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

第一行是版本識別碼。剩餘的行是索引標籤分隔的欄位,格式如下

<number of characters for match source> <tab> <characters for match source> <tab> <number of characters for match target> <tab> <characters for match target> <tab> <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」,反之亦然,則您需要為每個建立規則。

與訓練中使用的大多數其他檔案一樣,unicharambigs 檔案必須編碼為 UTF-8,並且必須以換行字元結尾。

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

unicharambigs 檔案也可能不存在。

整合所有檔案

這就是全部了!您現在需要做的就是將所有檔案(shapetablenormprotointtemppffmtable)收集在一起,並使用 lang. 前綴重新命名,其中 lang 是您的語言的三個字母代碼,取自 http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes,然後按如下方式對它們執行 combine_tessdata

combine_tessdata [lang].

注意:別忘了結尾的點!

產生的 lang.traineddata 會放在您的 tessdata 目錄中。然後,Tesseract(理論上)可以使用以下方式識別您的語言文字

tesseract image.tif output -l [lang]

(實際上,您可以使用任何字串作為語言代碼,但如果您希望其他人能夠輕鬆使用它,則使用 ISO 639 是最好的方法。)

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

您可以在第三方線上 Traineddata 檢查器中檢視 traineddata 檔案的某些內部結構。