中文專案:快速識別驗證碼,CNN也能為爬蟲保駕護航
本專案使用卷積神經網路識別字符型圖片驗證碼,其基於TensorFlow 框架。它封裝了非常通用的校驗、訓練、驗證、識別和呼叫 API,極大地減低了識別字符型驗證碼花費的時間和精力。
專案地址:https://github.com/nickliqian/cnn_captcha
1 專案介紹
1.1 關於驗證碼識別
驗證碼識別大多是爬蟲會遇到的問題,也可以作為影象識別的入門案例。這裡介紹一下使用傳統的影象處理和機器學習演算法,它們都涉及多種技術:
影象處理
-
前處理(灰度化、二值化)
-
影象分割
-
裁剪(去邊框)
-
影象濾波、降噪
-
去背景
-
顏色分離
-
旋轉
機器學習
-
SVM
使用這類方法對使用者的要求較高,且由於圖片的變化型別較多,處理的方法不夠通用,經常花費很多時間去調整處理步驟和相關演算法。
而使用卷積神經網路,只需要通過簡單的前處理,就可以實現大部分靜態字元型驗證碼的端到端識別,效果很好、通用性很高。
這裡列出目前常用的驗證碼生成庫:
1.2 目錄結構
1.3 依賴項
-
tensorflow
-
flask
-
requests
-
PIL
-
matplotlib
pip3 install tensorflow flask requests PIL matplotlib
1.4 模型結構
2 如何使用
2.1 資料集
原始資料集可以存放在./sample/origin 目錄中,為了便於處理,圖片最好以 2e8j_17322d3d4226f0b5c5a71d797d2ba7f7.jpg 格式命名(標籤_序列號. 字尾)。
2.2 配置檔案
建立一個新專案前,需要自行修改相關配置檔案:
圖片資料夾 sample_conf.origin_image_dir = "./sample/origin/"# 原始檔案 sample_conf.train_image_dir = "./sample/train/"# 訓練集 sample_conf.test_image_dir = "./sample/test/"# 測試集 sample_conf.api_image_dir = "./sample/api/"# api接收的圖片儲存路徑 sample_conf.online_image_dir = "./sample/online/"# 從驗證碼url獲取的圖片的儲存路徑 # 模型資料夾 sample_conf.model_save_dir = "./model/"# 訓練好的模型儲存路徑 # 圖片相關<mark data-type="technologies" data-id="2e982b73-88e2-41e8-a430-f7ae5a9af4bf">引數</mark> sample_conf.image_width = 80# 圖片寬度 sample_conf.image_height = 40# 圖片高度 sample_conf.max_captcha = 4# 驗證碼字元個數 sample_conf.image_suffix = "jpg"# 圖片檔案字尾 # 驗證碼字元相關<mark data-type="technologies" data-id="2e982b73-88e2-41e8-a430-f7ae5a9af4bf">引數</mark> # 驗證碼識別結果類別 sample_conf.char_set = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] # 驗證碼遠端連結 sample_conf.remote_url = "https://www.xxxxx.com/getImg"
具體配置的作用會在使用相關指令碼的過程中提到。
2.3 驗證和拆分資料集
執行下面的檔案會校驗原始圖片集的尺寸和測試圖片是否能開啟,並按照 19:1 的比例拆分出訓練集和測試集。所以需要分別建立和指定三個資料夾:origin,train,test 用於存放相關檔案。
也可以修改為不同的目錄,但是最好修改為絕對路徑。資料夾建立好之後,執行以下命令即可:
python3 verify_and_split_data.py
2.4 訓練模型
建立好訓練集和測試集之後,就可以開始訓練模型了,這裡不具體介紹 tensorflow 安裝相關問題,讀者可檢視官網。確保圖片相關引數和目錄設定正確後,執行以下命令開始訓練:
python3 train_model.py
也可以呼叫類開始訓練或執行一次簡單的識別演示:
from train_model import TrainModel from sample import sample_conf # 匯入配置 train_image_dir = sample_conf["train_image_dir"] char_set = sample_conf["char_set"] model_save_dir = sample_conf["model_save_dir"] tm = TrainModel(train_image_dir, char_set, model_save_dir) tm.train_cnn()# 執行訓練 tm.recognize_captcha()# 識別演示
2.5 批量驗證
使用測試集的圖片進行驗證,輸出準確率。
python3 test_batch.py
也可以呼叫類進行驗證:
from test_batch import Test<mark data-type="technologies" data-id="e3995dcb-2c96-4671-b7ed-d5f2abae3c08">Batch</mark> from sample import sample_conf # 匯入配置 test_image_dir = sample_conf["test_image_dir"] model_save_dir = sample_conf["model_save_dir"] char_set = sample_conf["char_set"] total = 100# 驗證的圖片總量 tb = Test<mark data-type="technologies" data-id="e3995dcb-2c96-4671-b7ed-d5f2abae3c08">Batch</mark>(test_image_dir, char_set, model_save_dir, total) tb.test_batch()# 開始驗證
2.6 啟動 WebServer
專案已經封裝好載入模型和識別圖片的類,啟動 web server 後呼叫介面就可以使用識別服務。啟動 web server:
python3 recognize_api.py
介面 url 為 http://127.0.0.1:6000/b
2.7 呼叫介面
使用 requests 呼叫介面:
url = "http://127.0.0.1:6000/b" files = {'image_file': (image_file_name, open('captcha.jpg', 'rb'), 'application')} r = requests.post(url=url, files=files)
返回的結果是一個 json:
{ 'time': '1542017705.9152594', 'value': 'jsp1', }
檔案 recognize_online.py 是使用介面線上識別的例子。