Python机器学习:训练Tesseract
訓(xùn)練Tesseract
大多數(shù)其他的驗證碼都是比較簡單的。例如,流行的 PHP 內(nèi)容管理系統(tǒng) Drupal 有一個著 名的驗證碼模塊(https://www.drupal.org/project/captcha),可以生成不同難度的驗證碼。
?
那么與其他驗證碼相比,究竟是什么讓這個驗證碼更容易被人類和機(jī)器讀懂呢?
- 字母沒有相互疊加在一起,在水平方向上也沒有彼此交叉。也就是說,可以在每一個字 母外面畫一個方框,而不會重疊在一起。
- 圖片沒有背景色、線條或其他對 OCR 程序產(chǎn)生干擾的噪點。
- 雖然不能因一個圖片下定論,但是這個驗證碼用的字體種類很少,而且用的是 sans-serif 字體(像“4”和“M”)和一種手寫形式的字體(像“m”“C”和“3”)。
- 白色背景色與深色字母之間的對比度很高。
這個驗證碼只做了一點點改變,就讓 OCR 程序很難識別。
- 字母和數(shù)據(jù)都使用了,這會增加待搜索字符的數(shù)量。
- 字母隨機(jī)的傾斜程度會迷惑 OCR 軟件,但是人類還是很容易識別的。
- 那個比較陌生的手寫字體很有挑戰(zhàn)性,在“C”和“3”里面還有額外的線條。另外這 個非常小的小寫“m”,計算機(jī)需要進(jìn)行額外的訓(xùn)練才能識別。 用下面的代碼運(yùn)行 Tesseract 識別圖片:
tesseract captchaExample.png output
我們得到的結(jié)果 output.txt 是: 4N\,,,C<3
訓(xùn)練Tesseract
要訓(xùn)練 Tesseract 識別一種文字,無論是晦澀難懂的字體還是驗證碼,你都需要向 Tesseract 提供每個字符不同形式的樣本。
做這個枯燥的工作可能要花好幾個小時的時間,你可能更想用這點兒時間找個好看的視頻 或電影看看。首先要把大量的驗證碼樣本下載到一個文件夾里。
下載的樣本數(shù)量由驗證碼 的復(fù)雜程度決定;我在訓(xùn)練集里一共放了 100 個樣本(一共 500 個字符,平均每個字符 8 個樣本;a~z 大小寫字母加 0~9 數(shù)字,一共 62 個字符),應(yīng)該足夠訓(xùn)練的了。
提示:建議使用驗證碼的真實結(jié)果給每個樣本文件命名(即4MmC3.jpg)。 這樣可以幫你 一次性對大量的文件進(jìn)行快速檢查——你可以先把圖片調(diào)成縮略圖模式,然后通過文件名 對比不同的圖片。這樣在后面的步驟中進(jìn)行訓(xùn)練效果的檢查也會很方便。
第二步是準(zhǔn)確地告訴 Tesseract 一張圖片中的每個字符是什么,以及每個字符的具體位置。 這里需要創(chuàng)建一些矩形定位文件(box file),一個驗證碼圖片生成一個矩形定位文件。一 個圖片的矩形定位文件如下所示:
4 15 26 33 55 0M 38 13 67 45 0m 79 15 101 26 0C 111 33 136 60 03 147 17 176 45 0
第一列符號是圖片中的每個字符,后面的 4 個數(shù)字分別是包圍這個字符的最小矩形的坐標(biāo) (圖片左下角是原點 (0,0),4 個數(shù)字分別對應(yīng)每個字符的左下角 x 坐標(biāo)、左下角 y 坐標(biāo)、右上角 x 坐標(biāo)和右上角 y 坐標(biāo)),最后一個數(shù)字“0”表示圖片樣本的編號。
顯然,手工創(chuàng)建這些圖片矩形定位文件很無聊,不過有一些工具可以幫你完成。我很喜歡 在線工具 Tesseract OCR Chopper(http://pp19dd.com/tesseract-ocr-chopper/),因為它不需要?安裝,也沒有其他依賴,只要有瀏覽器就可以運(yùn)行,而且用法很簡單:上傳圖片,如果要 增加新矩形就單擊“add”按鈕,還可以根據(jù)需要調(diào)整矩形的尺寸,最后把新生成的矩形 定位文件復(fù)制到一個新文件里就可以了。
矩形定位文件必須保存在一個 .box 后綴的文本文件中。和圖片文件一樣,文本文件也是用 驗證碼的實際結(jié)果命名(例如,4MmC3.box)。另外,這樣便于檢查 .box 文件的內(nèi)容和文件的名稱,而且按文件名對目錄中的文件排序之后,就可以讓 .box 文件與對應(yīng)的圖片文件 的實際結(jié)果進(jìn)行對比。
你還需要創(chuàng)建大約 100 個 .box 文件來保證你有足夠的訓(xùn)練數(shù)據(jù)。因為 Tesseract 會忽略那 些不能讀取的文件,所以建議你盡量多做一些矩形定位文件,以保證訓(xùn)練足夠充分。如果 你覺得訓(xùn)練的 OCR 結(jié)果沒有達(dá)到你的目標(biāo),或者 Tesseract 識別某些字符時總是出錯,多 創(chuàng)建一些訓(xùn)練數(shù)據(jù)然后重新訓(xùn)練將是一個不錯的改進(jìn)方法。
創(chuàng)建完滿載 .box 文件和圖片文件的數(shù)據(jù)文件夾之后,在做進(jìn)一步分析之前最好備份一下這 個文件夾。雖然在數(shù)據(jù)上運(yùn)行訓(xùn)練程序不太可能刪除任何數(shù)據(jù),但是創(chuàng)建 .box 文件用了你 好幾個小時的時間,來之不易,穩(wěn)妥一點兒總沒錯。此外,能夠抓取一個滿是編譯數(shù)據(jù)的 混亂目錄,然后再嘗試一次,總是好的。
前面的內(nèi)容只是對 Tesseract 庫強(qiáng)大的字體訓(xùn)練和識別能力的一個簡略概述。如果你對 Tesseract 的其他訓(xùn)練方法感興趣,甚至打算建立自己的驗證碼訓(xùn)練文件庫,或者想和全世 界的 Tesseract 愛好者分享自己對一種新字體的識別成果,推薦閱讀 Tesseract 的文檔:https://github.com/tesseract-ocr/tesseract/wiki,加油!
總結(jié)
以上是生活随笔為你收集整理的Python机器学习:训练Tesseract的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python:处理一些格式规范的文字
- 下一篇: Python:Scrapy 框架简单介绍