崔 新,白培瑞,張 策,劉慶一,傅穎霞2,劉嘉程,祝璐璐
(1.山東科技大學 電子信息工程學院,山東 青島 266590;2.山東科技大學 礦業與安全工程學院,山東 青島 266590)
互聯網技術的高速發展給人們帶來生活便利的同時,隨之而來的網絡安全問題也日益突出。網絡資源濫用、網絡信息竊取等惡意行為已引起廣泛關注。驗證碼識別是維護網絡安全和防止計算機程序惡意攻擊的一種有效機制和方法,在各大網站中已得到廣泛應用[1]。搜狐、愛奇藝、Facebook等網站使用的是具有噪聲干擾和獨立字符的驗證碼;百度、谷歌、新浪等網站使用的是具有扭曲和粘連字符的驗證碼,該類驗證碼主要由數字和字母隨機構成。而且,為了提高防偽能力,開始采用相互連接且扭曲的字符驗證碼。
傳統的驗證碼識別方法主要分為三個步驟:圖像預處理、字符分割和字符識別[2]。其中,字符分割是直接影響識別效果的關鍵因素。對于只包含字符的驗證碼圖像,一般采用先逐個分離字符,然后利用機器學習方法如k-最近鄰算法[3]或卷積神經網絡對子圖像進行正確分類。但是,傳統驗證碼識別方法對不同類型的驗證碼泛化能力和魯棒性較差。
針對復雜類型驗證碼分割的困難性,國內外學者已提出很多解決方案。李興國等[4]針對存在字符粘連的驗證碼提出一種將滴水算法與積分投影相結合的分割方法,對于驗證碼中存在部分粘連的字符具有較好的分割適應能力。尹龍等[5]對于扭曲粘連類型字符驗證碼的識別問題,提出基于DENSESIFT和RANSAC算法以及基于馬爾科夫隨機場算法,兩種算法均取得較好的效果。簡獻忠等[6]提出一種基于SOM聚類結合Voronoi骨架形態學分析的粘連字符分割算法,該方法對于傾斜扭曲的驗證碼具有良好的分割效果。Lu 等[7]針對多種類型驗證碼分別提出了不同的字符分割算法,并結合SVM 分類算法及BP 神經網絡進行字符識別。Wang等[8]基于自適應的算法來對驗證碼進行去噪和分割,并采用模板匹配的方法來對分割后的字符進行識別,取得了較好的識別效果。Mori等[9]基于shape context算法識別了EZ-Gimpy驗證碼,識別率為92%。但是,以上算法大多是解決特定類型的驗證碼,一旦驗證碼的樣式發生變化,識別效果往往并不理想,泛化能力不足。
近年來,在語音和圖像識別領域大獲成功的深度學習技術開始被引入驗證碼識別領域[10-12]。其中,卷積神經網絡(convolutional neural network,CNN)是最常見的一種深度學習技術,可以直接從圖像中學習深度特征,避免傳統方法中字符分割損失有用信息的問題[13]。Qing等[14]提出一種多標簽卷積神經網絡識別文本驗證碼且無需分割,對于字符失真和復雜驗證碼取得較好的效果。MATAN等[15]采用空間位移神經網絡(spatial displacement neural network,SDNN)和隱馬爾科夫模型(hidden Markov model,HMM)對帶有粘連的手寫字符進行識別,識別率達到90%。Shi等[16]將CNN與循環神經網絡(recurrent neural network,RNN)相結合,提出一種卷積循環神經網絡(CRNN)實現驗證碼的整體識別。Du等[17]利用Faster R-CNN進行整體識別,對于不定長度序列的驗證碼有較好的識別效果。Lin等[18]利用卷積神經網絡學習驗證碼的筆畫和字符特征,極大提高了具有失真、旋轉和背景噪聲的驗證碼識別準確率。與傳統方法相比,深度神經網絡具有更好的學習能力,能有效提升分類識別效率。然而,大多數端對端識別算法直接采用現有的卷積神經網絡結構,網絡層數較深,訓練參數量大,在有效樣本數量有限的情況下容易出現過擬合和泛化能力不足的現象。
本研究提出一種基于深度卷積神經網絡的端對端驗證碼識別方法。主要創新點:①采用并行級聯卷積層構建Inception模塊進而搭建卷積神經網絡,既增加網絡的寬度又提高網絡對于不同尺度的適應能力,避免產生過多的訓練參數。同時,采用全局平均池化層代替全連接層,可以防止過擬合,提高網絡的學習效率。②整個過程將驗證碼字符圖片直接作為網絡輸入,不進行圖像分割。在網絡訓練過程中主動學習調節參數,可以避免傳統方法中因過多人工干預造成圖像信息被破壞導致的誤差累積問題。
端對端驗證碼識別系統是將驗證碼圖像直接輸入至搭建的網絡模型中,利用網絡的學習能力自動提取驗證碼字符的特征信息進行訓練,產生最優模型參數進行字符識別。與傳統方法流程相比,該流程去除了字符圖像分割環節,可以避免學習過程中誤差累積問題。算法流程圖如圖1所示。

圖1 端對端識別算法的流程圖
1.2.1 驗證碼圖像預處理
圖像預處理是為了去除不利于識別的干擾信息,突出顯示與字符相關的特征信息,從而提高識別正確率。預處理過程主要分為三個環節:灰度化、二值化和圖像去噪。其中,灰度化采用加權平均法。
加權平均法通過對R、G、B三個分量分配不同大小的權值進行加權計算,并將計算結果作為整幅圖像的灰度像素值,公式如下:
f(x,y)=0.3R(x,y)+0.59G(x,y)+0.11B(x,y)。
(1)
二值化過程中,由于驗證碼圖像的目標信息通常位于中間區域,為避免重復計算圖像周圍的空白區域,減少計算復雜度,采用局部最優閾值法進行二值化[19]。其中,局部最優閾值采用Otsu算法計算:
(2)
式中,NA為目標區域的像素點數,N為灰度圖像的像素點總和,μ為整體灰度均值,μA為目標區域的灰度均值。
圖像去噪為可選操作,根據樣本形式和噪聲決定是否采用中值濾波去噪。
1.2.2 網絡架構設計
本研究所提的深度網絡架構是在Google-Net網絡模型的基礎上設計(圖2)[19],其中,實線連接部分為本研究設計的卷積神經網絡結構,虛線連接部分為傳統卷積神經網絡結構。網絡結構上主要做了兩點改進:一是采用由并行級聯卷積組成的Inception模塊代替中間的卷積層和池化層;二是采用全局平均池化層(global average pooling layer,GAP)來替換全連接層。采用Inception模塊雖然加深了網絡深度,但是可以減少網絡訓練參數,提高網絡對多尺度目標的適應能力。全局平均池化層替代全連接層可以提高網絡學習效率。所有Inception模塊中卷積層的輸出引入批量標準化操作(batch normalization),以此歸正每層輸入樣本的分布,可以加快訓練速度,提高泛化能力。各層的參數如表1所示。
Inception模塊的結構由并行級聯的卷積層構建(如圖3所示),該結構便于利用不同大小的卷積核感知不同范圍和尺度的局部特征,然后加以組合,提高網絡的多尺度適應性,在減少訓練權系數數量的同時,提高深度網絡的學習能力。本研究網絡用到4個Inception模塊,且4個Inception模塊的結構都是一致的。
利用全局平均池化層替代全連接層(如圖4所示),可以正則化網絡輸出,防止訓練過程中出現過擬合,提高分類準確性。

圖2 本研究提出的深度網絡結構與傳統卷積神經網絡結構對比

表1 本研究深度網絡結構的參數配置

圖3 簡易Inception模塊示意圖

圖4 采用全局平均池化層替換全卷積層示意圖
1.2.3 訓練過程
在訓練過程中通過對每一個中間層的輸入數據進行標準化操作,將樣本的數據分布映射到均值為0、方差為1的正態分布范圍內,當前層網絡參數發生變化時,后層的均值方差不變,減少了層與層之間參數的耦合,通過引入批量標準化操作使得網絡可以設置更高的學習率,降低初始化值加快網絡訓練速度,同時批量標準化對模型起到一定的正則化作用,減少了網絡對于Dropout的需求。
在批量標準化的過程中,首先需要對網絡的輸入數據進行歸一化處理:
(3)
式中,E(x(k))是指訓練數據神經元x(k)的平均值,分母是指數據神經元x(k)的一個標準差。為了防止歸一化改變數據的分布方式影響網絡學習,通過引入兩個超參數γ(k)、β(k)將其轉換為:
(4)

選取3個不同類別的驗證碼圖像作為樣本數據集進行訓練和識別(見表2)。
1)京東驗證碼
京東驗證碼包含了常見的驗證碼干擾方式,比如字符尺度變化、線性噪聲、字符粘連等特征,比較適合用于測試驗證碼的適用性。
2)正方教務系統驗證碼
正方教務系統驗證碼具有點噪聲和部分扭曲粘連的特性,可以用于評估粘連字符驗證碼識別方法的性能。
3)谷歌驗證碼
谷歌驗證碼是目前網絡上難度最大的字符型驗證碼,具有復雜的扭曲、粘連等特征,傳統驗證碼識別方法無法識別此類驗證碼。

表2 部分選用的驗證碼訓練集
樣本驗證碼圖像的大小均為60×160像素(高度×寬度),初始學習率為0.01。實驗過程首先對驗證碼數據集進行篩選,判斷是否進行預處理或樣本擴充操作,制作訓練集和測試集,將訓練集整體輸入至網絡結構中進行訓練和調參,待其產生最優訓練模型。其次,輸入測試樣本進行預測。統計正確預測個數(TP)和錯誤預測個數(TN),最后根據統計結果計算準確率(Accuracy,acc),acc=TP/(TP+TN)。為保證識別的魯棒性,對谷歌驗證碼進行了兩次訓練,第一次選用256的批量樣本迭代25次,后改用128的批量樣本迭代45次完成訓練。
對京東驗證碼、正方教務系統驗證碼和谷歌驗證碼的識別效果進行了對比實驗,實驗結果如表3所示。三種驗證碼的訓練樣本/測試樣本/批量樣本(batch-size)/迭代次數參數值分別為14 266、6 000、6 500張/420、1 000、500張/128、64、128張/50、40、25次。表3列出了不同驗證碼圖像的識別準確率,同時也列出了四種傳統深度網絡得到的識別準確率比較。可以看出,本方法對京東驗證碼的識別準確率比AlexNet、VGG-16、Googlenet-v2、ResNet34分別提高了1.14%、1.71%、0.5%和0.31%,對正方教務系統驗證碼的識別準確率分別提高了2.75%、3.08%、1.13%和1.46%,對谷歌驗證碼的識別準確率分別提高了3.14%、2.05%、0.43%和1.3%。本方法對于3種不同類型驗證碼均有著較高的識別率、魯棒性和良好的泛化能力。

表3 不同驗證碼圖像的識別準確率比較
表4對不同網絡架構的識別準確率和計算時間進行了對比。表1中的8層結構網絡分別減少2層Inception模塊和增加2層Inception模塊,得到6層和10層結構的深度學習網絡。根據統計結果,三種驗證碼采用8層結構網絡的識別準確率比6層結構網絡平均提高2.79%,訓練時間平均增加274 s;10層結構網絡的識別準確率比8層結構網絡平均提高了0.59%,訓練時間平均增加1 054 s。所以,從識別準確率和訓練時間指標折衷考慮,8層結構網絡的性能最好。

表4 不同網絡結構識別準確率和時間比較
傳統卷積神經網絡的卷積層通常由許多卷積單元組成,用來從前一層的特征圖中提取更高級的特征。但是,如何優化每一層各通道提取的特征,提高目標表示效率是深度學習技術中需要考慮的問題。通過采用并行的級聯卷積層構建簡易的Inception模塊,用于替代傳統網絡中的卷積層,并在其中運用多個小卷積核代替原來的大卷積核,可以在減少參數量的同時,增加網絡深度提高網絡學習能力。
1)Inception模塊中,通過使用兩個3×3卷積來替代5×5卷積,由于兩個3×3卷積核的參數量為:2KP3×3=2(32C2)=18C2,而一個5×5卷積核的參數量為:KP5×5=52C2=25C2,可以算出采用3×3卷積的堆積結構參數量為原結構的0.72倍。
2)每一個Inception模塊內由三個并行級聯卷積層組合而成,不同大小的卷積核與圖像卷積后產生不同的感受野提取不同區域的特征,1×1的卷積將輸入的圖像降維后保留了原來的全局特征,1×1卷積和2個3×3卷積的串聯組合可以提取輸入圖像的局部特征,池化層與1×1卷積串聯后提取原輸入圖像一半大小的區域特征,最后將這三層并聯卷積層提取的不同尺度特征進行合并,有效提升了網絡對不同尺度的適應性。
對于含有復雜干擾信息或粘連的驗證碼,基于圖像分割的傳統方法很難識別,而且分割會破壞字符信息,導致誤差累積。端對端的深度學習技術,從輸入端到輸出端會有一個對結果的預測,預測誤差在網絡的每一層反向傳遞與調整,直至得到預期的結果。通過將這種自主學習網絡架構引入驗證碼識別,可以去掉字符分割步驟,并根據訓練樣本中干擾復雜程度來選擇是否進行預處理操作,以此更好凸顯和保留字符間的特征信息[20]。以京東驗證碼為例,與傳統分類器算法(SVM)、基于BP神經網絡的分割算法以及基于CNN的分割算法相比,本算法識別準確率分別提高了5.68%、9.67%和0.56%,識別準確率和速度均有較大提升。以上實驗結果也表明采用端對端驗證碼識別方法可以達到更好的識別性能。
本研究提出一種基于深度卷積神經網絡的端對端驗證碼識別方法。利用Inception模塊代替卷積層構建深層卷積神經網絡,整個過程將驗證碼圖像直接作為網絡輸入,無須字符分割等過多人工干預,避免字符信息破壞造成錯誤累積的問題,利用網絡學習能力自動提取字符特征進行訓練,從而實現了端對端的訓練和識別。實驗結果表明,端對端的驗證碼識別方法對于不同類型的復雜驗證碼均有著較高的識別準確率和魯棒性。