使用Python+Tensorflow的CNN技術(shù)快速識別驗證碼

原文地址:https://finthon.com/python-tensorflow-cnn-captcha/

近年來,機器學習變得愈加火熱,中國選手柯潔與AlphaGo的人機大戰(zhàn)更是引起熱議。目前,在圖像識別和視覺分析研究中,卷積神經(jīng)網(wǎng)絡(CNN)技術(shù)的使用越來越多。Tensorflow 是由 Google 團隊開發(fā)的神經(jīng)網(wǎng)絡模塊,短短幾年間, 就已經(jīng)有很多次版本的更新。最近我也在自學Tensorflow,想通過卷積神經(jīng)網(wǎng)絡快速識別整塊驗證碼(不分割字符)。期間也碰到許多問題,諸如軟件安裝,Tensorflow版本差異等。一開始學習tensorflow是盲目的,不知如何下手,網(wǎng)上的資料都比較單一,為了回報社會,讓大家少走彎路,我將詳細介紹整個過程。本教程所需要的完整材料,我都會放在這里,密碼:5e91。限于個人水平,如有錯誤請指出!


接下來我將介紹如何使用Python+Tensorflow的CNN技術(shù)快速識別驗證碼。在此之前,介紹我們用到的工具:

1. PyCharm社區(qū)版(python的IDE):寫代碼非常方便,安裝第三方庫(tensorflow 1.2.1)操作簡單。

2. Python3:當我還在猶豫py2還是py3的時候,tensorflow已能支持windows、py3了,并且python3代表未來,建議使用Python3。

3. Photoshop:用于驗證碼的分析和處理(在這里不需要你精通)。

本文將從以下幾個方面來介紹:

驗證碼分析和處理—— tensorflow安裝 —— 模型訓練 —— 模型預測


驗證碼分析和處理

網(wǎng)上搜索驗證碼識別能夠得到很多教程,但大部分都是將驗證碼切割成單個字符訓練,有時候 驗證碼字符大小不一或者發(fā)生重疊,切割驗證碼變得不適用。因此通過CNN技術(shù)將整塊驗證碼進行識別,能使問題變得更加簡單(以下操作對其他驗證碼分析有參考作用)。

在這里我們選擇模擬學習這樣的驗證碼:

該驗證碼來源于這里(正如sci-hub網(wǎng)站所言"to remove all barriers in the way of science",知識就該如此)。

原始的驗證碼

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

顏色取樣器獲得RGB值

分析后發(fā)現(xiàn),只要將圖片二值化只保留字母,就能得到不錯的輸入圖片:

處理后的圖片

實現(xiàn)代碼如下:

驗證碼處理代碼

以上就是驗證碼處理方法,為了下面的分析方便,我將處理好的驗證碼打包放到這里,密碼:5e91。


Tensorflow安裝

如果你查看了官方文檔會發(fā)現(xiàn)提供了很多安裝方式,但是還是比較復雜。針對不同的系統(tǒng),不同設備(CPU or GPU)都不一樣,我在這里選擇用pycharm直接安裝tensorflow非常好用,而且跟python版本兼容,不用考慮過多。打開pycharm,在菜單欄里flie-settings-project-project interpreter,選擇python3 interpreter,

添加第三方庫

然后點擊+按鈕,輸入tensorflow,install package。

添加tensorflow庫

至此,tensorflow就在電腦上安裝好了,非常簡單吧,我安裝的時候版本是1.2.1。準備工作全部結(jié)束。


模型訓練

如果你對卷積神經(jīng)網(wǎng)絡或者Python代碼實現(xiàn)還不熟悉,我推薦你先看看《tensorflow實戰(zhàn)》黃 文堅著這本書,比官方文檔詳細多。搞清楚代碼如何實現(xiàn)后,再來看接下來的內(nèi)容(畢竟我也是花了時間走彎路的)。

首先,我們先輸入驗證碼的信息備用,圖片是114*450像素,最大有6個字母,每個字母通過26個0或1表示,比如a表示成10000000000000000000000000,b表示成01000000000000000000000000,以此類推。

驗證碼信息

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

獲取驗證碼名字和圖片

接下來定義兩個函數(shù),將名字轉(zhuǎn)變成向量,將向量轉(zhuǎn)變成名字。

名字向量互轉(zhuǎn)

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

采樣batch

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

卷積神經(jīng)網(wǎng)絡結(jié)構(gòu)

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

訓練模型

訓練完成后,你應該會得到如下幾個文件。在這里我花了將近9個小時跑了1800步,達到99.5%的準確率。輸出文件的詳細介紹參考這里

模型輸出文件

模型預測

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

更改到預測集文件夾
從預測集中隨機預測10次

預測結(jié)果如下:

預測結(jié)果對比

經(jīng)過比較,我發(fā)現(xiàn)10張預測的能有4張準確,這還有待改進,但是整體上還是達到了我的要求。畢竟訓練集的準確率有99.5%。如果我調(diào)低keep_prob的值,增加樣本量,增加卷積層,最后的預測效果應該會更好。完整代碼詳見


總之,通過上面這個教程,只是教大家如何通過tensorflow的CNN技術(shù)處理整塊驗證碼,大家可以嘗試著用其他驗證碼試試,但是樣本量越多越好。


總結(jié)

首先本文教大家如何簡單處理驗證碼,然后介紹了tensorflow的快速安裝方式,最后通過實現(xiàn)了CNN下整塊驗證碼的識別,訓練集準確率達到99.5%,測試集準確率在40%左右。如果調(diào)低keep_prob的值,增加樣本量,增加卷積層,最后的預測效果應該會更好。

希望大家以后在tensorflow的學習道路中少點阻礙!!!

可能感興趣


使用Python+Tensorflow的CNN技術(shù)快速識別驗證碼

"笨方法"學習CNN圖像識別(一)—— 圖片預處理

"笨方法"學習CNN圖像識別(二)—— tfrecord格式高效讀取數(shù)據(jù)

"笨方法"學習CNN圖像識別(三)—— ResNet網(wǎng)絡訓練及預測


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內(nèi)容