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