TensorFlow識別知乎驗證碼
識別知乎驗證碼
最近在爬知乎的數據,遇到了驗證碼,就想使用TensorFlow的CNN訓練一個能自動識別驗證碼的模型,說干就干!
預備知識
- Python3
- PIL庫和numpy庫
- TensorFlow
- CNN(卷積神經網路)
分析
做爬蟲請求知乎介面頻繁時,會遇到兩種驗證碼:細字體和粗字體。
如果把兩種驗證碼混合放到同一個神經網路中訓練的話,收斂會比較慢,需要的樣本量就比較大,如果手上樣本量不夠多,我們可以先訓練一個分類器,將兩種驗證碼區分開,再分別去訓練識別,這樣需要的樣本量就會少很多而且每個分類準確率都能得到保證!
最開始我樣本量不夠時就是是按照上面的做法實現的,現在樣本足夠了就可以把兩種驗證碼在樣本混合起來直接丟到CNN里訓練就好了,最後也達到不錯的準確率!
代碼鏈接在文末。
如何運行
- 把你的驗證碼樣本放到
samples
目錄下的train_mixed_captcha_base64.txt
文件中。 - 訓練模型:運行
train
目錄下的model.py
文件,直到達到你滿意的準確率為止。這時訓練好的網路結構和權重值會保存在checkpoints
目錄下。 - 在
train
模塊下的__init__.py
文件中恢復上一步訓練好的網路模型,導出predict_captcha
預測函數。 - 傳入base64編碼的圖片字元串,執行
predict_captcha
函數,得到預測結果。 - Boom!想幹嘛你就可以幹嘛了!
CNN
訓練的模型使用TensorFlow構建了一個簡單的卷積神經網路,包含一個輸入層、三個卷積層+池化層和最後一個全連接層,關於CNN的具體原理大家可以Google查一查,數據科學家N多年總結出來也不是幾句話能說清楚的,我這個初學者也只是個黑盒調參的。
使用TensorBoard可以可視化訓練的相關情況。
給大家看一下我訓練的網路結構:
準確率走勢圖:
loss曲線:
最後,使用訓練好的模型Cover到知乎線上的驗證碼平均識別準確率在90%左右,也就是兩次至少命中一次的概率為:1 - 0.1*0.1 = 0.99,夠我用啦!然後……你懂的!
源碼地址:https://github.com/lonnyzhang423/zhihu-captcha
關注微信公眾號:Python實驗課,後台回復 知乎驗證碼 免費分享一份10萬張、我千辛萬苦標記好的驗證碼樣本用於訓練 。
UPDATE
分享的文件被舉報,各位自行收集樣本吧!這樣也好,中國有句古話叫:
悶聲發大財
當知乎發現他的驗證碼被很多人都輕鬆過掉時,他又要升級驗證碼了,我又得整一波樣本。。。
Happy Coding!
推薦閱讀:
※tensorflow 為何方聖物??
※學習筆記TF037:實現強化學習策略網路
※Ubuntu下CUDA+cuDNN+源代碼方式編譯安裝TensorFlow GPU版本過程中的一些坑
※譯文 | 簡明 TensorFlow 教程:所有的模型
TAG:Python | TensorFlow | 機器學習 |