国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Python語言和支持向量機(jī)的字符驗(yàn)證碼識(shí)別

2017-06-02 09:24:03楊雄
關(guān)鍵詞:Python語言支持向量機(jī)

楊雄

摘要:驗(yàn)證碼的主要目的是區(qū)分人類和計(jì)算機(jī),用來防止自動(dòng)化腳本程序?qū)W(wǎng)站的一些惡意行為,目前絕大部分網(wǎng)站都利用驗(yàn)證碼來阻止惡意腳本程序的入侵。本文以某高校教務(wù)系統(tǒng)的字符驗(yàn)證碼作為研究對(duì)象,利用圖像處理的方法,對(duì)驗(yàn)證碼圖像進(jìn)行二值化、去離散噪聲、字符分割、歸一化、特征提取、訓(xùn)練和字符識(shí)別等過程實(shí)現(xiàn)了驗(yàn)證碼識(shí)別,并使用Python語言實(shí)現(xiàn)。最后在分析識(shí)別結(jié)果的基礎(chǔ)上,從驗(yàn)證碼識(shí)別的角度提出生成更加安全驗(yàn)證碼的一些建議。

關(guān)鍵詞:支持向量機(jī)(SVM);驗(yàn)證碼;Python語言

中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2017)04-0072-03

1 引言

隨著互聯(lián)網(wǎng)的迅速發(fā)展和應(yīng)用,網(wǎng)絡(luò)為我們提供了越來越多的資源,也為我們的生活和工作提供了極大的便利,但同時(shí)也帶來了大量的互聯(lián)網(wǎng)安全問題,比如刷票、用戶批量注冊(cè)、密碼暴力破解、社區(qū)惡意發(fā)帖等。

驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫[1],是能夠區(qū)分用戶是人還是計(jì)算機(jī)的公共自動(dòng)化程序,該程序提出的問題由計(jì)算機(jī)生成并評(píng)判,但必須只有人類才能回答。由于計(jì)算機(jī)無法解答驗(yàn)證碼的問題,所以可以認(rèn)為能夠回答出問題的用戶就是人類。目前大部分學(xué)校的教務(wù)系統(tǒng)都采用了字符圖像驗(yàn)證碼。

支持向量機(jī)(SVM)是在統(tǒng)計(jì)學(xué)習(xí)的 VC維理論和結(jié)構(gòu)風(fēng)險(xiǎn)最小化(Structure Risk Minimization,SRM)原理基礎(chǔ)上,發(fā)展起來的一種全新的機(jī)器學(xué)習(xí)算法[2]。該算法在解決小樣本、非線性及高維模式識(shí)別中有許多特有的優(yōu)勢(shì)。支持向量機(jī)根據(jù)其求解問題的不同分為支持向量分類機(jī)和支持向量回歸機(jī)兩種類型。本文提出的驗(yàn)證碼識(shí)別算法是基于C-SVC的支持向量分類機(jī)[3]。

但隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,最初的字符圖像驗(yàn)證碼已經(jīng)不能夠完全保障網(wǎng)絡(luò)的安全,為了評(píng)估這類驗(yàn)證碼的安全性,需要從識(shí)別角度進(jìn)行研究。因此,本文以某高校教務(wù)系統(tǒng)使用的驗(yàn)證碼作為識(shí)別對(duì)象,提出一種基于SVM的驗(yàn)證碼識(shí)別算法,使用Python的圖像處理庫和SVM機(jī)器學(xué)習(xí)庫來實(shí)現(xiàn)驗(yàn)證碼識(shí)別程序,根據(jù)識(shí)別率來評(píng)估網(wǎng)站的安全性,從而提出一些改進(jìn)意見。

2 驗(yàn)證碼預(yù)處理

為了防止計(jì)算機(jī)自動(dòng)化腳本的攻擊,字符圖像驗(yàn)證碼往往由服務(wù)器產(chǎn)生隨機(jī)字符序列后再加入一些干擾因素使計(jì)算機(jī)難以識(shí)別。本文將要識(shí)別的驗(yàn)證碼示例如圖1所示。

可以看到,該類驗(yàn)證碼加入的干擾因素主要是點(diǎn)線干擾噪聲,其加大了圖像識(shí)別的難度。因此,在進(jìn)行驗(yàn)證碼識(shí)別前,需要對(duì)驗(yàn)證碼圖像進(jìn)行預(yù)處理,步驟包括二值化、去除離散噪聲、字符分割和尺寸歸一化。

2.1 二值化

圖像的二值化處理就是將圖像上的點(diǎn)的像素值設(shè)置為0或255,使圖像的集合性質(zhì)只與像素值為0或255的點(diǎn)的位置有關(guān)。將圖像中所有小于閥值的像素被判定為屬于字符區(qū)域,其像素值設(shè)為0, 而大于或等于閥值的像素被排除在字符區(qū)域以外,像素值設(shè)為255。對(duì)圖像驗(yàn)證碼進(jìn)行二值化處理的關(guān)鍵是閾值的選擇與確定。二值化處理[4]選取閾值方法很多,經(jīng)過實(shí)驗(yàn)比較,本文采用全局固定閾值法[5]選取閾值,然后再對(duì)驗(yàn)證碼圖像進(jìn)行二值化處理。

設(shè)原始灰度圖像為f(x,y),二值化處理后的圖像為g(x,y),則二值化過程可表示為:

式中f(x,y)是原始圖像坐標(biāo)為(x,y)的點(diǎn)的像素值,g(x,y)是二值化處理后的該點(diǎn)的像素值,0表示黑點(diǎn),255表示白色。在實(shí)際的處理系統(tǒng)中,進(jìn)行圖像二值化處理的關(guān)鍵是要確定合適的閾值,使得字符與背景能夠分享開來,而且結(jié)果圖像必須具備良好的保形性,不能夠丟掉原來有用的信息,不產(chǎn)生額外的空缺等。通過實(shí)驗(yàn),采用固定閾值80能夠得到較完美的效果。

使用Python語言實(shí)現(xiàn)的主要步驟包括:將RGB彩圖轉(zhuǎn)為灰度圖和將灰度圖,再按照設(shè)定閾值轉(zhuǎn)化為二值圖。

二值化后的驗(yàn)證碼示例如圖2所示,基本將背景噪聲去除了。

2.2 去除離散噪聲

經(jīng)過二值化處理后,驗(yàn)證碼圖像還存在或多或少的離散噪聲,尤其在字符周圍。本文消除驗(yàn)證碼字符周圍離散噪聲采用的是連通域去噪法:當(dāng)發(fā)現(xiàn)一個(gè)像素值為0的點(diǎn)時(shí),記為:A,統(tǒng)計(jì)點(diǎn)A周邊九宮格里的像素值同樣為0的像素點(diǎn)數(shù)量,記為:Sum(A),如果Sum(A)少于一個(gè)定值K,則認(rèn)為此點(diǎn)為孤立點(diǎn),將其排除在字符區(qū)域以外,將點(diǎn)A像素值設(shè)為255。經(jīng)過實(shí)驗(yàn),當(dāng)K值取2時(shí),能夠去除絕大部分的離散噪聲,得到較好的效果。

在具體處理時(shí)需要將所有的像素點(diǎn)按如下圖分成三大類:頂點(diǎn)X、非頂點(diǎn)的邊界點(diǎn)Y和內(nèi)部點(diǎn)Z。如圖3所示。

其中:X類點(diǎn)需要計(jì)算周邊相鄰的3個(gè)點(diǎn),Y類點(diǎn)則需要計(jì)算周邊相鄰的5個(gè)點(diǎn),而Z類點(diǎn)則計(jì)算周邊相鄰的8個(gè)點(diǎn)。

經(jīng)過去除離散噪聲操作的驗(yàn)證碼圖像如圖4所示,已經(jīng)去除了給絕大部分干擾噪聲。

2.3 字符分割

字符圖像驗(yàn)證碼本質(zhì)是由一系列的單個(gè)字符圖片拼接而成。將去除離散噪聲后的驗(yàn)證碼圖片放大到像素級(jí)別,可獲取各個(gè)字符位置參數(shù)信息:整個(gè)圖片大小是 40*10(單位為像素),單個(gè)字符大小為 7*10,字符間隔3個(gè)像素,左相距1個(gè)像素,右相距1個(gè)像素,字符上下相距0個(gè)像素,如圖5所示。

這樣就可以使用投影分割算法將驗(yàn)證碼圖像分割成只包含單個(gè)字符的圖片,只需要定位每個(gè)字符在整個(gè)圖片中所占據(jù)的像素區(qū)域,然后就可以根據(jù)像素位置進(jìn)行分割,分割后的單個(gè)字符圖片如圖6所示。

2.4 尺寸歸一化

本文所選擇的研究對(duì)象進(jìn)行字符分割后單個(gè)字符的尺寸已經(jīng)統(tǒng)一為7*10的規(guī)格,所以不需要做額外處理。

3 基于支持向量機(jī)的驗(yàn)證碼識(shí)別

支持向量機(jī)算法的關(guān)鍵是選取核函數(shù)的類型,主要有線性內(nèi)核,多項(xiàng)式內(nèi)核,徑向基內(nèi)核(RBF),sigmoid核。本文選定RBF核為SVM的核函數(shù)進(jìn)行支持向量機(jī)分類識(shí)別:

本文提出的驗(yàn)證碼識(shí)別算法實(shí)現(xiàn)使用的是Python的機(jī)器學(xué)習(xí)庫libSVM ,libSVM是臺(tái)灣大學(xué)林智仁(Lin Chih-Jen)教授等開發(fā)設(shè)計(jì)的一個(gè)簡(jiǎn)單、易于使用和快速有效的SVM模式識(shí)別與回歸的軟件包[6],libSVM使用的一般步驟是:

(1)準(zhǔn)備數(shù)據(jù)集,轉(zhuǎn)化為 libSVM支持的數(shù)據(jù)格式;

(2)考慮選用核函數(shù)(本文使用RBF 核函數(shù));

(3)采用交叉驗(yàn)證,選擇最佳參數(shù)C與g;

(4)用得到的最佳參數(shù)C與g 對(duì)整個(gè)訓(xùn)練集進(jìn)行訓(xùn)練得到SVM模型;

(5)利用得到的SVM模型進(jìn)行預(yù)測(cè)[7]。

3.1 素材標(biāo)記

因?yàn)闄C(jī)器開始時(shí)是不具備任何字符的觀念,所以需要對(duì)機(jī)器學(xué)習(xí)的素材進(jìn)行手工標(biāo)識(shí),告訴機(jī)器哪些圖片的內(nèi)容是1,哪些圖片的內(nèi)容是A,這個(gè)過程叫做 “素材標(biāo)記”。本文所選擇的研究對(duì)象,其字符包括0~9和A~Z,所以具體標(biāo)記素材的方法是:為0~9和 A~Z分別建立目錄,目錄名稱為相應(yīng)數(shù)字或字母,人為判定單個(gè)字符圖片內(nèi)容,并將其拖到指定目錄中,每個(gè)目錄中大約存放100張左右的素材。

3.2 字符特征提取

字符分割后圖片大小已經(jīng)歸一化,均為:寬7個(gè)像素,高10個(gè)像素,本文選擇驗(yàn)證碼單個(gè)字符所有點(diǎn)像素特征作為特征向量,因此定義出70個(gè)特征:70個(gè)像素點(diǎn)上面的像素值。當(dāng)像素表示對(duì)象時(shí)(即其像素值為0),其特征值為1,否則其特征值為0,最后得到一組70維的特征。

3.3 生成特征和標(biāo)識(shí)對(duì)應(yīng)的訓(xùn)練數(shù)據(jù)集

將已經(jīng)標(biāo)記好的0~9和A~Z目錄下的單個(gè)字符圖片特征化,按照libSVM指定的格式生成一組帶特征值和標(biāo)記值的向量文件。生成的特征文件部分內(nèi)容如圖7所示。

每一行特征碼代表一張圖片,第一列就是該特征碼所代表的字符,示例文件中66即表示字符‘B,其他列分別表示70組特征值,冒號(hào)前為索引號(hào),冒號(hào)后為特征值。

3.4 訓(xùn)練特征標(biāo)記數(shù)據(jù)生成SVM模型

使用Python的機(jī)器學(xué)習(xí)庫libSVM,首先調(diào)用svm_read_problem函數(shù),選擇RBF 核函數(shù),輸入特征文件,然后調(diào)用svm_train函數(shù)進(jìn)行訓(xùn)練,最后調(diào)用svm_save_model以文件形式保存SVM模型。

3.5 使用SVM模型預(yù)測(cè)新的未知驗(yàn)證碼圖片集

生成SVM模型后,需要使用訓(xùn)練集之外的全新的標(biāo)記后的圖片作為測(cè)試集來對(duì)模型進(jìn)行測(cè)試。首先生成需要識(shí)別的字符驗(yàn)證碼的特征碼,將其全部標(biāo)記為0,然后將生成的文件作為測(cè)試樣本,接著調(diào)用函數(shù)svm_predict進(jìn)行預(yù)測(cè),最終返回識(shí)別結(jié)果。

4 實(shí)驗(yàn)結(jié)果分析

本文對(duì)指定高校教務(wù)系統(tǒng)的動(dòng)態(tài)驗(yàn)證碼形成持續(xù)不斷地識(shí)別,將識(shí)別的結(jié)果作為名稱保存此驗(yàn)證圖片,主要步驟如下:

(1)通過http接口,獲得驗(yàn)證碼圖片。

(2)對(duì)驗(yàn)證碼圖片進(jìn)行二值化、去除離散噪聲等預(yù)處理。

(3)使用SVM模型文件對(duì)分割后的4張單字符圖片分別進(jìn)行識(shí)別。

(4)將識(shí)別結(jié)果拼接。共識(shí)別了9000張圖片,識(shí)別率能達(dá)到100%,部分識(shí)別效果如圖8所示。

5 結(jié)語

通過實(shí)驗(yàn)數(shù)據(jù)可知,該高校的教務(wù)系統(tǒng)的驗(yàn)證碼能夠100%被識(shí)別出來,說明其驗(yàn)證碼無法有效保障網(wǎng)絡(luò)的安全,形同虛設(shè)。因?yàn)榱己玫尿?yàn)證碼的前提就是要滿足安全性,所以需要加強(qiáng)驗(yàn)證碼環(huán)節(jié)的安全性,提出如下建議:

(1)驗(yàn)證碼字符個(gè)數(shù)不固定,因?yàn)樽址麛?shù)目不確定性增加機(jī)器程序識(shí)別的難度;

(2)字符適當(dāng)扭曲或字符位置不固定,這使驗(yàn)證字符串即無固定的開始位置,也無固定的字符間隔,增加了機(jī)器識(shí)別的難度[8];

(3)使用行為驗(yàn)證碼,通過用戶的操作行為來完成驗(yàn)證。

參考文獻(xiàn)

[1]von Ahn L, Blum M, Hopper N, et al.The CAPTCHA project[EB/OL].

[2]Sun T,Neuro Y.Detail-preserving median based filters in image processing[J].Pattern Recognition Letters,1994,15(4):341-347.

[3]李卓,柴濱景,胡繼東.支持向量機(jī)在油田系統(tǒng)建模中的應(yīng)用[J].現(xiàn)代電子技術(shù),2007,30(1):162-164.

[4]Gonzalez R C.數(shù)字圖像處理[M].2版.北京:電子工業(yè)出版社,2007.

[5]王興芬,李雪燕,張繼松.基于支持向量機(jī)的網(wǎng)上銀行驗(yàn)證碼識(shí)別研究[J].計(jì)算機(jī)工程與應(yīng)用,2012,48(29):73-77.

[6]Chang CC, Lin CJ. LIBSVM: a library for support vector machines[EB/OL].[2015-08].

[7]趙振書,孫建平,朱雯.SVM在汽輪機(jī)軸系系統(tǒng)狀態(tài)監(jiān)測(cè)中的應(yīng)用[J].儀器儀表用戶,2012, 19(4):41-43.

[8]葉振.一種新型圖像驗(yàn)證碼系統(tǒng)[J].數(shù)字技術(shù)與應(yīng)用,2014(8):185-185.

猜你喜歡
Python語言支持向量機(jī)
面向計(jì)算生態(tài)的Python語言入門課程教學(xué)方案
論P(yáng)ython程序設(shè)計(jì)語言
基于Python語言的面向?qū)ο笳n程實(shí)踐教學(xué)探討
動(dòng)態(tài)場(chǎng)景中的視覺目標(biāo)識(shí)別方法分析
論提高裝備故障預(yù)測(cè)準(zhǔn)確度的方法途徑
基于熵技術(shù)的公共事業(yè)費(fèi)最優(yōu)組合預(yù)測(cè)
基于Android的Python語言英漢維電子詞典設(shè)計(jì)與實(shí)現(xiàn)
基于支持向量機(jī)的金融數(shù)據(jù)分析研究
英德市| 临漳县| 九江县| 习水县| 保德县| 肇州县| 泽州县| 班玛县| 建德市| 甘谷县| 博乐市| 兴义市| 潞城市| 林芝县| 南昌市| 琼海市| 隆化县| 沂水县| 阿图什市| 济源市| 潼关县| 馆陶县| 区。| 苏尼特右旗| 丹棱县| 富顺县| 云林县| 洱源县| 南澳县| 罗田县| 霍邱县| 临夏市| 岳普湖县| 晴隆县| 诸暨市| 山丹县| 崇义县| 泾川县| 崇信县| 威信县| 赣榆县|