實(shí)用目標(biāo)檢測(cè)器 | 性能超YoloV5,推理耗時(shí)不變(附github源碼)
點(diǎn)擊下方“AI算法與圖像處理”,一起進(jìn)步!
重磅干貨,第一時(shí)間送達(dá)
計(jì)算機(jī)視覺研究院專欄
作者:Edison_G
對(duì)PP-YOLO的一次升級(jí),從PP-YOLO出發(fā),通過增量消融方式逐步添加有助于性能提升且不增加推理耗時(shí)的措施,取得了更佳的性能(49.5%mAP)-速度(69FPS)均衡,并優(yōu)于YOLOv4與YOLOv5。
在實(shí)際應(yīng)用場景中,有效性與高效性對(duì)于目標(biāo)檢測(cè)器非常重要。為了滿足這兩個(gè)問題,研究者全面評(píng)估了現(xiàn)有的改進(jìn)的集合,以提高PP-YOLO的性能,同時(shí)幾乎保持推理時(shí)間不變。

百度研究者對(duì)現(xiàn)有改進(jìn)措施進(jìn)行了分析并通過增強(qiáng)消融研究評(píng)估了其對(duì)最終模型的影響,此外,那些不起作用的也進(jìn)行了討論。通過組合多種有效改進(jìn),將PP-YOLO在COCO2017 test-dev數(shù)據(jù)上的性能從45.9%mAP提升到了49.5%mAP,并將所得到的模型稱之為PP-YOLOv2。在推理速度方面,PP-YOLOv2可以達(dá)到68.9FPS(輸入尺寸為640*640);采用Paddle推理引擎+TensorRT+FP16+bs1,可以進(jìn)一步將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)檢測(cè)是各種現(xiàn)實(shí)世界應(yīng)用程序的一個(gè)關(guān)鍵組成部分,如自動(dòng)駕駛、人臉識(shí)別和人的重識(shí)別。近年來,隨著深度卷積神經(jīng)網(wǎng)絡(luò)(CNNs)的興起,目標(biāo)探測(cè)器的性能得到了迅速的提高。雖然最近的工作集中在新的檢測(cè)pipeline(即 Cascade RCNN和HTC),復(fù)雜的網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)(DetectoRS和CBNET)推動(dòng)了最先進(jìn)的目標(biāo)檢測(cè)方法,YOLOv3仍然是工業(yè)中使用最廣泛的檢測(cè)器之一。因?yàn)?,在各種實(shí)際應(yīng)用中,不僅計(jì)算資源有限,而且軟件支持不足。沒有必要的技術(shù)支持,two-stage檢測(cè)器(如Faster RCNN,Cascade RCNN)可能會(huì)非常慢。

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

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

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

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

Path Aggregation Network
對(duì)不同尺度的目標(biāo)進(jìn)行檢測(cè)是目標(biāo)檢測(cè)的一個(gè)基本挑戰(zhàn)。實(shí)際上,檢測(cè)Neck需要為所有尺度構(gòu)建高級(jí)語義特征。研究者參考PAN的設(shè)計(jì)集成了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對(duì)于改進(jìn)目標(biāo)檢測(cè)器的性能非常有效。由于已經(jīng)有了一個(gè)非常強(qiá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
提升輸入尺寸可以增強(qiáng)目標(biāo)面積,因此小尺度的目標(biāo)信息可以更好的保持,進(jìn)而可以提升模型性能。然而更大尺寸輸入會(huì)占用更多內(nèi)存,為使用這個(gè)技巧,需要減少batch。具體來說,將每個(gè)GPU的batch從24下降到12,并將輸入尺寸從608提升到768。
IoU Aware Branch
在PP-YOLO中,IoU損失采用了軟加權(quán)方式;在這里采用軟標(biāo)簽形式,IoU損失定義如下:
其中t表示錨點(diǎn)與其匹配真實(shí)框之間的IoU,p表示原始IoU分支的輸出。
注:僅僅正樣本的IoU損失進(jìn)行了計(jì)算。通過替換損失函數(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
四、實(shí)驗(yàn)及可視化

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

上表給出了所提方法與其他SOTA方案的性能、效率對(duì)比,從中可以看到:
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%。

個(gè)人微信(如果沒有備注不拉群!) 請(qǐng)注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會(huì)分享
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風(fēng)格指南
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!
下載3 CVPR2021 在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):CVPR,即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文

