PyTorch版:集成注意力和MobileNet的YOLOv4
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
距離 YOLO v4 的推出,已經(jīng)過去 5 個多月。YOLO 框架采用 C 語言作為底層代碼,這對于慣用 Python 的研究者來說,實在是有點不友好。因此網(wǎng)上出現(xiàn)了很多基于各種深度學習框架的 YOLO 復(fù)現(xiàn)版本。近日,就有研究者在 GitHub 上更新了基于 PyTorch 的 YOLOv4。
「有沒有同學復(fù)現(xiàn) YOLOv4 的, 可以交流一下么」。
由于原版 YOLO 使用 C 語言進行編程,光憑這一點就讓不少同學望而卻步。網(wǎng)上有很多基于 TF/Keras 和 Caffe 等的復(fù)現(xiàn)版本,但不少項目只給了代碼,并沒有給出模型在 COCO、PASCAL VOC 數(shù)據(jù)集上的訓(xùn)練結(jié)果。
近日,有研究者在 GitHub 上開源了一個項目:基于 PyTorch 深度學習框架的 YOLOv4 復(fù)現(xiàn)版本,該版本基于 YOLOv4 作者給出的實現(xiàn) AlexeyAB/darknet,并在 PASCAL VOC、COCO 和自定義數(shù)據(jù)集上運行。
項目地址:https://github.com/argusswift/YOLOv4-PyTorch
除此以外,該項目還向主干網(wǎng)絡(luò)添加了一些有用的注意力方法,并實現(xiàn)了mobilenetv2-YOLOV4 和 mobilenetv3-YOLOV4。
attentive YOLOv4
該項目向主干網(wǎng)絡(luò)添加了一些注意力方法,如 SEnet、CBAM。

SEnet (CVPR 2017)

CBAM (CVPR 2018)
mobilenet YOLOv4
該研究還實現(xiàn)了 mobilenetv2-YOLOV4 和 mobilenetv3-YOLOV4(只需更改 config/yolov4_config.py 中的 MODEL_TYPE 即可)。
下表展示了 mobilenetv2-YOLOV4 的性能結(jié)果:

現(xiàn)在我們來看該項目的詳細內(nèi)容和要求。
Nvida GeForce RTX 2080TI
CUDA10.0
CUDNN7.0
windows 或 linux 系統(tǒng)
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)以及所創(chuàng)建 conda 環(huán)境的名稱(此處為 YOLOv4-PyTorch)。
pip3 install -r requirements.txt --user
需要注意的是:安裝腳本已在 Ubuntu 18.04 和 Window 10 系統(tǒng)上進行過測試。如果出現(xiàn)問題,請查看詳細的安裝說明:https://github.com/argusswift/YOLOv4-PyTorch/blob/master/INSTALL.md。
準備工作
1. git 復(fù)制 YOLOv4 庫
準備工作的第一步是復(fù)制 YOLOv4。
git clone github.com/argusswift/YOLOv4-PyTorch.git
然后更新配置文件「config/yolov4_config.py」中「PROJECT_PATH」。
2. 數(shù)據(jù)集準備
該項目準備了 Pascal VOC 和 MSCOCO 2017 數(shù)據(jù)集。其中 PascalVOC 數(shù)據(jù)集包括 VOC 2012_trainval、VOC 2007_trainval 和 VOC2007_test,MSCOCO 2017 數(shù)據(jù)集包括 train2017_img、train2017_ann、val2017_img、val2017_ann、test2017_img、test2017_list。
PascalVOC 數(shù)據(jù)集下載命令:
# 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 數(shù)據(jù)集下載命令:
#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
在數(shù)據(jù)集下載好后,需要進行以下操作:
將數(shù)據(jù)集放入目錄,更新 config/yolov4_config.py 中的 DATA_PATH 參數(shù)。
(對于 COCO 數(shù)據(jù)集)使用 coco_to_voc.py 將 COCO 數(shù)據(jù)類型轉(zhuǎn)換為 VOC 數(shù)據(jù)類型。
轉(zhuǎn)換數(shù)據(jù)格式:使用 utils/voc.py 或 utils/coco.py 將 pascal voc *.xml 格式(或 COCO *.json 格式)轉(zhuǎn)換為 *.txt 格式(Image_path xmin0,ymin0,xmax0,ymax0,class0 xmin1,ymin1,xmax1,ymax1,class1 ...)。
3. 下載權(quán)重文件
1)darknet 預(yù)訓(xùn)練權(quán)重:yolov4(https://drive.google.com/file/d/1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT/view)。
2)Mobilenet 預(yù)訓(xùn)練權(quán)重:
mobilenetv2:(https://pan.baidu.com/share/init?surl=sjixK2L9L0YgQnvfDuVTJQ,提取碼:args);
mobilenetv3:(https://pan.baidu.com/share/init?surl=75wKejULuM0ZD05b9iSftg,提取碼:args)。
3)在根目錄下創(chuàng)建 weight 文件夾,將下載好的權(quán)重文件放到 weight / 目錄下。
4)訓(xùn)練時在 config/yolov4_config.py 中設(shè)置 MODEL_TYPE。
4. 轉(zhuǎn)換成自定義數(shù)據(jù)集(基于自定義數(shù)據(jù)集進行訓(xùn)練)
1)將自定義數(shù)據(jù)集的圖片放入 JPEGImages 文件夾,將注釋文件放入 Annotations 文件夾。
2)使用 xml_to_txt.py 文件將訓(xùn)練和測試文件列表寫入 ImageSets/Main/*.txt。
3)轉(zhuǎn)換數(shù)據(jù)格式:使用 utils/voc.py 或 utils/coco.py 將 pascal voc *.xml 格式(或 COCO *.json 格式)轉(zhuǎn)換為 *.txt 格式(Image_path xmin0,ymin0,xmax0,ymax0,class0 xmin1,ymin1,xmax1,ymax1,class1 ...)。
運行以下命令開始訓(xùn)練,詳情參見 config / yolov4_config.py。訓(xùn)練時應(yīng)將 DATA_TYPE 設(shè)置為 VOC 或 COCO。
CUDA_VISIBLE_DEVICES=0 nohup python -u train.py --weight_path weight/yolov4.weights --gpu_id 0 > nohup.log 2>&1 &
它還支持 resume 訓(xùn)練,添加 --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
結(jié)果可以在 output / 中查看,如下所示:

修改評估數(shù)據(jù)集路徑: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 -
評估(COCO 數(shù)據(jù)集)
修改評估數(shù)據(jù)集路徑: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 中設(shè)置 showatt=Ture,網(wǎng)絡(luò)即可輸出熱圖。
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 / 中可以查看熱圖,如下所示:

好消息!
小白學視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

