楊 航,蔡 浩
(汕頭大學(xué)工學(xué)院,廣東 汕頭 515063)
驗(yàn)證碼測(cè)試是一種為了區(qū)分人類和機(jī)器的測(cè)試.一般是人類可以測(cè)試通過,但是機(jī)器不能測(cè)試通過的,這樣就達(dá)到了圖靈測(cè)試的目的.因而,驗(yàn)證碼測(cè)試被廣泛應(yīng)用于網(wǎng)絡(luò)安全中,例如:賬號(hào)注冊(cè),賬號(hào)登陸等.最開始提到有關(guān)“機(jī)器圖靈測(cè)試”的問題出現(xiàn)在Moni Naor[1]的一篇論文中.而第一個(gè)自動(dòng)圖靈測(cè)試系統(tǒng)是由Altavista[2]開發(fā)的,是為了阻止機(jī)器人自動(dòng)識(shí)別注冊(cè)網(wǎng)頁.而最近兩年基于人工智能的分類算法是學(xué)術(shù)上研究的熱點(diǎn),在這種前提和背景下,本文研究了基于OCR的中文驗(yàn)證碼識(shí)別方法、模板匹配法、基于卷積神經(jīng)網(wǎng)絡(luò)的分類算法以及相關(guān)改進(jìn)方法在中文驗(yàn)證碼識(shí)別上的表現(xiàn),來探究這幾種方法在識(shí)別精度,樣本需求量,識(shí)別時(shí)長(zhǎng)上的表現(xiàn),并著重對(duì)基于卷積神經(jīng)網(wǎng)絡(luò)的方法進(jìn)行了改進(jìn),最后對(duì)三者的適用性做了簡(jiǎn)單的總結(jié).
目前利用已有中文字符OCR對(duì)中文字符的識(shí)別成功率不到10%(從文獻(xiàn)[3]中可以知道),文章新加了兩種方法對(duì)中文圖片驗(yàn)證碼進(jìn)行了識(shí)別研究.對(duì)比研究這三種驗(yàn)證碼識(shí)別技術(shù),結(jié)合驗(yàn)證碼的特點(diǎn),進(jìn)而探究這類驗(yàn)證碼中存在的安全隱患,從而構(gòu)建更加安全的防護(hù)機(jī)制.只有深入了解機(jī)器識(shí)別驗(yàn)證碼的機(jī)制,我們才能組合出更不利于機(jī)器識(shí)別的驗(yàn)證模式,從而使驗(yàn)證碼這種機(jī)制更加安全.
字符型驗(yàn)證碼的識(shí)別可分為基于分割的識(shí)別和不基于分割的識(shí)別.不基于分割的方法有,尹龍等[4]用到一種基于密集尺度不變特征變換(DENSE SIFT)和隨機(jī)抽樣一致性算法(RANSAC)的識(shí)別方法,該方法的普適性較好,但算法設(shè)計(jì)較為復(fù)雜.基于分割的方法,一般分割之后再用機(jī)器學(xué)習(xí)的方法進(jìn)行分類,殷光等[5]采用基于SVM分類器的識(shí)別方法,王璐[6]采用了分割后基于卷積神經(jīng)網(wǎng)絡(luò)的方法,張亮等[7]采用了LSTM型RNN的方法,都取得了不錯(cuò)的識(shí)別效果.當(dāng)然這些方法都是針對(duì)阿拉伯?dāng)?shù)字和英文字母,和中文比較起來,中文具有字型更復(fù)雜,符號(hào)數(shù)量更多的特點(diǎn).目前還沒有文獻(xiàn)介紹用卷積神經(jīng)網(wǎng)絡(luò)識(shí)別中文字符驗(yàn)證碼的.本文提出了基于點(diǎn)矩陣的模板匹配法和基于卷積神經(jīng)網(wǎng)絡(luò)的識(shí)別方法對(duì)該問題進(jìn)行實(shí)驗(yàn)研究.基于點(diǎn)矩陣的模板匹配法是比較尋找所要識(shí)別圖片與事先建好字庫中圖片相似度最大的圖片,這里的相似度可以采用點(diǎn)矩陣重合率和點(diǎn)矩陣余弦相似度,最后判定相似度最大的字符值為所要識(shí)別字符的值.基于卷積神經(jīng)網(wǎng)絡(luò)的方法則采用了現(xiàn)在在圖像分類問題上處理比較常用的方法,先進(jìn)行人工標(biāo)記樣本圖片,然后將圖片分為訓(xùn)練集和測(cè)試集,再建立神經(jīng)網(wǎng)絡(luò)模型,讓模型在訓(xùn)練集上訓(xùn)練,不斷調(diào)整模型參數(shù),最后讓訓(xùn)練好的模型在測(cè)試集上測(cè)試得到模型表現(xiàn)結(jié)果.本文選用一類代表性比較強(qiáng)的中文驗(yàn)證碼作為實(shí)驗(yàn)對(duì)象,驗(yàn)證碼中字符有平移,旋轉(zhuǎn),并且有大量的噪點(diǎn)和干擾線.本文是基于先分割再識(shí)別的思路去研究中文驗(yàn)證碼識(shí)別問題的,選用了基于OCR的識(shí)別方法和基于卷積神經(jīng)網(wǎng)絡(luò)的識(shí)別方法,以及基于點(diǎn)矩陣的模板匹配法,并對(duì)所研究方法進(jìn)行改進(jìn)和實(shí)驗(yàn)對(duì)比.
下面介紹的是實(shí)驗(yàn)的具體操作步驟,首先介紹兩種方法的公共部分,即圖片的預(yù)處理部分,分為圖片的灰度化,圖片的二值化,圖片去噪,圖片切塊,圖片的人工分類標(biāo)記.
樣本選用的是某個(gè)具有一定代表性的公開網(wǎng)站,我們提前下載好一批驗(yàn)證碼圖片,這里的樣本圖片如圖1所示.
圖1 原始未處理圖
可以看出圖片中的漢字的位置變化很大,噪點(diǎn)和干擾線較多,字符之間存在不同程度的粘連.
3.1.1 灰度化與二值化
灰度化是去掉圖片中與字符無關(guān)的色彩信息,簡(jiǎn)化計(jì)算,更有利于識(shí)別圖片中的字符.這是適用于字符類驗(yàn)證碼識(shí)別的預(yù)處理.具體可采用平均值法或者參考文獻(xiàn)[8]中的自適應(yīng)算法.為了之后的問題處理方便,要把圖像二值化成黑白圖像,即去掉中間的灰度.在處理像素點(diǎn)時(shí),用0表示白色像素,用1表示黑色像素.二值化圖像的方法有很多,有固定閾值二值化法和自適應(yīng)閾值二值化法.自適應(yīng)閾值二值化需要統(tǒng)計(jì)整幅圖像像素特征,自動(dòng)計(jì)算出閾值,然后根據(jù)該閾值進(jìn)行二值化.確定好閾值后,二者的后續(xù)操作是一樣的.如果用threshold表示閾值,則偽代碼如下(其中color表示當(dāng)前像素點(diǎn)的像素值):
3.1.2 去噪
一般采用中值濾波或均值濾波的方法去除圖像中的噪音,本文圖片分類對(duì)去噪能力依賴性不大,故采用相鄰點(diǎn)數(shù)的閾值去噪方法,具體步驟:設(shè)定閾值,統(tǒng)計(jì)相鄰點(diǎn)為黑色的數(shù)值,如果統(tǒng)計(jì)的黑色點(diǎn)個(gè)數(shù)小于閾值,則判定該點(diǎn)為噪點(diǎn),去除該點(diǎn),否則保留.算法的偽代碼如下(其中threshold為設(shè)定的閾值,number表示統(tǒng)計(jì)相鄰點(diǎn)為黑色的數(shù)值):
3.1.3 切塊
這里為了獲得更好的切塊效果也可以用文獻(xiàn)[9]中提出的基于結(jié)構(gòu)特征點(diǎn)的字符切割方法,切割準(zhǔn)確度要比投影分析方法、連通域提取方法、傳統(tǒng)滴水方法、骨架形態(tài)分析方法等要好.
3.1.4 分類貼標(biāo)簽及預(yù)處理效果
經(jīng)過以上幾個(gè)步驟操作之后,最后的效果圖如圖2,可以看到獲得的預(yù)處理效果還是相當(dāng)不錯(cuò)的,雖然字體有些歪斜,噪聲也并不是完全清楚干凈,但是肉眼可以明顯辨認(rèn)出圖2中字符所代表的中文字,這就有了后續(xù)識(shí)別的基礎(chǔ).
圖2 預(yù)處理后效果圖
3.2.1 相似度模板匹配方法
3.2.1.1 人工建立模板庫 對(duì)每個(gè)字符隨機(jī)挑選出50-100張切割好的圖片作為特定字符的模板庫,每個(gè)模板庫中模板的數(shù)量保持一致.原因有兩點(diǎn),一個(gè)是為了程序編寫方便,一個(gè)是為了匹配時(shí)不會(huì)產(chǎn)生計(jì)算偏倚,即不會(huì)偏重匹配成功某個(gè)模板較多的字符.
3.2.1.2 圖片模板庫轉(zhuǎn)文本模板庫壓縮存儲(chǔ) 可以利用將圖片信息轉(zhuǎn)化為文本信息來完成壓縮存儲(chǔ),這樣就可以減少計(jì)算機(jī)打開圖片解碼圖片等步驟,而且可以減小模板庫的存儲(chǔ)空間,使用起來更便利.
3.2.1.3 效果展示 最后統(tǒng)計(jì)圖片中總的點(diǎn)數(shù),統(tǒng)計(jì)重合點(diǎn)數(shù),則最后的相似率計(jì)算可以用重合點(diǎn)數(shù)比上總過的點(diǎn)數(shù),pic對(duì)應(yīng)的識(shí)別標(biāo)簽值.最后的效果展示圖如圖3所示.
圖3 識(shí)別效果展示圖
3.2.1.4 其他注意事項(xiàng)及技巧 可以看到圖1原始未處理圖中,字符是有旋轉(zhuǎn)的,有粘連,并且有噪點(diǎn)和干擾線,對(duì)于特定的一類驗(yàn)證碼我們需要人為的建立一類對(duì)應(yīng)的模板庫,這樣的識(shí)別才會(huì)更精準(zhǔn).可以看到初始圖片集中,是有成語類的驗(yàn)證碼的,而計(jì)算類驗(yàn)證碼字符是只有十三個(gè)的,所以如果能區(qū)分成語類和計(jì)算類,然后再進(jìn)行識(shí)別的話,所需要的模板字符就變少了.因?yàn)橛?jì)算類的圖片中,會(huì)出現(xiàn)“等于”字樣,我們可以建立一個(gè)“于”字庫,用于對(duì)比切割之后原始圖片中的最后一個(gè)字符來確定當(dāng)前驗(yàn)證碼的類別,這個(gè)技巧可以發(fā)散,對(duì)于特定一類驗(yàn)證碼,利用其本身的特點(diǎn)來驗(yàn)證可以事半功倍.如果一類驗(yàn)證碼中沒有明顯區(qū)分這種類別時(shí),則需要建立更多字符的模板庫.
3.2.1.5 模板匹配法優(yōu)缺點(diǎn) 簡(jiǎn)單總結(jié)一下,模板匹配法操作簡(jiǎn)單,容易實(shí)現(xiàn),所需樣本少,但是其識(shí)別精度還不夠高,當(dāng)識(shí)別字符較多時(shí),需要建立更多字符的模板庫,匹配計(jì)算量會(huì)變得很大,識(shí)別時(shí)間會(huì)很長(zhǎng).
3.2.2 基于卷積神經(jīng)網(wǎng)絡(luò)的識(shí)別
原始的模型參考LeNet-5[10]的結(jié)構(gòu)搭建卷積神經(jīng)網(wǎng)絡(luò),本文采用的網(wǎng)絡(luò)結(jié)構(gòu)一共有6層,第一層和第三層是卷積層,卷積核均為5×5的,第二層和第四層是池化層,但是第二層步長(zhǎng)設(shè)置為2,而第四層設(shè)置的是1,第五層和第六層為全連接層,連接數(shù)為512,輸入和輸出在模型的兩端,輸入為25×25的圖片,顏色通道數(shù)為3,最后的輸出為13類中的一類,模型示意圖如圖4所示:
圖4 卷積網(wǎng)絡(luò)模型示意圖
3.2.3 基于卷積神經(jīng)網(wǎng)絡(luò)識(shí)別方法的改進(jìn)
改進(jìn)1:加入圖片增強(qiáng)技術(shù).文獻(xiàn)[11]中進(jìn)行圖片編碼處理時(shí),對(duì)圖像進(jìn)行了大小調(diào)整、裁剪、翻轉(zhuǎn)等處理,這樣訓(xùn)練出的神經(jīng)網(wǎng)絡(luò)模型實(shí)用性更好.類似的,我們可以將這種思想運(yùn)用到中文驗(yàn)證碼識(shí)別問題中.對(duì)于該問題驗(yàn)證碼獲取成本較高,并且網(wǎng)站經(jīng)常禁止訪問,所以不可能獲得太大數(shù)量的原始樣本.為了獲得更多有效的樣本,對(duì)切割好的圖片,可以采用人工制造噪點(diǎn)干擾線,圖片適當(dāng)旋轉(zhuǎn)平移等方式,來增強(qiáng)圖片的表示,并獲得更多有效的樣本.
改進(jìn) 2:模型改進(jìn).在模型中引入 ReLU激活層[12]、Dropout層[13]以及 Batch Normalization層[14].ReLU激活層是一個(gè)非線性的激活層,可以更好的模擬神經(jīng)網(wǎng)絡(luò)的作用,實(shí)踐證明其表現(xiàn)是優(yōu)于Sigmoid線性激活層的.在池化層的后面添加Dropout層來防止過擬合,其主要工作原理是按照一定的概率將神經(jīng)網(wǎng)絡(luò)單元從網(wǎng)絡(luò)中丟棄.文獻(xiàn)[14]對(duì)Dropout層的作用有詳細(xì)的解釋.引入Batch Normalization的目的是,讓訓(xùn)練的過程更快,精準(zhǔn)度更高.基本原理是在每次SGD時(shí),通過mini-batch來對(duì)相應(yīng)的activation做規(guī)范操作,使得輸出信號(hào)各個(gè)維度的均值為0,方差為1.最后使用了scale and shift操作,保證了模型的容納能力.
改進(jìn)3:用模板匹配法粗分字符集.我們可以先建立極小數(shù)量的字符模板庫,然后利用建好的模板庫,對(duì)未處理的收集樣本進(jìn)行切割粗分,減少人工操作,當(dāng)然最后需要人工檢查是否分割正確,這樣可以大大降低人工干預(yù)和工作量.
4.1.1 硬件描述
處理器:Intel(R)Core(TM)i7-6700HQ CPU@2.60GHZ 2.60GHZ
內(nèi)存(RAM):8.00GB
系統(tǒng)類型:64位操作系統(tǒng)(WIN10),基于x64的處理器
4.1.2 軟件描述
編程語言為python(3.5.2版),安裝包主要有numpy(1.13.3版),Pillow(4.2.1版),Keras(2.0.8版),tensorflow(1.4.0版),pyocr(0.4.7版).算法的實(shí)現(xiàn)主要是基于google的tensorflow深度學(xué)習(xí)開源框架.
4.1.3 實(shí)驗(yàn)數(shù)據(jù)量描述
實(shí)驗(yàn)分類字符為13類,3種方法的數(shù)據(jù)量是不同的,這主要受限于當(dāng)前方法本身,中文模板匹配法總的圖片數(shù)據(jù)1 300張,每一類100張;未改進(jìn)的卷積神經(jīng)網(wǎng)絡(luò)方法總的數(shù)據(jù)量為26 000張,每一類2 000張;改進(jìn)的卷積神經(jīng)網(wǎng)絡(luò)方法總的數(shù)據(jù)量為3 900張,每一類300張.3種方法最后測(cè)試的數(shù)據(jù)圖片量為1 000張.
我們?cè)O(shè)定幾個(gè)指標(biāo)來比較衡量這些方法.設(shè)定指標(biāo)如下:
識(shí)別精度:即識(shí)別正確率(在測(cè)試集上的).
樣本需求量:方法對(duì)樣本數(shù)量多少的依賴.
識(shí)別時(shí)長(zhǎng):識(shí)別程序開發(fā)好后,識(shí)別一張圖片所用時(shí)間.
這些方法的指標(biāo)對(duì)比見表1.
表1 3種方法對(duì)比結(jié)果
經(jīng)過實(shí)踐證明,基于OCR的方法對(duì)于此類中文驗(yàn)證碼的識(shí)別基本無效.通過表1可以看出,從開發(fā)周期和樣本需求量上看,相較于模板匹配法,基于卷積神經(jīng)網(wǎng)絡(luò)的方法需要更多的樣本和時(shí)間去開發(fā).但是識(shí)別效果提升明顯,尤其是改進(jìn)之后的卷積神經(jīng)網(wǎng)絡(luò)方法,不僅樣本需求量更小,識(shí)別精度也有很大提高,優(yōu)于文獻(xiàn)[3-7]中的實(shí)驗(yàn)結(jié)果.從普適性上分析,改進(jìn)后的卷積神經(jīng)網(wǎng)絡(luò)方法更適用于圖像分類問題.
經(jīng)過上面的實(shí)驗(yàn),可以得出如下結(jié)論:
模板匹配法簡(jiǎn)單可行,開發(fā)周期短,所需樣本數(shù)量非常少,但正確率較低,字符較多時(shí),比較的計(jì)算時(shí)間會(huì)很長(zhǎng).相對(duì)的,基于卷積神經(jīng)網(wǎng)絡(luò)的方法則需要更多的樣本和開發(fā)訓(xùn)練時(shí)間,以及模型調(diào)整時(shí)間,但是模型的準(zhǔn)確性很高,而且識(shí)別所需時(shí)間更短,速度很快.二者各有所長(zhǎng),模板匹配簡(jiǎn)單易行,而卷積神經(jīng)網(wǎng)絡(luò)分類準(zhǔn)確率高.經(jīng)過改進(jìn)之后的卷積神經(jīng)網(wǎng)絡(luò)方法則表現(xiàn)出了更好的普適性和更優(yōu)越的性能.
中文圖片驗(yàn)證碼問題的研究能給防止機(jī)器識(shí)別的研究啟示,例如可以研究如何改變驗(yàn)證碼生成策略和驗(yàn)證策略來提高驗(yàn)證碼的安全性.再一個(gè)衍生的研究課題是,如何利用現(xiàn)有的卷積神經(jīng)網(wǎng)絡(luò),以及深度學(xué)習(xí)網(wǎng)絡(luò)來提升OCR中文識(shí)別技術(shù).
通過實(shí)驗(yàn)對(duì)比研究了文中提到的幾種方法在中文驗(yàn)證碼識(shí)別上的表現(xiàn),并進(jìn)行相應(yīng)的改進(jìn)與提升.最后改進(jìn)的卷積神經(jīng)網(wǎng)絡(luò)獲得了99.8%的識(shí)別精度,并且對(duì)樣本的依賴性降低,模型更適用于中文字符的識(shí)別.現(xiàn)實(shí)生活中我們經(jīng)常會(huì)遇到類似的圖像分類問題,而且很多時(shí)候無法在短時(shí)間里得到一個(gè)很好的模型,我們可以先從簡(jiǎn)單的模型出發(fā),后期再對(duì)模型進(jìn)行調(diào)整和優(yōu)化.對(duì)于圖片分類問題,卷積神經(jīng)網(wǎng)絡(luò)表現(xiàn)出的優(yōu)越性很明顯,并且相當(dāng)適用,是處理這類問題一個(gè)不錯(cuò)的選擇.