聲明:該教程不會直接貼代碼,以避免凌亂,你須要先下載項目代碼(第一章)並結合來看,教程中會告訴你具體代碼放在什麼位置,以及做用,用法html
咱們將學習如何構建一個用於驗證碼識別的深度學習模型和結合爬蟲進行構建一個項目python
項目基本介紹和體驗
深度學習模型構建和訓練
自動識別知乎認證碼並實現抓取
擴展之結合scrapy,Django構建完整項目網絡
網絡模型以下圖
scrapy
具體代碼請見項目目錄Unofficial-Zhihu-API/ufzh下的orcmodel.py模塊,該模塊只有一個類LSTMOCR,該類維護了整個網絡的模型構建、可視化tensorboard的記錄、loss、優化器等等。學習
爲何要模仿驗證碼數據呢,咱們回想一下上一章節說到的咱們準備用遷移學習方案來實現知乎驗證碼的識別,而遷移學習的前提是咱們有一個別的相似的場景的模型,咱們如今就是要模仿驗證碼數據,並拿這些數據訓練獲得的模型就是咱們所說的「別的相似的場景訓練好的模型」,獲得這個模型咱們才能夠進行遷移學習。測試
咱們能夠看出知乎驗證碼(忽略傾斜等效果,由於咱們也能夠作傾斜等處理)的字體跟euphemia.ttf字體很相似,注意了是相似,你也能夠以爲它跟其餘字體相似並拿那個字體爲模版,隨意點便可,字體
敲黑板,敲黑板,知乎驗證碼除了上面的實體,還有藝術字體的空心字體,空心字體要不要也模仿呢,不用,爲啥啊,由於咱們只是須要一個「別的相似的場景訓練好的模型」,不須要包括那麼全,只須要在遷移學習的時候少許包含空心字體的訓練樣本進行遷移學習就能夠了,這也是遷移學習的強大致現優化
具體代碼請見項目目錄Unofficial-Zhihu-API/train_workspace下的pai_image.py模塊,該模塊包含ImageCaptcha類,該類create_captcha_image方法就是模仿了知乎驗證碼的生成,注意,只是模仿,類似度仍是有差距的,人眼看起來可能沒那麼大差異,可是對於像素上的差異,毛刺,平滑等等,實際上算是差異很大的spa
具體代碼請見項目目錄Unofficial-Zhihu-API/train_workspace下的main.py模塊,該模塊包含一個方法train,train方法會負責加載模型,加載圖數據以及label(由名稱分離出來)到內存中,而後進行訓練
用到的命令行參數包含在utils.py模塊中,主要的參數有:
restore 是否加載以前訓練過的參數,能夠實現斷點續接,隨時隨地斷了再繼續訓練
initial_learning_rate 初始化學習率
train_dir 訓練圖片的目錄
val_dir 驗證圖片的目錄命令行
本章節介紹了orcmodel.py模塊,該模塊包含了網絡模型,pai_image.py模塊,該模塊包含了模仿驗證碼的生成代碼,代碼用法如目錄Unofficial-Zhihu-API/train_workspace下的helper.py模塊
打開終端,cd到目錄Unofficial-Zhihu-API/train_workspace,打開ipython,並輸入下列代碼
# 刪除./data/train目錄 # 準備一下200000張圖片,你能夠調整,若是你內存很大 # 你能夠生成40萬,內存不大能夠生成5萬 # 以避免圖數據太多,內存不夠致使運行訓練的時候會報錯 import helper # 生成訓練數據 helper.gen_simulated_img('./data/train', 200000) # 地二個參數是生成200000張 # 生成驗證數據 helper.gen_simulated_img('./data/val', 2000)
生成過程當中就能夠在根目錄的data/train目錄下看到以下圖,每張圖的名稱格式爲: id_正確驗證碼.png
數據生成完畢以後,打開終端,cd到根目錄Unofficial-Zhihu-API/train_workspace
運行一下命令
python main.py --restore False --initial_learning_rate 1e-5 --train_dir data/train --val_dir data/val
訓練會產生summary日誌,能夠用tensorboard可視化查看訓練過程當中cost的變化,打開終端,cd到目錄Unofficial-Zhihu-API/train_workspace,輸入下列命令,而後打開http://localhost:6006/#scalars查看cost變化,打開http://pai-pc:6006/#graphs查看圖模型
tensorboard --logdir ./log
若是你電腦的GPU不錯,你就用tensorflow-gpu版本訓練,我是用的GTX1060 6
G的GPU訓練的,若是你沒有GPU或者GPU很爛,你能夠去用百度GPU訓練,我曾經用過,2塊多一個小時吧,還能夠接受
訓練到正確率有90%以上以後就能夠中止了,這個時候咱們就獲得一個「別的相似的場景訓練好的模型」,而後能夠進入遷移學習部分了
上面已經得到一個「別的相似的場景訓練好的模型」,可是對於真實的知乎驗證碼,識別率低到你懷疑人生,因此,我們開始進行遷移學習知乎真實驗證碼吧
在項目根目錄的data目錄下,有一份打包文件遷移學習樣本.zip,這個是我本身抓取下載並本身手工標記的2000張真實的知乎驗證碼,心累啊,2000張都標記到我手斷了,而後解壓放在./data/zhihu_train和./data/zhihu_val,由於真實的知乎驗證碼數據太珍貴了,咱們就直接讓訓練和測試數據都同樣了,而後運行下列命令進行遷移學習
python main.py --restore True --initial_learning_rate 1e-5 --train_dir data/zhihu_train --val_dir data/zhihu_val --log_dir zhihu_log
仍是同樣的用tensorboard實現可視化,不過這回咱們生成summary日誌的地址變成zhihu_log了
tensorboard --logdir ./zhihu_log
訓練到90%以上正確率就能夠了
得到本身訓練的結果以後找到python的相似site-packages/ufzh-1.0.0-py3.6.egg/ufzh/checkpoint這樣的目錄,替換裏面的checkpoint便可用本身訓練的參數進行測試,替換四個文件