李世成,東野長磊
(山東科技大學 計算機科學與工程學院,山東 青島 266590)
驗證碼(CAPTCHA)是一種區(qū)分用戶是計算機還是人的公共全自動程序。驗證碼通常由字母和數(shù)字組成,為防止被機器自動識別,其分辨率通常較低,圖片噪聲較大。字符被一定程度的扭曲或傾斜,字符間往往存在粘連,“用戶”需要識別并鍵入正確的字符。人眼隊驗證碼的識別率可以達到80%以上,但自動化程序識別準確率往往低于 0.01%。這對于防止金融欺詐、電商刷單、惡意注冊等批量化行為具有較好的效果[1-2]。
鑒于驗證碼在互聯(lián)網(wǎng)中的廣泛應(yīng)用,國內(nèi)外對驗證碼的識別進行了相關(guān)研究,出現(xiàn)了很多破解驗證碼的技術(shù)。目前,驗證碼識別主要有支持向量機(SVM)、卷積神經(jīng)網(wǎng)絡(luò)(CNN)等方法[3]。對于噪聲較少并且字符位數(shù)固定的驗證碼圖片,使用深度神經(jīng)網(wǎng)絡(luò)對整張驗證碼圖片進行多標簽學習來完成分類任務(wù)也可以達到很好的效果。也可以使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)與循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)結(jié)合的方式實現(xiàn)驗證碼圖像端到端的識別[4]。
本文的驗證碼數(shù)據(jù)來源于 2019年全國高校計算機能力挑戰(zhàn)賽,字符之間大多數(shù)存在粘連問題,使用端到端的識別模型很容易遺漏掉字符。所以本文先進行單個字符切割,對卷積神經(jīng)網(wǎng)絡(luò)添加注意力模塊,并使用卷積神經(jīng)網(wǎng)絡(luò)對單個字符進行識別。
如圖1所示,原始驗證碼圖片中有很多椒鹽噪聲,這些噪聲對圖片識別效果有著很大的干擾作用。椒鹽噪聲也稱為脈沖噪聲,是圖像中經(jīng)常見到的一種噪聲,它是一種隨機出現(xiàn)的白點或者黑點,可能是亮的區(qū)域有黑色像素或是在暗的區(qū)域有白色像素(或是兩者皆有)。中值濾波是一種典型的非線性濾波,是基于排序統(tǒng)計理論的一種能夠有效抑制噪聲的非線性信號處理技術(shù),基本思想是用像素點鄰域灰度值的中值來代替該像素點的灰度值,讓周圍的像素值接近真實的值從而消除孤立的噪聲點。如圖2所示,使用數(shù)字圖像處理中的中值濾波方法可以有效去除圖像中的噪點。
二維中值濾波的輸出公式為:
其中, (,)f x y, (,)g x y分別為原始圖像和處理后的圖像。W為二維模板,通常為3*3,5*5區(qū)域。也可以是不同的的形狀,如線狀,圓形,十字形,圓環(huán)形等。
圖1 原始圖像Fig.1 The original image
圖2 去噪處理后的圖像Fig.2 The denoised image
如圖3所示,在原始圖像中有字符之間相互重疊的部分,直接使用多分類的圖像處理方法很難識別出正確的字符。如圖4所示,本文將原始圖片切割成4份只有單個字符的圖像,使用單分類的模型進行識別,可以大幅度提高識別精度。
圖3 原始圖像Fig.3 The original image
圖4 切割之后的圖像Fig.4 The image after cutting
驗證碼識別可以看作是圖像分類問題,也可以看作是對圖像的序列識別問題。近幾年,深度卷積神經(jīng)網(wǎng)絡(luò)在圖像分類問題上不斷創(chuàng)新,突破極限。從比較簡單的 LeNet5[5]到更加深層網(wǎng)絡(luò)結(jié)構(gòu)的VGGNet[6],說明了隨著網(wǎng)絡(luò)深度的增加,模型可以學習到更高級的圖像特征,使得圖像分類的效果更加準確。后來,研究者發(fā)現(xiàn)不斷的堆疊網(wǎng)絡(luò)結(jié)構(gòu)并不能更進一步的提升模型識別的效果。疊加過多的神經(jīng)網(wǎng)絡(luò)層會出現(xiàn)梯度消失或爆炸問題,難以收斂。隨著殘差網(wǎng)絡(luò)的提出,深層網(wǎng)絡(luò)結(jié)構(gòu)的梯度消失問題得以解決,ResNet[7]是經(jīng)典的深度殘差網(wǎng)絡(luò)模型。對于基于圖像序列的識別問題,有研究者提出了一種新穎的卷積循環(huán)神經(jīng)網(wǎng)絡(luò)(CRNN)[8],因為它是DCNN和 RNN的組合。對于類序列對象,CRNN與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)模型相比具有一些獨特的優(yōu)點:(1)可以直接從序列標簽(例如單詞)學習,不需要詳細的標注(例如字符);(2)直接從圖像數(shù)據(jù)學習信息表示時具有與DCNN相同的性質(zhì),既不需要手工特征也不需要預(yù)處理步驟,包括二值化/分割,組件定位等;(3)具有與RNN相同的性質(zhì),能夠產(chǎn)生一系列標簽;(4)對類序列對象的長度無約束,只需要在訓練階段和測試階段對高度進行歸一化;(5)與現(xiàn)有技術(shù)相比,它在場景文本(字識別)上獲得更好或更具競爭力的表現(xiàn);(6)它比標準DCNN模型包含的參數(shù)要少得多,占用更少的存儲空間。
2.2.1 圖像及標簽處理
驗證碼數(shù)據(jù)來源于 2019年全國高校計算機能力挑戰(zhàn)賽提供的5000張訓練圖片和5000張測試圖片。原始圖像為40*120的RGB圖像,按照預(yù)處理階段進行去噪和分割,每張原始圖像分割成 4張40*30的圖像。標簽總共62類,分別是數(shù)字10類、小寫英文字母26類和大寫英文字母26類。
2.2.2 網(wǎng)絡(luò)結(jié)構(gòu)
深度卷積神經(jīng)網(wǎng)絡(luò)中常用的圖像分類模型有很多,例如:LeNet、VGG、ResNet和DenseNet[9]等。因為原始圖像為3通道圖像,大多數(shù)圖像中字符與背景之間的對比度很小,并且更深層次的網(wǎng)絡(luò)過于龐大,對于網(wǎng)絡(luò)訓練的硬件環(huán)境要求更高。所以本文選擇ResNet50作為基礎(chǔ)網(wǎng)絡(luò),并且在每個殘差塊中添加注意力模塊(CBAM)[10]。
如圖5所示,殘差學習單元將輸入端與輸出端短路連接,復(fù)制一個淺層網(wǎng)絡(luò)的輸出加給深層的輸出。殘差學習單元的輸出如下:
x為淺層的輸出, ()H x為深層的輸出, ()F x為夾在二者之間的變換。當淺層的x代表的特征已經(jīng)足夠成熟,如果任何對于特征x的改變都會讓 loss變大的話, ()F x會自動趨向于學習成為0。在前向過程中,當淺層的輸出已經(jīng)足夠成熟的時候,讓更深層能夠?qū)崿F(xiàn)恒等映射的作用[7]。
圖5 殘差學習的基本單元Fig.5 Residual learning:a building block
Convolutional Block Attention Module(CBAM),這是一種為卷積神將網(wǎng)絡(luò)設(shè)計的,簡單有效的注意力模塊(Attention Module)。如圖 6所示,對于卷積神經(jīng)網(wǎng)絡(luò)的特征圖(feature map),CBAM從通道和空間兩個維度計算特征圖的注意力圖(attention map),然后將注意力圖與輸入的特征圖相乘來進行特征的自適應(yīng)學習。對于中間層的特征圖F∈將會順序推理出一維的通道注意力圖和二維的空間注意力圖過程如下:
其中?為逐個元素之間相乘,首先將通道注意力模塊的輸出(channel attention map)與輸入(feature map)相乘得到F′,之后計算F′的空間注意力模塊的輸出(spatial attention map),并將兩者相乘得到最終的輸出F′。
圖6 卷積注意力模塊Fig.6 Convolutional block attention module
特征圖的每個通道都被視為一個特征檢測器,通道注意力模塊主要關(guān)注于輸入圖片中什么是有意義的。如圖7所示,通道注意力模塊使用最大池化和平均池化對特征圖在空間維度上進行壓縮,使用由 MLP組成的共享網(wǎng)絡(luò)對這兩個不同的空間背景描述進行計算得到通道注意力模塊的輸出。計算過程如下:
圖7 通道注意力模塊Fig.7 Channel attention module
空間注意力模塊主要關(guān)注于位置信息。如圖 8所示,空間注意力模塊在通道的維度上使用了最大池化和平均池化得到兩個不同的特征描述,然后將兩個特征合并,并使用卷積操作生成空間注意力的輸出。計算過程如下:
圖8 空間注意力模塊Fig.8 spatial attention module
在每個殘差學習單元的第三層卷積之后添加CBAM模塊。如圖9所示。
圖9 添加CBAM的殘差學習單元Fig.9 Residual learning with CBAM
添加了注意力模塊的 ResNet50模型的核心框架如表1所示,輸入為224*224*3的圖像,卷積層采用傳統(tǒng)的 5層架構(gòu),第一層卷積使用 7*7的卷積核,步長為 2,padding為 3,接下來使用大小為3*3,步長為2的卷積核進行最大池化操作。輸出為 112*112*64。第二層到第五層使用添加了注意力模塊的殘差塊,每一層包含的殘差塊個數(shù)為[3,4,6,3]。最后經(jīng)過自適應(yīng)平均池化和全連接層輸出結(jié)果。
表1 模型架構(gòu)Tab.1 Model architecture
2.2.3 訓練樣本集
首先,將切割的圖片數(shù)據(jù)按照每一類樣本數(shù)據(jù)均等拆分成訓練集和驗證集,這樣可以使訓練樣本更加均衡。使用Scikit-learn中的stratifiedKFold函數(shù)可以做到這一點。使用雙線性插值法放大到224*224大小,并且在訓練集中隨機變換圖片的亮度、對比度、飽和度和色度,用來增強模型的泛化能力。使用交叉熵損失函數(shù)計算訓練損失,并使用AdaBound[11]優(yōu)化函數(shù)進行優(yōu)化。訓練集和驗證集的準確率隨著迭代次數(shù)的變化如圖10所示。
圖10 訓練集和驗證集準確率變化圖Fig.10 Plot of accuracy for training set and validation
模型訓練結(jié)束后,選取在驗證集中準確率最高的模型最為最終的模型,并且在5000張測試集中測試模型的準確度。測試過程如圖11所示,首先讀取原始圖片,將原始圖片去噪并切割成4個單字符圖片,每張單字符圖片改變大小為 224*224,將 4個三維 224*224*3的單字符圖片按順序組合成四維4*224*224*3的數(shù)據(jù),將組合成的四維數(shù)據(jù)輸入模型進行測試,將輸出的4個結(jié)果連接成字符串與正確的標簽進行比較計算準確率。準確率的計算公式如下:
模型在5000張測試集中的準確率達到97.9%,部分識別結(jié)果如表2所示。
圖11 測試流程圖Fig.11 Test flow chart
表2 識別結(jié)果Tab.2 Recognition result
本文通過卷積神經(jīng)網(wǎng)絡(luò)對驗證碼圖片進行特征提取訓練,在有線條干擾并且訓練數(shù)據(jù)較少的情況下,模型依然能夠達到接近98%的準確率。若能夠去除干擾線、增加訓練數(shù)據(jù),或者使用多模型融合的方式,測試集的準確率將會進一步提高。從表 2可以看出,人眼能夠識別的驗證碼圖片,模型也都可以正確的識別,模型識別錯誤的圖片,人眼也很難正確分辨。隨著圖像識別技術(shù)的不斷發(fā)展,驗證碼的生成規(guī)則也將發(fā)生改變。