晉大鵬 張?zhí)煨? 劉濤
摘 ?要:針對(duì)目前互聯(lián)網(wǎng)上關(guān)于頁面自動(dòng)登錄環(huán)節(jié)出現(xiàn)的難點(diǎn),由于部分登錄界面有驗(yàn)證碼的存在,自動(dòng)登錄的時(shí)長被增加,并且有的驗(yàn)證碼難以識(shí)別,這就提出了基于Python和卷積神經(jīng)網(wǎng)絡(luò)(CNN)相結(jié)合的驗(yàn)證碼識(shí)別。首先本文對(duì)三千多張驗(yàn)證碼的樣本集進(jìn)行圖片預(yù)處理,分別有灰度化處理、二值化處理和去噪點(diǎn)處理三步操作。然后利用三個(gè)池化層和一個(gè)全連接層的結(jié)構(gòu)設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò),隨后訓(xùn)練樣本集,并對(duì)隨機(jī)的十個(gè)樣本進(jìn)行預(yù)測(cè)。
關(guān)鍵詞:驗(yàn)證碼;Python;二值化;卷積神經(jīng)網(wǎng)絡(luò)
中圖分類號(hào):TP315 ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
Abstract:The paper focuses on the current difficulties in the automatic login of pages on the Internet.Due to the existence of verifications code in some login interfaces,the duration of automatic login is increased,and some verification codes are difficult to identify.Accordingly,based on Python and Convolutional Neural Network (CNN),a combined identification of verification codes is proposed in this study.Firstly,this paper preprocesses the sample set of more than 3,000 verification codes,including the three processing steps of graying,binarization and denoising.The Convolutional Neural Networ is then designed using three pooled layers and a fully connected layer structure,followed by training the sample set and predicting ten random samples.
Keywords:verification code;Python;binarization;Convolutional Neural Network
1 ? 引言(Introduction)
伴隨著互聯(lián)網(wǎng)行業(yè)的興起,人們的生活工作也越來越便利,很多需要大量工作量、計(jì)算量的工作漸漸被計(jì)算機(jī)所取代,在減輕人類壓力的同時(shí),也給了研究人員繼續(xù)研究機(jī)器學(xué)習(xí)的動(dòng)力。
驗(yàn)證碼本身是用來區(qū)分服務(wù)對(duì)象是人還是計(jì)算機(jī)腳本的一種公共全自動(dòng)程序,當(dāng)前大多數(shù)瀏覽器都具有記住賬號(hào)密碼的功能,然而為了防止頻繁的自動(dòng)登錄,減輕服務(wù)器端的壓力,并在一定程度上防止機(jī)器人、外掛等非法程序的攻擊,驗(yàn)證碼就被研發(fā)了出來。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是受對(duì)貓視覺皮層電生理研究啟發(fā)所提出的,Yann Lecun最早將CNN用于手寫數(shù)字識(shí)別這一方向。時(shí)至今日,CNN在多個(gè)方向都有應(yīng)用,例如,語音識(shí)別、人臉識(shí)別、通用物體識(shí)別、運(yùn)動(dòng)分析、自然語言處理甚至腦電波分析。
2 ? 圖片預(yù)處理(Image preprocessing)
2.1 ? 灰度化
一般來說,我們獲取到的圖片都是彩色的圖像,它的類型主要有RGB和CMYK兩種,其中RGB彩色圖像是由紅色、綠色和藍(lán)色組成;CMYK則是由青C、品M、黃Y和黑組成。識(shí)別圖片中最重要的信息是梯度,梯度就代表著邊緣,這是圖片最本質(zhì)的部分,而計(jì)算梯度就需要進(jìn)行灰度化處理?;叶然褪菍⒉噬?,含有很多噪點(diǎn)的圖像轉(zhuǎn)化為灰度圖像的過程,也叫作灰度化處理[1]。在一般RGB模型中,如果R=G=B=某個(gè)定值時(shí),其彩色就表示一個(gè)等于特定值的顏色,那個(gè)定值叫灰度值。因此,灰度化處理之后的圖像中任意單個(gè)像素僅需要一個(gè)字節(jié)用來存取灰度值,0—255就是其中灰度值的取值范圍。R、G、B三個(gè)分量決定了彩色圖像中的每個(gè)像素的顏色,每個(gè)分量又有255個(gè)值可以取,因此這樣一個(gè)像素點(diǎn)可以有255*255*255=16581375的顏色的變化范圍。與之對(duì)應(yīng)的是,灰度圖像的一個(gè)像素點(diǎn)僅有255種變化范圍,因此在進(jìn)行圖像處理時(shí),一般會(huì)先將各種格式的圖像轉(zhuǎn)變?yōu)榛叶葓D像,以便之后對(duì)圖像的計(jì)算量減輕[2]。灰度圖像的描述和彩色圖像一樣仍然反映了整幅圖像的整體和局部色度和亮度等級(jí)的分布和特征。對(duì)于灰度化的方式有分量法、最大值法、平均值法和加權(quán)平均值法等,以平均值法為例,求出R、G、B這三個(gè)分量的在彩色圖像中的亮度,并根據(jù)三個(gè)分量的亮度求簡單的平均值,將計(jì)算出來的值輸出進(jìn)而得到所需要的灰度圖。其實(shí)現(xiàn)的表達(dá)式如下:Gray(i,j)=(r(i,j)+g(i,j)+b(i,j))/3。
2.2 ? 二值化處理
任意圖像的像素一般在二維空間中都會(huì)對(duì)應(yīng)一個(gè)特定存在的位置,并且包含一個(gè)或者多個(gè)與該像素相關(guān)的采樣值組成數(shù)值。通過對(duì)圖片進(jìn)行了灰度化處理后,還需要再把獲取的灰度圖像進(jìn)行再處理,也就是二值化操作[3]。對(duì)于二值化,其目的是在不改變圖片主題內(nèi)容和輪廓的基礎(chǔ)上使圖片變得簡單,并使需要操作的數(shù)據(jù)量減小,這樣便于圖像的再處理。對(duì)灰度圖像進(jìn)行二值化再處理一般最常用的方法是閾值法[4],就是利用圖片中目標(biāo)和背景的差異,從而將圖像分別定義為兩個(gè)不相同的級(jí)別,選定一個(gè)恰當(dāng)?shù)拈撝?,從而確定某個(gè)像素到底是目標(biāo)還是背景,進(jìn)而獲得二值化處理之后的圖像。
二值化處理的基本過程:
(1)首先對(duì)初始的圖像進(jìn)行中低通濾波操作,也就是對(duì)圖像的預(yù)處理,從而起到降低或者去除噪聲的作用。
(2)用算法確定最佳閾值T。
(3)每當(dāng)像素的灰度值大于或等于該閾值的都設(shè)置成255,小于這個(gè)閾值的全部設(shè)置成0。這樣處理后的圖像就只有黑白兩種顏色,進(jìn)而就將灰度范圍分割成了目標(biāo)和背景兩個(gè)大類,最終就實(shí)現(xiàn)了對(duì)圖像的二值化操作。
2.3 ? 求連通域面積去噪點(diǎn)處理
(1)計(jì)算時(shí),每掃描到一個(gè)灰度值為0的黑點(diǎn)時(shí),就將與該點(diǎn)連通的所有點(diǎn)灰度值改為1,因此該連通域的點(diǎn)都不會(huì)再做二次計(jì)算了。下一個(gè)灰度值為0的點(diǎn),其所有連通點(diǎn)改為2,這樣一次迭代,直到掃描完所有點(diǎn)。
(2)再次掃描所有點(diǎn),統(tǒng)計(jì)各個(gè)灰度值所對(duì)應(yīng)的個(gè)數(shù),各個(gè)灰度值的點(diǎn)的個(gè)數(shù)對(duì)應(yīng)該連通域的大小,并且由于不同連通域的灰度值不同,因此每個(gè)點(diǎn)僅不重復(fù)的計(jì)算一次。這樣就統(tǒng)計(jì)到了每個(gè)連通域的大小,再根據(jù)預(yù)設(shè)的閾值,判斷該連通域的大小是否低于閾值,如果低于,則判定其為噪點(diǎn),該算法適合檢查較大的噪點(diǎn)。
基于以上處理之后的圖片,可以在保留原始圖片信息的前提下,將數(shù)據(jù)預(yù)處理,使樣本集體積縮小,便于后面的卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和預(yù)測(cè)。
3 ?利用CNN進(jìn)行樣本訓(xùn)練(Sample training using CNN )
3.1 ? 卷積神經(jīng)網(wǎng)絡(luò)概述
卷積神經(jīng)網(wǎng)絡(luò)是近幾年發(fā)展起來,被不斷重視的一種用于高效識(shí)別的網(wǎng)絡(luò)引擎[6]。20世紀(jì)60年代,Hubel和Wiesel研究貓腦皮層中用于局部敏感,以及方向選擇的神經(jīng)元時(shí)發(fā)現(xiàn)了其獨(dú)特的網(wǎng)絡(luò)結(jié)構(gòu)可以有效降低反饋神經(jīng)網(wǎng)絡(luò)的復(fù)雜性,繼而提出卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)[7]。
CNN由三種不同的層組成,分別是:卷積層、池化層、密集層或全連接層。
卷積層:假設(shè)某張圖片有5*5個(gè)像素,其中1代表白,0代表黑,這幅圖就被視為是一張5*5的單色圖像?,F(xiàn)在用一個(gè)由隨機(jī)的0和1組成的3*3矩陣去和圖像中的字區(qū)域做乘法,每次迭代移動(dòng)一個(gè)像素,這樣該乘法就會(huì)得到一個(gè)全新的3*3矩陣,這個(gè)矩陣被叫作濾波器[8],它的任務(wù)是提取圖像特征,它使用一種優(yōu)化算法來決定這個(gè)3*3矩陣中具體的0和1。在神經(jīng)網(wǎng)絡(luò)的卷句層中需要使用許多這種濾波器來提取多個(gè)特征,這個(gè)3*3矩陣的每一個(gè)單個(gè)步驟被稱作步幅[9]。
池化層:池化層主要使用不同的函數(shù)為其中的輸入矩陣降維。一般情況下,最大池化層出現(xiàn)在卷積層之后。池化層使用2*2矩陣,利用與卷積層相同的方式處理圖像,不過它的目的是為了給圖像本身進(jìn)行降維操作。
全連接層:全連接層位于之前一層和激活函數(shù)之間[10]。
3.2 ? 模型訓(xùn)練
3.2.1 ? 圖片信息代碼化
首先,先輸入圖片的信息作為備用,通過圖片屬性可以得知是114*450像素的,最多包含6個(gè)字母,每個(gè)字母我們利用0和1來進(jìn)行數(shù)字化表示,比如a可以數(shù)字化為10000000000000000000000000,b可以數(shù)字化為01000000000000000000000000,以此類推。基于以上的信息,我們?cè)诖a中將其表示為:
IMAGE_HEIGHT=114
IMAGE_WIDTH =450
MAX_CAPTCHA=6
CHAR_SET_LEN=26
3.2.2 ? 定義函數(shù)
定義一個(gè)從本文訓(xùn)練集中提取圖片的函數(shù),此處有一步預(yù)處理被省略,即將訓(xùn)練集圖片重命名,以簡化到只需獲取驗(yàn)證碼的名稱和圖片即可,其中以矩陣的形式返回圖片[11]。再定義兩個(gè)函數(shù),一個(gè)將名字轉(zhuǎn)換為向量,另一個(gè)將向量轉(zhuǎn)換為名字。
代碼如圖1所示。
3.2.3 ? 生成采樣集
首先本文通過之前定義的get_name_and_image()函數(shù)得到的圖片已經(jīng)被以含布爾值的矩陣形式返回了,接下來通過語句1*(image.flatten())將其轉(zhuǎn)換成1行114*450列的只含有0和1的矩陣,從而生成采樣集。代碼如圖2所示。
3.2.4 ? 定義卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
通過方案選擇,本文采用3+1的結(jié)構(gòu),即三個(gè)卷積層加上一個(gè)全連接層來定義卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。在每個(gè)卷積層中,都選擇使用2*2的最大池化層和一個(gè)隨機(jī)失活(dropout)層,其中卷積核尺寸選擇的是5*5。在全連接層中,原始圖片114*450的結(jié)果經(jīng)過了三層池化層,其長和寬都被壓縮了八倍,也就是15*57左右的大小。代碼如圖3所示。
3.2.5 ? 訓(xùn)練樣本集
當(dāng)把結(jié)構(gòu)設(shè)計(jì)完成后,就可以開始訓(xùn)練樣本集了,通過交叉熵(Cross Entropy)函數(shù)sigmoid_cross_entropy_with_logits()來比較其中的loss值[12],并采用adam優(yōu)化器來進(jìn)行優(yōu)化。訓(xùn)練中,每一步的loss值都要輸出,每100步的準(zhǔn)確率也要輸出。通過設(shè)置,本文這里將目標(biāo)準(zhǔn)確率設(shè)置為99%,即只有當(dāng)樣本訓(xùn)練準(zhǔn)確率達(dá)到了99%后,才會(huì)結(jié)束訓(xùn)練。代碼如圖4所示。
訓(xùn)練結(jié)束后,得到模型輸出文件,訓(xùn)練部分到這里就結(jié)束了。
3.3 ? 模型預(yù)測(cè)
在模型訓(xùn)練成功的基礎(chǔ)上,需要檢測(cè)此模型的預(yù)測(cè)水平,這時(shí)本文隨機(jī)找十張類似的圖片作為預(yù)測(cè)圖片進(jìn)行預(yù)測(cè),定義一個(gè)預(yù)測(cè)模型的函數(shù)crack_captcha(),代碼如圖5所示。
預(yù)測(cè)結(jié)束后發(fā)現(xiàn)準(zhǔn)確率在40%以上,但是細(xì)化到單個(gè)驗(yàn)證碼,其準(zhǔn)確率就可以達(dá)到,主要是因?yàn)橛?xùn)練集的準(zhǔn)確率有99%,在這其中,如果調(diào)低keep_prob的值(這個(gè)值在代碼中規(guī)定的是0.5,這個(gè)參數(shù)是用來控制著機(jī)器的擬合的)[13],增加樣本集的數(shù)量并增加卷積層,最后的準(zhǔn)確率會(huì)更高。預(yù)測(cè)結(jié)果如圖6所示。
4 ? 結(jié)論(Conclusion)
通過對(duì)該模型的設(shè)計(jì)和預(yù)測(cè),使用python和CNN可以有效地滿足驗(yàn)證碼識(shí)別的部分需求??紤]到以往利用支持向量機(jī)來識(shí)別驗(yàn)證碼,卷積神經(jīng)網(wǎng)絡(luò)的代碼更加輕量化。在對(duì)圖片做了灰度化、二值化和去噪點(diǎn)操作后,通過對(duì)系統(tǒng)訓(xùn)練集準(zhǔn)確率的設(shè)置,CNN可以保證該模型的高性能、高可用性和高復(fù)用性。當(dāng)樣本集數(shù)量越大,該模型可以更加準(zhǔn)確地識(shí)別預(yù)測(cè)集中的驗(yàn)證碼,對(duì)純數(shù)字和數(shù)字加字母的驗(yàn)證碼機(jī)制也同樣適用。當(dāng)然,它也存在一些不足之處,當(dāng)樣本集越大,雖然對(duì)識(shí)別準(zhǔn)確率可以起到顯著增加的效果,但是由于樣本集過于龐大,其在訓(xùn)練模型的階段所耗的時(shí)間也就會(huì)越久,其模型輸出文件的體積也就會(huì)越大。當(dāng)該模型對(duì)驗(yàn)證碼的識(shí)別預(yù)測(cè)達(dá)到一定的準(zhǔn)確率,那么頁面自動(dòng)登錄的時(shí)間也就可以大大縮短了。
參考文獻(xiàn)(References)
[1] 羅婷婷.兩種改進(jìn)的彩色圖像灰度化算法研究[D].浙江工商大學(xué),2014.
[2] 賀姣.基于色差模型的彩色圖像灰度化算法研究[D].西安電子科技大學(xué),2014.
[3] 王鵬.一種局部二值化方法及其應(yīng)用[D].吉林大學(xué),2007.
[4] 陳業(yè)慧,黃凱.基于OV7725二值化圖像的無線實(shí)時(shí)傳輸[J].長沙大學(xué)學(xué)報(bào),2018(02):39-41.
[5] 曹青媚,王雪蓮.快速位移圖像高階累積量噪點(diǎn)檢測(cè)技術(shù)[J].計(jì)算機(jī)仿真,2017(07):281-284.
[6] 張慶輝,萬晨霞.卷積神經(jīng)網(wǎng)絡(luò)綜述[J].中原工學(xué)院報(bào),2017(03):82-86.
[7] 王嘉鑫,鄒科文,陳義明.基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別[J].電腦知識(shí)與技術(shù),2016(29):187-190.
[8] 范望,韓俊剛,茍凡,等.卷積神經(jīng)網(wǎng)絡(luò)識(shí)別漢字驗(yàn)證碼[J].計(jì)算機(jī)工程與應(yīng)用,2018(03):160-165.
[9] 賀桂嬌.幾種經(jīng)典的圖像邊緣檢測(cè)算子分析比較[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2014(09):182-183.
[10] 歐先鋒,向燦群,湛西羊,等.基于CNN的車牌數(shù)字字符識(shí)別算法[J].成都工業(yè)學(xué)院學(xué)報(bào),2016(04):26-30.
[11] T.Lossau,H.Nickisch,T.Wissel,et al.Motion artifact recognition and quantification in coronary CT angiography using convolutional neural networks[J].Medical Image Analysis,2019(02):68-79.
[12] Huaqing Wang,Shi Li,Liuyang Song,et al.A novel convolutional neural network based fault recognition method via image fusion of multi-vibration-signals[J].Computers in Industry,2019(02):182-190.
[13] Saya Fujino,Taichi Hatanaka,Naoki Mori,et al.Evolutionary deep learning based on deep convolutional neural network for anime storyboard recognition[J].Neurocomputing, ? ? ? ?2019(03):393-398.
作者簡介:
晉大鵬(1995-),男,碩士生.研究領(lǐng)域:智能制造.
張?zhí)煨模?994-),男,碩士生.研究領(lǐng)域:金融管理和會(huì)計(jì).
劉 ?濤(1995-),男,碩士生.研究領(lǐng)域:智能制造.