實用目標(biāo)檢測器 | 性能超YoloV5,推理耗時不變(附github源碼)
論文:https://arxiv.org/pdf/2104.10419.pdf
github:https://github.com/PaddlePaddle/PaddleDetection
在實際應(yīng)用場景中,有效性與高效性對于目標(biāo)檢測器非常重要。為了滿足這兩個問題,研究者全面評估了現(xiàn)有的改進的集合,以提高PP-YOLO的性能,同時幾乎保持推理時間不變。

百度研究者對現(xiàn)有改進措施進行了分析并通過增強消融研究評估了其對最終模型的影響,此外,那些不起作用的也進行了討論。通過組合多種有效改進,將PP-YOLO在COCO2017 test-dev數(shù)據(jù)上的性能從45.9%mAP提升到了49.5%mAP,并將所得到的模型稱之為PP-YOLOv2。在推理速度方面,PP-YOLOv2可以達到68.9FPS(輸入尺寸為640*640);采用Paddle推理引擎+TensorRT+FP16+bs1,可以進一步將PP-YOLOv2的推理速度提升到106.5FPS。優(yōu)秀的性能完全超越了同等參數(shù)量的YOLOv4-CSP、YOLOv5l等模型。除此之外,采用ResNet101為主干網(wǎng)絡(luò)的PP-YOLOv2可以在COCO2017 test-dev數(shù)據(jù)集上取得50.3%mAP。
二、背景及PP-YOLO

目標(biāo)檢測是各種現(xiàn)實世界應(yīng)用程序的一個關(guān)鍵組成部分,如自動駕駛、人臉識別和人的重識別。近年來,隨著深度卷積神經(jīng)網(wǎng)絡(luò)(CNNs)的興起,目標(biāo)探測器的性能得到了迅速的提高。雖然最近的工作集中在新的檢測pipeline(即 Cascade RCNN和HTC),復(fù)雜的網(wǎng)絡(luò)架構(gòu)設(shè)計(DetectoRS和CBNET)推動了最先進的目標(biāo)檢測方法,YOLOv3仍然是工業(yè)中使用最廣泛的檢測器之一。因為,在各種實際應(yīng)用中,不僅計算資源有限,而且軟件支持不足。沒有必要的技術(shù)支持,two-stage檢測器(如Faster RCNN,Cascade RCNN)可能會非常慢。

同時,在YOLOv3和two-stage檢測器的精度之間存在著顯著的差距。因此,如何在保持推理速度的同時提高YOLOv3的有效性是實際使用的一個重要問題。為了同時滿足兩個問題,研究者添加了一堆改進,幾乎不增加推理時間來提高PP-YOLO的整體性能。要注意,盡管大量的方法聲稱可以獨立地提高目標(biāo)檢測器的精度,但在實踐中,有些方法在結(jié)合時是不有效的。因此,需要對這些技巧的組合進行實際的測試。研究者遵循增量的方法來逐一評估它們的有效性。所有的實驗都是基于PaddlePaddle實現(xiàn)。
PP-YOLO
最近出現(xiàn)了yolov4和yolov5模型,這些模型也是基于yolo3算法改進得來。但PP-YOLO并不像yolov4探究各種復(fù)雜的backbone和數(shù)據(jù)增廣手段,也不是靠nas暴力搜索得到一個結(jié)構(gòu)。在resnet主干網(wǎng)絡(luò)系列,數(shù)據(jù)增廣僅靠mixup的條件下,通過合理的tricks組合,不斷提升模型性能。最終與其他模型對比圖如下:

一個單階段的Anchor based的檢測模型通常是由一個主干網(wǎng)絡(luò)一個neck(通常是FPN),以及一個head(用于分類+定位)組成。PP-YOLO選擇了ResNet50-vd-dcn作為骨架網(wǎng)絡(luò)。

Backbone
直接用ResNet50-vd替換掉Darknet53會導(dǎo)致一部分的性能損失。因此,嘗試替換了一些ResNet中的卷積為可變形卷積(Deformable Convolution Network)??勺冃尉矸e的效果已經(jīng)被很多論文證明了其有效性,但是過多的添加DCN層會導(dǎo)致增加預(yù)測時間。論文這里使用的一個平衡的方案就是替換了最后一個stage的3x3卷積為DCNs。
Detection Neck
使用FPN,將backbone的3,4,5個stage的輸出作為FPN的輸入,輸出的大小變?yōu)檩斎氪笮〉囊话搿?/span>
Detection Head
常規(guī)來說Head的組成都是很簡單的,包含兩個卷積層,一個3x3和一個1x1。當(dāng)輸出類別是K的時候,輸出的維度就是3(K+5),每一個預(yù)測的特征圖上的每一個預(yù)測位置都與三個不同的anchors相關(guān)。針對每一個anchor,前K個維度確定了類別,后4個確定了bounding box的定位,最后一個確定了是否有目標(biāo)。然后CE和L1用于對這些預(yù)測值計算損失。

A->B
首先就是搭建基礎(chǔ)版本的PP-YOLO,在嘗試替換backbone后,雖然參數(shù)小了很多,但是mAP也下降了不少。我們通過增加了DCN卷積,將mAP提高到39.1%,增加的參數(shù)仍遠遠小于原始yolo3。
B->C
基礎(chǔ)模型搭建好后,嘗試優(yōu)化訓(xùn)練策略,選用的是更大的batch和EMA,并且加入DropBlock防止過擬合,mAP提升到了41.4%。
C->F
我們在這個階段分別增加了IOU Loss,IOU Aware,Grid Sensitive這三個損失函數(shù)的改進。分別得到了0.5%, 0.6%, 0.3%的提升,將mAP提升到了42.8%,推理速度下降仍屬于可接受范圍內(nèi)。
F->G
檢測框的處理部分也是能提升性能的,通過增加Matrix NMS,mAP提高了0.6%。這個表格暫時不考慮NMS對推理時間的影響,在實際測試中,MatrixNMS是能比傳統(tǒng)NMS降低推理時間的。
G->I
到了最后階段,很難通過增加網(wǎng)絡(luò)復(fù)雜度來提高mAP,因此我們將SPP和CoordConv放到這里再來考慮。這兩個結(jié)構(gòu)所帶來的額外參數(shù)較少,而實驗也證明了將mAP提高到44.3%。
I->J
分類模型的好壞不能代表整個檢測模型的性能,因此我們最后才考慮是否用更好的預(yù)訓(xùn)練模型。仍然是在ImageNet上進行預(yù)訓(xùn)練得到了一個更好的模型,并且提升了0.3%的mAP。
三、新框架

Path Aggregation Network
對不同尺度的目標(biāo)進行檢測是目標(biāo)檢測的一個基本挑戰(zhàn)。實際上,檢測Neck需要為所有尺度構(gòu)建高級語義特征。研究者參考PAN的設(shè)計集成了top-down信息??蓞⒁娚厦鎴D示部分。
def pan_module(self, input, filter_list, name=None):for i in range(1, len(input)):ch_out = input[i].shape[1] // 2conv_left = self._conv_bn(input[i],ch_out=ch_out,filter_size=1,stride=1,padding=0,name=name + '.{}.left'.format(i))ch_out = input[i - 1].shape[1] // 2conv_right = self._conv_bn(- 1],ch_out=ch_out,filter_size=1,stride=1,padding=0,name=name + '.{}.right'.format(i))conv_right = self._upsample(conv_right)pan_out = fluid.layers.concat([conv_left, conv_right], axis=1)ch_list = [pan_out.shape[1] // 2 * k for k in [1, 2, 1, 2, 1]]= self.stack_conv(pan_out,ch_list=ch_list,filter_list=filter_list,name=name + '.stack_conv.{}'.format(i))return input
Mish Activation Function
已有研究YOLOv4與YOLOv5表明:Mish對于改進目標(biāo)檢測器的性能非常有效。由于已經(jīng)有了一個非常強有力的預(yù)訓(xùn)練主干模型(82.4%top1精度),為保持主干結(jié)構(gòu)不變,僅將Mish用到了Neck部分。
def mish(x):return x * paddle.tanh(F.softplus(x))
Larger Input Size
提升輸入尺寸可以增強目標(biāo)面積,因此小尺度的目標(biāo)信息可以更好的保持,進而可以提升模型性能。然而更大尺寸輸入會占用更多內(nèi)存,為使用這個技巧,需要減少batch。具體來說,將每個GPU的batch從24下降到12,并將輸入尺寸從608提升到768。
IoU Aware Branch
在PP-YOLO中,IoU損失采用了軟加權(quán)方式;在這里采用軟標(biāo)簽形式,IoU損失定義如下:
其中t表示錨點與其匹配真實框之間的IoU,p表示原始IoU分支的輸出。
注:僅對正樣本的IoU損失進行了計算。通過替換損失函數(shù),IoU損失分支表現(xiàn)更佳。
class IouAwareLoss(IouLoss):"""iou aware loss, see https://arxiv.org/abs/1912.05992Args:loss_weight (float): iou aware loss weight, default is 1.0max_height (int): max height of input to support random shape inputmax_width (int): max width of input to support random shape input"""def __init__(self, loss_weight=1.0, giou=False, diou=False, ciou=False):super(IouAwareLoss, self).__init__(loss_weight=loss_weight, giou=giou, diou=diou, ciou=ciou)def __call__(self, ioup, pbox, gbox):iou = bbox_iou(pbox, gbox, giou=self.giou, diou=self.diou, ciou=self.ciou)iou.stop_gradient = Trueloss_iou_aware = F.binary_cross_entropy_with_logits(ioup, iou, reduction='none')loss_iou_aware = loss_iou_aware * self.loss_weightreturn loss_iou_aware
四、實驗及可視化

首先,參考原始的PP-YOLO構(gòu)建新框架的基線模型,由于CPU端的重度預(yù)處理會減慢訓(xùn)練,將每個GPU的圖像數(shù)從24下調(diào)到了12,降低bs會導(dǎo)致0.2%mAP指標(biāo)下降。
A->B
PP-YOLO上添加的第一個正向改進為PAN,為穩(wěn)定訓(xùn)練,為PAN模塊添加了幾個跳過連接,具體可以參見前面的圖示部分。可以看到:PAN+Mish的添加可以將模型的性能從45.4%mAP提升到47.1%mAP。盡管B模型要比A模型稍慢,但這種程度的性能提升促使將PAN應(yīng)用到最終的模型中。
B->C
由于YOLOv4與YOLOv5評估過程中的輸入尺寸為640,將訓(xùn)練與評估的輸入尺寸同樣調(diào)整到了640以進行公平對比??梢钥吹剑耗P托阅艿玫搅?.6%mAP提升。
C->D
持續(xù)輸入尺寸應(yīng)該受益更多,然而不可能同時采用大輸入尺寸與大batch。因此采用更大輸入尺寸+每個GPU12圖像訓(xùn)練模型D。此時可以帶來額外的0.6%mAP指標(biāo)提升。
D->E
在訓(xùn)練階段,改進IoU損失表現(xiàn)更好。通過該損失的替換,模型E的提升提升到了49.1%mAP指標(biāo)且不造成推理效率的損失。

上表給出了所提方法與其他SOTA方案的性能、效率對比,從中可以看到:
PP-YOLOv2顯著優(yōu)于YOLOv4-CSP與YOLOv5;
在同等FPS下,PP-YOLOv2以2%mAP優(yōu)于YOLOv4-CSP,以1.3%AP優(yōu)于YOLOv5l;
替換ResNet50為ResNet101后,PP-YOLOv2的性能與YOLOv5x相當(dāng)且推理速度快15.9%。

雙一流高校研究生團隊創(chuàng)建 ↓
專注于計算機視覺原創(chuàng)并分享相關(guān)知識 ?
整理不易,點贊三連!
