【項目實戰】YOLO v4訓練自己的數據集


論文題目: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的操作完全相同,可以很好的遷移!

 


免責聲明!

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



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