論文題目:YOLOv4: Optimal Speed and Accuracy of Object Detection
文獻地址:https://arxiv.org/pdf/2004.10934.pdf
源碼地址:https://github.com/AlexeyAB/darknet
今天,使用YOLOv4對無人機進行目標檢測,將自己的訓練過程記錄下來,總的來說,和之前Darknet的YOLOv3版本的操作完全相同。
環境
Ubuntu 16.04
Python: 3.6.4
OPENCV:3.4.0
CUDA: 10.0
GPU: RTX2080Ti
首先下載代碼:
1 git clone https://github.com/AlexeyAB/darknet.git
由於都是AlexeyAB大神的傑作,在使用上與YOLOv3使用過程幾乎相同,因此,使用起來較為熟悉。
1. 編譯make
如果硬件設備包含GPU加速,需要對makefile文件進行修改,修改后如下圖所示。
然后在終端進行編譯:
1 # cd到darknet文件夾下: 2 make # 或make -j8
2. 下載開源權重,並測試:
yolov4.weights: https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
yolov4.conv.137: https://drive.google.com/open?id=1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp
使用與訓練的權重進行測試:
1 ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
3. 訓練自己的數據集
構建與YOLOv3相同的數據文件夾(此處仍以YOLOv3的方式構建):
先按照上面的格式准備好數據。其中:
- Anontations用於存放標簽xml文件
- JPEGImage用於存放圖像
- ImageSets內的Main文件夾用於存放生成的圖片名字,例如:
4. 准備YOLOv4需要的label和txt
首先,從路徑為"/home/vtstar/yolov4/darknet/scripts"下的voc_label.py復制到項目根目錄下(darknet),並對其內容進行修改。
其中,#后為注釋掉的為原先的,未被注釋掉的是修改后的,sets中為年份(VOC后的數字,例如VOC2007中的2007)和包含的數據集(Main文件夾中划分數據集的txt的種類),classes中填寫標注文件中包含的待識別物體的類別標簽。
由於是將voc_label.py復制到項目的根目錄下,所以不需要對相關文件的路徑進行修改。
執行voc_label.py,在根目錄下將會生成訓練需要的文件,即各個訓練集中包含圖像的路徑。
5. 修改配置文件
這里同yolov3的使用是一致的,需要修改的配置文件包含三個部分:
-
cfg目錄下:
-
voc.data / coco.data (二選一即可,本篇使用voc.data)
- 存放相關文件的路徑:
-
- 類別的數量
- 訓練過程中訓練數據和驗證數據的txt文件(voc_label.py生成的)
- 類別標簽名稱
- 存放權重的路徑
-
yolov4-custom.cfg
-
yolov4訓練參數和相關網絡結構的修改:
-
輸入圖像大小和訓練測試階段中batch的數量和划分次數;
- 圖像的大小可以是32的倍數。
-
-
-
訓練代數;
- github中給出了max_batches的基本設置方法,2000 × classes。當然,設置的大一些也是可以的,只不過后期基本上在某一值附近震盪
- 值得注意的是,steps的設置是max_batches × 80% 和 max_batches × 90%/。
-
網絡結構;
-
根據待測目標類別的數量更改YOLO層(3個)和YOLO層前一層的卷積層(3個)
- 包含YOLO前一層卷積層的卷積核個數:(classes + 5)*3
- YOLO層的類別數classes。
- 錨框(可選,kmeans聚類)
-
-
data目錄下:
- voc.names / coco.names (二選一即可, 多個類別隔行輸入即可,本篇修改voc.names)
6. 開始訓練
訓練指令(與yolov3依舊相同):
1 ./darknet detector train cfg/voc.data cfg/yolov4-custom.cfg yolov4.conv.137 -gpus 0
在訓練過程中,與之前yolov3不同的是yolov4在訓練過程中會彈出訓練過程中的loss的實時圖像,如下圖所示,會動態的顯示每一代的損失,當前代數和預計剩余時間。
對於下圖,值得一提的是起初loss在圖像上看到的是平的,並不是意味着損失不下降,只是loss相對與18.0而言都太大了,在固定坐標的圖像上難以顯示,因此可視化的是平的。
7. 預測
預測指令:
1 ./darknet detector test cfg/voc.data cfg/yolov4-custom.cfg yolov4-custom_xxxx.weights
然后在提示的Enter Path中輸入待測圖像的路徑。如下圖所示。
或者直接在預測指令后添加圖像的路徑。
這是單張圖像的測試方式。
總的來說,和之前yolov3的操作完全相同,可以很好的遷移!