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