概述
darknet官網:https://pjreddie.com/darknet/ https://github.com/AlexeyAB/darknet
Darknet是一個比較小眾的深度學習框架,沒有社區,主要靠作者團隊維護,所以推廣較弱,用的人不多。而且由於維護人員有限,功能也不如tensorflow等框架那么強大,但是該框架還是有一些獨有的優點:
1.易於安裝:在makefile里面選擇自己需要的附加項(cuda,cudnn,opencv等)直接make即可,幾分鍾完成安裝;
2.沒有任何依賴項:整個框架都用C語言進行編寫,可以不依賴任何庫,連opencv作者都編寫了可以對其進行替代的函數;
3.結構明晰,源代碼查看、修改方便:其框架的基礎文件都在src文件夾,而定義的一些檢測、分類函數則在example文件夾,可根據需要直接對源代碼進行查看和修改;
4.友好python接口:雖然darknet使用c語言進行編寫,但是也提供了python的接口,通過python函數,能夠使用python直接對訓練好的.weight格式的模型進行調用;
5.易於移植:該框架部署到機器本地十分簡單,且可以根據機器情況,使用cpu和gpu,特別是檢測識別任務的本地端部署,darknet會顯得異常方便。
darknet是一個純C的輕量級框架,專為Yolo設計,是yolo的最佳配合平台,可以體驗yolo功能。
darknet目錄
cfg文件夾內是一些模型的架構,每個cfg文件類似與caffe的prototxt文件,通過該文件定義的整個模型的架構。
data文件夾內放置了一些label文件,如coco9k的類別名等,和一些樣例圖(該文件夾主要為演示用,或者是直接訓練coco等對應數據集時有用,如果要用自己的數據自行訓練,該文件夾內的東西都不是我們需要的)
src文件夾內全是最底層的框架定義文件,所有層的定義等最基本的函數全部在該文件夾內,可以理解為該文件夾就是框架的源碼
examples文件夾是更為高層的一些函數,如檢測函數,識別函數等,這些函數直接調用了底層的函數,我們經常使用的就是example中的函數
include文件夾,顧名思義,存放頭文件的地方
scripts文件夾中是一些腳本,如下載coco數據集,將voc格式的數據集轉換為訓練所需格式的腳本等
darknet.py是使用python對模型的調用方法,要實現python的調用,還需要用到darknet的動態庫libdarknet.so
darknet編譯
根據配置情況修改Makefile的相關參數,然后運行make即可。
GPU=1: build with CUDA to accelerate by using GPU (CUDA should be in /usr/local/cuda) CUDNN: build with cuDNN v5-v7 to accelerate training by using GPU (cuDNN should be in /usr/local/cudnn) CUDNN_HALF=1: build for Tensor Cores (on Titan V / Tesla V100 / DGX-2 and later) speedup Detection 3x, Training 2x OPENCV=1: build with OpenCV 4.x/3.x/2.4.x - allows to detect on video files and video streams from network cameras or web-cams DEBUG=1: build debug version of Yolo OPENMP=1: build with OpenMP support to accelerate Yolo by using multi-core CPU
檢驗:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights data/dog.jpg
darknet命令
如果使用的是作者提供的cfg模型結構,如yolov3,那么可以到其官網去下載預訓練模型(如:darknet53.conv.74)來初始化模型參數,這樣可以加快收斂。
訓練: darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74
無參考模型: darknet detector train data/obj.data yolo-obj.cfg
檢測: darknet detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
檢測模型精確效果:darknet detector map data/obj.data yolo-obj.cfg yolo-obj_8000.weights
視頻檢測: darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights my.mp4
默認第一個攝像頭視頻: darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
darknet配置文件解析
cfg/yolov3.cfg [net] # Testing # batch=1 # subdivisions=1 # Training batch=64 subdivisions=16 width=608 height=608 channels=3 momentum=0.9 decay=0.0005 angle=0 saturation = 1.5 exposure = 1.5 hue=.1
其中batch表示batchsize,而subdivisions是為了解決想要大batchsize而顯存又不夠的情況,每次代碼只讀取batchsize/subdivisions 個圖像,如圖中設置為64/16=4,但是會將16次的結果也就是64張圖的結果,作為一個batch來統一處理。
根據自己檢測的類別,將每個[yolo](共有三個[yolo])下方的classes修改為自己需要檢測的類別,如果只檢測一類則classes=1。
然后將每個[yolo] 上方的第一個filters的值進行修改,計算方式為(5+classes)*3,如果classes為1,則為18。
[yolo]下方的random表示論文中提及的resize network來增強網絡的適應性,如果顯存足夠,最好設置為1,如果顯存不夠,也可以將其設置為0,即不進行network resizing
darknet訓練參數解析
[to do]
Yolo_mark-標注工具
Windows & Linux GUI for marking bounded boxes of objects in images for training Yolo v3 and v2.
Yolo_mark是一個檢測任務數據集制作工具,制作完成后的數據格式不是VOC或者COCO的數據格式,從它的名字也可以看出,它是專門為了YOLO系列的網絡訓練准備數據的,它沒有使用任何一個已有的深度學習框架來實現他的代碼,而是自己寫了一個純C的輕量級框架—darknet,所以它的訓練數據准備也不是按照標准開源數據集那樣的格式。
參考官網:https://github.com/AlexeyAB/Yolo_mark
編譯
Yolo_mark依賴opencv,ubuntu16.04下需要更新opencv版本,默認版本編譯出錯。現測試了opencv-3.4.8可正常運行。
mkdir build cd build cmake .. make cd .. cp build/yolo_mark ..
目錄
├── CMakeLists.txt ├── LICENSE ├── linux_mark.sh ├── main.cpp ├── README.md ├── x64 │ └── Release │ ├── data │ │ ├── img │ │ │ ├── air1.jpg │ │ │ ├── air1.txt │ │ │ ├── air2.jpg │ │ │ ├── air2.txt │ │ │ ├── air3.jpg │ │ │ ├── air3.txt │ │ │ ├── air4.jpg │ │ │ ├── air4.txt │ │ │ ├── air5.jpg │ │ │ ├── air5.txt │ │ │ ├── air6.jpg │ │ │ ├── air6.txt │ │ │ ├── bird1.jpg │ │ │ ├── bird1.txt │ │ │ ├── bird2.jpg │ │ │ ├── bird2.txt │ │ │ ├── bird3.jpg │ │ │ ├── bird3.txt │ │ │ ├── bird4.jpg │ │ │ └── bird4.txt │ │ ├── obj.data │ │ ├── obj.names │ │ └── train.txt │ ├── train_obj.cmd │ ├── yolo_mark.cmd │ └── yolo-obj.cfg ├── yolo_mark ├── yolo_mark.sln └── yolo_mark.vcxproj
x86/Release/data: 存放需要標注的數據與標注后的結果。
x86/Release/data/img: 訓練的數據集,里面包含圖片和每一張圖片對應的標注數據。開始標注之前,img文件夾內只存放需要標注的圖像數據(要求.jpg文件),一張圖片標注完成后,會給該圖片生成一個名字相同的.txt文件,里面存放的就是bbox的信息。
x86/Release/data/img/*.txt: 每一行都是一個目標的信息,這意味着有幾行數據,圖像中就標注了幾個目標,它根據“id x y w h”的形式存放,其中“ x y w h”都是經過歸一化之后的。比如bird4.txt文件中的結果(bird的id是1,有一個目標因此只有一行):
1 0.526953 0.502083 0.303906 0.226389
x86/Release/data/train.txt: 數據集的相對路徑集合,由img文件夾內存放的數據自動獲取。
x64/Release/data/img/air1.jpg x64/Release/data/img/air2.jpg x64/Release/data/img/air3.jpg x64/Release/data/img/air4.jpg x64/Release/data/img/air5.jpg x64/Release/data/img/air6.jpg x64/Release/data/img/bird1.jpg x64/Release/data/img/bird2.jpg x64/Release/data/img/bird3.jpg x64/Release/data/img/bird4.jpg
x86/Release/data/obj.names: 數據集所有分類類名,每個類別的名稱都在單獨的一行,行數與名稱一一對應。示例中有兩個類別:air,bird。
air
bird
x86/Release/data/obj.data: 數據集的配置信息:類別數量,訓練和測試數據的txt文件列表,各個類別的名字。
classes= 2 train = data/train.txt valid = data/train.txt names = data/obj.names backup = backup/
標注命令
./yolo_mark x64/Release/data/img x64/Release/data/train.txt x64/Release/data/obj.names
訓練命令
拷貝yolo-obj.cfg, data/train.txt, data/obj.names, data/obj.data, darknet19_448.conv.23 and data/img到可執行文件darknet目錄
darknet detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23
參考:
1. YOLOv3樹葉識別實踐 https://wenku.baidu.com/view/e4e9a41ef4335a8102d276a20029bd64793e626f.html
2. 理解YOLOv2訓練過程中輸出參數含義 https://blog.csdn.net/dcrmg/article/details/78565440
https://timebutt.github.io/static/understanding-yolov2-training-output/
3. YOLOv3訓練自己的模型 https://blog.csdn.net/StrongerL/article/details/81023603
4. darknet的編譯和YOLO在不同編譯條件的運行速度對比 https://www.jianshu.com/p/c2a90b89fc21
5. Darknet概述 https://blog.csdn.net/u010122972/article/details/83541978
6. https://github.com/AlexeyAB/Yolo_mark
7. YOLO系列網絡訓練數據准備工具—Yolo_mark https://blog.csdn.net/chaipp0607/article/details/80009195