使用darknet識別點選驗證碼詳細過程(附帶原始碼)
專案基於darknet開發了一系列的快速啟動指令碼,旨在讓影象識別新手或者開發人員能夠快速的啟動一個目標檢測(定位)的專案。 如果有沒有講清楚的地方,歡迎提issue和PR,希望能和大家共同完善!
本專案分為兩個部分:
- 提供兩個目標檢測( 單分類和多分類點選驗證碼 )的例子,你可以通過例子熟悉定位yolo3定位網路的使用方式
- 基於darknet提供一系列API,用於使用 自己的資料 進行目標檢測模型的訓練,並提供web server的程式碼
目錄
專案結構
專案分為 darknet、extent、app
三部分
- darknet: 這部分是 darknet 專案原始碼,沒有作任何改動。
- extent: 擴充套件部分,包含 生成配置 、 生成樣本 、 訓練 、 識別demo 、 api程式 。
- app: 每一個新的識別需求都以app區分,其中包含配置檔案、樣本和標籤檔案等。
開始一個例子:單型別目標檢測
以點選驗證碼為例darknet實際上給我們提供了一系列的深度學習演算法,我們要做的就是使用比較簡單的步驟來呼叫darknet訓練我們的識別模型。
- 推薦使用的作業系統是
ubuntu
,遇到的坑會少很多。 - 如果使用windowns系統,需要先安裝
cygwin
,便於編譯darknet。(參考我的部落格:安裝cygwin)
下面的步驟都已經通過 ubuntu16.04
測試。
1.下載專案
git clone https://github.com/nickliqian/darknet_captcha.git 複製程式碼
2.編譯darknet
進入 darknet_captcha
目錄,下載 darknet
專案,覆蓋 darknet
目錄:
cd darknet_captcha git clone https://github.com/pjreddie/darknet.git 複製程式碼
進入 darknet
目錄,修改 darknet/Makefile
配置檔案
cd darknet vim Makefile 複製程式碼
- 如果使用GPU訓練則下面的GPU=1
- 使用CPU訓練則下面的GPU=0
GPU=1 CUDNN=0 OPENCV=0 OPENMP=0 DEBUG=0 複製程式碼
然後使用 make
編譯 darknet
:
make 複製程式碼
不建議使用CPU進行訓練,因為使用CPU不管是訓練還是預測,耗時都非常久。
如果你需要租用臨時且價格低的GPU主機進行測試,後面介紹了一些推薦的GPU雲服務。
如果在編譯過程中會出錯,可以在darknet的issue找一下解決辦法,也可以發郵件找我要舊版本的darknet。
3.安裝python3環境
使用pip執行下面的語句,並確保你的系統上已經安裝了tk:
pip install -r requirement.txt sudo apt-get install python3-tk 複製程式碼
4.建立一個應用
進入根目錄,執行下面的程式生成一個應用的基本配置:
cd darknet_captcha python3 extend/create_app_config.py my_captcha 1 複製程式碼
這裡的類別預設生成 classes_1
,你可以修改類別名稱;
開啟 app/my_captcha/my_captcha.names
修改 classes_1
為主機想要的名稱即可。
如何檢視 create_app_config.py
的命令列引數解釋?
直接執行 python create_app_config.py
便可以在控制檯檢視,下面的程式也是如此。
如果你對darknet相關配置有一定的瞭解,可以直接開啟檔案修改引數的值,這裡我們保持原樣即可。
5.生成樣本
生成樣本使用另外一個專案 nickliqian/generate_click_captcha
這裡我已經整合進去了,執行下面的命令生成樣本和對應標籤到指定應用中 yolo
規定的目錄:
python3 extend/generate_click_captcha.py my_captcha 複製程式碼
執行 python generate_click_captcha.py
檢視引數解釋。
6.劃分訓練集和驗證集
執行下面的程式,劃分訓練集和驗證集,同時將標籤的值轉換為 yolo
認識的格式:
python3 extend/output_label.py my_captcha 1 複製程式碼
這裡填寫的種類需要與上面一致。 執行 python output_label.py
檢視引數解釋。
7.開始訓練
到這裡,我們要準備的東西還差一樣,我們需要下載darknet提供的預訓練模型放在 darknet_captcha
目錄下:
wget https://pjreddie.com/media/files/darknet53.conv.74 複製程式碼
在 darknet_captcha
目錄下,執行下面的命令開始訓練:
./darknet/darknet detector train app/my_captcha/my_captcha.data app/my_captcha/my_captcha_train.yolov3.cfg darknet53.conv.74 複製程式碼
訓練過程中模型會每一百次迭代儲存一次,儲存在 app/my_captcha/backup/
下,可以進行檢視。
8.識別效果
使用 GTX 1060
訓練大概1.5小時,訓練迭代到1000次,會有比較明顯的效果。

我們找一張驗證集的圖片使用不同進度下的模型進行識別測試,執行下面的語句開始識別:
python3 extend/rec.py my_captcha 100 複製程式碼
這裡的100是選擇 app/my_captcha/images_data/JPEGImages
目錄下的第一百張圖片進行識別。
執行 python rec.py
檢視引數解釋。
迭代300次:

迭代800次:

迭代1000次:

迭代1200次:

9.圖片切割
這部分比較簡單,網上有很多示例程式碼,可以呼叫 darknet_interface.cut_and_save
方法把定位到的字元切割下來。

10.分類器
到分類這一步就比較容易了,可以使用darknet自帶的分類器,也可以使用 cnn_captcha 一個使用卷積神經網路識別驗證碼的專案。
11.總結
我們識別點選驗證碼的大致流程如下:
- 蒐集樣本
- 打標籤(標註座標和字元)
- 訓練定位器
- 檢測位置,切割圖片
- 訓練分類器
- 使用定位器+分類器識別點選驗證碼上字元的位置和字元類別
第二個例子:多型別目標檢測
步驟和上面基本上一致,直接把命令列出來:
# 生成配置檔案 python3 extend/create_app_config.py dummy_captcha 2 # 生成圖片 python3 extend/generate_click_captcha.py dummy_captcha 500 True # 輸出標籤到txt python3 extend/output_label.py dummy_captcha 2 # 開始訓練w ./darknet/darknet detector train app/dummy_captcha/dummy_captcha.data app/dummy_captcha/dummy_captcha_train.yolov3.cfg darknet53.conv.74 # 識別測試 python3 extend/rec.py dummy_captcha 100 複製程式碼
訓練自己的資料
下面的過程教你如何訓練自己資料。
假定我們要建立一個識別路上的車和人的應用,因此類別數量為2。
假定你現在有一些原始圖片,首先你需要給這些圖片打上標籤,推薦使用 labelImg 進行打標工作。
使用教程可以自行谷歌,軟體介面大致如下:

給圖片中的人和車分別打上person和car的標籤,會生成xml標籤檔案。
接下來,我們建立一個應用,應用名稱是 car
,類別為 2
類,同時生成一些配置檔案:
python3 extend/create_app_config.py car 2 複製程式碼
app/car/JPEGImages
,把xml標籤檔案放在
app/car/Annotations
yolo訓練的時候需要圖片中目標的相對座標,所以這裡需要把xml的座標計算為相對座標的形式。
同時car.data中需要分別定義訓練集和驗證集的樣本路徑,這裡會劃分出訓練集和驗證集,同時生成兩個txt檔案記錄其路徑。
python3 extend/output_label.py car 2 複製程式碼
要提到的是,這裡可以開啟car.names,把裡面的class_1和class_2分別修改為car和person,這裡識別結果就會輸出car和person。 然後就可以開始訓練了:
./darknet/darknet detector train app/car/car.data app/car/car_train.yolov3.cfg darknet53.conv.74 複製程式碼
識別測試和上面也沒有上面區別:
# 識別測試 python3 extend/rec.py car 100 複製程式碼
web服務
啟動web服務:
python3 extend/web_server.py 複製程式碼
啟動前需要按需修改配置引數:
# 生成識別物件,需要配置引數 app_name = "car"# 應用名稱 config_file = "app/{}/{}_train.yolov3.cfg".format(app_name, app_name)# 配置檔案路徑 model_file = "app/{}/backup/{}_train.backup".format(app_name, app_name)# 模型路徑 data_config_file = "app/{}/{}.data".format(app_name, app_name)# 資料配置檔案路徑 dr = DarknetRecognize( config_file=config_file, model_file=model_file, data_config_file=data_config_file ) save_path = "api_images"# 儲存圖片的路徑 複製程式碼
使用下面的指令碼 request_api.py
進行web服務的識別測試(注意修改圖片路徑):
python3 extend/request_api.py 複製程式碼
返回響應,響應包含目標類別和中心點位置:
介面響應: { "speed_time(ms)": 16469, "time": "15472704635706885", "value": [ [ "word", 0.9995613694190979, [ 214.47508239746094, 105.97418212890625, 24.86412811279297, 33.40662384033203 ] ], ... } 複製程式碼
API文件
暫無
其他問題
使用阿里雲OSS加速下載
如果你使用國外雲主機進行訓練,訓練好的模型的下載速度確實是一個問題。
這裡推薦使用阿里雲oss,在雲主機上把檔案上傳上去,然後使用oss下載下來。
配置祕鑰:
# 從環境變數獲取金鑰 AccessKeyId = os.getenv("AccessKeyId") AccessKeySecret = os.getenv("AccessKeySecret") BucketName = os.getenv("BucketName") 複製程式碼
上傳圖片:
python3 extend/upload2oss.py app/my_captcha/images_data/JPEGImages/1_15463317590530567.jpg python3 extend/upload2oss.py text.jpg 複製程式碼
GPU雲推薦
使用租用 vectordash GPU雲主機,ssh連線集成了Nvidia深度學習環境的ubuntu16.04系統
包含以下工具或框架:
CUDA 9.0, cuDNN, Tensorflow, PyTorch, Caffe, Keras 複製程式碼
vectordash提供了一個客戶端,具備遠端連線、上傳和下載檔案、管理多個雲主機等。
下面是幾種顯示卡的租用價格:

建立例項後,面板會提供一個祕鑰,輸入祕鑰後,就可以使用客戶端操作了:
# 安裝客戶端 pip install vectordash --upgrade # 登入 vectordash login # 列出主機 vectordash list # ssh登入 vectordash ssh <instance_id> # 開啟jupyter vectordash jupyter <instance_id> # 上傳檔案 vectordash push <instance_id> <from_path> <to_path> # 下載檔案 vectordash pull <instance_id> <from_path> <to_path> 複製程式碼
由於vectordash主機在國外,所以上傳和下載都很慢,建議臨時租用一臺阿里雲競價突發型例項(約7分錢一小時)作為中轉使用。
CPU和GPU識別速度對比
GTX 1060, 識別耗時1s
[load model] speed time: 4.691879987716675s [detect image - i] speed time: 1.002530813217163s 複製程式碼
CPU, 識別耗時13s
[load model] speed time: 3.313053846359253s [detect image - i] speed time: 13.256595849990845s 複製程式碼