陳詩雨
(武漢郵電科學(xué)研究院,湖北 武漢 430070)
文本驗證碼因易于維護、用戶體驗感好等優(yōu)點被廣泛使用,暗網(wǎng)驗證碼通常為復(fù)雜文本驗證碼。在實際匿名網(wǎng)站中,通過網(wǎng)絡(luò)瓶頸和反爬蟲機制,可以獲取的暗網(wǎng)驗證碼數(shù)量有限。對于小數(shù)據(jù)集復(fù)雜文本驗證碼識別,機器學(xué)習(xí)存在難以去噪和分割的問題,深度學(xué)習(xí)存在數(shù)據(jù)不足容易過擬合的問題。
文獻[1]使用圖像處理和深度學(xué)習(xí)技術(shù)做文本驗證碼識別;文獻[2]使用對抗樣本增強驗證碼安全性;文獻[3]提出識別驗證碼的輕量級卷積神經(jīng)網(wǎng)絡(luò);文獻[4]使用遷移學(xué)習(xí)減少驗證碼破解復(fù)雜度和樣本標(biāo)注成本;文獻[5]使用迭代對抗生成提高驗證碼防御能力;文獻[6]優(yōu)化卷積神經(jīng)網(wǎng)絡(luò)在復(fù)雜驗證碼識別中的應(yīng)用;文獻[7]使用深度學(xué)習(xí)識別背景噪聲大、字符長度可變的文本驗證碼;文獻[8]融合風(fēng)格遷移和對抗樣本技術(shù)增強驗證碼安全性;文獻[9]研究基于粒子群優(yōu)化算法的驗證碼識別;文獻[10]實現(xiàn)暗網(wǎng)站點的驗證碼快速識別;文獻[11]使用差分進化算法生成字符對抗驗證碼。
針對目標(biāo)文本驗證碼自身特點,提出了一種基于字符分割的小數(shù)據(jù)集復(fù)雜文本驗證碼識別方法,先使用深度學(xué)習(xí)方法進行去噪和分割,其中pix2pix算法用于去噪,YOLOv4[12]算法用于分割,再使用KNN 算法進行分類,從而實現(xiàn)小數(shù)據(jù)集復(fù)雜文本驗證碼識別。流程圖如圖1 所示。

圖1 實驗流程圖
pix2pix的核心技術(shù)有三點:基于CGAN(Conditional GAN)的損失函數(shù)、基于U-Net 的生成器和基于PatchGAN 的判別器。
GAN 通過生成器G(z)和判別器D(x)互相博弈來達(dá)到同時優(yōu)化兩個模型的目的,它的損失函數(shù)可以定義為對G(z)和D(x)的極大極小博弈。
在傳統(tǒng)的GAN 中,模型的生成內(nèi)容僅由生成器的參數(shù)和隨機噪聲z來決定,因此無法控制生成器生成的內(nèi)容。在CGAN 的判別器中,將數(shù)據(jù)x及其標(biāo)簽y作為輸入同時送到判別器中生成跨模態(tài)向量,然后再通過判別器判斷x是真實數(shù)據(jù)還是生成數(shù)據(jù)。CGAN 的損失函數(shù)可以定義為對G(z|y)和D(x|y)的極大極小博弈。
pix2pix 在損失函數(shù)中加入L1 正則項來提升生成圖像的質(zhì)量,使其更清晰。
最終目標(biāo)是在正則約束下的生成器和判別器的極大極小博弈。
U-Net 是一個全卷積模型,它分為兩個部分,左側(cè)是由卷積和降采樣操作組成的壓縮路徑,右側(cè)是由卷積和上采樣組成的擴張路徑,擴張的每個網(wǎng)絡(luò)塊的輸入由上一層上采樣的特征和壓縮路徑部分的特征拼接而成。網(wǎng)絡(luò)模型整體是一個U 型結(jié)構(gòu),因此被稱為U-Net。
不同于傳統(tǒng)的GAN 將整圖作為判別器的輸入,pix2pix 提出了將輸入圖像分成N×N個圖像塊(Patch),然后將N×N個圖像塊依次提供給判別器,因此這個方法被命名為PatchGAN。根據(jù)N的不同大小來調(diào)整判別器的層數(shù),進而得到最合適的模型感受野。
YOLO 網(wǎng)絡(luò)主要由Backbone、Neck 和Head 三個組件構(gòu)成,Backbone 用于提取特征,Neck 用于提取更復(fù)雜的特征,Head 用于預(yù)測目標(biāo)的類別和位置。YOLOv4 在YOLOv3 的基礎(chǔ)上對Backbone、Neck 和Head 作出了改進。
YOLOv4 的Backbone是在YOLOv3 的DarkNet53的基礎(chǔ)上通過借鑒CSPNet(Cross Stage Partial Network)[13]改進的CSPDarkNet53。CSPNet 直接對通道維度進行劃分,而YOLOv4 是利用兩個1×1 卷積核來實現(xiàn)兩個分支信息在交匯處的拼接。
YOLOv4 的Neck結(jié)構(gòu)主要采用了SPP(Spatial Pyramid Pooling)模塊、FPN(Feature Pyramid Networks)+PAN(Path Aggregation Network)的方式。在SPP 模塊中,使用最大池化方式將不同尺度特征圖進行拼接,實現(xiàn)多尺度融合,增加感受野。YOLOv3 的Neck 只有自頂向下的FPN 對特征圖進行特征融合,而YOLOv4 則是以FPN+PAN 的方式對特征做進一步的融合。相比于原始的PAN 結(jié)構(gòu),YOLOv4 實際采用的PAN 結(jié)構(gòu)將addition 改為concatenation,使得特征圖融合后實現(xiàn)維度擴張。如此一來,F(xiàn)PN 自頂向下傳遞強語義信息,PAN 自底向上傳遞強定位信息,達(dá)到更強的特征聚合效果。
YOLO 使用非極大值抑制(Non Maximum Suppression,NMS)保留最優(yōu)解,NMS 是基于交并比(Intersection Over Union,IOU)實現(xiàn)的,IOU 反應(yīng)了兩個邊界框的重疊度。YOLOv4 在Head 部分的主要改進是訓(xùn)練時損失函數(shù)采用CIOU_Loss[14],測試時采用DIOU_NMS 進行篩選。
IOU_Loss 主要考慮檢測框和目標(biāo)框重疊面積,其中,A 是兩者的交集,B 是兩者的并集。GIOU_Loss在IOU_Loss 的基礎(chǔ)上,考慮邊界框不重合的問題。DIOU_Loss 在GIOU_Loss 的基礎(chǔ)上,考慮邊界框中心點距離的信息。CLOU_Loss 在DIOU_Loss 的基礎(chǔ)上,考慮邊界框長寬比的尺度信息。
K 最鄰近(K-Nearest Neighbor,KNN)算法是最簡單的分類方法之一。該方法的思路非常簡單直觀:如果一個樣本在特征空間中的K個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。因為KNN 算法適合于樣本數(shù)較少、典型性較好的樣本集,所以實驗選擇KNN 算法構(gòu)建分類模型。
實驗在Ubuntu 系統(tǒng)上,由Anaconda 創(chuàng)建虛擬環(huán)境,使用開源的Python 機器學(xué)習(xí)庫PyTorch 實現(xiàn)。
首先通過計算圖像哈希值對從匿名網(wǎng)站獲取的真實文本驗證碼進行去重,得到500 張不同的驗證碼圖片,然后進行標(biāo)注——即驗證碼圖片命名格式為“六位數(shù)字字母_時間戳.jpg”,其中六位數(shù)字字母為驗證碼文本內(nèi)容,驗證碼如圖2 所示。

圖2 真實文本驗證碼
驗證碼由數(shù)字和大小寫字母組成,文本顏色隨機,文本位置隨機,并且每張驗證碼有六條粗細(xì)不一的干擾線。
實驗使用pix2pix 進行圖像去噪。考慮到由pix2pix 訓(xùn)練得到的模型是有偏的,所以根據(jù)真實文本驗證碼的字符集設(shè)置和字符參數(shù)設(shè)置,并且使用不同字體來自動生成兩萬對帶有標(biāo)簽的合成文本驗證碼,每對文本驗證碼包含兩張,一張是有噪的,另一張是對應(yīng)的無噪的。合成文本驗證碼對如圖3 所示。

圖3 合成文本驗證碼對
對合成文本驗證碼對做預(yù)處理,使其符合pix2pix 訓(xùn)練網(wǎng)絡(luò)標(biāo)準(zhǔn)輸入格式,準(zhǔn)備相關(guān)文件,開始訓(xùn)練去噪模型。生成網(wǎng)絡(luò)的輸入是一張有噪驗證碼圖片,輸出是一張被去噪的驗證碼圖片。將被去噪的驗證碼和對應(yīng)的無噪驗證碼同時輸入判別網(wǎng)絡(luò),讓判別網(wǎng)絡(luò)對兩者進行鑒別,目標(biāo)是選出被生成網(wǎng)絡(luò)去噪的驗證碼。生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò)的目標(biāo)相反,相互競爭,當(dāng)判別網(wǎng)絡(luò)的準(zhǔn)確性低于5%時停止迭代,去噪模型訓(xùn)練完成。
常用的圖像去噪方法有中值濾波、像素點法和腐蝕膨脹。這三種方法先對輸入圖像進行灰度處理和二值化,再進行去噪處理,二值化結(jié)果如圖4所示。

圖4 二值化結(jié)果
中值濾波適合處理顆粒噪聲,中值濾波去噪結(jié)果如圖5 所示。

圖5 中值濾波結(jié)果
像素點法只能去除細(xì)干擾線,像素點法去噪結(jié)果如圖6 所示。

圖6 像素點法結(jié)果
腐蝕膨脹是針對圖像中的高亮(白色)部分進行的,腐蝕膨脹去噪結(jié)果如圖7 所示。

圖7 腐蝕膨脹結(jié)果
pix2pix 去噪結(jié)果如圖8 所示。

圖8 pix2pix結(jié)果
綜上可得,中值濾波、像素點法和腐蝕膨脹三種方法均未達(dá)到理想的去噪效果,pix2pix 去噪效果最好。
由于字符粘連導(dǎo)致使用基于連通域的分割方法或使用垂直投影法均不能達(dá)到理想的字符分割效果,所以實驗使用目標(biāo)檢測進行文本單字符分割。
使用labelImg 標(biāo)注數(shù)據(jù),得到符合YOLOv4 訓(xùn)練網(wǎng)絡(luò)標(biāo)準(zhǔn)輸入數(shù)據(jù)格式——[類別class,目標(biāo)區(qū)域中心x點,目標(biāo)區(qū)域中心y點,目標(biāo)區(qū)域?qū)挾葁,目標(biāo)區(qū)域高度h]的標(biāo)注文件。將500 張驗證碼及其標(biāo)注文件按3∶1∶1 劃分為訓(xùn)練集、驗證集和測試集。制作和準(zhǔn)備用于訓(xùn)練模型的圖片路徑,類別標(biāo)簽,網(wǎng)絡(luò)配置和預(yù)訓(xùn)練權(quán)重等相關(guān)文件,迭代訓(xùn)練模型1 000次,保存迭代過程中在驗證集上準(zhǔn)確率最高的模型參數(shù),作為分割模型。分割模型在驗證集上各項評價指標(biāo)結(jié)果如表1 所示。

表1 分割模型各項評價指標(biāo)結(jié)果
分割模型檢測分割文本單字符結(jié)果如圖9所示。

圖9 驗證碼分割結(jié)果
將500 張驗證碼按4∶1 劃分為訓(xùn)練集和測試集,首先對驗證碼進行去噪,再進行字符分割,單字符分割結(jié)果如圖10 所示。

圖10 單字符分割結(jié)果
對于分割下來的單字符,先對其進行二值化,單字符二值化結(jié)果如圖11 所示。

圖11 單字符二值化結(jié)果
再做圖像大小歸一化處理,單字符歸一化結(jié)果如圖12 所示。

圖12 單字符歸一化結(jié)果
最后使用經(jīng)二值化和歸一化處理的單字符構(gòu)建KNN 分類模型。
實驗對比了五個開源模型和提出的無去噪KNN模型以及有去噪KNN 模型在測試集上的識別準(zhǔn)確率,結(jié)果如表2 所示。

表2 各個模型的識別準(zhǔn)確率
tesseractocr 模型在測試集上單字符識別準(zhǔn)確率為0.7%,驗證碼識別準(zhǔn)確率為0.0%;muggleocr 模型在測試集上單字符識別準(zhǔn)確率為4.6%,驗證碼識別準(zhǔn)確率為0.0%;easyocr 模型在測試集上單字符識別準(zhǔn)確率為7.3%,驗證碼識別準(zhǔn)確率為0.0%;ddddocr模型在測試集上單字符識別準(zhǔn)確率為54.0%,驗證碼識別準(zhǔn)確率為14.0%;paddleocr 模型在測試集上單字符識別準(zhǔn)確率為45.2%,驗證碼識別準(zhǔn)確率為17.0%;無去噪KNN 模型在測試集上單字符識別準(zhǔn)確率為96.3%,驗證碼識別準(zhǔn)確率為82.0%;有去噪KNN 模型在測試集上單字符識別準(zhǔn)確率為98.7%,驗證碼識別準(zhǔn)確率為94.0%。由此可見,相比開源模型,該文模型識別準(zhǔn)確率更高,同時,去噪處理有助于識別準(zhǔn)確率的提升。
文中提出一種基于字符分割的小數(shù)據(jù)集復(fù)雜文本驗證碼識別方法,該方法首先使用pix2pix 對驗證碼做去噪,再使用YOLOv4 進行單字符分割,最后使用KNN 進行分類。實驗結(jié)果表明,該方法的單字符識別準(zhǔn)確率達(dá)98.7%,優(yōu)于開源模型識別結(jié)果,證明了該方法的可行性和有效性。在后續(xù)的研究中,將使用YOLOX[15]或者YOLOv7[16]訓(xùn)練分割模型,以實現(xiàn)更高效、更精確的字符分割,或者通過遷移學(xué)習(xí)技術(shù)實現(xiàn)小數(shù)據(jù)集復(fù)雜文本驗證碼識別。