還記得那慘不仁賭的驗證碼準確率嗎?其實上回步驟跟做法都是對的,只是當初鬼遮眼,僅一行 code 沒注意到,白白浪費超多時間呀。
ref:
https://medium.com/@kuancat/tesseract-ocr-%E7%AD%86%E8%A8%98-d3e8781a587d
請教了一下強者同事,原來 tesseract 目前有三種訓練方法。
- make ( 此次會用到的方法 )
- tesstrain.sh
- jTessBoxEditor ( 適合陶冶性情 🍵 )
ref:
https://github.com/tesseract-ocr/tesstrain
https://livezingy.com/train-tesseract-lstm-methods-comparison/
因為我是開 VM 裝 docker 訓練的,如果想用 windows 跑的話,請依照上方 ref 安裝。
第一步
安裝 tesseract 4.0.0beta1 以上的版本、 tesseract training tools 與 Python 3.x for Pillow。
You will need a recent version (>= 4.0.0beta1) of tesseract built with the training tools and matching leptonica bindings. Build instructions and more can be found in the Tesseract project wiki.
You need a recent version of Python 3.x. For image processing the Python library
Pillow
is used. If you don't have a global installation, please use the provided requirements filepip install -r requirements.txt
.
第二步
準備待訓練的圖檔 ( png 或 tif ) 與相對應的 txt ( 檔名與圖檔相同,但後綴為.gt.txt;內容則是圖檔的文字 )
圖檔名稱為 BAmn.png
文檔名稱為 BAmn.gt.txt
文檔內容為圖片內容,此處為 BAmn
第三步
開始訓練
將剛剛準備好的檔案放到 tesstrain/data/[lang]-ground-truth 下。
make training MODEL_NAME=[lang]
假設想要訓練出的語言為 ABC、以基底英文 ( eng ) 為訓練 model.
make training MODEL_NAME=ABC START_MODEL=eng
訓練好後就會在 tesstrain/data 下產生一個 ABC.traineddata 啦!
就是這麼簡單~準備好圖、文檔,打打指令自動訓練。不用再像上回一樣,坐在電腦前一張一張 box 比對,省下來的時間就可以浪費在其他更美好的事物上啦!!
拉回本文開頭。強者我同事有寫一個驗證程式碼的程式,我就直接借來驗證我的訓練準不準確。那到底是漏看了什麼導致準確率甚低?
首先,拿 tesseract 原生的 eng.traineddata 來比對驗證碼, 解析出來的不是漏字、多字、不然就是英文變數字,準確率不到 1 %,然後訓練了 300 張,準確率 8 %; 800 張 11 % …
眉頭一皺,這樣下去要練幾萬張才會達到預期的準確率。念頭一轉,是不是圖檔太雜,訓練時不好判斷。
改成灰階圖或二值化圖訓練,沒用。開始想辦法降噪,降噪參數一個一個改,一個一個訓練,沒用。修改 PSM、拉高訓練次數,沒用!!!
電腦大概是 2012, 2013 左右的機子,效能問題訓練時間又不短,中間又歷經 VM 被我玩掛掉、重新下載 image 又常斷線( 剛好處在一個網路不好的地方 ) 。
就在要放棄時,想說看看到底是哪些 "字" 這麼難訓練,突然發現只要是大寫的字都判斷不出來!!!竟然!!!
當初沒仔細看,原來那驗證程式碼的程式有設定參數 tessedit_char_whitelist 只抓小寫…
恩恩...哈哈...我... 😭