研究了2天的驗證碼識別,雖然沒有成功,但是從中還是收獲了不少,這里記錄一下,方便以后繼續。
首先看圖片:
我就是被這種“簡單”的驗證碼給欺騙了,沒有干擾,不用去噪點,看起來一切是那么的容易,三下五除二的批量下載了驗證碼,然后將圖片切割開,就准備開始進行特征提取、訓練及識別了。
最開始采用的方式是直線碰撞法,即隨機在圖片上生成若干直線,計算直線與字符的碰撞數量,以這個碰撞數量作為特征值,然后才用ANN神經網絡進行訓練和識別,最終的結果是,90%的字符被識別為了f(這個驗證碼的f變形太厲害了)。
第二種方式是將每個字符的圖片二值化后,計算在垂直和水平線上的像素累計值,形成特征碼,然后分別采用了LD(編輯距離),SVM進行訓練和識別,結果同樣識別率不高,試過了30多張驗證碼,只成功完全識別出一張(不過數字的識別率很高)。
第三種方式就是采用了Google的TesseractOCR,不過他在切割字符生成box的時候,問題比較大,基本都需要手動去調整每個字符的位置,所以,我寫了個程序自動去生成box文件,字符定位的准確率能達到100%。box生成以后,便開始進行訓練,采用的3.02版本,一路順暢,然后進行了識別,結果慘不忍睹。
后來仔細思考了下,問題應該不在訓練和識別算法上,常用的驗證碼識別算法不外乎就ANN,SVM,各種距離算法,這三種我都分別用過了,所以,我開始在特征碼上找問題。
前面提取特征碼分別用了直線碰撞法,像素累計值,二值序列,效果都不太理想,於是,想從圖片本身的一些特征下手,第一個想到的是采用霍夫變換計算直線,用這個做為特征碼,然后分別采用上面三種識別算法進行訓練和識別,但是最后,都是以失敗告終。第二個是計算字符的HU不變距(這個還專門自己做了一系列的圖片來做測試,測試的效果都比較好,無論如何移動旋轉或縮放,都有較好的識別率),通過這個不變距來進行相似度匹配,效果也是相當不理想。
其實,這個驗證碼識別率低的原因估計在於他的字符是無規律的隨機變形(而不是單純的旋轉或者縮放),這種字符比較難以識別,所以,以后在做網站生成驗證碼的時候,如何來構建一個比較安全的驗證碼,就有一定經驗了。