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