前言
目標檢測的模型還是很多的,要挨個挨個學還是有點喫力(精力旺盛可忽略),所以這裏總結一下當前流行的目標檢測的框架:darknet yolov4,mmdetection2.0,detectron2.0。至於這三個框架怎麼去選擇,我的答案是隻有你真正懂了,上手試了這幾個框架之後你才能比較它們之間的優劣。
1 Darknet YOLOv4 配置
我的環境:WIN10,CUDA10.1,cuDNN7.6.4,Anaconda,VS2019,OpenCV3.4.10,GTX1660(6G內存)
- Windows10 這幾個框架全都是在windows10上配置成功的(符合大多數不懂Linux的朋友)。windows10不用我多說,windows7的小夥伴找個機會趕緊升級吧,不然接下來的很多操作你會不適應。
- CUDA10.1 各個版本的CUDA下載(沒有CUDA的小夥伴你就放棄吧,真心跑不動)。
- cuDNN7.6.4 cuDNN官方下載地址(需要註冊NVIDIA賬號下載)。
- Python3.7 這個Anaconda已經自帶。
- VS2019 進入VS官網下載社區版。
- OpenCV3.4.10 官網下載3.4.10版本
- YOLO v4 GitHub下載YOLO v4項目並解壓。
- 複製OpenCV文件 將
opencv\build\x64\vc15\bin
的兩個dll文件:opencv_ffmpeg340_64.dll
和opencv_world340.dll
複製到darknet\build\darknet\x64
- 配置VS2019 見下
具體如何將上述軟件整合到一起的操作,詳見:WIN10+YOLOv4,windows上完美執行YOLOv4目標檢測
2 YOLOv4如何使用
- Yolo v4 COCO - 檢測一張圖片:
darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
- 輸出被檢測物體座標:
darknet.exe detector test cfg/coco.data yolov4.cfg yolov4.weights -ext_output dog.jpg
- Yolo v4 COCO - 檢測一段視頻:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
- Yolo v4 COCO - 本地攝像頭檢測:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
- 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
- Yolo v4 - 保存結果視頻文件res.avi:
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
- Yolo v3 Tiny COCO - 視頻:
darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4
- JSON和MJPEG服務器,允許來自您的軟件瀏覽器或Web瀏覽器
ip-address:8070
和8090
的多個連接:./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
- Yolo v3 Tiny 在 GPU #1上:
darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
- 替代方法Yolo v3 COCO-檢測圖片:
darknet.exe detect cfg/yolov4.cfg yolov4.weights -i 0 -thresh 0.25
- 在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
- 186 MB 的Yolo9000-檢測圖片:
darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights
- 如果使用cpp api構建應用程序,請記住將
data / 9k.tree
和data / coco9k.map
放在應用程序的同一文件夾下。 - 要處理圖像列表
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
- 處理圖像列表
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
- 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
- 計算 anchors:
darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
- 檢查 mAP@IoU=50:
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
- 檢查 mAP@IoU=75:
darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75
- YOLOv4-tiny調用攝像頭
darknet.exe detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -c 0
- 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
修改以下幾個地方:
- 第七行:
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
- 將第9行改爲自己數據集的類別名稱:
classes = ["cat","dog"]
更改完成保存。將voc_label.py
複製到data
文件夾下,運行命令python voc_label.py
在VOCdevkit/VOC2007
路徑在可以看到labels文件夾,並且在data
文件夾內會有2007_test.txt
、2007_train.txt
、2007_val.txt
這三個文件。至此數據集準備完畢。
3.4 修改配置文件
- 修改
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/
- 2.修改
data/voc.names
將裏面改成自己類別的名字。 - 修改
cfg/yolov4-custom.cfg
3.5 修改cfg/yolov4-custom.cfg
cfg/yolov4-custom.cfg
總共有6處修改:
-
yolov4-cat.cfg文件第1-7行如下:
----------------------------------------------------------------
[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16
----------------------------------------------------------------
注意:由於是進行訓練,這裏不需要修改。訓練過程中可能出現CUDA out of memory
的提示,可將這裏的subdivisions
增大,如32或64,但是數值越大耗時越長,因此需要權衡一下; -
yolov4-cat.cfg
文件第8-9行將608修改爲416:
----------------------------------------------------------------
width=416
height=416
----------------------------------------------------------------
注意:這裏也可不改,如果原始的數值608可能會導致CUDA out of memory
的提示,而且這裏的數值必須是32的倍數,這裏也是數值越大耗時越長; -
第20行的參數
max_batches
也要修改,原始值爲500500,max_batches = classes*2000
,但是max_batches
不要低於訓練的圖片張數,這裏只訓練1類,因此max_batches = 2000
; -
第22行的參數
steps=1600,1800
,這兩個數值分別爲`max_batches的80%和90%; -
繼續修改
yolov4-cat.cfg
文件,按Ctrl+F鍵,搜索“classes”,一共有3處,先定位到第一處,將classes=80
改爲classes=1
,並將classes前面最近的filters修改爲18,計算由來(classes+5)*3=18
; -
繼續修改
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.txt
和test.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文件;
訓練的一些輸出說明:
Region xx
: cfg文件中yolo-layer的索引;Avg IOU
:當前迭代中,預測的box與標註的box的平均交併比,越大越好,期望數值爲1;Class
: 標註物體的分類準確率,越大越好,期望數值爲1;obj
: 越大越好,期望數值爲1;No obj
: 越小越好;.5R
: 以IOU=0.5爲閾值時候的recall; recall = 檢出的正樣本/實際的正樣本0.75R
: 以IOU=0.75爲閾值時候的recall;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版本添加了訓練時候訓練誤差隨着迭代次數的增加而變化的圖,可以方便看誤差的變化情況。