天天看點

福音:不懂代碼也能用TensorFlow做驗證碼識别了

項目位址: https://github.com/kerlomz/captcha_trainer

,歡迎各位大佬們指點

長話短說,開門見山,網絡上現有的代碼以教學研究為主,對于驗證碼識别有剛需的朋友們,無需閱讀代碼,幾個參數任何人都能使用機器學習技術訓練一個模型,如本文有不嚴謹之處還請告知與諒解,此文旨在獻給不求甚解,拿來主義者。

筆者選用的時下最為流行的CNN卷積神經網絡進行端到端的驗證碼識别

懶人們僅僅需要了解一點基本的理念即可,下面筆者将帶領大家走馬觀花瞧一瞧如何為之:

1.故事從兩個配置檔案說起

config.yaml # 系統配置

# Device: The default device is CPU.
# - If you use the GPU version, you need to install some additional applications.
# TrainRegex and TestRegex: Default matching apple_20181010121212.jpg file.
# TrainsPath and TestPath: The local path of your training and testing set.
System:
  Device: 'gpu:0'
  TrainsPath: 'E:\Task\Trains\cn_exec'
  TrainRegex: '.*?(?=_.*\.)'
  TestPath: 'E:\Task\TestGroup\cn_exec'
  TestRegex: '.*?(?=_.*\.)'

# TestNum: The number of samples for each test batch.
# - A test for every saved steps, Default value is 100.
# EndAcc: Finish the training when the accuracy reaches [EndAcc*100]%.
# EndStep: Finish the training when the step is greater than the [-1: Off, EndStep >0: On] step.
# LearningRate: Find the fastest relationship between the loss decline and the learning rate.
Trains:
  TestNum: 300
  SavedStep: 100
  EndAcc: 0.97
  EndStep: -1
  LearningRate: 0.0003           

筆者十分懷念大學時光,就用校園生活的大白話捋一捋何為機器學習吧。

簡單來說,給機器刷題(訓練集),機器邊做題邊對照标準答案(結合測試集進行訓練),機器用學習收獲的結晶(模型)通過套公式寫出了标準答案(識别)。學習指的就是找到特征與标簽的映射關系。這樣當有特征而無标簽的未知資料輸入時,我們就可以通過已有的關系得到未知資料标簽。

綜上所述,我們得出了第一個結論:我們需要 訓練集 和 測試集 來訓練 模型

1.1 訓練集

大緻常見的有以下幾種方案:

  1. 人工打碼
  2. 認真分析驗證碼特征,自己生成幾乎一樣的驗證碼來代替訓練集
  3. 對接打碼平台:前提是要寫一個爬蟲,并且該爬蟲需要具備以下功能:(1)下載下傳驗證碼圖檔、(2)接入打碼平台識别驗證碼、(3)将打碼結果輸入到驗證碼網站進行對錯校驗

1.2 測試集

極力推薦外部打碼+人肉打碼混合(特别是一些機器容易識别錯的)

1.3 開始刷題

訓練集和測試集到手之後就可以開搞了。

System:
  Device: 'gpu:0' # 配置用來訓練的裝置,GPU比CPU快得多的多,但是要安裝額外的環境依賴
  TrainsPath: 'E:\Task\Trains\cn_exec' # 訓練集的存放路徑
  TrainRegex: '.*?(?=_.*\.)' # 訓練集的檔案名比對,一般有兩個原則:不重名、包含标注
  TestPath: 'E:\Task\TestGroup\cn_exec' # 同上
  TestRegex: '.*?(?=_.*\.)' # 同上           

預設的命名規則為

正确标注_時間戳.jpg

上面對應的命名規則通過正則

.*?(?=_.*\.)

提取到正确标注,是以如果不按照這個規則命名,就需要自己另寫對應于正确标注的比對正則

Trains:
  TestNum: 300 # 每個批次測試樣本數,換言之:每次小測驗出300題
  SavedStep: 100 # 訓練過程中每100個步長儲存模型,接地氣的說法:每背100個單詞消化一下
  EndAcc: 0.97 # 結束訓練的準确率名額,換句話說,100分考97分就能畢業了
  EndStep: -1 # 結束訓練的步長名額,換句話說,跑10公裡就結束了,不看成績了
  LearningRate: 0.0003 # 學習率和loss值密切相關,按預設的來就好了,一般還有幾種選項:0.1, 0.01           

2.可以嘴角開始瘋狂上揚了

先曬出模型方面的參數,不要被吓到,講一講其實很簡單的

model.yaml # 模型配置

# Convolution: The number of layers is at least 3.
# - The number below corresponds to the size of each layer of convolution.
NeuralNet:
  Convolution:
    - 32
    - 64
    - 128
  ConvCoreSize: 3
  FullConnect: 1024

# CharSet: [ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER, NUMERIC].
# ImageChannel: [1 - Gray Scale, 3 - RGB].
Model:
  ModelName: patchca
  ImageChannel: 1
  CharLength: 4
  CharSet: ALPHANUMERIC

# OriginalColor: [false - Gray Scale, true - RGB].
# Binaryzation: [-1: Off, >0 and < 255: On].
# Smoothing: [-1: Off, >0: On].
# Blur: [-1: Off, >0: On].
Pretreatment:
  OriginalColor: false
  Binaryzation: 240
  Smoothing: 3
  Blur: 5           

2.1 神經網絡

我們選用的神經網絡是最基礎的CNN模型了,一般來說就是

卷積層+池化層+卷積層+池化層...+全連接配接層

筆者曾經上課時存了一個很好了解的圖示,

斯坦福大學的CS231N的課程的傳送門

卷積運算顯然是一個線性操作,而神經網絡要拟合的是非線性的函數,是以和全連接配接網絡類似,我們需要加上激活函數,筆者的代碼選取的為ReLU函數。

池化層的作用:通過卷積操作,我們完成了對輸入向圖像的降維和特征抽取,但特征圖像的維數還是很高。維數高不僅計算耗時,而且容易導緻過拟合。為此引入了下采樣技術,也稱為pooling即池化操作。池化的做法是對圖像的某一個區域用一個值代替,如最大值或平均值。在這裡,筆者選擇的是最大值,因為前者是非線性的,一般情況下将獲得更好的效果。(筆者在此便不徒增各位的選擇困難了,私下決定在代碼裡定死)

2.2 模型

忘了和大家說一件很重要的事,光把驗證碼丢給計算機純屬耍流氓,好比要考試了,老師不告訴你考試範圍,是以,我們還要告訴機器 這圖檔對應的驗證碼是幾位的,用的是什麼字元集等,例如 “AB3D” 是 4位,字元集用的是英文+數字混合。

字元集給各位安排好了:

  • ALPHANUMERIC: 英文大小寫與數字混合
  • ALPHANUMERIC_LOWER: 英文小寫與數字混合
  • ALPHANUMERIC_UPPER: 英文大寫與數字混合
  • NUMERIC: 純數字

    注: 本來想加中文的,但大家需要知道,中文的難度太大了,這個基本的神經網絡結構完全不足以支撐,即使能訓練,最多隻有很低的識别率,訓練時間也極高,是以這個Demo就一切從簡,隻考慮最常見的

2.3 預處理

節奏很快,給了考試範圍,預處理又是為了什麼呢,這個不知道從何說起了,這個并不是必須的環節,更像是優化,好比老師出題,出的都是無限維向量空間上的泛函,一題要解一百年,那我們分析個錘子,我們通過預處理,把次元降低到一進制一次方程,識别難度降低了,識别速度也快了。

一般情況下,預處理有這麼幾種:

筆者的訓練系統自帶了 二值化、濾波、模糊

特别強調一下:為什麼網上沒人提及過模糊處理呢,待我舉個栗子:

經過處理,類型A和類型B在肉眼上看是不是很像一個模子刻出來的。濾波主要是為了降噪,二值化旨在排除顔色的幹擾,經過這些預處理,足夠解決大部分簡單的字元型驗證碼了。

2.4 開工

不用過多介紹了吧,上圖也沒講什麼,大緻就告訴我們兩樣東西:

第一,測試環節的預測報告

第二,識别率

每100步的檢驗有兩種格式輸出消息:

  1. Flag: , Predict:
  2. False, Flag: , Predict:

    輸出這些消息的意義在于,滿足筆者不肯放過每一個細節的監視欲望。

acc_on_train 說的是是準确率

注:這個100%是要強調一下的,僅僅說明抽樣的300個測試集中,預測率100%。

該模型實際線上的識别率是99.8%,大約1w個測試樣本。

感謝時間:十分感謝全國失信網的驗證碼用以學習和研究

http://zxgk.court.gov.cn/zhzxgk/captcha.do?captchaId=08578d94beef4817afaa7b9fe1c64d58&random=0.11016792282004739

再次聲明:本人未以任何形式收集該網站上的個人資訊,僅作研究學習用途,該軟體僅限于個人玩耍使用,請勿用于商業用途,否則作者概不負責。

`

3. 驚!大媽玩轉深度學習的原因竟然是

到這裡差不多已經接近尾聲了,經過封裝打包,傻瓜式訓練神器鍛造出爐。下面簡單介紹以下:

  1. CPU版不需要安裝額外的依賴,但有些版本低的電腦需要安裝VC運作時庫,還有,Win7 SP1以下是不支援TensorFlow的。

最便捷的驗證碼訓練工具 - CPU版

連結:

https://kerlomz-business.oss-cn-hangzhou.aliyuncs.com/captcha_trainer.zip

GPU版不是純傻瓜式的,CPU版呢我就放阿裡雲OSS上好了,一鍵圓夢。

最便捷的驗證碼訓練工具 - GPU版

連結:

https://pan.baidu.com/s/119CIPEzwRmAZxu6BcBrJug 密碼: nfe5

下面祭出神器界面:

筆者思前想後:光訓練模型可不行,還要會部署。

筆者準備在下一篇将祭出殺手锏“驗證碼平台一鍵部署神器