項目源碼:github.com/nickliqian/…python
項目基於darknet開發了一系列的快速啓動腳本,旨在讓圖像識別新手或者開發人員可以快速的啓動一個目標檢測(定位)的項目。 若是有沒有講清楚的地方,歡迎提issue和PR,但願能和你們共同完善!git
本項目分爲兩個部分:github
項目分爲darknet、extent、app
三部分web
以點選驗證碼爲例 darknet實際上給咱們提供了一系列的深度學習算法,咱們要作的就是使用比較簡單的步驟來調用darknet訓練咱們的識別模型。算法
ubuntu
,遇到的坑會少不少。cygwin
,便於編譯darknet。(參考個人博客:安裝cygwin)下面的步驟都已經經過ubuntu16.04
測試。ubuntu
git clone https://github.com/nickliqian/darknet_captcha.git
複製代碼
進入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=1
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
複製代碼
而後使用make
編譯darknet
:bash
make
複製代碼
不建議使用CPU進行訓練,由於使用CPU不論是訓練仍是預測,耗時都很是久。
若是你須要租用臨時且價格低的GPU主機進行測試,後面介紹了一些推薦的GPU雲服務。
若是在編譯過程當中會出錯,能夠在darknet的issue找一下解決辦法,也能夠發郵件找我要舊版本的darknet。網絡
使用pip執行下面的語句,並確保你的系統上已經安裝了tk:
pip install -r requirement.txt
sudo apt-get install python3-tk
複製代碼
進入根目錄,運行下面的程序生成一個應用的基本配置:
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相關配置有必定的瞭解,能夠直接打開文件修改參數的值,這裏咱們保持原樣便可。
生成樣本使用另一個項目 nickliqian/generate_click_captcha
這裏我已經集成進去了,執行下面的命令生成樣本和對應標籤到指定應用中yolo
規定的目錄:
python3 extend/generate_click_captcha.py my_captcha
複製代碼
運行python generate_click_captcha.py
查看參數解釋。
運行下面的程序,劃分訓練集和驗證集,同時將標籤的值轉換爲yolo
認識的格式:
python3 extend/output_label.py my_captcha 1
複製代碼
這裏填寫的種類須要與上面一致。 運行python output_label.py
查看參數解釋。
到這裏,咱們要準備的東西還差同樣,咱們須要下載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/
下,能夠進行查看。
使用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次:這部分比較簡單,網上有不少示例代碼,能夠調用darknet_interface.cut_and_save
方法把定位到的字符切割下來。
到分類這一步就比較容易了,可使用darknet自帶的分類器,也可使用cnn_captcha一個使用卷積神經網絡識別驗證碼的項目。
咱們識別點選驗證碼的大體流程以下:
步驟和上面基本上一致,直接把命令列出來:
# 生成配置文件
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服務:
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
]
],
...
}
複製代碼
暫無
若是你使用國外雲主機進行訓練,訓練好的模型的下載速度確實是一個問題。
這裏推薦使用阿里雲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
複製代碼
使用租用 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分錢一小時)做爲中轉使用。
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
複製代碼