大多數(shù)其他的驗證碼都是比較簡單的筐乳。例如,流行的 PHP 內(nèi)容管理系統(tǒng) Drupal 有一個著 名的驗證碼模塊(https://www.drupal.org/project/captcha)太防,可以生成不同難度的驗證碼。酸员,可以生成不同難度的驗證碼杏头。)
那么與其他驗證碼相比,究竟是什么讓這個驗證碼更容易被人類和機器讀懂呢?
- 字母沒有相互疊加在一起沸呐,在水平方向上也沒有彼此交叉。也就是說呢燥,可以在每一個字 母外面畫一個方框崭添,而不會重疊在一起。
- 圖片沒有背景色叛氨、線條或其他對 OCR 程序產(chǎn)生干擾的噪點呼渣。
- 雖然不能因一個圖片下定論,但是這個驗證碼用的字體種類很少寞埠,而且用的是 sans-serif 字體(像“4”和“M”)和一種手寫形式的字體(像“m”“C”和“3”)屁置。
- 白色背景色與深色字母之間的對比度很高。
這個驗證碼只做了一點點改變仁连,就讓 OCR 程序很難識別蓝角。
- 字母和數(shù)據(jù)都使用了阱穗,這會增加待搜索字符的數(shù)量。
- 字母隨機的傾斜程度會迷惑 OCR 軟件使鹅,但是人類還是很容易識別的揪阶。
- 那個比較陌生的手寫字體很有挑戰(zhàn)性,在“C”和“3”里面還有額外的線條患朱。另外這 個非常小的小寫“m”鲁僚,計算機需要進行額外的訓(xù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)糠雨。 這樣可以幫你 一次性對大量的文件進行快速檢查——你可以先把圖片調(diào)成縮略圖模式,然后通過文件名 對比不同的圖片徘跪。這樣在后面的步驟中進行訓(xùn)練效果的檢查也會很方便甘邀。
第二步是準(zhǔn)確地告訴 Tesseract 一張圖片中的每個字符是什么,以及每個字符的具體位置垮庐。 這里需要創(chuàng)建一些矩形定位文件(box file)松邪,一個驗證碼圖片生成一個矩形定位文件。一 個圖片的矩形定位文件如下所示:
4 15 26 33 55 0
M 38 13 67 45 0
m 79 15 101 26 0
C 111 33 136 60 0
3 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/)仙辟,因為它不需要同波,因為它不需要) 安裝,也沒有其他依賴欺嗤,只要有瀏覽器就可以運行参萄,而且用法很簡單:上傳圖片,如果要 增加新矩形就單擊“add”按鈕煎饼,還可以根據(jù)需要調(diào)整矩形的尺寸讹挎,最后把新生成的矩形 定位文件復(fù)制到一個新文件里就可以了。
矩形定位文件必須保存在一個 .box 后綴的文本文件中吆玖。和圖片文件一樣筒溃,文本文件也是用 驗證碼的實際結(jié)果命名(例如,4MmC3.box)沾乘。另外怜奖,這樣便于檢查 .box 文件的內(nèi)容和文件的名稱,而且按文件名對目錄中的文件排序之后翅阵,就可以讓 .box 文件與對應(yīng)的圖片文件 的實際結(jié)果進行對比歪玲。
你還需要創(chuàng)建大約 100 個 .box 文件來保證你有足夠的訓(xùn)練數(shù)據(jù)。因為 Tesseract 會忽略那 些不能讀取的文件掷匠,所以建議你盡量多做一些矩形定位文件滥崩,以保證訓(xùn)練足夠充分。如果 你覺得訓(xùn)練的 OCR 結(jié)果沒有達到你的目標(biāo)讹语,或者 Tesseract 識別某些字符時總是出錯钙皮,多 創(chuàng)建一些訓(xùn)練數(shù)據(jù)然后重新訓(xùn)練將是一個不錯的改進方法。
創(chuàng)建完滿載 .box 文件和圖片文件的數(shù)據(jù)文件夾之后顽决,在做進一步分析之前最好備份一下這 個文件夾短条。雖然在數(shù)據(jù)上運行訓(xùn)練程序不太可能刪除任何數(shù)據(jù),但是創(chuàng)建 .box 文件用了你 好幾個小時的時間才菠,來之不易茸时,穩(wěn)妥一點兒總沒錯。此外赋访,能夠抓取一個滿是編譯數(shù)據(jù)的 混亂目錄可都,然后再嘗試一次,總是好的进每。
前面的內(nèi)容只是對 Tesseract 庫強大的字體訓(xùn)練和識別能力的一個簡略概述。如果你對 Tesseract 的其他訓(xùn)練方法感興趣命斧,甚至打算建立自己的驗證碼訓(xùn)練文件庫田晚,或者想和全世 界的 Tesseract 愛好者分享自己對一種新字體的識別成果,推薦閱讀 Tesseract 的文檔:https://github.com/tesseract-ocr/tesseract/wiki国葬,加油贤徒!