項目位址: 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 測試集
極力推薦外部打碼+人肉打碼混合(特别是一些機器容易識别錯的)
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步的檢驗有兩種格式輸出消息:
- Flag: , Predict:
-
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. 驚!大媽玩轉深度學習的原因竟然是
到這裡差不多已經接近尾聲了,經過封裝打包,傻瓜式訓練神器鍛造出爐。下面簡單介紹以下:
- 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
下面祭出神器界面:
筆者思前想後:光訓練模型可不行,還要會部署。
筆者準備在下一篇将祭出殺手锏“驗證碼平台一鍵部署神器