如何訓練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文件時則要求必須使用同樣的字符集

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章