close
↑ 點擊藍字關注極市平台

作者 | 咩咩2013
來源 | https://zhuanlan.zhihu.com/p/454165733
編輯 | 極市平台

極市導讀

miemiedetection 里的算法訓練速度都非常快,數據讀取不再是訓練速度的瓶頸!本文包含獲取預訓練模型(轉換權重)、配置文件詳解、預測、評估、訓練COCO數據集、訓練自定義數據集、導出為ONNX以及一些後續工作的介紹。>>加入極市CV技術交流群,走在計算機視覺的最前沿

代碼:https://github.com/miemie2013/miemiedetection

miemiedetection 是 Github 開源作者 miemie2013 (https://github.com/miemie2013)基於 YOLOX (https://github.com/Megvii-BaseDetection/YOLOX)進行二次開發的個人檢測庫(使用的深度學習框架為pytorch),支持 Windows、Linux 系統,以咩醬的名字命名。miemiedetection 是一個不需要安裝的檢測庫用戶可以直接更改其代碼改變執行邏輯,所見即所得!所以往miemiedetection里加入新的算法是一件很容易的事情(可以參考 PPYOLO 的寫法往 miemiedetection 里加入新的算法)。得益於 YOLOX 的優秀架構,miemiedetection 里的算法訓練速度都非常快,數據讀取不再是訓練速度的瓶頸!目前 miemiedetection 支持 YOLOX、PPYOLO、PPYOLOv2 等算法,預計未來會加入更多算法。

本倉庫包含以下模型:

模型GPU個數每GPU圖片個數骨幹網絡輸入尺寸Box APvalBox APtestinference time(ms)PP-YOLO_2x824ResNet50vd60845.345.934.49PP-YOLO_2x824ResNet50vd32039.540.110.69PP-YOLO432ResNet18vd41628.628.95.40PP-YOLOv2812ResNet50vd64049.149.542.58PP-YOLOv2812ResNet101vd64049.750.356.81

注意:

inference time通過tools/eval.py腳本測出,相關命令見下文「評估」小節。測速環境為Ubuntu20.04、GTX 1660TI、torch==1.9.1+cu102。
獲取預訓練模型(轉換權重)

讀者可以到這個鏈接下載轉換好的*.pth權重文件:

鏈接:https://pan.baidu.com/s/1ehEqnNYKb9Nz0XNeqAcwDw 提取碼:qe3i

或者按照下面的步驟獲取(需要安裝paddlepaddle):

第一步,需要先安裝paddlepaddle來方便讀取權重:

pipinstallpaddlepaddle-gpu==2.2.1-ihttps://pypi.tuna.tsinghua.edu.cn/simple

第二步,下載權重文件,項目根目錄下執行(即下載文件,Windows用戶可以用迅雷或瀏覽器下載wget後面的鏈接):

wgethttps://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_2x_coco.pdparamswgethttps://paddledet.bj.bcebos.com/models/ppyolo_r18vd_coco.pdparamswgethttps://paddledet.bj.bcebos.com/models/ppyolov2_r50vd_dcn_365e_coco.pdparamswgethttps://paddledet.bj.bcebos.com/models/ppyolov2_r101vd_dcn_365e_coco.pdparamswgethttps://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_pretrained.pdparamswgethttps://paddledet.bj.bcebos.com/models/pretrained/ResNet18_vd_pretrained.pdparamswgethttps://paddledet.bj.bcebos.com/models/pretrained/ResNet101_vd_ssld_pretrained.pdparams

注意,帶有pretrained字樣的模型是在ImageNet上預訓練的骨幹網路,PPYOLO和PPYOLOv2加載這些權重以訓練COCO數據集。其餘為COCO上的預訓練模型。

第三步,轉換權重,項目根目錄下執行:

pythontools/convert_weights.py-fexps/ppyolo/ppyolo_r50vd_2x.py-cppyolo_r50vd_dcn_2x_coco.pdparams-ocppyolo_2x.pth-nc80pythontools/convert_weights.py-fexps/ppyolo/ppyolo_r18vd.py-cppyolo_r18vd_coco.pdparams-ocppyolo_r18vd.pth-nc80pythontools/convert_weights.py-fexps/ppyolo/ppyolov2_r50vd_365e.py-cppyolov2_r50vd_dcn_365e_coco.pdparams-ocppyolov2_r50vd_365e.pth-nc80pythontools/convert_weights.py-fexps/ppyolo/ppyolov2_r101vd_365e.py-cppyolov2_r101vd_dcn_365e_coco.pdparams-ocppyolov2_r101vd_365e.pth-nc80pythontools/convert_weights.py-fexps/ppyolo/ppyolo_r18vd.py-cResNet18_vd_pretrained.pdparams-ocResNet18_vd_pretrained.pth-nc80--only_backboneTruepythontools/convert_weights.py-fexps/ppyolo/ppyolov2_r50vd_365e.py-cResNet50_vd_ssld_pretrained.pdparams-ocResNet50_vd_ssld_pretrained.pth-nc80--only_backboneTruepythontools/convert_weights.py-fexps/ppyolo/ppyolov2_r101vd_365e.py-cResNet101_vd_ssld_pretrained.pdparams-ocResNet101_vd_ssld_pretrained.pth-nc80--only_backboneTrue

參數解釋:

-f表示的是使用的配置文件;
-c表示的是讀取的源權重文件;
-oc表示的是輸出(保存)的pytorch權重文件;
-nc表示的是數據集的類別數;
--only_backbone為True時表示只轉換骨幹網絡的權重;

執行完畢後就會在項目根目錄下獲得轉換好的*.pth權重文件。

配置文件詳解

在下面的命令中,大部分都會使用模型的配置文件,所以一開始就有必要先詳細解釋配置文件。

(1)mmdet.exp.base_exp.BaseExp為配置文件基類,是一個抽象類,聲明了一堆抽象方法,如get_model()表示如何獲取模型,get_data_loader()表示如何獲取訓練的dataloader,get_optimizer()表示如何獲取優化器等等。

(2)mmdet.exp.datasets.coco_base.COCOBaseExp是數據集的配置,繼承了BaseExp,它只給出數據集的配置。本倉庫只支持COCO標註格式的數據集的訓練!其它標註格式的數據集,需要先轉換成COCO標註格式,才能訓練(支持太多標註格式的話,工作量太大)。如何把自定義數據集轉換成COCO標註格式,可以看miemieLabels 。所有的檢測算法配置類都會繼承COCOBaseExp,表示所有的檢測算法共用同樣的數據集的配置。

COCOBaseExp的配置項有:

self.num_classes=80self.data_dir='../COCO'self.cls_names='class_names/coco_classes.txt'self.ann_folder="annotations"self.train_ann="instances_train2017.json"self.val_ann="instances_val2017.json"self.train_image_folder="train2017"self.val_image_folder="val2017"
self.num_classes表示的是數據集的類別數;
self.data_dir表示的是數據集的根目錄;
self.cls_names表示的是數據集的類別名文件路徑,是一個txt文件,一行表示一個類別名。如果是自定義數據集,需要新建一個txt文件並編輯好類別名,再修改self.cls_names指向它;
self.ann_folder表示的是數據集的註解文件根目錄,需要位於self.data_dir目錄下;
self.train_ann表示的是數據集的訓練集的註解文件名,需要位於self.ann_folder目錄下;
self.val_ann表示的是數據集的驗證集的註解文件名,需要位於self.ann_folder目錄下;
self.train_image_folder表示的是數據集的訓練集的圖片文件夾名,需要位於self.data_dir目錄下;
self.val_image_folder表示的是數據集的驗證集的圖片文件夾名,需要位於self.data_dir目錄下;

另外,自帶有一個VOC2012數據集的配置,把

#self.num_classes=20#self.data_dir='../VOCdevkit/VOC2012'#self.cls_names='class_names/voc_classes.txt'#self.ann_folder="annotations2"#self.train_ann="voc2012_train.json"#self.val_ann="voc2012_val.json"#self.train_image_folder="JPEGImages"#self.val_image_folder="JPEGImages"

解除注釋,注釋掉COCO數據集的配置,就是使用VOC2012數據集了。

voc2012_train.json、voc2012_val.json是我個人轉換好的COCO標註格式的註解文件,可以到這個鏈接下載:

鏈接:https://pan.baidu.com/s/1ehEqnNYKb9Nz0XNeqAcwDw 提取碼:qe3i

下載好後,在VOC2012數據集的self.data_dir目錄下新建一個文件夾annotations2,把voc2012_train.json、voc2012_val.json放進這個文件夾。

所以,COCO數據集、VOC2012數據集、本項目的放置位置應該是這樣:

D://GitHub|------COCO||------annotations||------test2017||------train2017||------val2017||------VOCdevkit||------VOC2007|||------Annotations|||------ImageSets|||------JPEGImages|||------SegmentationClass|||------SegmentationObject||||------VOC2012||------Annotations||------annotations2|||----------voc2012_train.json|||----------voc2012_val.json||------ImageSets||------JPEGImages||------SegmentationClass||------SegmentationObject||------miemiedetection-master|------assets|------class_names|------mmdet|------tools|------...

數據集根目錄和miemiedetection-master是同一級目錄。我個人非常不建議把數據集放在miemiedetection-master里,那樣的話PyCharm打開會巨卡無比;而且,多個項目(如mmdetection、PaddleDetection、AdelaiDet)共用數據集時,可以做到數據集路徑和項目名無關。

(3)mmdet.exp.ppyolo.ppyolo_method_base.PPYOLO_Method_Exp是實現具體算法所有抽象方法的類,繼承了COCOBaseExp,它實現了所有抽象方法。

(4)mmdet.exp.ppyolo.ppyolo_r50vd_2x_base.PPYOLO_R50VD_2x_Exp是PPYOLO算法的Resnet50Vd模型的配置類,繼承了PPYOLO_Method_Exp,它給出了ppyolo_r50vd_2x具體的所有配置(包括訓練輪數、學習率、ema、網絡結構配置、NMS配置、預處理配置等);

mmdet.exp.ppyolo.ppyolo_r18vd_base.PPYOLO_R18VD_Exp是PPYOLO算法的Resnet18Vd模型的配置類,繼承了PPYOLO_Method_Exp,它給出了ppyolo_r18vd具體的所有配置(包括訓練輪數、學習率、ema、網絡結構配置、NMS配置、預處理配置等);

注意,xxx_base_coco.py和xxx_base_custom.py僅為了方便複製粘貼而存在,實際配置文件是xxx_base.py。如果是訓練自定義數據集,複製xxx_base_custom.py里的全部內容,粘貼到xxx_base.py,再根據自己的需求更改相關配置項。如果是訓練COCO數據集,複製xxx_base_coco.py里的全部內容,粘貼到xxx_base.py。最初xxx_base_coco.py里的內容和xxx_base.py里的內容是完全一樣的。

(5)exp.ppyolo_r50vd_2x.Exp是PPYOLO算法的Resnet50Vd模型的最終配置類,繼承了PPYOLO_R50VD_2x_Exp,除了self.exp_name什麼都沒有修改;

exp.ppyolo_r18vd.Exp是PPYOLO算法的Resnet50Vd模型的最終配置類,繼承了PPYOLO_R18VD_Exp,除了self.exp_name什麼都沒有修改;

預測

(1)預測一張圖片,項目根目錄下執行:

pythontools/demo.pyimage-fexps/ppyolo/ppyolo_r50vd_2x.py-cppyolo_2x.pth--pathassets/000000000019.jpg--conf0.15--tsize608--save_result--devicegpupythontools/demo.pyimage-fexps/ppyolo/ppyolo_r18vd.py-cppyolo_r18vd.pth--pathassets/000000000019.jpg--conf0.15--tsize416--save_result--devicegpupythontools/demo.pyimage-fexps/ppyolo/ppyolov2_r50vd_365e.py-cppyolov2_r50vd_365e.pth--pathassets/000000000019.jpg--conf0.15--tsize640--save_result--devicegpupythontools/demo.pyimage-fexps/ppyolo/ppyolov2_r101vd_365e.py-cppyolov2_r101vd_365e.pth--pathassets/000000000019.jpg--conf0.15--tsize640--save_result--devicegpu

參數解釋:

-f表示的是使用的配置文件;
-c表示的是讀取的權重文件;
--path表示的是圖片的路徑;
--conf表示的是分數閾值,只會畫出高於這個閾值的預測框;
--tsize表示的是預測時將圖片Resize成--tsize的分辨率;

預測完成後控制台會打印結果圖片的保存路徑,用戶可打開查看。

其它可選的參數:

--fp16,自動混合精度預測,使得預測速度更快;
--fuse,把模型的卷積層與其之後的bn層合併成一個卷積層,使得預測速度更快(實現中);

如果是使用訓練自定義數據集保存的模型進行預測,修改-c為你的模型的路徑即可。

(2)預測圖片文件夾,項目根目錄下執行:

pythontools/demo.pyimage-fexps/ppyolo/ppyolo_r50vd_2x.py-cppyolo_2x.pth--pathassets--conf0.15--tsize608--save_result--devicegpupythontools/demo.pyimage-fexps/ppyolo/ppyolo_r18vd.py-cppyolo_r18vd.pth--pathassets--conf0.15--tsize416--save_result--devicegpu

很簡單,--path改成圖片文件夾的路徑即可。

評估

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolo_r50vd_2x.py-d1-b4-cppyolo_2x.pth--conf0.01--tsize608

結果是

Averageforwardtime:36.18ms,AverageNMStime:0.00ms,Averageinferencetime:36.18msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.453AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.654AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.498AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.300AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.485AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.593AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.345AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.578AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.631AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.450AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.666AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.780

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolo_r50vd_2x.py-d1-b8-cppyolo_2x.pth--conf0.01--tsize320

結果是

Averageforwardtime:10.69ms,AverageNMStime:0.00ms,Averageinferencetime:10.69msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.395AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.593AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.428AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.173AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.432AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.590AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.314AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.515AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.559AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.305AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.614AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.761

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolo_r18vd.py-d1-b8-cppyolo_r18vd.pth--conf0.01--tsize416

結果是

Averageforwardtime:5.40ms,AverageNMStime:0.00ms,Averageinferencetime:5.40msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.286AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.470AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.303AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.125AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.307AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.428AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.255AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.421AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.449AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.222AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.482AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.649

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolov2_r50vd_365e.py-d1-b4-cppyolov2_r50vd_365e.pth--conf0.01--tsize640

結果是

Averageforwardtime:42.58ms,AverageNMStime:0.00ms,Averageinferencetime:42.58msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.491AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.677AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.538AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.315AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.534AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.622AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.363AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.612AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.665AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.464AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.711AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.801

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolov2_r50vd_365e.py-d1-b8-cppyolov2_r50vd_365e.pth--conf0.01--tsize320

結果是

Averageforwardtime:12.62ms,AverageNMStime:0.00ms,Averageinferencetime:12.62msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.424AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.608AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.457AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.207AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.469AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.631AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.330AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.542AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.588AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.331AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.655AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.800

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolov2_r101vd_365e.py-d1-b4-cppyolov2_r101vd_365e.pth--conf0.01--tsize640

結果是

Averageforwardtime:56.81ms,AverageNMStime:0.00ms,Averageinferencetime:56.81msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.497AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.683AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.545AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.336AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.543AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.633AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.366AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.616AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.668AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.490AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.713AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.812

項目根目錄下執行:

pythontools/eval.py-fexps/ppyolo/ppyolov2_r101vd_365e.py-d1-b8-cppyolov2_r101vd_365e.pth--conf0.01--tsize320

結果是

Averageforwardtime:16.42ms,AverageNMStime:0.00ms,Averageinferencetime:16.42msAveragePrecision(AP)@[IoU=0.50:0.95|area=all|maxDets=100]=0.431AveragePrecision(AP)@[IoU=0.50|area=all|maxDets=100]=0.614AveragePrecision(AP)@[IoU=0.75|area=all|maxDets=100]=0.466AveragePrecision(AP)@[IoU=0.50:0.95|area=small|maxDets=100]=0.214AveragePrecision(AP)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.477AveragePrecision(AP)@[IoU=0.50:0.95|area=large|maxDets=100]=0.640AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=1]=0.333AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=10]=0.545AverageRecall(AR)@[IoU=0.50:0.95|area=all|maxDets=100]=0.589AverageRecall(AR)@[IoU=0.50:0.95|area=small|maxDets=100]=0.338AverageRecall(AR)@[IoU=0.50:0.95|area=medium|maxDets=100]=0.653AverageRecall(AR)@[IoU=0.50:0.95|area=large|maxDets=100]=0.807

需要注意的是,PPYOLO和PPYOLOv2使用的是matrix_nms,為SOLOv2中提出的新的後處理算法,已經包含在head裡面,所以評估時的代碼捕捉不到NMS的時間,所以顯示"Average NMS time: 0.00 ms"。

參數解釋:

-f表示的是使用的配置文件;
-d表示的是顯卡數量;
-b表示的是評估時的批大小;
-c表示的是讀取的權重文件;
--conf表示的是分數閾值;
--tsize表示的是評估時將圖片Resize成--tsize的分辨率;

其它可選的參數:

--fp16,自動混合精度評估,使得預測速度更快;
--fuse,把模型的卷積層與其之後的bn層合併成一個卷積層,使得預測速度更快(實現中);

如果是使用訓練自定義數據集保存的模型進行評估(評估的是自定義數據集的驗證集),修改-c為你的模型的路徑即可。

訓練COCO數據集

如果讀取ImageNet預訓練骨幹網路訓練COCO數據集,項目根目錄下執行:

pythontools/train.py-fexps/ppyolo/ppyolo_r50vd_2x.py-d8-b24-eb8-cResNet50_vd_ssld_pretrained.pth

或者

pythontools/train.py-fexps/ppyolo/ppyolo_r18vd.py-d4-b32-eb8-cResNet18_vd_pretrained.pth

或者

pythontools/train.py-fexps/ppyolo/ppyolov2_r50vd_365e.py-d8-b12-eb8-cResNet50_vd_ssld_pretrained.pth

或者

pythontools/train.py-fexps/ppyolo/ppyolov2_r101vd_365e.py-d8-b12-eb8-cResNet101_vd_ssld_pretrained.pth

這些是高端玩家才能輸入的命令,使用8卡訓練,每卡的批大小是24,需要每張卡的顯存為32GB或以上。建議8張Tesla V100。咩醬沒有試過多卡訓練,如果有報錯或你發現什麼錯誤,請提出,讓咩醬修正多卡部分的代碼。

有一個細節是miemiedetection的PPYOLO把RandomShape、NormalizeImage、Permute、Gt2YoloTarget這4個預處理步驟放到了sample_transforms中,不像PaddleDetection放到batch_transforms中(配合DataLoader的collate_fn使用),雖然這樣寫不美觀,但是可以提速n倍。因為用collate_fn實現batch_transforms太耗時了!能不使用batch_transforms儘量不使用batch_transforms!唯一的缺點是對於隨機種子玩家,可能需要寫額外代碼初始化隨機種子,決定每個epoch怎麼打亂所有圖片,以及每個iter怎麼選隨機尺度。

參數解釋:

-f表示的是使用的配置文件;
-d表示的是顯卡數量;
-b表示的是訓練時的批大小(單張卡);
-eb表示的是評估時的批大小(單張卡);

其它可選的參數:

--fp16,自動混合精度訓練;
--num_machines,機器數量,建議單機多卡訓練;
-c表示的是讀取的權重文件;
--resume表示的是是否是恢復訓練;
訓練自定義數據集

建議讀取COCO預訓練權重進行訓練,因為收斂快。以上述的VOC2012數據集為例,

一、ppyolo_r50vd模型

只需修改2個配置文件:

(1)mmdet.exp.datasets.coco_base.COCOBaseExp,修改數據集的配置項。把COCO數據集的配置注釋掉,把VOC2012數據集的配置項解除注釋即可。如果是其它的自定義數據集,需要手動寫一下配置項。

(2)mmdet.exp.ppyolo.ppyolo_r50vd_2x_base.PPYOLO_R50VD_2x_Exp,修改該模型的配置項。複製ppyolo_r50vd_2x_base_custom.py里的全部內容,粘貼到ppyolo_r50vd_2x_base.py,再根據自己的需求更改相關配置項(或不改,使用咩醬預設配置)。我個人建議修改的配置項有:

self.max_epoch,訓練輪數;
self.aug_epochs,前幾輪進行mixup或cutmix或mosaic數據增強;
self.eval_interval,每訓練幾輪評估一次模型;
self.warmup_epochs,前幾輪學習率warm up;
self.milestones_epoch,第幾個epoch學習率衰減一次;
self.backbone['freeze_at'],凍結骨幹網絡的前多少個stage,5表示凍結前5個(全部)stage,0表示不凍結骨幹網絡;

不建議修改基礎學習率self.basic_lr_per_img,這是算法作者默認的配置,是每張圖片的學習率。本倉庫會根據用戶輸入的訓練時的批大小動態調節真正的basic_lr,即basic_lr = self.basic_lr_per_img * batch_size

輸入命令開始訓練:

pythontools/train.py-fexps/ppyolo/ppyolo_r50vd_2x.py-d1-b8-eb4-cppyolo_2x.pth

如果訓練因為某些原因中斷,想要讀取之前保存的模型恢復訓練,只要修改-c,加上--resume,輸入:

pythontools/train.py-fexps/ppyolo/ppyolo_r50vd_2x.py-d1-b8-eb4-cPPYOLO_outputs/ppyolo_r50vd_2x/13.pth--resume

把13.pth替換成你要讀取的模型的名字。

遷移學習VOC2012數據集,實測ppyolo_r50vd_2x的AP(0.50:0.95)可以到達0.59+、AP(0.50)可以到達0.82+、AP(small)可以到達0.18+。

讀者感興趣的話,可以把命令中的「 -c ppyolo_2x.pth」改成「 -c ResNet50_vd_ssld_pretrained.pth」,即讀取ImageNet預訓練骨幹網路訓練VOC2012數據集,並且修改配置文件mmdet.exp.ppyolo.ppyolo_r50vd_2x_base.PPYOLO_R50VD_2x_Exp的self.backbone['freeze_at']為4(因為預訓練骨幹網路沒有使用DCNv2,所以stage5的可變形卷積層也要訓練一下)。咩醬實測也能訓練出一個較好的效果。

二、ppyolo_r18vd模型

只需修改2個配置文件:

(1)mmdet.exp.datasets.coco_base.COCOBaseExp,修改數據集的配置項。把COCO數據集的配置注釋掉,把VOC2012數據集的配置項解除注釋即可。如果是其它的自定義數據集,需要手動寫一下配置項。

(2)mmdet.exp.ppyolo.ppyolo_r18vd_base.PPYOLO_R50VD_2x_Exp,修改該模型的配置項。複製ppyolo_r18vd_base_custom.py里的全部內容,粘貼到ppyolo_r18vd_base.py,再根據自己的需求更改相關配置項(或不改,使用咩醬預設配置)。

輸入命令開始訓練:

pythontools/train.py-fexps/ppyolo/ppyolo_r18vd.py-d1-b8-eb4-cppyolo_r18vd.pth

遷移學習VOC2012數據集,實測ppyolo_r18vd的AP(0.50:0.95)可以到達0.39+、AP(0.50)可以到達0.65+、AP(small)可以到達0.06+。

三、ppyolov2_r50vd模型

只需修改2個配置文件:

(1)mmdet.exp.datasets.coco_base.COCOBaseExp,修改數據集的配置項。把COCO數據集的配置注釋掉,把VOC2012數據集的配置項解除注釋即可。如果是其它的自定義數據集,需要手動寫一下配置項。

(2)mmdet.exp.ppyolo.ppyolov2_r50vd_365e_base.PPYOLOv2_R50VD_365e_Exp,修改該模型的配置項。複製ppyolov2_r50vd_365e_base_custom.py里的全部內容,粘貼到ppyolov2_r50vd_365e_base.py,再根據自己的需求更改相關配置項(或不改,使用咩醬預設配置)。

輸入命令開始訓練:

pythontools/train.py-fexps/ppyolo/ppyolov2_r50vd_365e.py-d1-b6-eb2-cppyolov2_r50vd_365e.pth

遷移學習VOC2012數據集,實測ppyolov2_r50vd的AP(0.50:0.95)可以到達0.63+、AP(0.50)可以到達0.84+、AP(small)可以到達0.25+。

導出為ONNX

目前只支持ppyolo_r18vd導出。其它模型實現中..

導出:

pythontools/export_onnx.py--output-nameppyolo_r18vd.onnx-fexps/ppyolo/ppyolo_r18vd.py-cppyolo_r18vd.pth

ONNX預測:

pythontools/onnx_inference.py-anPPYOLO-acnppyolo_r18vd-mppyolo_r18vd.onnx-iassets/dog.jpg-oONNX_PPYOLO_R18VD_outputs-s0.15--input_shape416,416-cnclass_names/coco_classes.txt

用onnx模型進行驗證:

pythontools/onnx_eval.py-anPPYOLO-acnppyolo_r18vd-mppyolo_r18vd.onnx-i../COCO/val2017-a../COCO/annotations/instances_val2017.json-s0.01--input_shape416,416--eval_typeeval後續工作

支持NCNN、TensorRT等的部署。

如果覺得有用,就請分享到朋友圈吧!


△點擊卡片關注極市平台,獲取最新CV乾貨

公眾號後台回復「transformer」獲取最新Transformer綜述論文下載~

極市乾貨

課程/比賽:珠港澳人工智能算法大賽|保姆級零基礎人工智能教程
算法trick:目標檢測比賽中的tricks集錦|從39個kaggle競賽中總結出來的圖像分割的Tips和Tricks
技術綜述:一文弄懂各種loss function|工業圖像異常檢測最新研究總結(2019-2020)

#CV技術社群邀請函#




△長按添加極市小助手
添加極市小助手微信(ID : cvmart4)

備註:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)

即可申請加入極市目標檢測/圖像分割/工業檢測/人臉/醫學影像/3D/SLAM/自動駕駛/超分辨率/姿態估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群

每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、乾貨資訊匯總、與10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發者互動交流~



覺得有用麻煩給個在看啦~
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()