GitHub開源130+Stars:手把手教你復(fù)現(xiàn)基于PPYOLO系列的目標(biāo)檢測算法
目標(biāo)檢測是計算機視覺領(lǐng)域的基礎(chǔ)任務(wù),沒個稱手的Model Zoo怎么行?
今天給大家安利一個簡單好用的目標(biāo)檢測的算法模型庫miemiedetection,目前在GitHub已斬獲130+顆star
代碼鏈接:https://github.com/miemie2013/miemiedetection
miemiedetection是基于YOLOX進行二次開發(fā)的個人檢測庫,還支持PPYOLO、PPYOLOv2、PPYOLOE、FCOS等算法。
得益于YOLOX的優(yōu)秀架構(gòu),miemiedetection里的算法訓(xùn)練速度都非???,數(shù)據(jù)讀取不再是訓(xùn)練速度的瓶頸。
代碼開發(fā)使用的深度學(xué)習(xí)框架為pyTorch,實現(xiàn)了可變形卷積DCNv2、Matrix NMS等高難度算子,支持單機單卡、單機多卡、多機多卡訓(xùn)練模式(多卡訓(xùn)練模式建議使用Linux系統(tǒng)),支持Windows、Linux系統(tǒng)。
并且由于miemiedetection是一個不需要安裝的檢測庫,用戶可以直接更改其代碼改變執(zhí)行邏輯,所以向庫中添加新算法也很容易。
作者表示未來還會加入更多的算法支持(還有女裝)。
算法如假包換
復(fù)現(xiàn)模型,最重要的就是準(zhǔn)確率要跟原版的基本相同。
先看PPYOLO、PPYOLOv2、PPYOLOE這三個模型,作者均經(jīng)過了loss對齊、梯度對齊的實驗。
為了保留證據(jù),在源碼中還可以看到注釋掉的讀寫*.npz 的部分,都是做對齊實驗遺留的代碼。
并且作者還詳細(xì)記錄了性能對齊的過程,對于新手來說,照著這條路走一遍,也是一個不錯的學(xué)習(xí)過程!
全部的訓(xùn)練日志也都記錄保存在倉庫中,足以證明復(fù)現(xiàn)PPYOLO系列算法的正確性!
最后的訓(xùn)練結(jié)果顯示,復(fù)現(xiàn)的PPYOLO算法和原版?zhèn)}庫具有一樣的損失、一樣的梯度。
另外,作者也試著用原版?zhèn)}庫和miemiedetection遷移學(xué)習(xí)voc2012數(shù)據(jù)集,也獲得了一樣的精度(使用了相同的超參數(shù))。
和原版實現(xiàn)一樣,使用了同樣的學(xué)習(xí)率、同樣的學(xué)習(xí)率衰減策略warm_piecewisedecay(PPYOLO和PPYOLOv2使用)和warm_cosinedecay(PPYOLOE使用)、同樣的指數(shù)滑動平均EMA、同樣的數(shù)據(jù)預(yù)處理方式、同樣的參數(shù)L2權(quán)重衰減、同樣的損失、同樣的梯度、同樣的預(yù)訓(xùn)練模型,遷移學(xué)習(xí)得到了同樣的精度。
實驗做得足,測試做得多,保證大家有美好的使用體驗!
不要998,也不要98,只要點個star,所有目標(biāo)檢測算法免費帶回家!
模型下載與轉(zhuǎn)換
想跑通模型,參數(shù)很重要,作者提供了轉(zhuǎn)換好的預(yù)訓(xùn)練pth權(quán)重文件,可以通過百度網(wǎng)盤直接下載。
鏈接:https://pan.baidu.com/s/1ehEqnNYKb9Nz0XNeqAcwDw
提取碼:qe3i
或者按照下面的步驟獲?。?/span>
第一步,下載權(quán)重文件,項目根目錄下執(zhí)行(即下載文件,Windows用戶可以用迅雷或瀏覽器下載wget后面的鏈接,這里為了展現(xiàn)美觀,只以ppyoloe_crn_l_300e_coco為例):
注意,帶有pretrained字樣的模型是在ImageNet上預(yù)訓(xùn)練的骨干網(wǎng)路,PPYOLO、PPYOLOv2、PPYOLOE加載這些權(quán)重以訓(xùn)練COCO數(shù)據(jù)集。其余為COCO上的預(yù)訓(xùn)練模型。
第二步,轉(zhuǎn)換權(quán)重,項目根目錄下執(zhí)行:
其中各個參數(shù)的含義為:
- -f表示的是使用的配置文件;
- -c表示的是讀取的源權(quán)重文件;
- -oc表示的是輸出(保存)的pytorch權(quán)重文件;
- -nc表示的是數(shù)據(jù)集的類別數(shù);
- --only_backbone為True時表示只轉(zhuǎn)換骨干網(wǎng)絡(luò)的權(quán)重;
執(zhí)行完畢后就會在項目根目錄下獲得轉(zhuǎn)換好的*.pth權(quán)重文件。
手把手教學(xué)
在下面的命令中,大部分都會使用模型的配置文件,所以一開始就有必要先詳細(xì)解釋配置文件。
mmdet.exp.base_exp.BaseExp為配置文件基類,是一個抽象類,聲明了一堆抽象方法,如get_model()表示如何獲取模型,get_data_loader()表示如何獲取訓(xùn)練的dataloader,get_optimizer()表示如何獲取優(yōu)化器等等。
mmdet.exp.datasets.coco_base.COCOBaseExp是數(shù)據(jù)集的配置,繼承了BaseExp,它只給出數(shù)據(jù)集的配置。該倉庫只支持COCO標(biāo)注格式的數(shù)據(jù)集的訓(xùn)練!
其它標(biāo)注格式的數(shù)據(jù)集,需要先轉(zhuǎn)換成COCO標(biāo)注格式,才能訓(xùn)練(支持太多標(biāo)注格式的話,工作量太大)。可以通過miemieLabels將自定義的數(shù)據(jù)集轉(zhuǎn)換成COCO的標(biāo)注格式。所有的檢測算法配置類都會繼承COCOBaseExp,表示所有的檢測算法共用同樣的數(shù)據(jù)集的配置。
COCOBaseExp的配置項有:
其中,
- self.num_classes表示的是數(shù)據(jù)集的類別數(shù);
- self.data_dir表示的是數(shù)據(jù)集的根目錄;
- self.cls_names表示的是數(shù)據(jù)集的類別名文件路徑,是一個txt文件,一行表示一個類別名。如果是自定義數(shù)據(jù)集,需要新建一個txt文件并編輯好類別名,再修改self.cls_names指向它;
- self.ann_folder表示的是數(shù)據(jù)集的注解文件根目錄,需要位于self.data_dir目錄下;
- self.train_ann表示的是數(shù)據(jù)集的訓(xùn)練集的注解文件名,需要位于self.ann_folder目錄下;
- self.val_ann表示的是數(shù)據(jù)集的驗證集的注解文件名,需要位于self.ann_folder目錄下;
- self.train_image_folder表示的是數(shù)據(jù)集的訓(xùn)練集的圖片文件夾名,需要位于self.data_dir目錄下;
- self.val_image_folder表示的是數(shù)據(jù)集的驗證集的圖片文件夾名,需要位于self.data_dir目錄下;
對于VOC 2012數(shù)據(jù)集,則需要修改數(shù)據(jù)集的配置為:
另外,你也可以像exps/ppyoloe/ppyoloe_crn_l_voc2012.py中一樣,在子類中修改self.num_classes、self.data_dir這些數(shù)據(jù)集的配置,這樣COCOBaseExp的配置就被覆蓋掉(無效)了。
將前面提到的模型下載好后,在VOC2012數(shù)據(jù)集的self.data_dir目錄下新建一個文件夾annotations2,把voc2012_train.json、voc2012_val.json放進這個文件夾。
最后,COCO數(shù)據(jù)集、VOC2012數(shù)據(jù)集、本項目的放置位置應(yīng)該是這樣:
數(shù)據(jù)集根目錄和miemiedetection-master是同一級目錄。我個人非常不建議把數(shù)據(jù)集放在miemiedetection-master里,那樣的話PyCharm打開會巨卡無比;而且,多個項目(如mmdetection、PaddleDetection、AdelaiDet)共用數(shù)據(jù)集時,可以做到數(shù)據(jù)集路徑和項目名無關(guān)。
mmdet.exp.ppyolo.ppyolo_method_base.PPYOLO_Method_Exp是實現(xiàn)具體算法所有抽象方法的類,繼承了COCOBaseExp,它實現(xiàn)了所有抽象方法。
exp.ppyolo.ppyolo_r50vd_2x.Exp是PPYOLO算法的Resnet50Vd模型的最終配置類,繼承了PPYOLO_Method_Exp;
PPYOLOE的配置文件也是類似這樣的結(jié)構(gòu)。
預(yù)測
首先,如果輸入的數(shù)據(jù)為一張圖片,則在項目根目錄下執(zhí)行:
其中各個參數(shù)的含義為:
- -f表示的是使用的配置文件;
- -c表示的是讀取的權(quán)重文件;
- --path表示的是圖片的路徑;
- --conf表示的是分?jǐn)?shù)閾值,只會畫出高于這個閾值的預(yù)測框;
- --tsize表示的是預(yù)測時將圖片Resize成--tsize的分辨率;
預(yù)測完成后控制臺會打印結(jié)果圖片的保存路徑,用戶可打開查看。如果是使用訓(xùn)練自定義數(shù)據(jù)集保存的模型進行預(yù)測,修改-c為你的模型的路徑即可。
如果預(yù)測的是一個文件夾下的所有圖片,則在項目根目錄下執(zhí)行:
將--path修改為對應(yīng)圖片文件夾的路徑即可。
訓(xùn)練COCO2017數(shù)據(jù)集
如果讀取ImageNet預(yù)訓(xùn)練骨干網(wǎng)絡(luò)訓(xùn)練COCO數(shù)據(jù)集,則在項目根目錄下執(zhí)行:
一條命令直接啟動單機八卡訓(xùn)練,當(dāng)然了,前提是你真的有一臺單機8卡的超算。
其中各個參數(shù)的含義為:
-f表示的是使用的配置文件;
-d表示的是顯卡數(shù)量;
-b表示的是訓(xùn)練時的批大?。ㄋ锌ǖ模?/span>
-eb表示的是評估時的批大?。ㄋ锌ǖ模?/span>
-c表示的是讀取的權(quán)重文件;
--fp16,自動混合精度訓(xùn)練;
--num_machines,機器數(shù)量,建議單機多卡訓(xùn)練;
--resume表示的是是否是恢復(fù)訓(xùn)練;
訓(xùn)練自定義數(shù)據(jù)集
建議讀取COCO預(yù)訓(xùn)練權(quán)重進行訓(xùn)練,因為收斂快。
以上述的VOC2012數(shù)據(jù)集為例,對于ppyolo_r50vd模型,如果是1機1卡,輸入下述命令開始訓(xùn)練:
如果訓(xùn)練因為某些原因中斷,想要讀取之前保存的模型恢復(fù)訓(xùn)練,只要修改-c為想要讀取模型的路徑,再加上--resume參數(shù)即可。
如果是2機2卡,即每臺機上1張卡,在0號機輸入以下命令:
并在1號機輸入以下命令:
只需要把上面2條命令的192.168.0.107改成0號機的局域網(wǎng)ip即可。
如果是1機2卡,則輸入下面的命令即可開始訓(xùn)練:
遷移學(xué)習(xí)VOC2012數(shù)據(jù)集,實測ppyolo_r50vd_2x的AP(0.50:0.95)可以到達(dá)0.59+、AP(0.50)可以到達(dá)0.82+、AP(small)可以到達(dá)0.18+。不管是單卡還是多卡,都能得到這個結(jié)果。
遷移學(xué)習(xí)時和PaddleDetection獲得了一樣的精度、一樣的收斂速度,二者的訓(xùn)練日志位于train_ppyolo_in_voc2012文件夾下。
如果是ppyoloe_l模型,在單機輸入下面的命令即可開始訓(xùn)練(凍結(jié)了骨干網(wǎng)絡(luò))
遷移學(xué)習(xí)VOC2012數(shù)據(jù)集,實測ppyoloe_l的AP(0.50:0.95)可以到達(dá)0.66+、AP(0.50)可以到達(dá)0.85+、AP(small)可以到達(dá)0.28+。
評估
命令和具體的參數(shù)如下。
在項目根目錄下運行結(jié)果為:
轉(zhuǎn)換權(quán)重后精度有一點損失,大約為0.4%。