摘要:神經網絡以上驗證碼識別都依賴于字符切分,切分的好壞幾乎直接決定識別的準確程度。目前驗證碼識別最先進的是谷歌在識別街景圖像中門牌號碼中使用的一套的算法。
最近在一個爬蟲項目中遇到了驗證碼,需要機器自動識別繞過。剛好與題主的問題類似,在這里做一些分享。
在網上調研了資料和文獻后,分別采用OCR識別和模板庫匹配方法對不同類型驗證碼進行了識別。主要過程可以分解為三個步驟:1.圖片清理,2.字符切分,3.字符識別。以下結合工作經驗和調研內容講解一些常用的驗證碼識別方法和過程。
1.圖片清理
圖片清理是為接下來的機器學習或模板匹配階段做準備的,指通過灰度化、二值化、干擾點清理等過程,得到比較干凈的圖片數據,具體樣例見下表。
1.1 彩色去噪
在計算機中使用最多的 RGB色彩空間,分別對應紅、綠、藍三種顏色,通過調配三個分量的比例來組成各種顏色。以最常見的32位顏色為例,一個分量是用8位來表示,最大值是255,灰度圖是指組成顏色的三個分量相等。原始彩色圖片包含的信息量是最大的,如果驗證碼圖片中有一些利用顏色反差加的干擾點或者線條,最好能在該階段做初步清理。比較簡單的一種處理方法是采用33矩陣對圖像進行平滑處理,即對每個像素取他所在33矩陣所有點的RGB均值,分別作為新的RGB值。稍微做點優化,取3*3矩陣中RGB三維歐式距離最接近均值的點作為新值。
1.2 灰度化
在彩色電視機系統中,通常使用一種叫 YUV 的色彩空間,其中Y表示亮度信號,對于人眼來說,亮度信號(Y)是最敏感的,如果將彩色圖像轉換為灰度圖像,僅僅需要轉換并保存亮度信號就可以。從RGB到YUV空間的Y轉換有一個很著名的心理學公式:Y = 0.299R + 0.587G + 0.114B。
而實際應用時,將系數縮放1000倍來實現整數運算:Gray = (R299 + G587 + B114 + 500) / 1000 。注意后面那個除法是整數除法,所以需要加上500來實現四舍五入。該公式的另一個簡化變種也很流行:Gray = (R30 + G59 + B11 + 50) / 100。更快的算法是采用移位代替除法,所以可以將系數縮放成 2的整數冪,再做右移操作。該整數取7從精度和速度上最合適:Gray = (R0.2992^7 + G0.5872^7 + B0.1142^7)>>7 = (R38 + G75 + B*15)>>7
1.3 二值化
為了簡化接下來的計算,需要把灰度圖片轉化成黑白二值圖。默認情況下值大于127的像素點被設置為白色,其余像素點設置為黑色。當然,這個閾值也需要根據圖片的實際情況計算調整。一般采用直方圖統計確定動態閾值的方法比較靠譜,白底黑字的取直方圖靠左邊的波谷位置作為閾值,黑底白字則取直方圖右邊的波谷位置作為閾值,將背景和字符作很好的區分。
以
(圖A),和
(圖B)為例,對應直方圖分別為直方圖A和直方圖B,圖A對應的動態閾值取127,而圖B的動態閾值則取241比較合適。
1.4 底色統一
如果是黑底白字的圖片,需要轉換成白底黑字,如以上圖B。
1.5 干擾點清理
在黑白二值圖片去噪階段,常用的去噪方法為聯通性去噪,通常采用8向聯通來計算連通點個數,若某個點的連通點數目小于預設的閥值,則認為這些點都是噪聲點。這一簡單粗暴的清理方法,通常情況下是非常有效的。
2 字符切分
該階段對前期預處理后的圖片進行切割處理,定位和分離出整幅圖片中的每個孤立的字符主體部分。主要采用X軸和Y軸投影的方法,即統計對應坐標上黑色像素點的個數。對于圖片
得到的X軸和Y軸投影分別如下。利用X軸投影可以切割出多帶帶的字符,再分別利用Y軸投影,裁剪掉頂部和底部的空白部分。
OCR軟件識別
我們使用的是開源的OCR識別引擎Tesseract,初期由HP實驗室研發,后來貢獻給了開源軟件業,后經由Google進行優化并重新發布。調用代碼以及識別效果如下:
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_TESSERACT_ONLY) #初始化
api.SetPageSegMode(tesseract.PSM_SINGLE_LINE) #設置為單行字符串模式
api.SetVariable("tessedit_char_whitelist", whitelist) #設置白名單
stringOCR = tesseract.ProcessPagesBuffer(mBuffer, len(mBuffer), api)
該方法的優點是:開發量少;比較通用,適合于各種變形較少的驗證碼;對于扭曲不嚴重的字母和數字識別率高。缺點也很明顯:對于扭曲的字母和數字識別率大大降低;對于字符間有粘連的驗證碼幾乎難以正確識別;很難針對特定網站的驗證碼做定制開發。
4.模板庫匹配
4.1 建立字符模板庫
首先需要針對目標網站收集大量的驗證碼;然后根據上一章節的方法,進行圖片清理;最后按照固定的長寬值切分出字符模板圖,保存文件名帶上對應字符的標記。
4.2 字符匹配
首先,把目標驗證碼圖片按字符個數切分,這里的圖片切分方法必須與模板制作時的切分方法一致,得到與模板圖同樣大小的字符圖。接下來通常的做法是使用漢明距離或編輯距離定義相似度,并用KNN方法得到K個最相似的字符,最后從K個字符中選取出現次數最多的那個作為匹配結果。參考了文獻[1]中K取值和字符識別率的變化關系(如下圖)。
然后,我們把K取值為5。并且把相似度重新定義為:matchScore = dotMatch^2 / (dotCaptcha * dotTemplate),其中dotMatch為驗證碼字符圖與模板圖對應位置都是黑色點的個數,dotCaptcha為驗證碼字符圖中黑色點個數,而dotTemplate為模板圖中黑色點個數。取這個分母是為了防止某些黑色點較多的模板圖在匹配度計算中始終得到較大值。識別效果如下表:
該方法的優點是:原理簡單直觀;可以針對不同網站定制優化;對于扭曲的字母和數字識別率較高。缺點是:開發量大,需要定制開發;需要收集大量的字符圖片庫;字符變化很多的情況,匹配次數增加速度下降;對于字符有粘連的圖片識別率低;
支持向量機
支持向量機通俗來講是一種二類分類模型,其基本模型定義為特征空間上的間隔最大的線性分類器,其學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。實際應用上,往往遇到的是非線性可分得情況,因此通過核函數把低維向量映射到更高維空間,使得樣本滿足線性可分。
驗證碼識別問題實際上是其中單個字符識別問題,而在字符可窮舉的情況下,比如只有英文字符和數字,單個字符識別問題其實是一個分類問題。一個英文字母或數字表示一類,而驗證碼中切分后得到的單個字符需要被機器自動分到某一類。一般情況下,把單個字符的灰度圖片轉成整形數組,數組的每一個元素表示圖片的一個像素,即一個特征維度。我們切分得到的圖片大小為10x16=160像素,即有160個特征,當特征數量多且特征之間關系不明確時,采用支持向量機分類比較合適。
LIBSVM 是臺灣大學林智仁(Lin Chih-Jen)副教授等開發設計的一個簡單、易于使用和快速有效的SVM模式識別與回歸的軟件包,他不但提供了編譯好的可在Windows系統的執行文件,還提供了源代碼,方便改進、修改以及在其它操作系統上應用。該軟件還有一個特點,就是對SVM所涉及的參數調節相對比較少,提供了很多的默認參數,利用這些默認參數就可以解決很多問題;并且提供了交互檢驗(Cross Validation)的功能。主要參數使用:多類別(C-SVC=0),radial basis function(kernel_type=2),訓練和預測代碼如下。對于 這樣輕微變形的驗證碼,有字母和數字共36個類別,收集訓練樣本共778個字符圖的情況下,單字符預測準確率接近100%:
該方法的優點是:無需設計快速的圖像匹配算法;只要圖片切分方法合適,對于扭曲傾斜的字母和數字識別率也較高;并且可以針對不同類型的驗證碼做定制優化。缺點是:支持向量機原理比較復雜,無法直觀解釋,需要了解支持向量機等機器學習方法。
神經網絡
以上驗證碼識別都依賴于字符切分,切分的好壞幾乎直接決定識別的準確程度。而對于有字符粘連的圖片,往往識別率就會低很多。目前驗證碼識別最先進的是谷歌在識別“街景”圖像中門牌號碼中使用的一套的算法。該算法將定位、分割和識別等幾個步驟統一起來,采用一種“深度卷積神經網絡”(deep convolutional neural network)方法進行識別,準確率可以達到99%以上。谷歌拿自有的reCAPTCHA驗證碼做了測試,結果發現,對于難度最大的reCAPTCHA驗證碼,新算法的準確率都達到 99.8%,這可能也好于大多數人為驗證。
驗證碼作為一種輔助安全手段在Web安全中有著特殊的地位,了解驗證碼識別的方法和原理,不僅有利于繞過驗證碼抓取網站內容,而且有利于設計更安全合理的驗證碼。
點擊可免費試用網易云安全(易盾)驗證碼
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25434.html
摘要:為了方便廣大的開發者,特此統計了網上諸多的免費,為您收集免費的接口服務,做一個的搬運工,以后會每月定時更新新的接口。將長段中文切詞分開。 為了方便廣大的開發者,特此統計了網上諸多的免費API,為您收集免費的接口服務,做一個api的搬運工,以后會每月定時更新新的接口。有些接口來自第三方,在第三方注冊就可以成為他們的會員,免費使用他們的部分接口。 百度AccessToken:針對HTTP ...
閱讀 1198·2021-11-10 11:35
閱讀 2925·2021-09-24 10:35
閱讀 2957·2021-09-22 15:38
閱讀 2807·2019-08-30 15:43
閱讀 1338·2019-08-29 18:39
閱讀 2557·2019-08-29 15:22
閱讀 2788·2019-08-28 18:17
閱讀 611·2019-08-26 13:37