YOLO v4:物體檢測的最佳速度和精度
只需看一次(YOLO)是快速、準(zhǔn)確的單階段目標(biāo)檢測器。最近發(fā)布的YOLO v4與其他目標(biāo)檢測器相比,顯示出非常好的結(jié)果。
1.介紹
當(dāng)今大多數(shù)精確模型都需要使用許多GPU進(jìn)行大mini-batch的訓(xùn)練,使用單GPU訓(xùn)練實(shí)際上會(huì)使訓(xùn)練變得緩慢且不切實(shí)際。YOLO v4目標(biāo)檢測器可以在具有較小mini-batch批處理大小的單GPU上進(jìn)行訓(xùn)練,使得使用單1080 Ti或2080 Ti GPU訓(xùn)練出超快速和精確的目標(biāo)檢測器成為可能。
YOLO v4在MS COCO數(shù)據(jù)集上實(shí)現(xiàn)了實(shí)時(shí)檢測的最優(yōu)表現(xiàn),在Tesla V100上以65 FPS運(yùn)行,AP達(dá)到43.5%。為了獲得這些結(jié)果,YOLO v4結(jié)合了一些功能,例如加權(quán)殘差連接(WRC)、跨階段部分連接(CSP)、交叉小批量標(biāo)準(zhǔn)化(CmBN)、自對(duì)抗訓(xùn)練(SAT)和Mish激活,Mosaic數(shù)據(jù)增強(qiáng),DropBlock正則化和CIoU損失。稍后將討論這些功能。
將YOLOv3的AP和FPS分別提高10%和12%[5](淺藍(lán)色區(qū)域的模型被視為實(shí)時(shí)目標(biāo)檢測器)
可以看出,EfficientDet D4-D3比YOLO v4具有更好的AP,但是它們?cè)赩100 GPU上的運(yùn)行速度低于30 FPS。另一方面,YOLO能以更高的速度(> 60 FPS)和非常好的精度運(yùn)行。
2.目標(biāo)檢測器一般架構(gòu)
盡管YOLO是單階段目標(biāo)檢測器,但也有兩階段目標(biāo)檢測器,如R-CNN、Fast R-CNN和Faster R-CNN,它們準(zhǔn)確但速度慢。我們將專注于單階段目標(biāo)檢測器,讓我們來看看單階段目標(biāo)檢測器的主要組件:
2.1 骨干
骨干網(wǎng)絡(luò),如ResNet、DenseNet、VGG等,被用作特征提取器,它們?cè)趫D像分類數(shù)據(jù)集(如ImageNet)上進(jìn)行了預(yù)訓(xùn)練,然后在檢測數(shù)據(jù)集上進(jìn)行了微調(diào)。事實(shí)證明,這些骨干網(wǎng)絡(luò)隨著層數(shù)的加深能產(chǎn)生具有更高語義的不同級(jí)別的特征,對(duì)之后的目標(biāo)檢測發(fā)揮很大作用。
2.2 頸部
頸部在骨干和頭部之間的額外層,用于提取骨干網(wǎng)絡(luò)不同階段的不同特征圖,如FPN [1]、PANet[2]、Bi-FPN[3]。YOLO v3使用FPN從主干中提取不同比例的特征。
什么是特征金字塔網(wǎng)絡(luò)(FPN)?
通過自上而下的路徑和橫向連接來增強(qiáng)標(biāo)準(zhǔn)卷積網(wǎng)絡(luò),因此該網(wǎng)絡(luò)可以有效地從單分辨率輸入圖像構(gòu)造出豐富的多尺度特征金字塔[4]。
特征金字塔[1]網(wǎng)絡(luò)用于目標(biāo)檢測
(1)每個(gè)橫向連接將特征圖從下至上的路徑合并到自上而下的路徑,從而生成不同的金字塔層,在合并特征圖之前,對(duì)先前的金字塔層進(jìn)行2倍上采樣,使兩個(gè)特征圖具有相同的空間分辨率大小。
(2)然后將分類/回歸網(wǎng)絡(luò)(頭部)應(yīng)用于金字塔的每個(gè)層,以幫助檢測不同大小的目標(biāo)。特征金字塔可以應(yīng)用于不同的骨干模型,例如最初的FPN[1]論文使用ResNets,還有許多以不同方式集成FPN的模塊,例如SFAM[7]、ASFF[9]和Bi-FPN[3]。
四種類型的特征金字塔。
圖像(a)顯示了如何在Single Shot Detector體系結(jié)構(gòu)(SSD)中從主干中提取特征,上圖還展示了其他三種不同類型的金字塔網(wǎng)絡(luò),它們背后的思想與它們的目的相同:緩解目標(biāo)實(shí)例之間比例變化引起的問題[3]。
2.3 頭部
實(shí)際負(fù)責(zé)執(zhí)行邊界框檢測(分類和回歸)的網(wǎng)絡(luò)。
輸出(取決于實(shí)現(xiàn)方式):1)4個(gè)值描述了預(yù)測的邊界框(x,y,h,w);2)k類的概率+ 1(背景額外一個(gè))。
像YOLO一樣,基于anchor的目標(biāo)探測器也將頭部應(yīng)用于每個(gè)anchor box,其他流行的基于anchor的單階段檢測器包括:Single Shot Detector[6]和RetinaNet[4]。
下圖結(jié)合了上述三個(gè)模塊:
3.BoF&BoS
YOLO v4論文的作者[5]區(qū)分了用于提高目標(biāo)檢測器精度的兩類方法,分析了這兩種類別中的不同方法,以實(shí)現(xiàn)具有良好準(zhǔn)確性的快速運(yùn)行的神經(jīng)網(wǎng)絡(luò),這兩個(gè)類別是:
3.1 Bag of freebies(BOF)
定義:僅改變訓(xùn)練策略或僅增加訓(xùn)練成本[5],使目標(biāo)檢測器獲得更準(zhǔn)確性而又不增加推理成本。
(1)數(shù)據(jù)增強(qiáng):可以提高模型的泛化能力??梢赃M(jìn)行光度畸變?nèi)纾赫{(diào)整亮度、飽和度、對(duì)比度和噪點(diǎn),或者對(duì)圖像進(jìn)行幾何變形,例如圖像旋轉(zhuǎn)、裁剪等。這些技術(shù)都是BoF的明顯示例,有助于提升檢測器的準(zhǔn)確性。
幾何變形示例(對(duì)于對(duì)象檢測任務(wù),邊界框也應(yīng)用相同的轉(zhuǎn)換)
其他有趣的技術(shù)可以增強(qiáng)圖像:1)CutOut[8]可以在訓(xùn)練過程中隨機(jī)掩蓋輸入的正方形區(qū)域,可以提高CNN的魯棒性和性能。2)類似地隨機(jī)擦除[10]選擇圖像中的矩形區(qū)域并使用隨機(jī)值擦除其像素。
用于目標(biāo)檢測的隨機(jī)擦除示例
(2)避免過度擬合的正則化技術(shù):如DropOut、DropConnect和DropBlock [13]。最后一個(gè)實(shí)際上在CNN中表現(xiàn)出非常好的結(jié)果,并用于YOLO v4主干中。
來自DropBlock論文
(3)回歸網(wǎng)絡(luò)的損失函數(shù):傳統(tǒng)的做法是應(yīng)用均方誤差對(duì)坐標(biāo)進(jìn)行回歸,如本文所述將這些點(diǎn)視為獨(dú)立變量,但未考慮對(duì)象本身的完整性。
IoU [12]損失:考慮了預(yù)測邊界框(BBox)和真實(shí)邊界框的面積。
GIoU[11]損失:除了考慮覆蓋區(qū)域之外,還考慮了對(duì)象的形狀、方向、重疊區(qū)域和中心點(diǎn)之間的距離和寬高比。YOLO v4使用CIoU損失作為邊界框的損失,主要是因?yàn)榕c上述提到的其他損失相比,它導(dǎo)致更快的收斂和更好的性能。
(注意:可能引起混亂的一件事是,盡管許多模型將MSE用于BBox回歸損失,但它們使用IoU作為度量標(biāo)準(zhǔn),而不是如上所述的損失函數(shù)。)下圖比較了具有不同IoU損耗的相同模型:
損失比較
上述檢測來自Faster R-CNN(Ren等人,2015),該數(shù)據(jù)在相同的MS COCO數(shù)據(jù)集上訓(xùn)練,并帶有GIoU和CIoU損失??梢宰⒁獾紺IoU的性能要優(yōu)于GIoU。
3.2 Bag of specials(BOS)
定義:僅會(huì)增加少量推理成本,但可以顯著提升目標(biāo)檢測器準(zhǔn)確性的插件模塊和后處理方法[5]。此類模塊/方法通常包括:引入注意力機(jī)制(SE模塊與SAM模塊)、擴(kuò)大模型的感受野范圍并增強(qiáng)特征集成能力等。
(1)引入注意力機(jī)制:主要是channel-wise注意力(如擠壓與激勵(lì)模塊SE)和point-wise注意力(如空間注意力模塊SAM)。YOLO v4選擇了空間注意力模塊SAM,但與該模塊的最初發(fā)布版本不完全相同,請(qǐng)注意以下幾點(diǎn):
原始空間注意模塊[16]
原始SAM:給定一個(gè)特征圖F',沿通道執(zhí)行平均池化和最大池化操作,并將它們串聯(lián)起來,然后應(yīng)用卷積層(包含S型激活函數(shù))生成注意力圖(Ms),并將其應(yīng)用于原始F'。
YOLO v4修改的空間注意模塊,來源[5]
YOLO v4修改的SAM:不應(yīng)用最大池化和平均池化,而是F'通過卷積層(包含S型激活函數(shù))得到的結(jié)果與原始特征圖(F')相乘。
(2)改善感受野:常用模塊是SPP,ASPP和RFB(YOLO v4使用SPP)。早先討論過的特征金字塔(如SFAM[7],ASFF[9]和Bi-FPN[3])也屬于BoS。
(3)激活函數(shù):自ReLU問世以來,它已經(jīng)有很多變體,如LReLU、PReLU和ReLU6。ReLU6和hard-Swish之類的激活函數(shù)是專門為壓縮網(wǎng)絡(luò)設(shè)計(jì)(用于嵌入式設(shè)備),如Google Coral Edge TPU。YOLO v4 在主干中使用了很多Mish [14]激活函數(shù):
來源[14 ]
事實(shí)證明該激活函數(shù)顯示出非常好的結(jié)果。如與使用Swish或ReLU激活函數(shù)的Squeeze Excite網(wǎng)絡(luò)(CIFAR-100數(shù)據(jù)集)Mish激活函數(shù)分別使得測試精度提升0.494%、1.671%[14]。
其他一些圖形化的激活函數(shù)參考:https://www.desmos.com/calculator/rhx5tl8ygi
4.YOLO v4設(shè)計(jì)
已經(jīng)討論了用于提高模型精度和目標(biāo)檢測器不同部分(骨干、頸部、頭部)的方法?,F(xiàn)在我們討論一下YOLO中使用的新內(nèi)容。
(1)骨干:CSPDarknet53用作GPU版本的特征提取網(wǎng)絡(luò)。對(duì)于VPU(視覺處理單元),他們考慮使用EfficientNet-lite — MixNet — GhostNet或MobileNetV3。我們重點(diǎn)介紹GPU版本。
下表顯示了適用于GPU版本的不同候選的主干
來源[5]
某些主干與檢測相比更適合分類。對(duì)于檢測CSPDarknet53優(yōu)于CSPResNext50,對(duì)于圖像分類,CSPResNext50優(yōu)于CSPDarknet53。如本文所述用于目標(biāo)檢測的骨干模型需要更大的輸入網(wǎng)絡(luò)大小(以便對(duì)小目標(biāo)也能進(jìn)行更好的檢測)、更多的層(得到更大的感受野)。
(2)頸部:使用空間金字塔池(SPP)和路徑聚合網(wǎng)絡(luò)(PAN)。
路徑聚合網(wǎng)絡(luò)(PAN):與原始PAN不同,修改后的版本用concat代替addition操作,如下圖
來源[5]
最初PAN將N4的尺寸減小到與P5相同的空間尺寸后,將這種縮小的N4與P5 相加,在所有Pi+ 1和Ni上重復(fù)此操作。在YOLO v4中,不是將Pi+1 和Ni加起來,而是concatenate連接起來(如上圖所示)。
路徑聚合網(wǎng)絡(luò)(PAN)源[2]
空間金字塔池(SPP):它使用不同的核大小k = {5,9,13}、same填充在19 * 19 * 512的特征圖上執(zhí)行最大池化,然后將四個(gè)對(duì)應(yīng)的特征圖連接起來形成19 * 19 * 2048的特征圖,這增加了頸部的感受野,在推理時(shí)間可以忽略不計(jì)的情況下提高了模型準(zhǔn)確性。
在yolov4.cfg中觀察到的SPP
如果您想可視化顯示 yolo中使用的不同層(如上圖所示),建議使用https://github.com/lutzroeder/netron(可以使用Web /桌面版本),然后使用它打開yolov4.cfg。
(3)頭部:用法與YOLO v3相同。
應(yīng)用在不同尺度的YOLO頭部
頭部應(yīng)用在網(wǎng)絡(luò)的不同尺度特征圖,用于檢測大小不同的物體通道數(shù)為255,因?yàn)?80個(gè)類別 + 1個(gè)對(duì)象 + 4個(gè)坐標(biāo))* 3個(gè)錨點(diǎn)。
5. BoF&BoS使用總結(jié)
骨干和YOLO v4檢測器中使用的BoF和BoS的不同模塊/方法可以總結(jié)如下:
6. 其他改進(jìn)
(1)使用“Mosaic”的數(shù)據(jù)增強(qiáng)新方法:將訓(xùn)練數(shù)據(jù)集的4張圖像合并為1張圖像:批量歸一化從每層的4張不同的圖像計(jì)算激活統(tǒng)計(jì)信息[5],因此極大地減少了選擇大型mini-batch批量進(jìn)行訓(xùn)練的需求。
來自[5]的Mosaic數(shù)據(jù)增強(qiáng)
示例:用于車牌檢測的Mosaic增強(qiáng)
(2)使用自對(duì)抗訓(xùn)練(SAT):該訓(xùn)練分為兩個(gè)階段,第一階段:神經(jīng)網(wǎng)絡(luò)更改原始圖像,而不是網(wǎng)絡(luò)權(quán)重,以這種方式神經(jīng)網(wǎng)絡(luò)對(duì)其自身執(zhí)行對(duì)抗攻擊,從而改變?cè)紙D像以產(chǎn)生對(duì)圖像上沒有所需物體的欺騙。第二階段:訓(xùn)練神經(jīng)網(wǎng)絡(luò)以正常方式檢測此修改圖像上的對(duì)象。[5]
7. Colab Demo
我制作了一個(gè)Colab,您可以在自己的視頻中測試YOLO v4及其微型版本,它使用了在MS COCO上訓(xùn)練的模型。地址為:https://colab.research.google.com/drive/1PuI9bYeM8O1OA82pI12oGopRJJrLWfs9?usp=sharing
8. 結(jié)論
更多詳細(xì)信息參考https://arxiv.org/abs/2004.10934。如果您想在自己的數(shù)據(jù)集上進(jìn)行訓(xùn)練,請(qǐng)查看官方倉庫https://github.com/AlexeyAB/darknet。
YOLO v4達(dá)到了用于實(shí)時(shí)目標(biāo)檢測的最新結(jié)果(AP為43.5%),并且能夠在V100 GPU上以65 FPS的速度運(yùn)行。如果您想降低精度但要提高FPS,請(qǐng)?jiān)诠俜絺}庫中查看新的Yolo v4 Tiny版本https://github.com/AlexeyAB/darknet。
本文轉(zhuǎn)載 ??小白遇見AI?? ,作者:小魚
