代碼編譯
1.準備工作(如何安裝依賴項)
- 推薦使用Ubuntu 18.04
- CMake >= 3.8: https://cmake.org/download/
- CUDA >= 10.0: https://developer.nvidia.com/cuda-toolkit-archive
- OpenCV >= 2.4: https://opencv.org/releases.html
- cuDNN >= 7.0 for CUDA >= 10.0 https://developer.nvidia.com/rdp/cudnn-archive
- GPU with CC >= 3.0: https://en.wikipedia.org/wiki/CUDA#GPUs_supported
- GCC
2.Linux上編譯
下載YOLOv4源碼,推薦使用Ubuntu 18.04:
sudo apt-get install -y git
git clone https://github.com/AlexeyAB/darknet.git
配置
Makefile
文件中的參數,然後運行make -j8
進行編譯,具體參數解釋如下:
-
GPU=1
使用CUDA和GPU(CUDA默認路徑爲/usr/local/cuda
) -
CUDNN=1
使用cuDNN v5-v7加速網絡(cuDNN默認路徑/usr/local/cudnn
) -
CUDNN_HALF=1
使用Tensor Cores(可用GPU爲Titan V / Tesla V100 / DGX-2或者更新的)檢測速度3x,訓練速度2x -
OPENCV=1
使用OpenCV 4.x/3.x/2.4.x,運行檢測視頻和攝像機 -
DEBUG=1
編譯調試版本 -
OPENMP=1
使用OpenMP利用多CPU加速 -
LIBSO=1
編譯darknet.so
- 使用
uselib
來運行YOLO,輸入指令如下:
LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4
- 在自己的代碼中嵌入YOLO,請參考例程:
https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
- 使用
-
ZED_CAMERA=1
增加ZED-3D相機的支持(需要先安裝好ZED SDK)- 運行
LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera
- 運行
3.常見編譯問題
/bin/sh: 1: nvcc: not found
首先確保CUDA正確安裝,並且在路徑/usr/local/cuda
下,然後輸入如下指令:
echo "PATH=/usr/local/cuda/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
include/darknet.h:46:10: fatal error: cudnn.h: No such file or directory
首先下載cuDNN
,https://developer.nvidia.com/rdp/cudnn-archive,需要根據自己的CUDA版本選擇,然後解壓,輸入指令:
sudo cp -r cudnn-10.1-linux-x64-v7.6.5.32/cuda /usr/local/cudnn
運行代碼
1.預訓練模型
所有模型都是在MS-COCO數據集上訓練,模型包括兩個文件(cfg
和weights
)
R表示在RTX 2070設備上的FPS,V表示在Tesla V100設備上的FPS
百度網盤打包下載,鏈接:https://pan.baidu.com/s/1QQPB27n18XeRDnhHA2Gxuw,提取碼:uill
-
yolov4.cfg - 245 MB: yolov4.weights
width=608 height=608
: 65.7 [email protected] | 43.5 [email protected]:0.95 - 34® FPS / 62(V) FPS - 128.5 BFlopswidth=512 height=512
: 64.9 [email protected] | 43.0 [email protected]:0.95 - 45® FPS / 83(V) FPS - 91.1 BFlopswidth=416 height=416
: 62.8 [email protected] | 41.2 [email protected]:0.95 - 55® FPS / 96(V) FPS - 60.1 BFlopswidth=320 height=320
: 60.0 [email protected] | 38.0 [email protected]:0.95 - 63® FPS / 123(V) FPS - 35.5 BFlops
-
yolov3-tiny-prn.cfg - 18.8 MB: yolov3-tiny-prn.weights
width=416 height=416
: 33.1 [email protected] - 370® FPS - 3.5 BFlops
-
enet-coco.cfg (EfficientNetB0-Yolov3) - 18.3 MB: enetb0-coco_final.weights
width=416 height=416
: 45.5 [email protected] - 55® FPS - 3.7 BFlops
-
csresnext50-panet-spp-original-optimal.cfg - 217 MB: csresnext50-panet-spp-original-optimal_final.weights
width=608 height=608
: 65.4 [email protected] | 43.2 [email protected]:0.95 - 32® FPS - 100.5 BFlops
-
yolov3-spp.cfg - 240 MB: yolov3-spp.weights
width=608 height=608
: 60.6 [email protected] - 38® FPS - 141.5 BFlops
-
yolov3.cfg - 236 MB: yolov3.weights
width=416 height=416
: 55.3 [email protected] - 66® FPS - 65.9 BFlops
-
yolov3-tiny.cfg - 33.7 MB: yolov3-tiny.weights
width=416 height=416
: 33.1 [email protected] - 345® FPS - 5.6 BFlops
可以在如下路徑找到所有的cfg文件: darknet/cfg/
2.運行指令介紹
需要將訓練好的weights
文件放到darknet
根目錄下,運行如下指令:
- 檢測單張圖像
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
- 檢測給定路徑的單張圖像(參數最後的路徑需要寫待檢測圖像的路徑)
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output /home/jario/Pictures/h1.jpg
- 檢測給定路徑的單個視頻
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
- 檢測給定路徑的單個視頻,並將檢測結果保存爲視頻
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
- 利用攝像機實時檢測(YOLOv4)
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
- 利用攝像機實時檢測(YOLOv3-Tiny)
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -c 0
- 在GPU1上檢測給定路徑的單個視頻
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
- 檢測列表
data/train.txt
中圖像,並將結果保存在result.json
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
- 檢測列表
data/train.txt
中圖像,並將結果保存在result.txt
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
如何訓練
1.如何構建自己的訓練數據
下載數據集標註工具,下載地址:(https://pan.baidu.com/s/1EE52cDStjIxsRgM_a9pWQQ) (password: 4b2q) 或者 Spire Web.
數據集管理軟件github地址:https://github.com/jario-jin/spire-image-manager
1.1 打開標註軟件 SpireImageTools_x.x.x.exe
首先點擊Tools->Setting…,填寫一個 save path (所有的標註文件都會存儲在這個文件夾中)
如果採集的數據集是視頻 (如果採集的是圖像,則調過這一步驟),點擊 Input->Video, 選擇要標註的視頻。
然後,點擊Tools->Video to Image
點擊OK 後,等待完成,結果會存儲在
1.2 打開需要標註的圖像
Input->Image Dir, 找到需要標註的圖像所在文件夾 Ctrl+A,全選,打開
點擊,Tools->Annotate Image->Instance Label,開始標註圖像
在 label 中填寫待標註目標名稱,然後將對話框拖到一邊
在主窗口中開始標註,鼠標滾輪放大縮小圖像,按住左鍵移動可視圖像區域不斷點擊左鍵將目標框包圍,
使用 Yolo 訓練時,點擊 2 個點即可
標註時,如果點錯,按鼠標右鍵可以取消
標註完成後,如果不滿意,可以點擊綠色邊框(邊框會變紅,如下圖所示),按Delete 刪除
1.3 將標註輸出爲 Yolo 格式,準備訓練
在標註完成之後,按下 Ctrl+O
點擊確定後
然後將下面 4 個文件取出用於 Yolo 訓練
2.開始訓練YOLO
使用YOLOv4和YOLOv3:
-
針對選擇的模型,下載預訓練權重:
- 對於
yolov4.cfg
,yolov4-custom.cfg
(162 MB): yolov4.conv.137 - 對於
csresnext50-panet-spp.cfg
(133 MB): csresnext50-panet-spp.conv.112 - 對於
yolov3.cfg, yolov3-spp.cfg
(154 MB): darknet53.conv.74 - 對於
yolov3-tiny-prn.cfg , yolov3-tiny.cfg
(6 MB): yolov3-tiny.conv.11 - 對於
enet-coco.cfg (EfficientNetB0-Yolov3)
(14 MB): enetb0-coco.conv.132
百度網盤打包下載,鏈接:https://pan.baidu.com/s/1CNVyyjoph7YVSXGT3vjbfQ,提取碼:4usc
- 對於
-
將
cfg/yolov4-custom.cfg
拷貝一份,重命名爲yolov4-obj.cfg
(obj
可以是自定義名稱)- 修改batch爲
batch=64
- 修改subdivisions爲
subdivisions=16
- 修改max_batches爲(
類別數量*2000
,但不要小於4000
),如訓練3個類別max_batches=6000
- 修改steps爲max_batches的0.8與0.9,如
steps=4800,5400
- 修改
classes=80
爲自定義數據集的類別數量,主要需要修改3處(3個[yolo]
層):- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L610
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L696
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L783
- 修改
filters=255
爲filters=(classes+5)x3
,在3個[yolo]
層的前一個[convolutional]
層,分別爲:- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L603
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L689
- https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L776
- 如果使用
[Gaussian_yolo]
層,修改filters=57
爲filters=(classes+9)x3
,在3個[Gaussian_yolo]
層的前一個[convolutional]
層,分別爲:- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L604
- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L696
- https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L789
例如,如果
classes=1
,則filters=18
;如果classes=2
,則filters=21
。
注意:不要在cfg
文件中直接寫:filters=(classes+5)x3)
- 修改batch爲
-
在
darknet/data
路徑下創建obj.names
,其中每一行是一個目標類別名稱- 將數據集標註得到的文件
Yolo_categories.names
重命名爲obj.names
,並放到darknet/data
下
- 將數據集標註得到的文件
-
在
darknet/data
路徑下創建obj.data
:- 教程 darknet 路徑爲
/home/user/darknet
,本文以此爲例,請根據自己的路徑進行修改。在 /home/user/darknet/cfg/ 文件夾下新建一個文件,名字叫 obj.data 在裏面寫入:
classes = 1 train = /home/user/darknet/data/coco/Yolo_20180908_234114.txt valid = /home/user/darknet/data/coco/Yolo_20180908_234114.txt names = data/obj.names backup = backup eval = coco
注意:classes 爲類別數量,對於單類檢測問題,寫 1
- 教程 darknet 路徑爲
-
將圖像文件(.jpg)與標註文件放入到如下路徑
darknet\data\coco\
路徑下- 將
scaled_images
裏的圖像拷貝到/home/user/darknet/data/coco/images/train
下 - 將
Yolo_labels
裏的標註文件拷貝到/home/user/darknet/data/coco/images/train
下 - 將
Yolo_20180908_234114.txt
拷貝到/home/user/darknet/data/coco
下
- 將
-
開始訓練
- 訓練指令:
./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137
- (對於最新100次迭代的最新權重
yolo-obj_last.weights
會保存在darknet\backup\
) - (對於每1000次迭代的權重
yolo-obj_xxxx.weights
會保存在darknet\backup\
) - (關閉Loss的顯示窗口
./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -dont_show
) - (通過瀏覽器查看訓練過程
./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
,然後打開Chrome瀏覽器,輸入http://ip-address:8090
) - (如果需要在訓練中計算mAP,每4期計算一次,需要在
obj.data
文件中設置valid=valid.txt
,運行:./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map
)
- (對於最新100次迭代的最新權重
- 訓練指令:
-
訓練結束,結果保存在
darknet\backup\yolo-obj_final.weights
- 如果訓練中斷,可以選擇一個保存的權重繼續訓練,使用
./darknet detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights
- 如果訓練中斷,可以選擇一個保存的權重繼續訓練,使用
注意:在訓練中,如果
avg
(loss)出現nan
,則訓練出了問題,如果是其他字段出現nan
,這種情況是正常的。
注意:如果需要改變cfg
文件中的width=
或height=
,新的數字需要被32整除。
注意:訓練完成後,檢測指令爲:./darknet detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
。
注意:如果出現Out of memory
,需要修改cfg文件中的subdivisions=16
爲32
或64
。
3. 訓練YOLOv3-Tiny
訓練YOLOv3-Tiny與選了YOLOv4、YOLOv3基本相同,主要有以下小區別:
- 下載yolov3-tiny預訓練權重,運行命令
./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
- 新建自定義
cfg
文件yolov3-tiny-obj.cfg
(可以複製cfg/yolov3-tiny.cfg
爲yolov3-tiny-obj.cfg
) - 運行訓練命令:
./darknet detector train data/obj.data yolov3-tiny-obj.cfg yolov3-tiny.conv.15
4.多GPU訓練
- 首先在1塊GPU上訓練1000次
./darknet detector train cfg/coco.data cfg/yolov4.cfg yolov4.conv.137
- 停止訓練,使用權重
darknet/backup/yolov4_1000.weights
,在多塊GPU上訓練,運行./darknet detector train cfg/coco.data cfg/yolov4.cfg /backup/yolov4_1000.weights -gpus 0,1,2,3
注意:如果出現
nan
,應該降低學習率,如4塊GPUlearning_rate=0.00065
(learning_rate=0.00261/GPUs),還應該增加cfg文件中的burn_in=
爲原先的4x,如burn_in=4000
5.訓練常見程序問題
注意:如果出現如下錯誤
需要修改源碼/home/user/darknet/src/data.c
將如下代碼
list *get_paths(char *filename)
{
char *path;
FILE *file = fopen(filename, "r");
if(!file)
file_error(filename);
list *lines = make_list();
while((path=fgetl(file))) {
list_insert(lines, path);
}
fclose(file);
return lines;
}
修改爲:
void ltrim(char *s)
{
char *p; p = s;
while (*p == ' ' || *p == '\t' || *p == '\r') { p++; } strcpy(s,p);
}
void rtrim(char *s)
{
int i;
i = strlen(s) - 1;
while ((s[i] == ' ' || s[i] == '\t' || s[i] == '\r') && i >= 0 ) { i--; } s[i+1] = '\0';
}
void _trim(char *s)
{
ltrim(s);
rtrim(s);
}
list *get_paths(char *filename)
{
char *path;
FILE *file = fopen(filename, "r"); if(!file) file_error(filename); list *lines = make_list(); while((path=fgetl(file))) {
_trim(path); list_insert(lines, path);
}
fclose(file); return lines;
}
保存,make -j8
重新編譯
下面爲正常訓練時畫面
6.何時應該停止訓練
通常情況下,爲每個類別迭代2000次是足夠的,且總的迭代次數不能低於4000次。但是如果想要更加精確的停止時間,可以參考以下說明:
- 在訓練過程中,你會看到一系列訓練誤差,當0.XXXXXXX avg這個參數不再下降時,就該停止訓練了
Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8
9002: 0.211667, 0.60730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds
- 9002 - 迭代數量(batch數量)
- 0.60730 avg - 平均損失(誤差),越低越好
如果發現0.XXXXXXX avg在很多次迭代後都不再降低,則是時候該停止訓練了。最終的平均損失從0.05(對於小模型和簡單訓練數據)到3.0(對於大模型和複雜訓練數據)不等。
- 當訓練停止之後,可以從
darknet\backup
中取出最新保存的訓練權重.weights
,並選擇它們中檢測效果最好的
例如,當訓練9000次停止後,效果最好的模型可能是之前保存權重中的一個(7000,8000,9000),這是因爲過擬合(Overfiting)現象。過擬合的表現可以解釋爲,在訓練圖像上檢測效果很好,但是在其他圖像上效果不佳,這時候就該儘早停止訓練(早停點)。
2.1 首先,你需要在obj.data
中指定驗證數據集valid=valid.txt
,如果你沒有準備驗證數據集,可以簡單的複製data\train.txt
爲data\valid.txt
。
2.2 如果你在迭代9000次之後停止訓練,驗證之前的模型權重可以使用如下命令:
- ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_7000.weights
- ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_8000.weights
- ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_9000.weights
然後對比每個權重(7000,8000,9000)最後一行輸出,選擇mAP(mean average precision)最高權重,或者對比IoU(intersect over union)進行選擇。
例如,yolo-obj_8000.weights的mAP最高,則使用這個權重。或者在訓練時加上-map
參數:
./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -map
結果如下圖所示,mAP每4期(Epoch)通過obj.data
中設置的驗證集valid=valid.txt
上計算一次(1期=train_txt中圖像數量 / batch
次迭代)。
運行訓練好的模型,進行目標檢測,執行:
./darknet detector test data/obj.data cfg/yolo-obj.cfg yolo-obj_8000.weights
7.如何提升檢測效果
7.1 訓練之前提升檢測效果的技巧
-
設置
.cfg
文件中random=1
,可以使用多分辨率輸入增加檢測效果:link -
在
.cfg
文件中增加網絡的輸入分辨率(設置任意可以被32整除的數字,如,height=608
,width=608
),可以增加精度 -
檢查圖像每個目標是否都被標記,圖像中的所有目標都必須被正確標記,推薦使用數據管理工具檢查:spire-image-manager
-
Loss很大,mAP很低,是不是訓練錯了?在訓練中使用
-show_imgs
參數,能夠可視化目標框真值,檢查數據集是否出了問題。 -
對於每一個你要檢測的物體,在訓練數據集中至少需要有一個實例與之相似,包括:形狀、物體側面、相對大小、旋轉角度、傾斜方位角、光照等。因此,你的訓練數據集需要包含具有不同對象屬性的圖像:比例、旋轉、光照、不同側面、不同背景等。建議對每一類物體收集2000張不同圖像,並迭代訓練2000*類別數量次。
-
推薦在訓練數據集中包含帶有不希望檢測的非標記目標的圖像。負樣本圖像不需要方框標記(空
.txt
文件),越多越好。 -
標註目標的最佳方式是:僅標註物體的可見部分,或標註物體的可見和重疊部分,或標註比整個物體稍多一點的部分(有一點間隙),標註你想讓檢測器檢測的部分。
-
如果單幅圖像中的物體很多,需要在
[yolo]
層或[region]
層中修改參數max=200
或者更高(全局最大目標檢測數量爲0,0615234375*(width*height)
)。 -
如果想要檢測小目標(圖像被縮放到後,小於的目標)
- 在https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L895修改
layers = 23
- 在https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L892修改
stride=4
- 在https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L989修改
stride=4
- 在https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L895修改
-
如果想要同時檢測大目標與小目標,可以使用修改模型:
- 全模型 - 5個yolo層:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3_5l.cfg
- 小模型 - 3個yolo層:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg
- YOLOv4 - 3個yolo層:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4-custom.cfg
-
如果你訓練的數據類別需要區分左右目標(如檢測左右手,交通信號中的左右方向),則不能使用左右翻轉圖像增強,在cfg文件中設置
flip=0
: https://github.com/AlexeyAB/darknet/blob/3d2d0a7c98dbc8923d9ff705b81ff4f7940ea6ff/cfg/yolov3.cfg#L17 -
一般規則 - 您的訓練數據集應包含待檢測目標的相對大小的集合:
train_network_width * train_obj_width / train_image_width ~= detection_network_width * detection_obj_width / detection_image_width
train_network_height * train_obj_height / train_image_height ~= detection_network_height * detection_obj_height / detection_image_height
也就是,對於測試數據集中的每個物體,訓練數據集中必須至少有一個具有相同類與大約相同相對大小的物體。如果訓練數據中僅有佔圖像面積80-90%的物體,則訓練後的網絡不能夠檢測佔圖像面積1-10%的物體。
-
如果想加速訓練(損失檢測精度),可以在cfg文件layer-136中設置參數
stopbackward=1
-
注意
物體的模型、側面、光照、尺度、方位角
等屬性,從神經網絡的內部角度來看,這些是不同的物體。因此,你想檢測的物體越多,就應該使用越複雜的網絡模型。 -
如果想要外包矩形框更加精確,可以在
[yolo]
層中增加3個參數:ignore_thresh=.9 iou_normalizer=0.5 iou_loss=giou
,這會增加[email protected],同時降低[email protected]。 -
如果你比較熟悉檢測網絡了,可以重新計算自定義數據集的錨框(Anchor):
./darknet detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
,然後設置cfg文件中3個[yolo]
層9個錨框。同時需要改變每個[yolo]
層中的錨框索引mask=
,第一層有大於的錨框,第二層有大於的錨框,第三層相同。也需要改變每個[yolo]
層之前的filters=(classes + 5)*<number of mask>
。如果許多計算出的錨框不適合在適當的層下 - 那麼就嘗試使用默認錨框。
7.2 訓練之後提升檢測效果的技巧
- 增加cfg文件中網絡輸入的分辨率,如,
height=608
,width=608
,或height=832
,width=832
,這樣可以檢測更小的目標。
如何將訓練好的模型部署到無人機上
1.TX2上的準備工作
- 推薦使用Ubuntu 18.04(可以使用JetPack刷機)
- CMake >= 3.8: https://cmake.org/download/
- CUDA >= 10.0: https://developer.nvidia.com/cuda-toolkit-archive
- cuDNN >= 7.0 for CUDA >= 10.0 https://developer.nvidia.com/rdp/cudnn-archive
- OpenCV >= 2.4: https://opencv.org/releases.html
- GCC
- ROS Melodic: http://wiki.ros.org/melodic/Installation
1.1 使用JetPack爲TX2安裝CUDA與cuDNN
-
下載JetPack,地址:https://developer.nvidia.com/embedded/jetpack
-
進入 sdkmanager-[version].[build].deb 所在的路徑,其中version和build代表相應各自的編號,安裝Debian包:
sudo apt install ./sdkmanager-[version].[build].deb
- 安裝好之後,在Terminal中輸入
sdkmanager
-
使用NVIDIA賬號登錄
-
選擇開發環境
- 在 Product Category 中選擇 Jetson.
- 在 Hardware Configuration 中選擇 target hardware(Jetson TX2),勾掉 host machine
- 在 Target Operating System 中選擇 JetPack 的版本.
- 點擊CONTINUE進入下一步
-
檢查下載組件(如果僅安裝CUDA和cuDNN,則只勾選紅圈內的選項)、選擇存儲路徑以及接收條款
- 保證Host計算機與TX2在同一局域網內,輸入TX2的IP地址就可以安裝
2.部署Darknet-ROS
- 下載darknet_ros源碼
cd ~
cd catkin_ws/src
git clone --recursive https://github.com/leggedrobotics/darknet_ros.git
cd ../
- 編譯
catkin_make -DCMAKE_BUILD_TYPE=Release
- 將訓練好的cfg和weights加載到darknet_ros中
將/home/user/darknet/cfg/yolov3-tiny.cfg
和/home/user/darknet/backup
中剛剛訓練好的參數
分別拷貝到/home/user/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config
中的cfg
和weights
兩個文件夾中
在/home/user/catkin_ws/src/darknet_ros/darknet_ros/config
文件夾中新建yolov3-tiny-obj.yaml
裏面寫入
yolo_model:
config_file:
name: yolov3-tiny-obj.cfg
weight_file:
name: yolov3-tiny-obj.weights
threshold:
value: 0.3
detection_classes:
names:
- drone
注意,在
yolov3-tiny-obj.yaml
文件中,需要指定剛纔拷貝的cfg
和weights
文件以及names
爲自己訓練的類別
在/home/user/catkin_ws/src/darknet_ros/darknet_ros/launch
文件夾中,複製一份darknet_ros.launch
,重命名爲obj_det.launch
修改裏面的
<rosparam command="load" ns="darknet_ros" file="$(find darknet_ros)/config/yolov2-tiny.yaml"/>
爲
<rosparam command="load" ns="darknet_ros" file="$(find darknet_ros)/config/yolov3-tiny-obj.yaml"/>
注意:這正式剛纔編寫的yaml文件
roslaunch darknet_ros obj_det.launch
注意:進行檢測,需要先打開一個ros_web_cam節點,以提供攝像頭數據
最後,給一張YOLOv4檢測結果的樣張吧