目標檢測框架——Darknet YOLOv4

前言

目標檢測的模型還是很多的,要挨個挨個學還是有點喫力(精力旺盛可忽略),所以這裏總結一下當前流行的目標檢測的框架:darknet yolov4,mmdetection2.0,detectron2.0。至於這三個框架怎麼去選擇,我的答案是隻有你真正懂了,上手試了這幾個框架之後你才能比較它們之間的優劣。

1 Darknet YOLOv4 配置

我的環境:WIN10,CUDA10.1,cuDNN7.6.4,Anaconda,VS2019,OpenCV3.4.10,GTX1660(6G內存)

  1. Windows10 這幾個框架全都是在windows10上配置成功的(符合大多數不懂Linux的朋友)。windows10不用我多說,windows7的小夥伴找個機會趕緊升級吧,不然接下來的很多操作你會不適應。
  2. CUDA10.1 各個版本的CUDA下載(沒有CUDA的小夥伴你就放棄吧,真心跑不動)。
  3. cuDNN7.6.4 cuDNN官方下載地址(需要註冊NVIDIA賬號下載)。
  4. Python3.7 這個Anaconda已經自帶。
  5. VS2019 進入VS官網下載社區版
  6. OpenCV3.4.10 官網下載3.4.10版本
  7. YOLO v4 GitHub下載YOLO v4項目並解壓。
  8. 複製OpenCV文件opencv\build\x64\vc15\bin的兩個dll文件: opencv_ffmpeg340_64.dllopencv_world340.dll複製到darknet\build\darknet\x64
  9. 配置VS2019 見下

具體如何將上述軟件整合到一起的操作,詳見:WIN10+YOLOv4,windows上完美執行YOLOv4目標檢測

2 YOLOv4如何使用

  1. Yolo v4 COCO - 檢測一張圖片: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
  2. 輸出被檢測物體座標: darknet.exe detector test cfg/coco.data yolov4.cfg yolov4.weights -ext_output dog.jpg
  3. Yolo v4 COCO - 檢測一段視頻: darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
  4. Yolo v4 COCO - 本地攝像頭檢測: darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
  5. Yolo v4 COCO 智能網絡攝像頭(海康): darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg
  6. Yolo v4 - 保存結果視頻文件res.avi: darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
  7. Yolo v3 Tiny COCO - 視頻: darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4
  8. JSON和MJPEG服務器,允許來自您的軟件瀏覽器或Web瀏覽器ip-address:80708090的多個連接: ./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
  9. Yolo v3 Tiny 在 GPU #1上: darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
  10. 替代方法Yolo v3 COCO-檢測圖片: darknet.exe detect cfg/yolov4.cfg yolov4.weights -i 0 -thresh 0.25
  11. 在Amazon EC2上進行訓練,以使用URL來查看mAP和丟失圖表,例如: http://ec2-35-160-228-91.us-west-2.compute.amazonaws.com:8090 在Chrome / Firefox中(Darknet應該使用OpenCV進行編譯): ./darknet detector train cfg/coco.data yolov4.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
  12. 186 MB 的Yolo9000-檢測圖片: darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights
  13. 如果使用cpp api構建應用程序,請記住將data / 9k.treedata / coco9k.map放在應用程序的同一文件夾下。
  14. 要處理圖像列表data/train.txt並將檢測結果保存到result.json文件中,請使用: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
  15. 處理圖像列表data/train.txt並保存檢測結果以result.txt供使用:
    darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
  16. Pseudo-lableing - 處理圖像列表data/new_train.txt並將檢測結果以Yolo訓練格式保存爲每個圖像作爲標籤<image_name>.txt(通過這種方式,您可以增加訓練數據量)使用: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25 -dont_show -save_labels < data/new_train.txt
  17. 計算 anchors: darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
  18. 檢查 mAP@IoU=50: darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
  19. 檢查 mAP@IoU=75: darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75
  20. YOLOv4-tiny調用攝像頭 darknet.exe detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -c 0
  21. YOLOv4-tiny調用海康攝攝像頭 darknet.exe detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights rtsp://admin:[email protected]:554/Streaming/Channels/1

3 YOLOv4訓練自己的數據集

3.1 labelme製作數據集

這裏先說明一下爲什麼我要選擇labelme來製作數據集,鑑於目前網上大多數都是採用的labelimg來製作YOLO的數據,但是思考到一個問題:

  • 如果每用一個框架或者訓練一個網絡就去重新制作一次數據集,這樣會不會重複做一無用功?

所以我才用labelme來製作數據集,最明顯的優點就是既可以目標檢測又可以實力分割。

至於如何用labelme來標記數據,不會的自己百度,很簡單。

3.2 labelme2voc

由於目前網絡上很多都是針對VOC數據集的,所以主要是如何將labelme製作的數據轉化爲VOC格式的數據。(我知道daknet一定可以直接訓練coco格式的數據格式,由於資料過少,就沒有具體去嘗試,有會的大佬還望不吝賜教)

在data目錄下創建一個VOCdevkit文件夾,格式如下:

x64
├── backup
├── cfg
├── configs
├── voc
├── data
│   ├── VOCdevkit
│   │   ├── VOC2007
│   │   │	├── Annotations
│   │   │	├── ImageSets
│   │   │	├── JPEGImages
│   │   │	├── labels

labelme製作的json文件並不能直接使用,需要轉換工具轉換成VOC數據集文件的格式。去GitHub下載labelme2voc.py文件,然後修改裏面的文件路徑。主要修改以下兩個地方:

#1.標籤路徑
labelme_path = "./labelme/"              #原始labelme標註數據路徑
saved_path = "./VOCdevkit/VOC2007/"                #保存路徑

(如果報錯,那就把錯誤打印出來在百度,很快就能解決)。

完成了上面的轉化就生成了標準的VOC數據格式。

3.3 voc_label

YOLO並不能直接訓練VOC的數據格式,還需要轉化成YOLO自己的數據格式。
數據準備完畢後,打開voc/voc_label.py修改以下幾個地方:

  1. 第七行:sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
  2. 將第9行改爲自己數據集的類別名稱:classes = ["cat","dog"]
    更改完成保存。將voc_label.py複製到data文件夾下,運行命令python voc_label.py

VOCdevkit/VOC2007路徑在可以看到labels文件夾,並且在data文件夾內會有2007_test.txt2007_train.txt2007_val.txt這三個文件。至此數據集準備完畢。

3.4 修改配置文件

  1. 修改data/voc.data
classes= 1
train  = data/2007_train.txt
valid  = data/2007_val.txt
#difficult = data/difficult_2007_test.txt
names = data/voc.names
backup = backup/


  1. 2.修改data/voc.names將裏面改成自己類別的名字。
  2. 修改cfg/yolov4-custom.cfg

3.5 修改cfg/yolov4-custom.cfg

cfg/yolov4-custom.cfg總共有6處修改:

  1. yolov4-cat.cfg文件第1-7行如下:
    ----------------------------------------------------------------
    [net]
    # Testing
    #batch=1
    #subdivisions=1
    # Training
    batch=64
    subdivisions=16
    ----------------------------------------------------------------
    注意:由於是進行訓練,這裏不需要修改。訓練過程中可能出現CUDA out of memory的提示,可將這裏的subdivisions增大,如32或64,但是數值越大耗時越長,因此需要權衡一下;

  2. yolov4-cat.cfg文件第8-9行將608修改爲416:
    ----------------------------------------------------------------
    width=416
    height=416
    ----------------------------------------------------------------
    注意:這裏也可不改,如果原始的數值608可能會導致CUDA out of memory的提示,而且這裏的數值必須是32的倍數,這裏也是數值越大耗時越長;

  3. 第20行的參數max_batches也要修改,原始值爲500500,max_batches = classes*2000,但是max_batches不要低於訓練的圖片張數,這裏只訓練1類,因此max_batches = 2000

  4. 第22行的參數steps=1600,1800,這兩個數值分別爲`max_batches的80%和90%;

  5. 繼續修改yolov4-cat.cfg文件,按Ctrl+F鍵,搜索“classes”,一共有3處,先定位到第一處,將classes=80改爲classes=1,並將classes前面最近的filters修改爲18,計算由來(classes+5)*3=18

  6. 繼續修改yolov4-cat.cfg文件,按照上面的步驟同樣修改第二處和第三處的classes;

繼續修改

進入darknet/data文件夾下,創建名稱爲cat.names的文件(參考該文件夾voc.names文件的寫法),在cat.names文件中添加類別名稱,本次實驗只需添加cat即可;

進入darknet/cfg文件夾下,創建名稱爲cat.data的文件,在該文件中添加相關內容,一共5行,參考示例voc.data文件,類別改爲1;
----------------------------------------------------------------
classes= 1
train = ~/darknet/data/cat_data/train.txt
valid = ~/darknet/data/cat_data/test.txt
names = data/cat.names
backup = backup/
----------------------------------------------------------------
(1)其中第二行和第三行分別爲train.txttest.txt所在的路徑,第5行改爲前面新建的cat.names

(2)這裏的train.txt和test.txt`前一篇博客中第1步生成的文件;

(3)第5行backup = backup/不能寫成其它路徑,否則會報錯;

3.6 訓練和測試

訓練

打開命令行窗口進入darknet目錄下,並輸入以下指令:

#單GPU
C:\Darknet\darknet-master\build\darknet\x64>.\darknet.exe detector train cfg/voc.data  cfg/yolov4-custom.cfg yolov4.conv.137 

#多GPU
C:\Darknet\darknet-master\build\darknet\x64>.\darknet.exe detector train cfg/voc.data  cfg/yolov4-custom.cfg yolov4.conv.137 -gpus 0,1,2,3

訓練的過程中,生成的權重文件會存放在/darknet/backup文件夾下,訓練過程每隔一段時間會生成一個.weights文件;

訓練的一些輸出說明:

  1. Region xx: cfg文件中yolo-layer的索引;
  2. Avg IOU:當前迭代中,預測的box與標註的box的平均交併比,越大越好,期望數值爲1;
  3. Class: 標註物體的分類準確率,越大越好,期望數值爲1;
  4. obj: 越大越好,期望數值爲1;
  5. No obj: 越小越好;
  6. .5R: 以IOU=0.5爲閾值時候的recall; recall = 檢出的正樣本/實際的正樣本
  7. 0.75R: 以IOU=0.75爲閾值時候的recall;
  8. count:正樣本數目

測試

生成.weights文件後,便可以進行測試了(此時訓練仍在繼續,另外開一個終端進入darknet路徑下)。也可以等待全部訓練完成後再進行測試。測試指令如下:

C:\Darknet\darknet-master\build\darknet\x64>.\darknet.exe detect  cfg/yolov4-custom.cfg backup/yolov4-custom_last.weights data/test2014/1.jpg

注意,Yolo v4版本添加了訓練時候訓練誤差隨着迭代次數的增加而變化的圖,可以方便看誤差的變化情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章