使用darknet識別點選驗證碼詳細過程(附帶源碼)

項目源碼:github.com/nickliqian/…python

darknet_captcha

項目基於darknet開發了一系列的快速啓動腳本,旨在讓圖像識別新手或者開發人員可以快速的啓動一個目標檢測(定位)的項目。 若是有沒有講清楚的地方,歡迎提issue和PR,但願能和你們共同完善!git

本項目分爲兩個部分:github

  1. 提供兩個目標檢測(單分類和多分類點選驗證碼)的例子,你能夠經過例子熟悉定位yolo3定位網絡的使用方式
  2. 基於darknet提供一系列API,用於使用本身的數據進行目標檢測模型的訓練,並提供web server的代碼
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

目錄

項目結構

項目分爲darknet、extent、app三部分web

  1. darknet: 這部分是darknet項目源碼,沒有做任何改動。
  2. extent: 擴展部分,包含生成配置生成樣本訓練識別demoapi程序
  3. app: 每個新的識別需求都以app區分,其中包含配置文件、樣本和標籤文件等。

開始一個例子:單類型目標檢測

以點選驗證碼爲例 darknet實際上給咱們提供了一系列的深度學習算法,咱們要作的就是使用比較簡單的步驟來調用darknet訓練咱們的識別模型。算法

  • 推薦使用的操做系統是ubuntu,遇到的坑會少不少。
  • 若是使用windowns系統,須要先安裝cygwin,便於編譯darknet。(參考個人博客:安裝cygwin

下面的步驟都已經經過ubuntu16.04測試。ubuntu

1.下載項目

git clone https://github.com/nickliqian/darknet_captcha.git
複製代碼

2.編譯darknet

進入darknet_captcha目錄,下載darknet項目,覆蓋darknet目錄:vim

cd darknet_captcha
git clone https://github.com/pjreddie/darknet.git
複製代碼

進入darknet目錄,修改darknet/Makefile配置文件api

cd darknet
vim Makefile
複製代碼
  • 若是使用GPU訓練則下面的GPU=1
  • 使用CPU訓練則下面的GPU=0
GPU=1
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
複製代碼

而後使用make編譯darknetbash

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.總結

咱們識別點選驗證碼的大體流程以下:

  1. 蒐集樣本
  2. 打標籤(標註座標和字符)
  3. 訓練定位器
  4. 檢測位置,切割圖片
  5. 訓練分類器
  6. 使用定位器+分類器識別點選驗證碼上字符的位置和字符類別

第二個例子:多類型目標檢測

步驟和上面基本上一致,直接把命令列出來:

# 生成配置文件
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
複製代碼

報錯解決辦法

  1. UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f621' in posit
    參考連接
  2. pip install, locale.Error: unsupported locale setting
    參考連接

TODO

  1. 支持多類別檢測的識別和訓練 Done
  2. WebServer API調用 Done
  3. 分類器
相關文章
相關標籤/搜索