張?zhí)K沛 ,劉 軍*,肖澳文 ,杜 壯
1.智能機器人湖北省重點實驗室(武漢工程大學),湖北 武漢 430205;
2.武漢工程大學計算機科學與工程學院,湖北 武漢 430205
驗證碼是一種區(qū)別用戶是人或計算機的自動化測試方法,目前廣泛應用于互聯(lián)網(wǎng),可以有效避免自動化程序濫用網(wǎng)站服務。驗證碼通常由字母和數(shù)字組成,為防止被機器自動識別,其分辨率通常較低,圖片噪聲較大。字符被一定程度地扭曲或傾斜,字符間往往存在粘連,“用戶”需要識別并鍵入正確的字符。人眼對驗證碼的識別率可以達到80%以上,但自動化程序識別準確度往往低于0.01%。這對于防止金融欺詐、電商刷單、惡意注冊等批量化行為具有較好的效果[1-2]。
近年來,研究學者提出使用自動化方法識別驗證碼,如支持向量機(support vector machine,SVM)和旋轉(zhuǎn)粗匹配算法[3-4]。上述方法一般有如下流程:圖像預處理、二值化、去除離散噪聲、字符分割、歸一化、特征提取、訓練和字符識別等[5]。這些方法模塊之間相互獨立,流程較為復雜,一旦某個模塊出現(xiàn)故障,會直接影響最后的識別準確度。字符分割再識別的方法只針對復雜度較低、噪聲較小的驗證碼圖片,某些場景下字符相互堆疊,影響分割難度,并直接降低識別準確率。
受人類大腦處理信息方式的啟發(fā),有學者提出神經(jīng)網(wǎng)絡的方法。神經(jīng)網(wǎng)絡具有多層隱藏層結(jié)構(gòu),經(jīng)過大量的訓練,可以模擬人類的學習過程,實現(xiàn)機器智能化[6]。1998 年,Le[7-8]首次提出卷積神經(jīng)網(wǎng)絡(convolutional neural network,CNN),該神經(jīng)網(wǎng)絡是一種前饋神經(jīng)網(wǎng)絡,與傳統(tǒng)BP神經(jīng)網(wǎng)絡相比,層與層之間的神經(jīng)元屬與部分連接,而非全部連接。限于當時的計算機硬件條件,卷積神經(jīng)網(wǎng)絡未能廣泛流行,而開銷較少,效果較好的SVM[9]成為主要研究方法。21世紀初,計算機與互聯(lián)網(wǎng)的快速發(fā)展使卷積神經(jīng)網(wǎng)絡的計算開銷成為可能。基于LeCun提出的5層神經(jīng)網(wǎng)絡LeNet-5,陸續(xù)有研究者提出更深層的神經(jīng)網(wǎng)絡[10],并在各類圖像識別比賽(如Kaggle)上取得優(yōu)秀的成績。近幾年,類似ResNet等神經(jīng)網(wǎng)絡甚至實現(xiàn)了比人類識別更好的準確度[11-12]。
卷積神經(jīng)網(wǎng)絡最大的特點是將圖片做為整體進行特征識別,省略了傳統(tǒng)方法中圖片預處理的過程。它包含了多層隱藏層結(jié)構(gòu),由底向上逐層學習更高層次的語義特征。目前,已有研究人員將卷積神經(jīng)網(wǎng)絡用于光學字符和大小寫英文字符識別[13],并取得較高的識別效率。
基于上述分析,本文提出了基于LeNet-5的具有卷積結(jié)構(gòu)的神經(jīng)網(wǎng)絡,針對驗證碼的特征進行學習和識別,能夠有效避免人工設計梯度特征的缺陷。在縮短識別流程的基礎上,一定程度上提高了驗證碼識別的準確度。整個系統(tǒng)可由如下步驟實現(xiàn):1)利用標準第三方庫生成驗證碼圖片;2)利用大量驗證碼圖片訓練卷積神經(jīng)網(wǎng)絡,同時設置對照實驗;3)利用訓練完成的網(wǎng)絡進行測試和識別。
卷積神經(jīng)網(wǎng)絡是一種具有多層結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡,通常應用于圖像分析領域。對于一幅二維圖像,不需要人工設計和手動提取特征,可以通過卷積層和池化層自動完成。與人類大腦的學習方法類似,神經(jīng)網(wǎng)絡可以通過提取出圖像的具體特征來對圖像進行判斷。卷積層和池化層最大的便利性在于圖像特征的大小及出現(xiàn)的位置,均不影響最終的提取。
卷積層的工作方式可以理解為一個矩陣(也稱為卷積核,大小通常為3×3,5×5)依次在圖像上滑動并與對應位置的像素值做運算的過程,其最大特點是稀疏連接和權(quán)值共享[14]。稀疏連接是指每一層之間的神經(jīng)元節(jié)點相互且非全連接,這是它與傳統(tǒng)BP神經(jīng)網(wǎng)絡最大的區(qū)別,這一特點極大地降低了計算的復雜度并減少了權(quán)值的數(shù)量。權(quán)值共享是指卷積濾波器在對圖像進行卷積操作得到特征圖(feature map)之后,每一個濾波器共享同樣的參數(shù),包括相同的權(quán)重矩陣和偏置項。
卷積神經(jīng)網(wǎng)絡中,池化層往往緊隨卷積層出現(xiàn)。輸入圖像經(jīng)過卷積層得到特征圖像之后,池化層可以進一步地提取圖像特征。池化操作一般有3種:最大池化(max pooling)、平均池化(average pooling)以及隨機池化(stochastic pooling)。最大池化指在鄰域特征點內(nèi)取最大值,這是最常用的池化操作也是本文選取的操作。池化層的存在可以有效降低特征圖像的維度,降低復雜度,減少計算量,避免訓練過程中的過擬合現(xiàn)象,保證平移不變性,提高模型的泛化性。
激活函數(shù)在卷積神經(jīng)網(wǎng)絡中最大的作用是引入非線性因素[15],避免線性函數(shù)的局限性。常用的激活函數(shù)有3種:Sigmoid、Tanh以及ReLU。經(jīng)研究指出[16],與Sigmoid和Tanh相比,ReLU不僅計算速度較快,避免了訓練過程中過擬合的問題,而且可以更有效地實現(xiàn)深層的神經(jīng)網(wǎng)絡,防止梯度彌散。因此本文選用ReLU作為神經(jīng)網(wǎng)絡中的激活函數(shù)。
ReLU函數(shù)表達式為:
其函數(shù)圖像如圖1所示。
圖1 ReLU函數(shù)圖像Fig.1 Image of ReLU function
在Le-Net 5的基礎上,設計了7層的網(wǎng)絡結(jié)構(gòu)。除輸入層以外,卷積層與池化層各有2層,前后交替排列,最后有2層全連接層。卷積層可以獲取圖像特征,池化層可以減少計算復雜度,避免過擬合;全連接層綜合所有特征,輸出不同類別的概率。另外激活函數(shù)ReLU引入的非線性因素,可以進一步增強網(wǎng)絡的表達能力。本文卷積層中卷積核均為 3×3,步長(strides)均為 1;池化層核均為2×2。步長均為2。卷積層和池化層填充方式(padding)為“0”填充。網(wǎng)絡中每一層的參數(shù)以及輸出如下:
輸入層,驗證碼圖像經(jīng)過灰度轉(zhuǎn)換,大小為60像素×160像素。
C1層,32個卷積核對圖像進行卷積操作,得到32張60×160的特征圖,共有(3×3+1)×32=320個訓練參數(shù)。
S2層,對C1層得到的特征圖進行最大池化操作,得到32張30×80的特征圖,共有(1+1)×32=64個訓練參數(shù)。
C3層,64個卷積核對S2得到的特征圖進行卷積操作,得到64張30×80的特征圖,共有(3×3×32+1)×64=18 496個訓練參數(shù)。
S4層,對C3層得到的特征圖進行最大池化操作,得到64張15×40的特征圖,共有(1+1)×64=128個訓練參數(shù)。
F5層,全連接層,將15×40×64的特征圖展開為38 400維的向量,輸出1 024個節(jié)點。
F6層,全連接層,輸入節(jié)點為1 024個,輸出節(jié)點為62×4=248個(一張圖片共4個字符,每個字符有62種可能)。
每一層參數(shù)及輸出如表1所示。
表1 卷積神經(jīng)網(wǎng)絡各層參數(shù)Tab.1 Parameters of each layer in CNN
卷積神經(jīng)網(wǎng)絡的訓練需要大量的數(shù)據(jù)。由于缺少公共數(shù)據(jù)集,本文采用的圖像由程序自動生成。驗證碼圖像高度為60像素,寬度為160像素,字符集包括阿拉伯數(shù)字0~9,26個英文字母的大小寫。每張圖像包括4個隨機字符并含有一定噪聲,字符均有不同程度的扭曲、變形和粘連。數(shù)據(jù)集分為訓練集和測試集,訓練集包括40 000張圖片,測試集包括1 000張圖片。部分驗證碼圖片如圖2所示。
圖2 部分驗證碼圖片F(xiàn)ig.2 Some CAPTCHAs
本文程序采用Python語言編寫,基于Google開源機器學習框架Tensorflow。其中batch size為100,初始學習率(learning rate)為0.003,并在訓練過程中不斷衰減(每1 000次訓練學習率下降為上一學習率的1/3),同時采用AdamOptimizer作為優(yōu)化器。為驗證學習率對訓練結(jié)果的影響,訓練過程中設置對照組(固定學習率)進行對比實驗。
測試平臺為Ubuntu 16.04,內(nèi)存16 GB,GPU為NVIDIA GeForce GTX 1080Ti。兩組實驗迭代次數(shù)與準確率關系如表2所示。
實驗結(jié)果表明,在學習率變化的情況下,迭代訓練10 000次之后,模型已經(jīng)達到了一個較好的準確度。隨著迭代次數(shù)的增加,準確度繼續(xù)提高;盡管在訓練過程中,準確率有一定程度的下降,但最終依然超過99%,并繼續(xù)保持穩(wěn)定。而當學習率保持固定不變時,模型性能較差。由此可以證明,變化的學習率可以提高卷積神經(jīng)網(wǎng)絡的訓練效率。
表2 不同學習率與迭代次數(shù)下識別準確率的比較Tab.2 Recognition accuracy comparison under different learning rates and iterations
測試集方面,除個別字符偶爾識別有誤(如“0”,“o”與“O”),模型在大多數(shù)驗證碼上表現(xiàn)良好,測試集準確率在95%以上。
本文提出基于LeNet-5的網(wǎng)絡模型對驗證碼進行識別,利用卷積神經(jīng)網(wǎng)絡對驗證碼的特征進行提取。實驗表明:1)本文提出的卷積神經(jīng)網(wǎng)絡模型實現(xiàn)了端到端的識別,避免流程過多導致的設計缺陷,在驗證碼識別上具有較高的準確率;2)隨著訓練次數(shù)的增加,變化的學習率對于識別準確度的提高有明顯幫助。