Pnig0s1992:最近作驗證碼識別的技術調查,看了幾篇不錯的文章。javascript
1、驗證碼的基本知識
1. 驗證碼的主要目的是強制人機交互來抵禦機器自動化***的。
2. 大部分的驗證碼設計者並不得要領,不瞭解圖像處理,機器視覺,模式識別,人工智能的基本概念。
3. 利用驗證碼,能夠發財,固然要犯罪:好比招商銀行密碼只有6位,驗證碼形同虛設,計算機很快就能破解一個有錢的帳戶,不少賬戶是能夠網上交易的。
4. 也有設計的比較好的,好比Yahoo,Google,Microsoft等。而國內Tencent的中文驗證碼雖然難,但算不上好。
2、人工智能,模式識別,機器視覺,圖像處理的基本知識
1)主要流程:
好比咱們要從一副圖片中,識別出驗證碼;好比咱們要從一副圖片中,檢測並識別出一張人臉。 大概有哪些步驟呢?
1.圖像採集:驗證碼呢,就直接經過HTTP抓HTML,而後分析出圖片的url,而後下載保存就能夠了。 若是是人臉檢測識別,通常要經過視屏採集設備,採集回來,經過A/D轉操做,存爲數字圖片或者視頻頻。
2.預處理:檢測是正確的圖像格式,轉換到合適的格式,壓縮,剪切出ROI,去除噪音,灰度化,轉換色彩空間這些。
3.檢測:車牌檢測識別系統要先找到車牌的大概位置,人臉檢測系統要找出圖片中全部的人臉(包括疑似人臉);驗證碼識別呢,主要是找出文字所在的主要區域。
4.前處理:人臉檢測和識別,會對人臉在識別前做一些校訂,好比面內面外的旋轉,扭曲等。我這裏的驗證碼識別,「通常」要作文字的切割
5.訓練:經過各類模式識別,機器學習算法,來挑選和訓練合適數量的訓練集。不是訓練的樣本越多越好。過學習,泛化能力差的問題可能在這裏出現。這一步不是必須的,有些識別算法是不須要訓練的。
6.識別:輸入待識別的處理後的圖片,轉換成分類器須要的輸入格式,而後經過輸出的類和置信度,來判斷大概多是哪一個字母。識別本質上就是分類。
2)關鍵概念:
圖像處理:通常指針對數字圖像的某種數學處理。好比投影,鈍化,銳化,細化,邊緣檢測,二值化,壓縮,各類數據變換等等。
1.二值化:通常圖片都是彩色的,按照逼真程度,可能不少級別。爲了下降計算複雜度,方便後續的處理,若是在不損失關鍵信息的狀況下,能將圖片處理成黑白兩種顏色,那就最好不過了。
2.細化:找出圖像的骨架,圖像線條多是很寬的,經過細化將寬度將爲1,某些地方可能大於1。不一樣的細化算法,可能有不一樣的差別,好比是否更靠近線條中間,好比是否保持聯通行等。
3.邊緣檢測:主要是理解邊緣的概念。邊緣其實是圖像中圖像像素屬性變化劇烈的地方。可能經過一個固定的門限值來判斷,也多是自適應的。門限多是圖像全局的,也多是局部的。不能說那個就必定好,不過大部分時候,自適應的局部的門限可能要好點。被分析的,多是顏色,也多是灰度圖像的灰度。
機器視覺:利用計算機來模式實現人的視覺。 好比物體檢測,定位,識別。按照對圖像理解的層次的差異,分高階和低階的理解。
模式識別:對事物或者現象的某種表示方式(數值,文字,咱們這裏主要想說的是數值),經過一些處理和分析,來描述,歸類,理解,解釋這些事物,現象及其某種抽象。
人工智能:這種概念比較寬,上面這些都屬於人工智能這個大的方向。簡單點不要過度學院派的理解就是,把人類的很「智能」的東西給模擬出來協助生物的人來處理問題,特別是在計算機裏面。java
3、常見的驗證碼的破解分析
以http://libcaca.zoy.org/wiki/PWNtcha這裏PWNtcha項目中的資料爲例分析,各類驗證碼的破解。(方法不少,僅僅從我我的乍看之下以爲可行的方法來分析)
1)Authp_w_picpath
使用的反破解技巧:
1.不連續的點組成字符
2.有必定程度的傾斜
設計很差的地方:
1.經過縱橫的直方圖投影,能夠找到字幕區域
2.經過Hough變換,適當的參數,能夠找到近似的橫線,能夠作傾斜矯正
3.字符串的傾斜式面內的,沒有太多的破解難度
4.字母寬度必定,大小必定
2)Clubic
使用的反破解技巧:
1.字符是手寫體
設計很差的地方:
1.檢測切割階段沒有任何技術含量,屬於設計的比較醜的
2.只有數字,並且手寫體變化不大
3.表面看起來對識別階段有難度,仔細分析,發現幾乎不用任何高級的訓練識別算法,就
固定的招某些像素點是否有色彩就夠了
3)linuxfr.org
使用的反破解技巧:
1.背景顏色塊
2.前景的橫線或矩形
設計很差的地方:
1.背景色是單一色塊,有形狀,經過Region-Growth區域增加來很容易把背景給去掉
2.前景色是標準的線條,色彩單一
3.字母無粘連
4.都是印刷體
4)Ourcolony
使用的反破解技巧:
1.設計的過低級,不屑於去評價
設計很差的地方:
1.這種驗證碼,設計的最醜,但仍是能把菜鳥搞定,畢竟學計算機的少,搞這個破解的更少,正所謂隔行如隔山
5)LiveJournal
使用的反破解技巧:
1.這個設計略微好點,使用個隨機噪音,並且做爲前景
2.字母位置粗細都有變化
設計很差的地方:
1.字母沒有粘連
2.噪音類型單一
3.經過在X軸的直方圖投影,能準確分割字幕
4.而後在Y周做直方圖投影,能準肯定位高度
5.識別階段,都是印刷體,簡單地很linux
4、網上的一些高級驗證碼
1)ICQ
2)IMDb
3)MS MVPS
4)MVN Forum
這些類型是被不少人認爲比較可貴類型,分析一下能夠發現,字符檢測,定位和分割都不難。 惟一影響識別率的是IMDBb和MVPS這兩類,字體變形略大。
整體來講,這些類型的破解也不難,很容易作到50%以上的識別率。
5、高級驗證碼的破解分析
時間關係,我簡單介紹如何利用圖像處理和模式識別技術,自動識別比較高級的驗證碼。
(以風頭正勁的Google爲例)
1)至少從目前的AI的發展程度看,沒有簡單的作法能自動處理各類不一樣的驗證碼,即便能力很強,那麼系統天然也十分複雜強大。因此,要想在很簡單的算法實現比較高級的驗證碼破解,必須分析不一樣驗證碼算法的特色:
做爲通常的圖像處理和計算機視覺,會考慮色彩,紋理,形狀等直接的特徵,同時也考慮直方圖,灰度等統計特徵,還考慮FFT,Wavelet等各類變換後的特徵。但最終目標都是Dimension Reduction(降維)而後利於識別,不只僅是速度的考慮。從圖像的角度看,不少系統都考慮轉換爲灰度級甚者黑白圖片。
Google的圖片能夠看出,顏色變化是虛晃一槍,不存在任何處理難度。難度是字體變形和字符粘連。
若是能成功的分割字符,那麼後期識別不管是用SVM等分類算法,仍是分析筆順比劃走向來硬識別,都相對好作。
2)圖像處理和粘連分割
代碼中的part1目錄主要完成圖像預處理和粘連字符分割
001:將圖像從jpg等格式轉換爲位圖便於處理
002:採用Fix/Adaptive的Threshold門限算法,將圖片Bin-Value二值化。(可用003算法)
003:採用OSTU分水嶺算法,將圖片Bin-Value二值化。(更通用,大部分時候效果更好)
005:獲取ROI感興趣的區域。
006:Edge Trace邊緣跟蹤。
007:Edge Detection邊界檢測。
008:Thin細化去骨架。
009:作了一些Tidy整理。(這個通常要根據特定的Captcha算法調整)
010:作切割,注意圖片中紅色的交叉點。
011:將邊緣檢測和骨幹交叉點監測的圖像合併。(合併過程能夠作分析: 好比X座標偏移門限分析,交叉點區域紋理分析,線條走勢分析,等等各類方法,找出更可能的切分點和分離後部件的組合管理。)
注:在這裏,咱們能夠看到,基本的部件(字母是分割開了,但能夠形成統一字母的被切割成多個Component。 一種作法是:利用先驗知識,作分割; 另一種作法是,和第二部分的識別結合起來。 好比按照從左至右,嘗試增長component來識別,若是不能識別並且component的總寬度,總面積還比較小,繼續增長。 固然不排除拒識的可能性。)
3)字符部件組合和識別。
part2的代碼展現了切割後的字母組合,和基於svm的字符識別的訓練和識別過程。
Detection.cpp中展現了ImageSpam檢測過程當中的一些字符分割和組合,layout的分析和利用的簡單技術。 而Google的驗證碼的識別,徹底能夠不用到,僅作參考。
SVM及使用:
本質上,SVM是一個分類器,原始的SVM是一個兩類分類的分類器。能夠經過1:1或者1:n的方式來組合成一個多類分類的分類器。 天生經過核函數的使用支持高維數據的分類。從幾何意義上講,就是找到最能表示類別特徵的那些向量(支持向量SV),而後找到一條線,能最大化分類的Margin。
libSVM是一個不錯的實現。
訓練間斷和識別階段的數據整理和歸一化是同樣的。這裏的簡單作法是:
首先:
#define SVM_MAX +0.999
#define SVM_MIN +0.001
其次:
掃描黑白待識別字幕圖片的每一個像素,若是爲0(黑色,是字母上的像素),那麼svm中該位置就SVM_MAX,反之則反。
最後:
訓練階段,在svm的input的前面,爲該類打上標記,便是那一個字母。
識別階段,固然這個類別標記是SVM分類出來。
注意:
若是是SVM菜鳥,最好找一個在SVM外邊作了包裝的工具,好比樣本選擇,交叉驗證,核函數選擇這些,讓程序自動選擇和分析。
6、對驗證碼設計的一些建議
1.在噪音等類型的使用上,盡力讓字符和用來混淆的前景和背景不容易區分。盡力讓壞人(噪音)長得和好人(字母)同樣。
2.特別好的驗證碼的設計,要盡力發揮人類擅長而AI算法不擅長的。 好比粘連字符的分割和手寫體(經過印刷體作特別的變形也能夠)。 而不要一味的去加一些看起來比較複雜的噪音或者其餘的花哨的東西。即便你作的足夠複雜,但若是人也難識別,顯然別人認爲你是沒事找抽型的。
3. 從專業的機器視覺的角度說,驗證碼的設計,必定要讓破解者在識別階段,反覆在低階視覺和高階視覺之間多反覆幾回才能識別出來。 這樣能夠大大下降破解難度和破解的準確率。
7、鄭重申明
1.這個問題,自己是人工智能,計算機視覺,模式識別領域的一個難題。做爲破解者來講,是出於劣勢地位。要作的很好,是很可貴。整體來講,我走的是比較學院派的線路,能真正的破解難度比較高的驗證碼,不一樣於網上不少不太入流的破解方法。我能作的只有利用有限的知識,拋磚引玉而已。不少OCR的技術,特別是離線手寫體中文等文字識別的技術,我的瞭解有限的很,都不敢在這裏亂寫。web