跳至內容。

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


如何使用提供的工具來為新的語言訓練 Tesseract 2.x?

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

簡介

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

背景與限制

Tesseract 最初設計為僅識別英文文字。已努力修改引擎及其訓練系統,使其能夠處理其他語言和 UTF-8 字元。Tesseract 2.0 可以處理任何 Unicode 字元(以 UTF-8 編碼),但它成功的語言範圍有限,因此請在抱持期望它可以在您的特定語言上良好運作之前,將此部分納入考量!

Tesseract 只能處理由左至右的語言。雖然您可以使用由右至左的語言獲得某些結果,但輸出檔案的順序會像是文字是由左至右排列。由上至下的語言目前將無望處理。

Tesseract 不太可能處理像阿拉伯語這樣的連寫文字。需要一些特殊的演算法來處理這種情況,而目前它沒有這些演算法。

對於大型字元集語言(如中文),Tesseract 可能會非常慢,以至於可能沒有用處。還需要進行一些程式碼變更,以容納具有超過 256 個字元的語言。

任何具有不同標點符號和數字的語言,都會因為一些假設 ASCII 標點符號和數字的硬編碼演算法而處於劣勢。

所需的資料檔案

若要訓練其他語言,您必須在 tessdata 子目錄中建立 8 個資料檔案。命名慣例是 語言代碼.檔案名稱。語言代碼遵循 ISO 639-3 標準。用於英文的 8 個檔案是

您最少需要做些什麼?

必須使用下面描述的程序建立 inttemp、normproto、pffmtable、freq-dawg、word-dawg 和 unicharset。如果您只是嘗試識別有限範圍的字型(例如單一字型),則單一訓練頁面可能就足夠了。DangAmbigs 和 user-words 可以是空檔案。如果您沒有可用的單字清單,則字典檔案 freq-dawg 和 word-dawg 不必提供太多單字,但準確性會低於您擁有合理大小的字典(例如,對於英文來說是數萬個單字)的情況,但至少對於 2.04 及更低版本,不允許空的 dawg 檔案和沒有單字的 dawg。

訓練程序

部分程序不可避免地是手動的。已提供盡可能多的自動化幫助。未來可能會出現更多自動化工具。下面引用的工具均內建於訓練子目錄中。

產生訓練影像

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

接下來,列印和掃描(或使用某些電子渲染方法)以建立您的訓練頁面的影像。可以使用最多 32 個訓練影像。最好以混合字型和樣式(包括斜體和粗體)建立頁面。

注意: 由於間隔要求,從真實影像進行訓練實際上非常困難。這將在未來版本中得到改進。目前,如果您可以列印/掃描自己的訓練文字,則會容易得多。

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

大量訓練資料的說明 32 個影像限制適用於字型。 每個字型可以放入單個多頁 tiff (僅當您使用 libtiff 時!) 並且可以修改 box 檔案以在座標之後為每個字元指定頁碼。因此,可以為任何給定字型建立任意大量的訓練資料,允許訓練大型字元集語言。多頁 tiff 的替代方法是為單一字型建立許多單頁 tiff,然後您必須將每個字型的 tr 檔案連結到幾個單字型 tr 檔案中。無論如何,mftraining 的輸入 tr 檔案都必須各自包含單一字型,並且提供給 mftraining 的檔案順序必須與提供給 unicharset_extractor 的檔案順序相符。

製作 Box 檔案

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

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

tesseract fontfile.tif fontfile batch.nochop makebox

然後您必須將 fontfile.txt 重新命名為 fontfile.box

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

s 734 491 751 516
p 753 483 776 515
r 779 492 796 516
i 799 492 810 525
n 814 492 837 516
g 839 483 862 516
t 865 491 878 520
u 101 452 122 483
b 126 453 146 486
e 149 452 168 477
r 172 453 187 476
d 211 450 232 483
e 236 450 255 474
n 259 451 281 474

由於 Tesseract 是在英文模式下執行,因此它無法正確識別變音符號。此字元需要使用合適的編輯器進行更正。應使用了解 UTF-8 的編輯器來執行此操作。HTML 編輯器通常是不錯的選擇。(Linux 上的 Mozilla 允許您直接從瀏覽器編輯 UTF-8 文字檔案。Firefox 和 IE 不允許您執行此操作。MS Word 非常擅長處理不同的文字編碼,而 Notepad++ 是另一個了解 UTF-8 的編輯器。)Linux 和 Windows 都有一個字元對應表,可用於複製無法鍵入的字元。在這種情況下,u 需要變更為 ü。

理論上,box 檔案中的每一行都應代表訓練檔案中的一個字元,但如果您有一個水平斷開的字元,例如較低的雙引號 „,它可能會包含需要合併的 2 個 box!

範例:第 117-130 行

D 101 503 131 534
e 135 501 154 527
r 158 503 173 526
, 197 496 205 507
, 206 496 214 508
s 220 499 236 524
c 239 499 258 523
h 262 500 284 532
n 288 500 310 524
e 313 499 332 523
l 336 500 347 533
l 352 500 363 532
e 367 499 386 524
" 389 520 407 532

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

這會產生

D 101 503 131 534
e 135 501 154 527
r 158 503 173 526
„ 197 496 214 508
s 220 499 236 524
c 239 499 258 523
h 262 500 284 532
n 288 500 310 524
e 313 499 332 523
l 336 500 347 533
l 352 500 363 532
e 367 499 386 524
" 389 520 407 532

如果您沒有成功地在訓練影像上隔開字元,則某些字元可能會合併到單個 box 中。在這種情況下,您可以重新製作具有更好間隔的影像並重新開始,或者如果該對很常見,則將兩個字元都放在行的開頭,並讓邊界框代表它們兩個。(從 2.04 版開始,「字元」的描述限制為 24 個位元組。這將允許您使用 6 到 24 個 unicode 來描述字元,具體取決於您的程式碼在 unicode 集中所處的位置。如果有人達到此限制,請提交一份問題報告,說明您的情況。)

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

如果你的編輯器支援 UTF-8 編碼,這個過程會比不支援的編輯器容易許多,因為每個 UTF-8 字元最多需要 4 個位元組來編碼,而較舊的編輯器會將這些位元組個別顯示。

有幾種視覺工具可以編輯 box 檔案 - 請參考 ../AddOns

引導新的字元集

如果你嘗試訓練新的字元集,最好先花點力氣在單一字型上建立一個良好的 box 檔案,執行剩餘的訓練流程,然後使用 Tesseract 以你的新語言產生剩餘的 box 檔案,如下所示:

tesseract fontfile.tif fontfile -l yournewlanguage batch.nochop makebox

這應該會讓第二個 box 檔案更容易產生,因為 Tesseract 很有可能正確辨識出大部分的文字。你可以隨時重複這個步驟,將更多字型加入訓練集(例如,加入下方 mfTraining 和 cnTraining 的命令列),但請注意,沒有增量訓練模式可以讓你將新的訓練資料加入現有的資料集。這表示每次執行 mfTraining 和 cnTraining 時,都是從你於命令列給定的 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 最多只能接受 32 個 .tr 檔案,因此你必須將多種語言的檔案針對相同字型串連起來,以建立 32 個結合語言但個別字型的檔案。當傳遞給 unicharset_extractor 時,tr 檔案中找到的字元必須與 box 檔案中找到的字元順序相符,因此你必須以與 tr 檔案相同順序串連 box 檔案。cn/mftraining 和 unicharset_extractor 的命令列必須以相同順序給定 .tr 和 .box 檔案(分別),以防你對不同的字型進行不同的篩選。可能會有一個程式可用於執行所有這些操作,並以字元對應表的方式挑選出字元。這可能會讓整個過程更容易。

執行 Tesseract 進行訓練

針對你的每個訓練影像和 box 檔案配對,以訓練模式執行 Tesseract。

tesseract fontfile.tif junk nobatch box.train

或者

tesseract fontfile.tif junk nobatch box.train.stderr

第一種形式會將所有錯誤傳送到 tesseract.log(在所有平台上),就像在 Windows 版本 2.03 及更早版本中所做的那樣。使用 box.train.stderr,所有錯誤都會傳送到 stderr(在所有平台上),就像在版本 2.03 及更早版本的非 Windows 平台上所做的那樣。

請注意,box 檔案名稱必須與 tif 檔案名稱相符,包括路徑,否則 Tesseract 將找不到它。此步驟的輸出是 fontfile.tr,其中包含訓練頁面中每個字元的特徵。另請注意,輸出名稱是從輸入影像名稱衍生而來,而不是此處顯示為 junk 的正常輸出名稱。junk.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...」錯誤表示你已超出字元描述的 8 位元組 (v2.01) 限制。如果你需要超過 8 位元組的描述,請提交問題。沒有以上任何錯誤的 box 檔案格式錯誤表示邊界框整數有問題,或可能是 box 檔案中有空行。空行實際上是無害的,在這種情況下可以忽略該錯誤。程式碼可以忽略它們,但它沒有忽略它們,以防 box 檔案有任何非預期的錯誤。

無需編輯 fontfile.tr 檔案的內容。其中的字型名稱不必設定。對於好奇的人,以下是一些關於格式的資訊。

Every character in the box file has a corresponding set of entries in
the .tr file (in order) like this
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

The mf features are polygon segments of the outline normalized to the
1st and 2nd moments.
x= x position [-0.5.0.5]
y = y position [-0.25, 0.75]
length is the length of the polygon segment [0,1.0]
dir is the direction of the segment [0,1.0]

The cn feature is to correct for the moment normalization to
distinguish position and size (eg c vs C and , vs ')

群集

當所有訓練頁面的字元特徵被擷取後,我們需要將它們叢集,以建立原型。可以使用 mftrainingcntraining 程式叢集字元形狀特徵。

mftraining fontfile_1.tr fontfile_2.tr ...

這將輸出兩個資料檔案:inttemp(形狀原型)和 pffmtable(每個字元的預期特徵數量)。(此程式也會寫入第三個稱為 Microfeat 的檔案,但未使用。)

cntraining fontfile_1.tr fontfile_2.tr ...

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

計算字元集

Tesseract 需要知道它可以輸出的可能字元集。若要產生 unicharset 資料檔案,請對用於叢集的相同訓練頁面邊界框檔案使用 unicharset_extractor 程式。

unicharset_extractor fontfile_1.box fontfile_2.box ...

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

範例

; 0
b 3
W 5
7 8

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

注意 每次產生 inttemp、normproto 和 pffmtable 時都必須重新產生 unicharset 檔案(也就是說,當 box 檔案變更時,它們必須重新建立),因為它們必須同步。unicharset 中的行必須以正確的順序排列,因為 inttemp 會儲存 unicharset 的索引,且分類器傳回的實際字元來自 unicharset 中給定索引的位置。

字典資料

Tesseract 針對每種語言使用 3 個字典檔案。其中兩個檔案編碼為有向非循環字詞圖 (DAWG),另一個是純 UTF-8 文字檔案。若要建立 DAWG 字典檔案,你首先需要你的語言的字詞清單。字詞清單的格式為 UTF-8 文字檔案,每行一個字詞。將字詞清單分成兩組:常用字詞和其餘字詞,然後使用 wordlist2dawg 建立 DAWG 檔案。

wordlist2dawg frequent_words_list freq-dawg
wordlist2dawg words_list word-dawg

注意:字詞清單必須包含至少一個字詞!目前支援空檔案和沒有字詞的字典!(你肯定知道至少一個要辨識的字詞。)

如果字詞中總是包含一些標點符號,例如 google.com,則最好將它們包含在字典中。

第三個字典檔案稱為 user-words,通常是空的。

最後一個檔案

Tesseract 使用的最後一個資料檔案稱為 DangAmbigs。它表示字元或字元集之間的固有歧義,並且目前完全是手動產生的。若要了解檔案格式,請查看以下範例。

1       m       2       r n
3       i i i   1       m

第一個欄位是第二個欄位中的字元數。第三個欄位是第四個欄位中的字元數。與其他檔案一樣,這是一個 UTF-8 格式的檔案,因此每個字元都可以由多個位元組表示。第一行顯示「rn」這對字元有時可能會被錯誤地辨識為「m」。第二行顯示字元「m」有時可能會被錯誤地辨識為序列「iii」。請注意,兩邊的字元都應出現在 unicharset 中。此檔案不能用於將字元從一組轉換為另一組。

DangAmbigs 檔案也可能為空。

整合所有內容

這就是全部了!你現在需要做的就是將所有 8 個檔案收集在一起,並將它們重新命名為以 lang. 為前綴,其中 lang 是你的語言的 3 個字母代碼,取自 http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes,並將它們放入你的 tessdata 目錄中。然後,Tesseract (理論上)可以使用以下方式辨識你的語言中的文字。

tesseract image.tif output -l lang

(實際上,你可以使用你喜歡的任何字串作為語言代碼,但如果你希望其他人能夠輕鬆使用它,則應使用 ISO 639。)