徐 星,宋小鵬,杜春暉
(1.中北大學 信息與通信工程學院,山西 太原 030051;2.中國煤炭科工集團太原研究院有限公司,山西 太原 030006)
為了實現全自動、 大批量地抓取“企查貓”網站的信息,需要破解該網站的驗證碼.該網站的驗證碼圖像包含4位字符,由數字和大寫字母組成,共28個字符,為“0123456789ACDFHJKLN-PRSTUVXY”.
鑒于驗證碼在互聯網中的廣泛應用,國內外對驗證碼的識別進行了相關研究,出現了很多破解驗證碼的技術.目前,驗證碼識別主要有支持向量機(SVM)、 卷積神經網絡(CNN)等方法.殷光等[1]將每張圖像進行灰度化、 二值化后進行區域分割,將4位字符切割成4個單個字符供SVM分類器進行訓練.該方法能夠識別大多數圖像不粘連的驗證碼.張濤等[2]也提出在驗證碼圖像字符容易分割的情況下,對其先經過灰度化、 二值化、 去噪后,切割成單個字符,采用深度卷積神經網絡的方法對單個字符進行訓練、 識別后再合并的方法.該方法基于卷積神經網絡強大的特征提取能力,并且使用了非線性激活函數,效果明顯優于SVM的分類方法,但是也僅僅能夠處理容易分割的驗證碼圖像.對于不易分割的驗證碼,張濤等[2]將包含10個數字和26個字母的4位字符的標簽使用1*144向量表示,每位字符占用1*36,采用深度學習端對端的單任務整體分類的方式進行訓練.該方式分類類別較多,擬合效果不好,準確率只達到了85%.于鵬[3]、 溫明莉[4]和洪洋[5]等都提出用深度神經網絡對整張驗證碼圖片進行多標簽學習來完成多任務分類,端對端地識別出了驗證碼中的所有字符.該方法對特定位數并且圖像噪聲較少的驗證碼識別效果較好.張濤等[2]也提出使用CNN+RNN的方法進行驗證碼識別,但是由于其設計的CNN網絡層數較淺,得出該方法沒有優于只使用CNN的效果.
本文主要受圖像描述(Image Caption)的啟發,圖像描述是指從圖片中自動生成一段描述性文字,機器不僅要能檢測出圖像中的物體,而且要理解物體之間的相互關系,最后用合理的語言表達出來.谷歌開源了圖像描述系統,提出使用Caption模型,使其能對圖像生成更詳細、 更準確的描述,解決圖像標注問題[6].對于驗證碼圖像,同樣也可以采用此方法將圖像中的字符表達出來.本實驗將采用卷積神經網絡(CNN)與循環神經網絡(RNN)結合的方式,構造出復雜的CNN模型進行特征提取用于RNN語句的生成.這對于擁有動態位數,不容易被分割成一個個單獨字符且圖片背景復雜的驗證碼,具有良好的識別效果.
圖像描述就是由給定的圖像生成一段描述文字.驗證碼圖像描述要做的就是將驗證碼圖像中的字符表達出來.目標是產生標注驗證碼字符的語句,是一個語句生成的任務,一對多的序列生成過程使用RNN進行; 描述的對象擁有大量的圖像信息,利用CNN將更深層次的特征表達輸出到RNN的輸入端.將CNN與RNN結合的網絡模型設計能夠把時間、 空間的特性更加完整、 具體地表達出來.CNN適合用于空間擴展,其在神經元與特征卷積上的特性,使得它更專注于圖像的特征提取,并且能夠靜態地輸出圖像特征; RNN適合用于時間擴展,由于它的特殊結構能夠對神經元與時間上連續狀態的輸出進行計算,因此它擅長處理序列化數據,并且具有記憶功能.
卷積神經網絡作為一種深度學習架構,是一種多層神經網絡,通過一系列方法,它成功地將數據量龐大的圖像識別問題不斷降維,最終使其能夠被訓練,并且得到了較高的準確率[7,8].本實驗中CNN的目的是以一定的模型對事物進行特征提取,由于卷積和池化計算的性質,使得圖像中的平移部分對于最后的特征向量是沒有影響的,提取到的特征更不容易過擬合.網絡的層數越多,意味著能夠提取到不同等級的特征越豐富.并且,對深層次的網絡結構能夠提取到更抽象的特征,得到更多的語義信息.但是隨著網絡深度的增加,網絡準確度出現飽和,甚至出現下降的問題,ResNet通過短路機制加入了殘差單元,并證明了加深的殘差網絡比簡單疊加層的深度網絡更容易優化,準確度得到了明顯提升[9].本實驗根據ResNet網絡的特性,創新性地構建出24層的卷積神經網絡,結構如表 1 所示,Conv1為卷積層,它使用64個7*7大小的卷積核; Conv2_x、 Conv3_x為多重殘差單元,其中Conv2_x為3重殘差單元,每重殘差單元由3個卷積層構成,而Conv3_x為4重殘差單元,同樣地,每重殘差單元包含3個卷積層.對于Conv2_中的殘差單元,如圖 1 所示,該結構將輸入端與輸出端短路連接,有助于解決神經網絡訓練出現梯度消失和梯度爆炸的問題.x為輸入值,F(x)為三層卷積后得到的值,F(x)+x表示網絡最終結果.若直接去擬合一個潛在的恒等映射函數H(x)=x比較困難.但是,如果把網絡設計為H(x)=F(x)+x,如圖 1 所示,可以轉換為學習一個殘差函數F(x)=H(x)-x.因此只要F(x)=0,就可以構成一個H(x)=x的恒等映射,而且對于殘差的擬合會更加容易.

表 1 卷積神經網絡結構

圖 1 殘差單元示意圖Fig.1 Diagram of residual cells
在眾多自然語言處理的任務中,循環神經網絡(RNN)已經取得了巨大成功,用于語言建模[10],文本生成[11],機器翻譯[12],語音識別[13],生成圖片的文字描述[6].卷積神經網絡(CNN)解決了圖像空間問題,但還存在圖像時間問題.RNN具有記憶功能,當前的輸出由上一時刻的輸出和當前的輸入共同決定,因此使其在處理序列的問題上得到了廣泛的應用.長短期記憶網絡(LSTM)作為一種特殊的RNN模型,通過設計遺忘門避免了以往RNN出現當前系統狀態受之前系統狀態影響的問題,使其得到了廣泛的應用[14].LSTM是根據前面的信息推出后面的,但有時只看前面的信息是不夠的,可能需要由前面若干輸入和后面若干輸入共同決定,以使推測更加準確.Bartz等[15]采用雙向循環神經網絡(Bidirectional Long-Short Term Memory, BLSTM)彌補了這一問題,并用于語言識別.因此,本實驗采用BLSTM處理卷積神經網絡輸出的特征,識別驗證碼序列.雙向循環神經網絡,如圖 2 所示,輸入序列中的第一個是原樣的,第二個是輸入序列的反轉副本.這可以為網絡提供額外的上下文,使得網絡得到更快、 更好的擬合.

圖 2 BLSTMFig.2 Diagram of BLSTM
采用CTC(Connectionist Temporal Classification) Loss作為序列有監督學習的損失函數進行模型訓練時,不需要將數據對齊和一一標注,只需要一個輸入序列和一個輸出序列即可以訓練,并且直接輸出序列預測的概率,不需要外部的后處理[16].因為CTC允許神經網絡在任意一個時間段預測標簽,但要求輸出的序列順序必須是正確的,這樣就不需要讓標簽和圖像中的字符嚴格對齊了,而且CTC輸出的是整個序列標簽,因此也不需要再做一些外部的后處理.CTC Loss在分類處理時需要多設置1個長度即空格,否則會無法預測出連續兩個相同的字母或者數字的驗證碼序列了.
本次識別驗證碼是為了解決實際爬蟲遇到的問題,驗證碼圖片來自“企查貓”網站,使用python語言編碼發送http請求到該網站驗證碼圖像接口來獲取驗證碼圖片.獲得的驗證碼圖像如圖 3 所示,寬為80像素,高為160像素.收集到22 388張驗證碼,將這些驗證碼圖片按照0.75,0.15,0.10的比例分為訓練集、 驗證集和測試集三部分.訓練集為16 791張,驗證集為3 358張,測試集為2 239張.驗證碼字符包含28個字符,為“0123456789ACDFHJKLNPRSTUVXY”.驗證碼圖像標簽的制作采用手工打標簽,打完標簽后進行檢查排錯以確保標簽的正確性,因為實驗采用的是監督學習,沒有正確的標簽則不會有較高的識別準確率,這也會避免訓練中出現過擬合的現象.

圖 3 驗證碼2KN6Fig.3 Captcha 2KN6
本實驗采用準確率評估驗證碼的識別效果,用識別對的驗證碼圖片數量去除參與識別的驗證碼圖片數量.
① 本實驗采用Caffe[17]框架進行訓練,將數據集制作好后修改Caffe源碼使其支持多標簽輸入和訓練; ② 將圖像數據和標簽轉換成LMDB格式的數據庫文件; ③ 設計CNN與RNN結合的網絡模型結構,使之能夠適合處理驗證碼標注任務; ④ 訓練和測試網絡; ⑤ 使用Flask搭建基于深度學習的驗證碼圖像識別服務器; ⑥ 編寫代碼,發送post請求,返回識別結果; ⑦ 制作軟件圖形化界面,可視化識別,如圖 4 所示,當點擊“識別”按鈕后會發送下載驗證碼圖片的請求并調用識別程序,在界面會顯示這幅驗證碼圖片和識別結果.

圖 4 驗證碼識別圖形用戶界面Fig.4 Captcha recognition GUI
從圖 5 中可見,迭代初始階段驗證碼識別的準確率不高,隨著迭代次數的增加,識別準確率突然上升; 在迭代7 000次后,模型的識別準確率緩慢上升; 在10 000次迭代后,模型平均識別率基本達到穩定,最終收斂在97%左右,并且并沒有出現過擬合.測試結果顯示,2 239張圖片有65張圖片被識別錯,識別正確率達到97.09%.由此可見,本文設計的基于深度學習的驗證碼識別正確率高,效果很好.通過觀察實驗結果發現,存在的部分誤判是因為驗證碼字母的復雜變形導致字母與字母之間很容易產生混淆,如K、 H、 N等,人眼也很難分辨.對這一問題,可以通過反復排查打標簽的正確性來避免人為因素,另外還可以增加更多的訓練樣本和加深卷積神經網絡的層數來進一步提高識別率.

圖 5 迭代次數與正確率的關系圖 Fig.5 The diagram of the relation between the number of iterations and the correct rate
本文針對“企查貓”網站的驗證碼進行分析,由于該類型的驗證碼圖片中的字符之間存在粘連,不容易被分割成一個個單獨的字符.對此本文提出利用端到端的思想搭建深度學習模型,省去預處理和分割環節,然后進行訓練識別,取得了較好的結果.實驗結果證明了采用CNN結合RNN的方式進行訓練,能夠達到較高的識別準確率,沒有出現過擬合現象,并且能夠識別動態位數的驗證碼.采用這種圖像描述的方處理驗證碼識別問題,效果很好,可以將此技術應用于車牌識別或身份證號碼識別上.但是對于如果不經過訓練的驗證碼,直接使用這個訓練好的模型可能達不到如此好的效果,需要采集大量地訓練樣本并且對此打上正確的標簽,重新進行訓練.