張蘇沛 ,劉 軍*,肖澳文 ,杜 壯
1.智能機器人湖北省重點實驗室(武漢工程大學),湖北 武漢 430205;
2.武漢工程大學計算機科學與工程學院,湖北 武漢 430205
驗證碼是一種區別用戶是人或計算機的自動化測試方法,目前廣泛應用于互聯網,可以有效避免自動化程序濫用網站服務。驗證碼通常由字母和數字組成,為防止被機器自動識別,其分辨率通常較低,圖片噪聲較大。字符被一定程度地扭曲或傾斜,字符間往往存在粘連,“用戶”需要識別并鍵入正確的字符。人眼對驗證碼的識別率可以達到80%以上,但自動化程序識別準確度往往低于0.01%。這對于防止金融欺詐、電商刷單、惡意注冊等批量化行為具有較好的效果[1-2]。
近年來,研究學者提出使用自動化方法識別驗證碼,如支持向量機(support vector machine,SVM)和旋轉粗匹配算法[3-4]。上述方法一般有如下流程:圖像預處理、二值化、去除離散噪聲、字符分割、歸一化、特征提取、訓練和字符識別等[5]。這些方法模塊之間相互獨立,流程較為復雜,一旦某個模塊出現故障,會直接影響最后的識別準確度。字符分割再識別的方法只針對復雜度較低、噪聲較小的驗證碼圖片,某些場景下字符相互堆疊,影響分割難度,并直接降低識別準確率。
受人類大腦處理信息方式的啟發,有學者提出神經網絡的方法。神經網絡具有多層隱藏層結構,經過大量的訓練,可以模擬人類的學習過程,實現機器智能化[6]。1998 年,Le[7-8]首次提出卷積神經網絡(convolutional neural network,CNN),該神經網絡是一種前饋神經網絡,與傳統BP神經網絡相比,層與層之間的神經元屬與部分連接,而非全部連接。限于當時的計算機硬件條件,卷積神經網絡未能廣泛流行,而開銷較少,效果較好的SVM[9]成為主要研究方法。21世紀初,計算機與互聯網的快速發展使卷積神經網絡的計算開銷成為可能。基于LeCun提出的5層神經網絡LeNet-5,陸續有研究者提出更深層的神經網絡[10],并在各類圖像識別比賽(如Kaggle)上取得優秀的成績。近幾年,類似ResNet等神經網絡甚至實現了比人類識別更好的準確度[11-12]。
卷積神經網絡最大的特點是將圖片做為整體進行特征識別,省略了傳統方法中圖片預處理的過程。它包含了多層隱藏層結構,由底向上逐層學習更高層次的語義特征。目前,已有研究人員將卷積神經網絡用于光學字符和大小寫英文字符識別[13],并取得較高的識別效率。
基于上述分析,本文提出了基于LeNet-5的具有卷積結構的神經網絡,針對驗證碼的特征進行學習和識別,能夠有效避免人工設計梯度特征的缺陷。在縮短識別流程的基礎上,一定程度上提高了驗證碼識別的準確度。整個系統可由如下步驟實現:1)利用標準第三方庫生成驗證碼圖片;2)利用大量驗證碼圖片訓練卷積神經網絡,同時設置對照實驗;3)利用訓練完成的網絡進行測試和識別。
卷積神經網絡是一種具有多層結構的前饋神經網絡,通常應用于圖像分析領域。對于一幅二維圖像,不需要人工設計和手動提取特征,可以通過卷積層和池化層自動完成。與人類大腦的學習方法類似,神經網絡可以通過提取出圖像的具體特征來對圖像進行判斷。卷積層和池化層最大的便利性在于圖像特征的大小及出現的位置,均不影響最終的提取。
卷積層的工作方式可以理解為一個矩陣(也稱為卷積核,大小通常為3×3,5×5)依次在圖像上滑動并與對應位置的像素值做運算的過程,其最大特點是稀疏連接和權值共享[14]。稀疏連接是指每一層之間的神經元節點相互且非全連接,這是它與傳統BP神經網絡最大的區別,這一特點極大地降低了計算的復雜度并減少了權值的數量。權值共享是指卷積濾波器在對圖像進行卷積操作得到特征圖(feature map)之后,每一個濾波器共享同樣的參數,包括相同的權重矩陣和偏置項。
卷積神經網絡中,池化層往往緊隨卷積層出現。輸入圖像經過卷積層得到特征圖像之后,池化層可以進一步地提取圖像特征。池化操作一般有3種:最大池化(max pooling)、平均池化(average pooling)以及隨機池化(stochastic pooling)。最大池化指在鄰域特征點內取最大值,這是最常用的池化操作也是本文選取的操作。池化層的存在可以有效降低特征圖像的維度,降低復雜度,減少計算量,避免訓練過程中的過擬合現象,保證平移不變性,提高模型的泛化性。
激活函數在卷積神經網絡中最大的作用是引入非線性因素[15],避免線性函數的局限性。常用的激活函數有3種:Sigmoid、Tanh以及ReLU。經研究指出[16],與Sigmoid和Tanh相比,ReLU不僅計算速度較快,避免了訓練過程中過擬合的問題,而且可以更有效地實現深層的神經網絡,防止梯度彌散。因此本文選用ReLU作為神經網絡中的激活函數。
ReLU函數表達式為:

其函數圖像如圖1所示。

圖1 ReLU函數圖像Fig.1 Image of ReLU function
在Le-Net 5的基礎上,設計了7層的網絡結構。除輸入層以外,卷積層與池化層各有2層,前后交替排列,最后有2層全連接層。卷積層可以獲取圖像特征,池化層可以減少計算復雜度,避免過擬合;全連接層綜合所有特征,輸出不同類別的概率。另外激活函數ReLU引入的非線性因素,可以進一步增強網絡的表達能力。本文卷積層中卷積核均為 3×3,步長(strides)均為 1;池化層核均為2×2。步長均為2。卷積層和池化層填充方式(padding)為“0”填充。網絡中每一層的參數以及輸出如下:
輸入層,驗證碼圖像經過灰度轉換,大小為60像素×160像素。
C1層,32個卷積核對圖像進行卷積操作,得到32張60×160的特征圖,共有(3×3+1)×32=320個訓練參數。
S2層,對C1層得到的特征圖進行最大池化操作,得到32張30×80的特征圖,共有(1+1)×32=64個訓練參數。
C3層,64個卷積核對S2得到的特征圖進行卷積操作,得到64張30×80的特征圖,共有(3×3×32+1)×64=18 496個訓練參數。
S4層,對C3層得到的特征圖進行最大池化操作,得到64張15×40的特征圖,共有(1+1)×64=128個訓練參數。
F5層,全連接層,將15×40×64的特征圖展開為38 400維的向量,輸出1 024個節點。
F6層,全連接層,輸入節點為1 024個,輸出節點為62×4=248個(一張圖片共4個字符,每個字符有62種可能)。
每一層參數及輸出如表1所示。

表1 卷積神經網絡各層參數Tab.1 Parameters of each layer in CNN
卷積神經網絡的訓練需要大量的數據。由于缺少公共數據集,本文采用的圖像由程序自動生成。驗證碼圖像高度為60像素,寬度為160像素,字符集包括阿拉伯數字0~9,26個英文字母的大小寫。每張圖像包括4個隨機字符并含有一定噪聲,字符均有不同程度的扭曲、變形和粘連。數據集分為訓練集和測試集,訓練集包括40 000張圖片,測試集包括1 000張圖片。部分驗證碼圖片如圖2所示。

圖2 部分驗證碼圖片Fig.2 Some CAPTCHAs
本文程序采用Python語言編寫,基于Google開源機器學習框架Tensorflow。其中batch size為100,初始學習率(learning rate)為0.003,并在訓練過程中不斷衰減(每1 000次訓練學習率下降為上一學習率的1/3),同時采用AdamOptimizer作為優化器。為驗證學習率對訓練結果的影響,訓練過程中設置對照組(固定學習率)進行對比實驗。
測試平臺為Ubuntu 16.04,內存16 GB,GPU為NVIDIA GeForce GTX 1080Ti。兩組實驗迭代次數與準確率關系如表2所示。
實驗結果表明,在學習率變化的情況下,迭代訓練10 000次之后,模型已經達到了一個較好的準確度。隨著迭代次數的增加,準確度繼續提高;盡管在訓練過程中,準確率有一定程度的下降,但最終依然超過99%,并繼續保持穩定。而當學習率保持固定不變時,模型性能較差。由此可以證明,變化的學習率可以提高卷積神經網絡的訓練效率。

表2 不同學習率與迭代次數下識別準確率的比較Tab.2 Recognition accuracy comparison under different learning rates and iterations
測試集方面,除個別字符偶爾識別有誤(如“0”,“o”與“O”),模型在大多數驗證碼上表現良好,測試集準確率在95%以上。
本文提出基于LeNet-5的網絡模型對驗證碼進行識別,利用卷積神經網絡對驗證碼的特征進行提取。實驗表明:1)本文提出的卷積神經網絡模型實現了端到端的識別,避免流程過多導致的設計缺陷,在驗證碼識別上具有較高的準確率;2)隨著訓練次數的增加,變化的學習率對于識別準確度的提高有明顯幫助。