近年來,機器學習變得越發火熱,中國選手柯潔與AlphaGo的人機大戰更是引發熱議。目前,在圖像識別和視覺分析研究中,卷積神經網絡(CNN)技術的使用愈來愈多。Tensorflow 是由 Google 團隊開發的神經網絡模塊,短短几年間, 就已經有不少次版本的更新。最近我也在自學Tensorflow,想經過卷積神經網絡快速識別整塊驗證碼(不分割字符)。期間也碰到許多問題,諸如軟件安裝,Tensorflow版本差別等。一開始學習tensorflow是盲目的,不知如何下手,網上的資料都比較單一,爲了回報社會,讓你們少走彎路,我將詳細介紹整個過程。本教程所須要的完整材料,我都會放在這裏,密碼:5e91。限於我的水平,若有錯誤請指出!python
接下來我將介紹如何使用Python+Tensorflow的CNN技術快速識別驗證碼。在此以前,介紹咱們用到的工具:git
1. PyCharm社區版(python的IDE):寫代碼很是方便,安裝第三方庫(tensorflow 1.2.1)操做簡單。windows
2. Python3:當我還在猶豫py2仍是py3的時候,tensorflow已能支持windows、py3了,而且python3表明將來,建議使用Python3。網絡
3. Photoshop:用於驗證碼的分析和處理(在這裏不須要你精通)。機器學習
本文將從如下幾個方面來介紹:函數
驗證碼分析和處理—— tensorflow安裝 —— 模型訓練 —— 模型預測工具
網上搜索驗證碼識別可以獲得不少教程,但大部分都是將驗證碼切割成單個字符訓練,有時候 驗證碼字符大小不一或者發生重疊,切割驗證碼變得不適用。所以經過CNN技術將整塊驗證碼進行識別,能使問題變得更加簡單(如下操做對其餘驗證碼分析有參考做用)。學習
在這裏咱們選擇模擬學習這樣的驗證碼:測試
該驗證碼來源於這裏(正如sci-hub網站所言」to remove all barriers in the way of science」,知識就該如此)。優化
原始的驗證碼
該驗證碼只由六位小寫字母、噪點和干擾線組成,若是能去除噪點和干擾線,可以大大下降學習的難度。不少驗證碼的噪點和干擾線RGB值和字母的不一致,這個咱們能經過Photoshop來分析,使用顏色取樣器工具,分別在圖片噪點、干擾線、空白處和字母處點擊得到RGB值,以下圖:
顏色取樣器得到RGB值
分析後發現,只要將圖片二值化只保留字母,就能獲得不錯的輸入圖片:
處理後的圖片
實現代碼以下:
驗證碼處理代碼
以上就是驗證碼處理方法,爲了下面的分析方便,我將處理好的驗證碼打包放到這裏,密碼:5e91。
若是你查看了官方文檔會發現提供了不少安裝方式,可是仍是比較複雜。針對不一樣的系統,不一樣設備(CPU or GPU)都不同,我在這裏選擇用pycharm直接安裝tensorflow很是好用,並且跟python版本兼容,不用考慮過多。打開pycharm,在菜單欄裏flie-settings-project-project interpreter,選擇python3 interpreter,
添加第三方庫
而後點擊+按鈕,輸入tensorflow,install package。
添加tensorflow庫
至此,tensorflow就在電腦上安裝好了,很是簡單吧,我安裝的時候版本是1.2.1。準備工做所有結束。
若是你對卷積神經網絡或者Python代碼實現還不熟悉,我推薦你先看看《tensorflow實戰》黃文堅著這本書,比官方文檔詳細多。搞清楚代碼如何實現後,再來看接下來的內容(畢竟我也是花了時間走彎路的)。
首先,咱們先輸入驗證碼的信息備用,圖片是114*450像素,最大有6個字母,每一個字母經過26個0或1表示,好比a表示成10000000000000000000000000
,b表示成01000000000000000000000000
,以此類推。
驗證碼信息
接下來定義一個函數,隨機從訓練集(3430張)中提取驗證碼圖片,因爲驗證碼通過我手動打標籤(碼了6小時),在這裏只要獲取驗證碼的名字和圖片就夠了,我默認放在"F:/captcha4/"
目錄下,須要注意的是返回的圖片是以矩陣的形式。
獲取驗證碼名字和圖片
接下來定義兩個函數,將名字轉變成向量,將向量轉變成名字。
名字向量互轉
生成一個訓練batch,也就是採樣的大小,默認一次採集64張驗證碼做爲一次訓練,須要注意經過get_name_and_image()
函數得到的image是一個含布爾值的矩陣,在這裏經過1*(image.flatten())
函數轉變成只含0和1的1行114*450列的矩陣。
採樣batch
接下來定義卷積神經網絡結構,咱們採用3個卷積層加1個全鏈接層的結構,在每一個卷積層中都選用2*2的最大池化層和dropout層,卷積核尺寸選擇5*5。須要注意的是在全鏈接層中,咱們的圖片114*450已經通過了3層池化層,也就是長寬都壓縮了8倍,獲得15*57大小。
卷積神經網絡結構
結構創建好後就能夠開始訓練了,在這裏選擇的sigmoid_cross_entropy_with_logits()
交叉熵來比較loss,用adam優化器來優化。輸出每一步的loss值,每100步,輸出一次準確率。在這裏我調節當準確率達到99%後,結束訓練。須要注意的是,keep_prob = 0.5
,這個參數控制着過擬合,當咱們機器學習速度過快的時候,能夠減少該值,讓機器遺忘的多一點(像人同樣,記得多不必定好,哈哈)。
訓練模型
訓練完成後,你應該會獲得以下幾個文件。在這裏我花了將近9個小時跑了1800步,達到99.5%的準確率。輸出文件的詳細介紹參考這裏。
模型輸出文件
咱們的模型訓練成功後,咱們就要檢驗一下該模型的預測水平,在這裏咱們首先要把train_crack_captcha_cnn()
函數註釋掉,而後再定義一個預測模型的函數crack_captcha()
,須要注意爲了從預測集中抽數據,這裏的get_name_and_image()
函數調用"F:/captcha5/"
目錄下的10張預測圖片。
更改到預測集文件夾
從預測集中隨機預測10次
預測結果以下:
預測結果對比
通過比較,我發現10張預測的能有4張準確,這還有待改進,可是總體上仍是達到了個人要求。畢竟訓練集的準確率有99.5%。若是我調低keep_prob
的值,增長樣本量,增長卷積層,最後的預測效果應該會更好。完整代碼詳見
總之,經過上面這個教程,只是教你們如何經過tensorflow的CNN技術處理整塊驗證碼,你們能夠嘗試着用其餘驗證碼試試,可是樣本量越多越好。
首先本文教你們如何簡單處理驗證碼,而後介紹了tensorflow的快速安裝方式,最後經過實現了CNN下整塊驗證碼的識別,訓練集準確率達到99.5%,測試集準確率在40%左右。若是調低keep_prob的值,增長樣本量,增長卷積層,最後的預測效果應該會更好。
但願你們之後在tensorflow的學習道路中少點阻礙!!!