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