近年來(lái),機(jī)器學(xué)習(xí)變得愈加火熱,中國(guó)選手柯潔與AlphaGo的人機(jī)大戰(zhàn)更是引起熱議。目前,在圖像識(shí)別和視覺分析研究中,卷積神經(jīng)網(wǎng)絡(luò)(CNN)技術(shù)的使用越來(lái)越多。Tensorflow是由 Google 團(tuán)隊(duì)開發(fā)的神經(jīng)網(wǎng)絡(luò)模塊,短短幾年間, 就已經(jīng)有很多次版本的更新。最近我也在自學(xué)Tensorflow,想通過卷積神經(jīng)網(wǎng)絡(luò)快速識(shí)別整塊驗(yàn)證碼(不分割字符)。期間也碰到許多問題,諸如軟件安裝,Tensorflow版本差異等。一開始學(xué)習(xí)tensorflow是盲目的,不知如何下手,網(wǎng)上的資料都比較單一,為了回報(bào)社會(huì),讓大家少走彎路,我將詳細(xì)介紹整個(gè)過程。本教程所需要的完整材料,我都會(huì)放在這里。限于個(gè)人水平,如有錯(cuò)誤請(qǐng)指出!
接下來(lái)我將介紹如何使用Python+Tensorflow的CNN技術(shù)快速識(shí)別驗(yàn)證碼。在此之前,介紹我們用到的工具:
1.PyCharm社區(qū)版(python的IDE):寫代碼非常方便,安裝第三方庫(kù)(tensorflow 1.2.1)操作簡(jiǎn)單。
2.Python3:當(dāng)我還在猶豫py2還是py3的時(shí)候,tensorflow已能支持windows、py3了,并且python3代表未來(lái),建議使用Python3。
3.Photoshop:用于驗(yàn)證碼的分析和處理(在這里不需要你精通)。
本文將從以下幾個(gè)方面來(lái)介紹:
驗(yàn)證碼分析和處理——tensorflow安裝 ——模型訓(xùn)練——模型預(yù)測(cè)
驗(yàn)證碼分析和處理
網(wǎng)上搜索驗(yàn)證碼識(shí)別能夠得到很多教程,但大部分都是將驗(yàn)證碼切割成單個(gè)字符訓(xùn)練,有時(shí)候 驗(yàn)證碼字符大小不一或者發(fā)生重疊,切割驗(yàn)證碼變得不適用。因此通過CNN技術(shù)將整塊驗(yàn)證碼進(jìn)行識(shí)別,能使問題變得更加簡(jiǎn)單(以下操作對(duì)其他驗(yàn)證碼分析有參考作用)。
在這里我們選擇模擬學(xué)習(xí)這樣的驗(yàn)證碼:
該驗(yàn)證碼來(lái)源于這里(正如sci-hub網(wǎng)站所言"to remove all barriers in the way of science",知識(shí)就該如此)。

原始的驗(yàn)證碼
該驗(yàn)證碼只由六位小寫字母、噪點(diǎn)和干擾線組成,如果能去除噪點(diǎn)和干擾線,能夠大大降低學(xué)習(xí)的難度。很多驗(yàn)證碼的噪點(diǎn)和干擾線RGB值和字母的不一致,這個(gè)我們能通過Photoshop來(lái)分析,使用顏色取樣器工具,分別在圖片噪點(diǎn)、干擾線、空白處和字母處點(diǎn)擊獲得RGB值,如下圖:

顏色取樣器獲得RGB值
分析后發(fā)現(xiàn),只要將圖片二值化只保留字母,就能得到不錯(cuò)的輸入圖片:

處理后的圖片
實(shí)現(xiàn)代碼如下:

驗(yàn)證碼處理代碼
以上就是驗(yàn)證碼處理方法,為了下面的分析方便,我將處理好的驗(yàn)證碼打包放到這里。
Tensorflow安裝
如果你查看了官方文檔會(huì)發(fā)現(xiàn)提供了很多安裝方式,但是還是比較復(fù)雜。針對(duì)不同的系統(tǒng),不同設(shè)備(CPU or GPU)都不一樣,我在這里選擇用pycharm直接安裝tensorflow非常好用,而且跟python版本兼容,不用考慮過多。打開pycharm,在菜單欄里flie-settings-project-project interpreter,選擇python3 interpreter,

添加第三方庫(kù)
然后點(diǎn)擊+按鈕,輸入tensorflow,install package。

添加tensorflow庫(kù)
至此,tensorflow就在電腦上安裝好了,非常簡(jiǎn)單吧,我安裝的時(shí)候版本是1.2.1。準(zhǔn)備工作全部結(jié)束。
模型訓(xùn)練
如果你對(duì)卷積神經(jīng)網(wǎng)絡(luò)或者Python代碼實(shí)現(xiàn)還不熟悉,我推薦你先看看《tensorflow實(shí)戰(zhàn)》黃 文堅(jiān)著這本書,比官方文檔詳細(xì)多。搞清楚代碼如何實(shí)現(xiàn)后,再來(lái)看接下來(lái)的內(nèi)容(畢竟我也是花了時(shí)間走彎路的)。
首先,我們先輸入驗(yàn)證碼的信息備用,圖片是114*450像素,最大有6個(gè)字母,每個(gè)字母通過26個(gè)0或1表示,比如a表示成10000000000000000000000000,b表示成01000000000000000000000000,以此類推。

驗(yàn)證碼信息
接下來(lái)定義一個(gè)函數(shù),隨機(jī)從訓(xùn)練集(3430張)中提取驗(yàn)證碼圖片,由于驗(yàn)證碼經(jīng)過我手動(dòng)打標(biāo)簽(碼了6小時(shí)),在這里只要獲取驗(yàn)證碼的名字和圖片就夠了,我默認(rèn)放在"F:/captcha4/"目錄下,需要注意的是返回的圖片是以矩陣的形式。

獲取驗(yàn)證碼名字和圖片
接下來(lái)定義兩個(gè)函數(shù),將名字轉(zhuǎn)變成向量,將向量轉(zhuǎn)變成名字。

名字向量互轉(zhuǎn)
生成一個(gè)訓(xùn)練batch,也就是采樣的大小,默認(rèn)一次采集64張驗(yàn)證碼作為一次訓(xùn)練,需要注意通過get_name_and_image()函數(shù)獲得的image是一個(gè)含布爾值的矩陣,在這里通過1*(image.flatten())函數(shù)轉(zhuǎn)變成只含0和1的1行114*450列的矩陣。

采樣batch
接下來(lái)定義卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),我們采用3個(gè)卷積層加1個(gè)全連接層的結(jié)構(gòu),在每個(gè)卷積層中都選用2*2的最大池化層和dropout層,卷積核尺寸選擇5*5。需要注意的是在全連接層中,我們的圖片114*450已經(jīng)經(jīng)過了3層池化層,也就是長(zhǎng)寬都?jí)嚎s了8倍,得到15*57大小。

卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
結(jié)構(gòu)建立好后就可以開始訓(xùn)練了,在這里選擇的sigmoid_cross_entropy_with_logits()交叉熵來(lái)比較loss,用adam優(yōu)化器來(lái)優(yōu)化。輸出每一步的loss值,每100步,輸出一次準(zhǔn)確率。在這里我調(diào)節(jié)當(dāng)準(zhǔn)確率達(dá)到99%后,結(jié)束訓(xùn)練。需要注意的是,keep_prob = 0.5,這個(gè)參數(shù)控制著過擬合,當(dāng)我們機(jī)器學(xué)習(xí)速度過快的時(shí)候,可以減小該值,讓機(jī)器遺忘的多一點(diǎn)(像人一樣,記得多不一定好,哈哈)。

訓(xùn)練模型
訓(xùn)練完成后,你應(yīng)該會(huì)得到如下幾個(gè)文件。在這里我花了將近9個(gè)小時(shí)跑了1800步,達(dá)到99.5%的準(zhǔn)確率。輸出文件的詳細(xì)介紹參考這里。

模型輸出文件
模型預(yù)測(cè)
我們的模型訓(xùn)練成功后,我們就要檢驗(yàn)一下該模型的預(yù)測(cè)水平,在這里我們首先要把train_crack_captcha_cnn()函數(shù)注釋掉,然后再定義一個(gè)預(yù)測(cè)模型的函數(shù)crack_captcha(),需要注意為了從預(yù)測(cè)集中抽數(shù)據(jù),這里的get_name_and_image()函數(shù)調(diào)用"F:/captcha5/"目錄下的10張預(yù)測(cè)圖片。

更改到預(yù)測(cè)集文件夾

從預(yù)測(cè)集中隨機(jī)預(yù)測(cè)10次
預(yù)測(cè)結(jié)果如下:

預(yù)測(cè)結(jié)果對(duì)比
經(jīng)過比較,我發(fā)現(xiàn)10張預(yù)測(cè)的能有4張準(zhǔn)確,這還有待改進(jìn),但是整體上還是達(dá)到了我的要求。畢竟訓(xùn)練集的準(zhǔn)確率有99.5%。如果我調(diào)低keep_prob的值,增加樣本量,增加卷積層,最后的預(yù)測(cè)效果應(yīng)該會(huì)更好。完整代碼詳見
總之,通過上面這個(gè)教程,只是教大家如何通過tensorflow的CNN技術(shù)處理整塊驗(yàn)證碼,大家可以嘗試著用其他驗(yàn)證碼試試,但是樣本量越多越好。
總結(jié)
首先本文教大家如何簡(jiǎn)單處理驗(yàn)證碼,然后介紹了tensorflow的快速安裝方式,最后通過實(shí)現(xiàn)了CNN下整塊驗(yàn)證碼的識(shí)別,訓(xùn)練集準(zhǔn)確率達(dá)到99.5%,測(cè)試集準(zhǔn)確率在40%左右。如果調(diào)低keep_prob的值,增加樣本量,增加卷積層,最后的預(yù)測(cè)效果應(yīng)該會(huì)更好。
希望大家以后在tensorflow的學(xué)習(xí)道路中少點(diǎn)阻礙?。?!
作者:MrLonelyZC88
鏈接:http://www.itdecent.cn/p/26ff7b9075a1
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。