darknet簡述


概述

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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM