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