范亞如, 徐鵬飛
(平頂山學(xué)院 ,河南 平頂山 467000)
由于后期對樣本進(jìn)行訓(xùn)練的時(shí)候需要大量的樣本集,如果只是簡單的人工采集的話,需要耗費(fèi)大量的時(shí)間和精力,所以可以采用python下的Captcha模塊,這里我生成了5000張符合要求的字符驗(yàn)證碼圖片[1]。
預(yù)處理的目的就是盡量排除雜點(diǎn)、像素干擾、字符變形、粘連等干擾因素,使各個(gè)字符圖像變得更加清晰,以便為后續(xù)的字符特征提取和字符識別打下基礎(chǔ)。圖像預(yù)處理功能模塊,包括圖像的灰度化、二值化、去燥、傾斜度調(diào)整、字符分割等的圖像處理技術(shù)[2]。
所謂樣本訓(xùn)練,就是根據(jù)大量的驗(yàn)證碼樣本,針對10個(gè)阿拉伯?dāng)?shù)字(0-9)和26個(gè)英文字母的大小寫,對這些字符制作大量的字模[3]。在經(jīng)過足夠多的樣本訓(xùn)練之后,建立一個(gè)字模庫,從而使要識別的字符進(jìn)行對號入座。由此可見,樣本訓(xùn)練的重要性,它決定了最終識別效率的高低。以下是我在趕集網(wǎng)網(wǎng)站上面選取的樣本訓(xùn)練之后制作的字模庫,字符識別就是在預(yù)處理后的圖片的基礎(chǔ)之上,將識別出來的字符以文本的形式顯示出來。識別結(jié)果如圖1所示。
圖1 識別結(jié)果
上文提到的傳統(tǒng)的識別方法僅限于簡單的驗(yàn)證碼,為了提高網(wǎng)絡(luò)的安全性,驗(yàn)證碼的種類也在不斷地更新?lián)Q代,對于比較復(fù)雜的,甚至肉眼都難以識別的驗(yàn)證碼,傳統(tǒng)的識別方法已不能滿足人們的需求。針對這種干擾程度較為復(fù)雜的驗(yàn)證碼識別,通常采用BP神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)。
使用梯度下降來搜索可能的權(quán)向量的假設(shè)空間,以找到最佳的擬合樣例的權(quán)向量。具體而言,即利用損失函數(shù),每次向損失函數(shù)負(fù)梯度方向移動(dòng),直到損失函數(shù)取得最小值。即反向傳播算法,是根據(jù)損失函數(shù),求出損失函數(shù)關(guān)于每一層的權(quán)值及偏置項(xiàng)的偏導(dǎo)數(shù),也稱為梯度,用該值更新初始的權(quán)值和偏置項(xiàng),一直更新到損失函數(shù)取得最小值或是設(shè)置的迭代次數(shù)完成為止,以此來計(jì)算神經(jīng)網(wǎng)絡(luò)中的最佳的參數(shù)[4]。
BP的缺陷:
(1)學(xué)習(xí)速度慢,需要幾百次甚至上千次的學(xué)習(xí)才能收斂。
(2)容易陷入局部極小值。
(3)權(quán)值過多。當(dāng)隱藏節(jié)點(diǎn)過多,層數(shù)越多時(shí),權(quán)值成倍增長。
1. 基本原理
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡稱CNN)就是一種深度的監(jiān)督學(xué)習(xí)下的機(jī)器學(xué)習(xí)模型。CNN的整體結(jié)構(gòu)包含了3種層:
(1) Convolutional layer(卷積層--CONV)
由濾波器filters和激活函數(shù)構(gòu)成。一般要設(shè)置的超參數(shù)包括filters的數(shù)量、大小、步長,以及padding是“valid”還是“same”。此外,還包括選擇什么激活函數(shù)。
(2)Pooling layer (池化層--POOL)
這里的參數(shù)一般是Maxpooling,Averagepooling。需要指定的超參數(shù),包括是Max還是average,窗口大小以及步長。通常,我們使用較多的是Maxpooling參數(shù),而且一般取大小為(2,2)步長為2的filter,這樣,經(jīng)過pooling之后,輸入的長寬都會(huì)縮小2倍,channels不變。
(3) Fully Connected layer(全連接層--FC)
這與之前的神經(jīng)網(wǎng)絡(luò)中的普通的層一樣,就是一排神經(jīng)元。因?yàn)檫@一層是每一個(gè)單元都和前一層的每一個(gè)單元相連接,所以稱之為“全接”[5]。
2. ResNet網(wǎng)絡(luò)結(jié)構(gòu)
比 較 有 名 的 CNN結(jié)構(gòu)有 AlexNet、ZFNet、VGGNet、GoogleNet和 ResNet。ResNet是卷積神經(jīng)網(wǎng)絡(luò)模型之一,它引入了殘差網(wǎng)絡(luò)結(jié)構(gòu)(residual network),通過這種殘差網(wǎng)絡(luò)結(jié)構(gòu),可以把網(wǎng)絡(luò)層弄的很深(目前可以達(dá)到1000多層),并且最終的分類效果也非常好,殘差網(wǎng)絡(luò)在借鑒了高速網(wǎng)絡(luò)的跨層連接的思想上進(jìn)行了改進(jìn),殘差項(xiàng)原本是帶權(quán)值的,但ResNet用恒等映射代替了它[6]。
卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)驗(yàn)證碼的識別具體流程大致為:
(1)使用python的captcha模塊生成驗(yàn)證碼圖片。
(2)使用PyTorch搭建神經(jīng)網(wǎng)絡(luò)模型。
(3)將數(shù)據(jù)喂入神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。
(4)保存訓(xùn)練好的網(wǎng)絡(luò)模型。
其中生成的驗(yàn)證碼圖片樣本、模型訓(xùn)練數(shù)據(jù)圖以及最終識別結(jié)果分別如圖2、3、4、5所示。
圖2 訓(xùn)練集
圖3 損失率
圖4 學(xué)習(xí)率
圖5 識別結(jié)果
一個(gè)良好的算法首先應(yīng)具有較高的識別效率,其次就是識別過程中所要消耗的時(shí)間和精力。通過對算法進(jìn)行改進(jìn)和優(yōu)化之后,可以得出在保證較高識別率的基礎(chǔ)之上,CNN能夠達(dá)到減少訓(xùn)練次數(shù),從而縮短耗時(shí)的效果。改進(jìn)前后的訓(xùn)練效果分別如圖6和圖7所示。
圖6 改進(jìn)前的訓(xùn)練效果
圖7 改進(jìn)后的訓(xùn)練效果
在簡單的字符識別基礎(chǔ)上進(jìn)行了改進(jìn),采用神經(jīng)網(wǎng)絡(luò)字符識別,通過對比兩種神經(jīng)網(wǎng)絡(luò),從而得出卷積神經(jīng)網(wǎng)絡(luò)在總體上占有很大的優(yōu)勢。而且卷積神經(jīng)網(wǎng)絡(luò)的發(fā)展歷程豐富,具有一系列不同的網(wǎng)絡(luò)結(jié)構(gòu)及其變體,在此基礎(chǔ)上可以優(yōu)化出更好的網(wǎng)絡(luò)結(jié)構(gòu),未來可期。