PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

機器之心發表於2020-10-05

距離 YOLO v4 的推出,已經過去 5 個多月。YOLO 框架採用 C 語言作為底層程式碼,這對於慣用 Python 的研究者來說,實在是有點不友好。因此網上出現了很多基於各種深度學習框架的 YOLO 復現版本。近日,就有研究者在 GitHub 上更新了基於 PyTorch 的 YOLOv4。

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

從今年 4 月 YOLOv4 釋出後,對於這個目標檢測框架,問的最多的問題或許就是:「有沒有同學復現 YOLOv4 的, 可以交流一下麼」。由於原版 YOLO 使用 C 語言進行程式設計,光憑這一點就讓不少同學望而卻步。網上有很多基於 TF/Keras 和 Caffe 等的復現版本,但不少專案只給了程式碼,並沒有給出模型在 COCO、PASCAL VOC 資料集上的訓練結果。

近日,有研究者在 GitHub 上開源了一個專案:基於 PyTorch 深度學習框架的 YOLOv4 復現版本,該版本基於 YOLOv4 作者給出的實現 AlexeyAB/darknet,並在 PASCAL VOC、COCO 和自定義資料集上執行。

專案地址:https://github.com/argusswift/YOLOv4-PyTorch

除此以外,該專案還向主幹網路新增了一些有用的注意力方法,並實現了 mobilenetv2-YOLOV4 和 mobilenetv3-YOLOV4。

attentive YOLOv4

該專案向主幹網路新增了一些注意力方法,如 SEnet、CBAM。

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

SEnet (CVPR 2017)

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

CBAM (CVPR 2018)

mobilenet YOLOv4

該研究還實現了 mobilenetv2-YOLOV4 和 mobilenetv3-YOLOV4(只需更改 config/yolov4_config.py 中的 MODEL_TYPE 即可)。

下表展示了 mobilenetv2-YOLOV4 的效能結果:

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

現在我們來看該專案的詳細內容和要求。

環境要求
  • Nvida GeForce RTX 2080TI

  • CUDA10.0

  • CUDNN7.0

  • windows 或 linux 系統

  • python 3.6

特性
  • DO-Conv (https://arxiv.org/abs/2006.12030) (torch>=1.2)

  • Attention

  • fp_16 training

  • Mish

  • Custom data

  • Data Augment (RandomHorizontalFlip, RandomCrop, RandomAffine, Resize)

  • Multi-scale Training (320 to 640)

  • focal loss

  • CIOU

  • Label smooth

  • Mixup

  • cosine lr

安裝依賴項

執行指令碼安裝依賴項。你需要提供 conda 安裝路徑(例如 ~/anaconda3)以及所建立 conda 環境的名稱(此處為 YOLOv4-PyTorch)。

pip3 install -r requirements.txt --user

需要注意的是:安裝指令碼已在 Ubuntu 18.04 和 Window 10 系統上進行過測試。如果出現問題,請檢視詳細的安裝說明:https://github.com/argusswift/YOLOv4-PyTorch/blob/master/INSTALL.md

準備工作

1. git 複製 YOLOv4 庫

準備工作的第一步是複製 YOLOv4。

git clone github.com/argusswift/YOLOv4-PyTorch.git

然後更新配置檔案「config/yolov4_config.py」中「PROJECT_PATH」。

2. 資料集準備

該專案準備了 Pascal VOC 和 MSCOCO 2017 資料集。其中 PascalVOC 資料集包括 VOC 2012_trainval、VOC 2007_trainval 和 VOC2007_test,MSCOCO 2017 資料集包括 train2017_img、train2017_ann、val2017_img、val2017_ann、test2017_img、test2017_list。

PascalVOC 資料集下載命令:
# Download the data.
cd $HOME/data
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
# Extract the data.
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar

MSCOCO 2017 資料集下載命令:

#step1: download the following data and annotation   
2017 Train images [118K/18GB]   
2017 Val images [5K/1GB]   2017 Test images [41K/6GB]   
2017 Train/Val annotations [241MB]   
#step2: arrange the data to the following structure   
COCO   
---train   
---test   
---val   
---annotations

在資料集下載好後,需要進行以下操作:
  • 將資料集放入目錄,更新 config/yolov4_config.py 中的 DATA_PATH 引數。

  • (對於 COCO 資料集)使用 coco_to_voc.py 將 COCO 資料型別轉換為 VOC 資料型別。

  • 轉換資料格式:使用 utils/voc.py 或 utils/coco.py 將 pascal voc *.xml 格式(或 COCO *.json 格式)轉換為 *.txt 格式(Image_path xmin0,ymin0,xmax0,ymax0,class0 xmin1,ymin1,xmax1,ymax1,class1 ...)。


3. 下載權重檔案

1)darknet 預訓練權重:yolov4(https://drive.google.com/file/d/1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT/view)。
2)Mobilenet 預訓練權重:
mobilenetv2:(https://pan.baidu.com/share/init?surl=sjixK2L9L0YgQnvfDuVTJQ,提取碼:args);
mobilenetv3:(https://pan.baidu.com/share/init?surl=75wKejULuM0ZD05b9iSftg,提取碼:args)。
3)在根目錄下建立 weight 資料夾,將下載好的權重檔案放到 weight / 目錄下。
4)訓練時在 config/yolov4_config.py 中設定 MODEL_TYPE。

4. 轉換成自定義資料集(基於自定義資料集進行訓練)

1)將自定義資料集的圖片放入 JPEGImages 資料夾,將註釋檔案放入 Annotations 資料夾。
2)使用 xml_to_txt.py 檔案將訓練和測試檔案列表寫入 ImageSets/Main/*.txt。
3)轉換資料格式:使用 utils/voc.py 或 utils/coco.py 將 pascal voc *.xml 格式(或 COCO *.json 格式)轉換為 *.txt 格式(Image_path xmin0,ymin0,xmax0,ymax0,class0 xmin1,ymin1,xmax1,ymax1,class1 ...)。

訓練

執行以下命令開始訓練,詳情參見 config / yolov4_config.py。訓練時應將 DATA_TYPE 設定為 VOC 或 COCO。

CUDA_VISIBLE_DEVICES=0 nohup python -u train.py  --weight_path weight/yolov4.weights --gpu_id 0 > nohup.log 2>&1 &

它還支援 resume 訓練,新增 --resume,使用以下命令即可自動載入 last.pt。

CUDA_VISIBLE_DEVICES=0 nohup python -u train.py  --weight_path weight/last.pt --gpu_id 0 > nohup.log 2>&1 &

檢測

修改檢測影像路徑:DATA_TEST=/path/to/your/test_data# your own images。

for VOC dataset:
CUDA_VISIBLE_DEVICES=0 python3 eval_voc.py --weight_path weight/best.pt --gpu_id 0 --visiual $DATA_TEST --eval --mode det
for COCO dataset:
CUDA_VISIBLE_DEVICES=0 python3 eval_coco.py --weight_path weight/best.pt --gpu_id 0 --visiual $DATA_TEST --eval --mode det

結果可以在 output / 中檢視,如下所示:

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

評估(Pascal VOC 資料集)

修改評估資料集路徑:DATA_PATH=/path/to/your/test_data # your own images

for VOC dataset:
CUDA_VISIBLE_DEVICES=0 python3 eval_voc.py --weight_path weight/best.pt --gpu_id 0 --visiual $DATA_TEST --eval -

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

評估(COCO 資料集)

修改評估資料集路徑:DATA_PATH=/path/to/your/test_data # your own images

CUDA_VISIBLE_DEVICES=0 python3 eval_coco.py --weight_path weight/best.pt --gpu_id 0 --visiual $DATA_TEST --eval --mode val

type=bbox
Running per image evaluation...      DONE (t=0.34s).
Accumulating evaluation results...   DONE (t=0.08s). 
Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.438  
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.607  
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.469  
Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.253  
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.486  
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.567  
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.342  
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.571  
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.632  
Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.458  
Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.691  
Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.790

視覺化熱圖

在 val_voc.py 中設定 showatt=Ture,網路即可輸出熱圖。

for VOC dataset:
CUDA_VISIBLE_DEVICES=0 python3 eval_voc.py --weight_path weight/best.pt --gpu_id 0 --visiual $DATA_TEST --eval
for COCO dataset:
CUDA_VISIBLE_DEVICES=0 python3 eval_coco.py --weight_path weight/best.pt --gpu_id 0 --visiual $DATA_TEST --eval

在 output / 中可以檢視熱圖,如下所示:

PyTorch版YOLOv4更新了,不僅適用於自定義資料集,還整合了注意力和MobileNet

相關文章