1. 程式人生 > >如何訓練Tesseract 4.0

如何訓練Tesseract 4.0

原文:https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00

tesseract 4.0之後開始使用機器學習來進行字元識別,其訓練模型的方法與以前的版本有所不同,現將其官網的手冊翻譯如下 (未完成) 一、引言 Tesseract 4.0中包含了一個新的基於神經元網路的識別引擎,使得識別的精度比以前的版本大大提高了,相應的,對機器的計算能力要求也有了一個顯著的提高。當然對於複雜的語言,它實際上比基本Tesseract要執行得更快 和基本的Tesseract相比,神經元網路要求大量的訓練資料,訓練速度也慢了很多。對於拉丁語系的語言,版本中提供的訓練好的模型是在400000個文字行,4500種字型上訓練得到的。對於 其他語言,可能沒有這麼多 的字型,但它們訓練的文字行數是差不多的。Tesseract的訓練將需要幾天到2周的時間,而不是幾分鐘到幾個小時。即使使用了這麼多的訓練資料,你可能還是發現,它並不適合你特定的問題,因此你還需要重新訓練模型 訓練有幾個可選項:
  • Fine tune:從一個已經訓練過的語言開始,訓練你特定的資料。對那種和已有訓練資料很接近、但在一些細微的地方有差別,如特定的不常用的字型的場景,這種方式是一種好的選擇。即使只有少量的訓練資料,這種方式也可以執行得很好
  • 去掉網路的最上層(或任意層)重新訓練一個新的最上層,並使用新的資料。如果fine tuning不能很好地工作,這可能是一個最好選項。對於訓練一個全新的語言,如果你從一種看上去相似的語言開始的話,去掉網路的最上層仍然可以工作。
  • 從零開始訓練。這是一個艱鉅的任務,除非你有非常充分的理由和大量的訓練集。如果不是,你可能最終得到一個過擬合的網路模型,它在訓練資料上表現得很好,但在實際資料上表現很差
上面幾個選項看上去很不一樣,實際上訓練步驟幾乎是一樣的,除了命令列有一些不同。所以幾種選項都試一下是相當容易的,考慮到時間或硬體的話,可以讓它們並行執行 對於4.00版本,老的識別引擎仍然保留,也可以被訓練,但它是過時了的,除非有正當的理由,以後釋出的版本中可能會刪除它 二、開始之前 為了訓練tesseract4.0,你不需要任何神經元網路的背景知識,但這些知識可以幫助理解不同訓練選項之間的差異。在深陷訓練過程之前 ,請先閱讀“實現簡介”和tesseract3.04版本訓練過程中的一些注意事項 重要提示:在你花時間和精力去訓練tesseract之前,強烈推薦你閱讀“質量改進”頁 三、訓練要求的額外庫 從3.03版本開始,訓練工具需要以下一些額外的庫: sudo apt-get install libicu-dev sudo apt-get install libpango1.0-dev sudo apt-get install libcairo2-dev 四、構建訓練工具 從3.03開始,如果你從原始碼編譯Tesseract,那你需要使用單獨的命令來建立和安裝訓練工具。安裝好上面的額外庫後,就可以在Tessercat原始碼目錄下執行下面的命令來生成訓練 工具: make make training sudo make training-install
下面兩條命令是用來生成ScrollView.jar的,這個不是必須的(用來檢視訓練過程中的結果) make ScrollView.jar export SCROLLVIEW_PATH=$PWD/java 五、軟/硬體要求 在寫這篇文章的時候,訓練只能在小端位元組序(little-endian)機器(如intel)的linux上執行。為了訓練tesseract 4.0,最好是使用多核的機器(最好是4核),支援OpenMP和intel的SSE/AVX指令擴充套件。基本上只要有足夠的記憶體它就可以執行,但是你的處理器越高階,它執行得更快。GPU目前還不支援。記憶體的使用可以使用--max_image_MB命令列引數來控制,除作業系統佔用部分,你可能至少還需要1GB記憶體 六、訓練文字要求: 對於拉丁語系的語言而言,現在版本中提供的訓練好的模型資料,是經過了400000個文字行,在4500種字型訓練而來,對於 其它的語言,可能沒有這麼多的字型,但他們也已經訓練了同樣多的文字行 擁有更多的訓練文字、生成更多的頁將是有益的,雖然神經元網路並不總是能很好的泛化,並且需要和他們執行時遇到的東西相類似的東西來進行訓練。如果目標領域是一個非常限制的領域,那麼所有需要大量資料的告警都可以忽略,但神經元網路配置可能需要調整 七、訓練過程概述 整體的訓練過程和3.04是一樣的,都包括以下幾步: 1. 準備訓練資料 2. 渲染文字成影象+box檔案(或者為已經存在的影象檔案手工建立box檔案) 3. 建立unicharset檔案 4. (可選)建立字典資料 5. 執行tesseract來處理影象+box檔案來建立訓練資料集 6. 在訓練集上訓練 7. 合併資料檔案 主要的不同是: 1. box只在文字行這一級需要,因此當從已經存在的圖片資料進行訓練時,它更加容易 2. .tr檔案已經被.lstmf檔案代替 3. 字型可以,也應該被自由地混合,而不需要分開 4. 原來的多步(mf訓練,cn訓練,形狀簇),現在改成一個單一的lstm訓練 訓練還不能像3.04版本那樣自動化,原因如下: 1. 慢速訓練過程如果停止,它很難從中間重新開始,很難自動地告訴他什麼時候停止訓練 2. 在如何訓練一個網路時,有很多的選項(參見下文) 3. 訓練模型和unicharset可以是不同的,來自基本的tesseract,但並不是必須如此 4. 理論上,對於同一種語言來說,神經元網路版的tesseract並不需要一個基本的tesseract,但是當前如果沒有基本版本的tesseract,神經元網路版的tesseract不能被載入 建立訓練資料的過程已經寫在下面了,後面是lstm訓練的指南,介紹了訓練主體過程。在Linux上,你可以拷貝-貼上這些命令到你的終端上。為了讓tesstrain.sh指令碼能工作,你必須 設定你的PATH到你本地的training和api路徑,或者使用make install 八、建立訓練資料 和基本tesseract一樣,你可以從字型中渲染合成訓練資料,也可以對已有的圖片(如古人的手稿)進行標註。兩種情況下都要求tiff/box檔案對 有兩種可能的方法來格式化一個box檔案 1. box檔案格式——選項一 在這種格式中,box檔案的每一行匹配tiff圖片中的一個字元 在行的結尾處,需要插入一個特殊的行來標識一行的結束 2. box檔案格式——選項二(還沒有實現) 在這種格式下box只需要覆蓋一行檔案,而不是覆蓋一個單獨的字元 WordStr <left> <bottom> <right> <top> <page> #<text for line including spaces> WordStr是一個標識字串,它指示box檔案分析器從這一行的後部,#之後獲取實際的文字字串 如,檔案行”What a nice sunny day!“,應該被寫成 #W h a t a n i c e s u n n y d a y ! 原來的單詞之間的空格被省略 需要注意的是,在任何情況下,即使是像阿拉伯語這種從右向左的語言,文字的抄寫(代表著box序列或者一個WordStr字串)也應該是從左到右的順序。換句話說,網路將從左到右來進行學習,無論哪種語言,從右到左/雙向 處理將在tesseract的更高層進行 這些說明僅僅覆蓋了從字型檔案中渲染的情況,所以需要安裝必須的字型 執行tesstrain.sh的設定和基本tesseract一樣,使用--linedata_only選項來進行LSTM訓練 執行如下的tesstrain.sh命令將建立訓練資料,注意你的字型路徑可能需要調整: training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \ --noextract_font_properties --langdata_dir ../langdata \ --tessdata_dir ./tessdata --output_dir ~/tesstutorial/engtrain 上面的命令建立LSTM訓練資料,相當於訓練基本tesseract時英語資料。為了建立通用目的的基於LSTM的OCR引擎,它還遠遠不夠,但是這是一個很好的演示教程 現在試著為Impack字型建立驗證資料: training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \ --noextract_font_properties --langdata_dir ../langdata \ --tessdata_dir ./tessdata \ --fontlist "Impact Condensed" --output_dir ~/tesstutorial/engeval 我們將在在後面的優化演示時使用這些資料 九、lstmtraining使用指南 1. lstmtraining命令列 lstmtraining是一個多工的訓練神經元網路工具,下面列出了它的命令列引數:
標誌 型別 預設值 說明
U string 指向到unicharset的路徑
script_dir string 指向langdata路徑,用來獲取unicharset和基本筆畫表
net_spec string 指定網路拓撲結構
model_output string 輸出檔案/檢查點的輸出的基本路徑
max_image_MB int 6000 緩衝影象時使用的最大記憶體
learning_rate double 1e-4 SGD演算法的初始學習率
train_mode int 80 訓練模型,64為壓縮的unicharset,16用於迴圈訓練
net_mode int 192 網路模型
perfect_sample_delay int 4 當網路變好,僅僅反向傳播一個好的樣本在很多不好的樣本被看到之後,從上一個好的樣本允許通過
debug_interval int 0 如果不為0,則每過這麼多輪後顯示除錯資訊
weight_range double 0.1 初始權重的隨機數取值範圍
momentum double 0.9 alpha平滑梯度時的動量值
max_iterations int 0 經過這麼多輪訓練後停止
target_error_rate double 0.01 如果平均錯誤率低於此值,則停止訓練
continue_from string none 指向之前的檢查點以便繼續訓練或fine tune
stop_training bool false 轉換訓練中的檢查點到一個識別模型
append_index int -1 去掉網路的上面幾層,追加上--net_spec指定的網張來代替
train_listfile string none 訓練資料檔案的列表檔案
eval_listfile string none 驗證資料檔案的列表檔案,用來獨立於訓練資料對模型進行評估
多數flags使用預設值就可以工作,有幾個是在特殊操作時要求的,但是有幾個選項需要特別說明一下: 1.1 unicode字符集壓縮和train_mode LSTM在學習序列時非常好,但是當狀態數變得太大時會大幅減慢。有一個經驗性建議是:讓LSTM學習一個長序列,要比學習許多類的短序列要好,所以對於複雜的語言(如漢語,韓語,印度語),對每個符號重新編碼成一個短的序列碼,比一個少數的類大類集的效果要好。--train_mode 使用64將開啟這個功能開關,它也包含在預設值中。它將每一個漢字字元編碼成一個3code的序列,韓文使用Jamo編碼,印度文使用syllables作為他們的unicode序列。對於字符集更小的語言(如拉丁文),這些被摺疊進不同的單引號形狀到一個類,而雙引號到一個不同的類 1.2 隨機化訓練資料和train_mode 為了讓隨機梯度下降演算法能順利工作,訓練資料要求所有的樣本檔案可以隨機打亂組合,所以訓練器可以輪流讀取每個檔案,當到到尾時可以返回到從頭開始 。這和基本tesseract訓練是完全不同的 如果使用渲染程式碼(通過tesstrain.sh),它將打亂每個樣本檔案中的文字行,但你可以得到一組檔案,每個包含了單一字型的訓練樣本。為了增加一個更多混合,你應該使用train_mode 16,即使你不想uncicharset壓縮 1.3 模型輸出 訓練器週期性儲存checkpoints檔案,使用--model_output作為一個基本名字。因此它可以在任何點上停止訓練,並且重新開始,使用相同的命令列,它將繼續。為了強制重新開始,使用一個不同的--model_output,或者刪除這個目錄下的所有檔案 1.4 網路模型及優化 128開啟Adam優化,這似乎比平坦動量優化會更好一點。程式碼稱它為Adagrad,但並不是說Adagrad就不用動量優化,動量優化還在。沒有動量優化的平坦Adagrad完全不能工作 使用64將自動化每層的學習率,當處理過程中,訓練器獨立地檢查每一層是否應該減少學習率,可能更小或更大的學習率來繼續學習 1.5 完善取樣延遲(?) 在容易的樣本上訓練並不是一個好主意,它只是在浪費時間,但網路並不能因此不能處理他們,所以可能會丟棄一些訓練樣本如果樣本出現過於頻繁。--perfect_sample_delay引數丟棄完好的樣本,如果沒有發現許多不完好的樣本 1.6 除錯間隔(?) --debug_interval,預設值為0,訓練器輸出每100輪輸出一個進展報告 如果--debug_interval -1,訓練器將每輪都會輸出詳細的除錯資訊 如果--debug_interval 大於0,訓練器顯示幾個視窗的,顯示這一層的除錯資訊。特別的,當--debug_interval 1時,它每進入下一輪之前需要LSTMForward視窗點選一次,但在其它情況下,它將繼續並且按要求的頻率顯示資訊 注意:--debug_interval大於0時,你必須構建了ScrollView.jar,還有其它訓練工具,詳細參見”Building the Training Tools“ 2. 從零開始訓練 下面的例子是從頭開始訓練的命令,使用上面的命令列建立的資料 mkdir -p ~/tesstutorial/engoutput training/lstmtraining -U ~/tesstutorial/engtrain/eng.unicharset \ --script_dir ../langdata --debug_interval 100 \ --net_spec '[1,36,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx256 O1c105]' \ --model_output ~/tesstutorial/engoutput/base \ --train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \ --max_iterations 5000 &>~/tesstutorial/engoutput/basetrain.log 可以開啟另外一個視窗監控日誌輸出: tail -f ~/tesstutorial/engoutput/basetrain.log 你應該可以觀察 到,每500輪,空白將開始在CTC輸出視窗,而800輪綠線將出現在LSTMForward視窗中,那有空格在圖片上 到600輪時,有一個的非空格的碰撞在CTC輸出中。注意這個CTC目標,它開始以同樣 的高度現在高度發生變化,因為空白的輸出。同時,字元和綠線的位置在LSTMTraining視窗也不精確像他們普通的那樣,因為從這個網路的特殊輸出,弄亂了CTC演算法(CTC假定在不同的x-座標統計獨立 ,但們們很清楚不是獨立 的) 到2000輪,它應該是很清楚在輸出視窗中:一些微弱的黃色標誌將出現,表示有一些正在成長的輸出對非空和非空格,並且字元正在開始出現 在LSTMForward視窗中 到3200輪,字元錯誤率跌入50以下到5000輪到18% 注意,這個引擎訓練部分資料與基礎Tesseract使用的訓練資料是相同的,但是它們的精度在其它字型上是很差的。它在訓練5000輪之後停止(目前高階的機器上大約需要半個小時),此時它的字元錯誤率大約是25%。使用下面的命令可以執行一個單獨的測試 training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt 76%的字元錯誤率?不太好 現在基礎Tesseract在Impact字型上做的並不太好,但是它包含了4500多種字型,所以如果你從eng.traineddata中抽取出eng.lstm檔案的話,你可以比較一下: mkdir -p ~/tesstutorial/impact_from_full training/combine_tessdata -e tessdata/eng.traineddata \ ~/tesstutorial/impact_from_full/eng.lstm training/lstmeval --model ~/tesstutorial/impact_from_full/eng.lstm \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt 1.7%的字元錯誤率?非常好 為了下一節引用,我們在訓練集上也運行了一個全模型集的測試 training/lstmeval --model ~/tesstutorial/impact_from_full/eng.lstm \ --eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt 字元錯誤率是0.047221785,單詞錯誤率是0.24679659 你可以再訓練5000輪,可以得到一個更低的錯誤率,但這對Impact字型並沒有多少幫助 mkdir -p ~/tesstutorial/engoutput training/lstmtraining -U ~/tesstutorial/engtrain/eng.unicharset \ --script_dir ../langdata \ --net_spec '[1,36,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx256 O1c105]' \ --model_output ~/tesstutorial/engoutput/base \ --train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \ --max_iterations 10000 &>>~/tesstutorial/engoutput/basetrain.log Impact字型的字元錯誤率還是75%,即使當訓練集的錯誤率已經達到字元錯誤率為0.86%/單詞錯誤率為3.1% training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \ --eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt 總的來說,從頭開始訓練需要一個非常限制的問題,大量的訓練資料,或你需要減小網路的結構使用--net_spec。否則你應該用微調方式 3. Fine Tuning Fine Tuning就是在不改變任何網路結構、字符集的情況下,使用新的資料訓練一個已有模型的過程。不需要一個unicharset,script_dir或net_spec,因為它們都可以從已有的模型中得到 training/lstmtraining --model_output /path/to/output [--max_image_MB 6000] \ --continue_from /path/to/existing/model \ [--perfect_sample_delay 4] [--debug_interval 0] \ [--max_iterations 0] [--target_error_rate 0.01] \ --train_listfile /path/to/list/of/filenames.txt 注意:--continue_from引數可以指向一個訓練中的checkpoint,也可以是一個識別模型,即使檔案格式不同。訓練中的checkpoint檔案是參model_output 開頭、以checkpoint或lstm結尾的檔案,像我們上面做的。讓我們在上面建立的模型上開始fine tuning,來看看我們能否在Impact上工作得更好: mkdir -p ~/tesstutorial/impact_from_small training/lstmtraining --model_output ~/tesstutorial/impact_from_small/impact \ --continue_from ~/tesstutorial/engoutput/base_checkpoint \ --train_listfile ~/tesstutorial/engeval/eng.training_files.txt \ --max_iterations 1200 這一次訓練100輪後,字元/單詞的錯誤率達到27%/56.2%,1200輪後達到了1.4%/4.8%。現在我們做一個單獨的測試: training/lstmeval --model ~/tesstutorial/impact_from_small/impact_checkpoint \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt 資料顯示出一個更低的字元/單詞的錯誤率:0.18%/0.92%,因為訓練 器平均超過1000輪了,它已經改進了。這不是Impact這種字型特有的結果,我們是在整個訓練集上進行測試 這是一個很有趣的例子。fine tuning是真的可以應用到全訓練模型中的一個 mkdir -p ~/tesstutorial/impact_from_full training/lstmtraining --model_output ~/tesstutorial/impact_from_full/impact \ --continue_from ~/tesstutorial/impact_from_full/eng.lstm \ --train_listfile ~/tesstutorial/engeval/eng.training_files.txt \ --max_iterations 1200 在100輪之後 ,它已經達到 了1.26%/3.98%的字元/單詞錯誤率,在1200輪時更是達到了0.31%/1,18%的錯誤率。再一次,全單獨的測試給出了更好的結果 training/lstmeval --model ~/tesstutorial/impact_from_full/impact_checkpoint \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt 字元錯誤率0.2%,單詞錯誤率0.7%。更有趣的是其它字型的影響,所以執行一個測試在之前我們用的基礎訓練 集上 training/lstmeval --model ~/tesstutorial/impact_from_full/impact_checkpoint \ --eval_listfile ~/tesstutorial/engtrain/eng.training_files.tx 字元錯誤率是0.04552459,單詞錯誤率是0.22928254 似乎在那個資料集的結果更好。這可能是因為最初的模型已經被訓練在人工降級的圖片上,為了使它能學習降級的文字 總的來說,預訓練好的模型可以被fine-tuned或適匹到小的資料集上,不需要做大的損害對它的一般精度 4. 只訓練幾層 如果你不打算修改字符集,Fine-tuning是非常好的選擇。但是如果你想增加一個新的字元到一個語言中,或者你想訓練克林貢語,你不太可能有大量的訓練資料而且它也不太像別的東西,這時你該怎麼辦?你可以刪除掉已有網路模型中上面的若干層,用新的隨機層來代替他們,並且訓練你的資料。這個命令列幾乎與“從零開始訓練”節中介紹的一致,只是你必須提供一個unicharset和net_spec,你也可以提供一個模型給--continue_from和--append_index引數 --append_index引數告訴訓練器它將刪除掉給定的索引值以上的層(從0開始,在最外層),附加的層通過--net_spec引數哪些將儲存。雖然這些索引系統並不是完美地引用網路層的方式,它是一個網路規範劉品言大大簡化後的結果。這個構建器將輸出一個字串代表它生成的網路,使它可以很容易地檢查索引引用到想要的層 作為參考,4.0alpha版本中,chi_sim, chi_tra, guj, hin, jpn, mal, mar, pan, tel這些語言是這樣訓練的: --learning_rate 10e-5 --net_spec '[1,0,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx384 O1c1]' --net_mode 192 --perfect_sample_delay 19 其它的語言使用下面的引數訓練: --learning_rate 10e-5 --net_spec '[1,0,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx256 O1c1]' --net_mode 192 --perfect_sample_delay 19 這兩者唯一的不同是最外一個LSTM層的大小。因此在這些模型中,--append_index將儲存與相關聯的最外層,並且附加 上 Index layer 0 input 1 ct5,5,16 2 mp3,3 3 lfys64 4 lfx128 5 lrx128 6 lfx256/384 已有模型剩下部分的權重開始並不修改,但是允許被新的訓練資料修改 例如,讓我們將一個已經存在的chi_sim模型轉成eng。我們將刪除最外一個LSTM層(它在chi_sim模型中比在eng模型中更大)和softmax,換成一個更小的LSTM層和一個新的softmax mkdir -p ~/tesstutorial/eng_from_chi training/combine_tessdata -e tessdata/chi_sim.traineddata \ ~/tesstutorial/eng_from_chi/eng.lstm training/lstmtraining -U ~/tesstutorial/engtrain/eng.unicharset \ --script_dir ../langdata --debug_interval 100 \ --continue_from ~/tesstutorial/eng_from_chi/eng.lstm \ --append_index 5 --net_spec '[Lfx256 O1c105]' \ --model_output ~/tesstutorial/eng_from_chi/base \ --train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \ --max_iterations 5000 &>~/tesstutorial/eng_from_chi/basetrain.log 因為低層已經訓練過了,這個學習比從零開始 訓練要快。到400輪,已經有一些空格被輸出,到500輪,一些正確的字元被輸出,到1000輪,已經所有的字元幾乎都正確了。到這時,它就完成了,它應該是2.6%的字元錯誤率和8.6%的單詞錯誤率 試著使用全訓練資料進行一個獨立 測試在IMpact字型: training/lstmeval --model ~/tesstutorial/eng_from_chi/base_checkpoint \ --eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt training/lstmeval --model ~/tesstutorial/eng_from_chi/base_checkpoint \ --eval_listfile ~/tesstutorial/engeval/eng.training_files.txt 在全訓練集,我們得到2.24%/7.36%,而在Impact上23.9%/59.3%,這已經比從頭開始訓練要好很多了,但是它還是過擬合了 總的來說,刪除掉一個已有網路的上面幾層是可以的,和從零開始 訓練一樣,但是需要大師的訓練資料作準備,而剩餘的是保留下來避免過擬合的 5. 訓練過程中的錯誤資訊 訓練過程中會出現 幾種錯誤訊息,其中有些是比較重要的,而其它的則不太重要 Encoding of string failed! 當訓練影象中的文字字串不能用給定的字符集進行編碼時,產生此錯誤。可能的原因是 1)文字中有一個不可表達的字元,如一個英鎊的符號,而你的字符集中沒有 2)對文字中的不可列印字元(如表格或控制字元)出現錯誤 3)文字中有一個不可表達的印度語字母 無論哪種原因,訓練器都將訓練圖片忽略掉。如果這個錯誤不是很頻繁,那它是無關緊要的,但可能指示,對於你正在訓練的語言來說,你的字符集是不夠的 unichar xxx is too long to encode!!(只在印度語時出現)。為了簡化LSTM引擎,編碼器對於unicode字元的長度有一個上限。它會把這個字母排除在可識別集之外然後繼續,但是如果有很多這個的錯誤,那你就麻煩了 Bad box coordinates in boxfile string! LSTM訓練器只需要一個完整文字行的邊界資訊,而不需要每個字元的,如果你在box字串中間放入了空格,像下面這樣: <text for line including spaces> <left> <bottom> <right> <top> <page> 分析器將被弄糊塗,於是給出錯誤提示。對這個的boxfile字串有一個不同的格式要求: WordStr <left> <bottom> <right> <top> <page> #<text for line including spaces> 當訓練輸入不是以LSTM格式或檔案不可讀,並行化頭就會失敗。檢查你的檔案列表檔案,看看它是否包含一個有效的檔名 No block overlapping textline: 對給定的訓練資料進行佈局分析,來進行分段,如果失敗,將出現這個提示。這個文字行將被刪除。如果它出現的不多那沒什麼問題,但是如果有很多,那應該是訓練文字或渲染出了問題 <undecodable>出在在ALIGNED_TRUTH or OCR TEXT輸出早期在訓練中。它是字符集進行壓縮和CTC訓練的結果(參看上面的字符集壓縮和訓練模式)。這應該是無害的可以忽略。它出現 的頻率應該隨著訓練的進行而越來越少 十、合併輸出檔案 lstmtraining程式輸出兩種型別的checkpoint檔案: <model_base>_checkpoint:是最終的模型檔案 <model_base><char_error>_<iteration>.lstm檔案會定期地被輸出,以最好的訓練結果。這個lstm的字尾是一個誤導,好像檔案格式和識別模式檔案格式不同。它和checkpoint檔案一樣是訓練的輸出 ,但它更小,因為它並沒有一個模型備份,如果訓練執行到一個分支時將需要這個備份 這些檔案都可以轉化為一個識別模型: training/lstmtraining --model_output ~/tesstutorial/eng_from_chi/eng.lstm \ --continue_from ~/tesstutorial/eng_from_chi/base_checkpoint \ --stop_training 最後,將你的新模型檔案和語言模型檔案合併成一個數據檔案: training/combine_tessdata -o tessdata/eng.traineddata \ ~/tesstutorial/eng_from_chi/eng.lstm \ ~/tesstutorial/engtrain/eng.lstm-number-dawg \ ~/tesstutorial/engtrain/eng.lstm-punc-dawg \ ~/tesstutorial/engtrain/eng.lstm-word-dawg dawg檔案是可選的,沒有它們也可以正常工作,但它們通常提供了一些精度 上的改進 注意:Tesseract 4.00將和一個包含了lang.lstm檔案的traineddata檔案工作得很好。lstm-*-dawgs是可選的,如果沒有這些檔案,則ocr引擎模式要求使用OEM_LSTM_ONLY 模式,不需要bigrams, chichar ambigs或其它的一些檔案,有這些檔案甚至沒有任何影響 當增加到一個已經存在的Tessearcat traineddata檔案中,LSTM字符集並不要求必須與Tesseract中的字符集匹配,但是在訓練LSTM和構建lstm-*-dawgs檔案時則要求必須使用同樣的字符集