TensorFlow識別知乎驗證碼

識別知乎驗證碼

最近在爬知乎的數據,遇到了驗證碼,就想使用TensorFlow的CNN訓練一個能自動識別驗證碼的模型,說干就干!

預備知識

  1. Python3
  2. PIL庫和numpy庫
  3. TensorFlow
  4. CNN(卷積神經網路)

分析

做爬蟲請求知乎介面頻繁時,會遇到兩種驗證碼:細字體和粗字體。

如果把兩種驗證碼混合放到同一個神經網路中訓練的話,收斂會比較慢,需要的樣本量就比較大,如果手上樣本量不夠多,我們可以先訓練一個分類器,將兩種驗證碼區分開,再分別去訓練識別,這樣需要的樣本量就會少很多而且每個分類準確率都能得到保證!

最開始我樣本量不夠時就是是按照上面的做法實現的,現在樣本足夠了就可以把兩種驗證碼在樣本混合起來直接丟到CNN里訓練就好了,最後也達到不錯的準確率!


代碼鏈接在文末。

如何運行

  1. 把你的驗證碼樣本放到samples目錄下的train_mixed_captcha_base64.txt文件中。
  2. 訓練模型:運行train目錄下的model.py文件,直到達到你滿意的準確率為止。這時訓練好的網路結構和權重值會保存在checkpoints目錄下。
  3. train模塊下的__init__.py文件中恢復上一步訓練好的網路模型,導出predict_captcha預測函數。
  4. 傳入base64編碼的圖片字元串,執行predict_captcha函數,得到預測結果。
  5. Boom!想幹嘛你就可以幹嘛了!

CNN

訓練的模型使用TensorFlow構建了一個簡單的卷積神經網路,包含一個輸入層、三個卷積層+池化層和最後一個全連接層,關於CNN的具體原理大家可以Google查一查,數據科學家N多年總結出來也不是幾句話能說清楚的,我這個初學者也只是個黑盒調參的。

使用TensorBoard可以可視化訓練的相關情況。

給大家看一下我訓練的網路結構

網路結構

準確率走勢圖

準確率曲線

loss曲線

loss曲線

最後,使用訓練好的模型Cover到知乎線上的驗證碼平均識別準確率在90%左右,也就是兩次至少命中一次的概率為:1 - 0.1*0.1 = 0.99,夠我用啦!然後……你懂的!

源碼地址github.com/lonnyzhang42


關注微信公眾號:Python實驗課,後台回復 知乎驗證碼 免費分享一份10萬張、我千辛萬苦標記好的驗證碼樣本用於訓練 。


UPDATE

分享的文件被舉報,各位自行收集樣本吧!這樣也好,中國有句古話叫:

悶聲發大財

當知乎發現他的驗證碼被很多人都輕鬆過掉時,他又要升級驗證碼了,我又得整一波樣本。。。

Happy Coding!

推薦閱讀:

tensorflow 為何方聖物??
學習筆記TF037:實現強化學習策略網路
Ubuntu下CUDA+cuDNN+源代碼方式編譯安裝TensorFlow GPU版本過程中的一些坑
譯文 | 簡明 TensorFlow 教程:所有的模型

TAG:Python | TensorFlow | 機器學習 |