博客專欄

EEPW首頁 > 博客 > YOLOv4詳細(xì)分析 | 細(xì)數(shù)當(dāng)前最佳檢測框架小細(xì)節(jié)(1)

YOLOv4詳細(xì)分析 | 細(xì)數(shù)當(dāng)前最佳檢測框架小細(xì)節(jié)(1)

發(fā)布人:CV研究院 時間:2020-12-30 來源:工程師 發(fā)布文章

前段時間,突然發(fā)布的YOLOv4成了計算機(jī)視覺領(lǐng)域一大熱點新聞。這個目標(biāo)檢測任務(wù)的SOTA模型究竟有何創(chuàng)新?這篇解讀文章為你一一拆解。

27.png

目標(biāo)檢測在近幾年開始發(fā)展成熟,但即便如此,競爭依舊激烈。如下所示,YOLOv4 宣稱已經(jīng)實現(xiàn)了當(dāng)前最前沿技術(shù)的準(zhǔn)確度,同時還能維持較高的處理幀率。使用 Tesla V100 GPU,在 MS COCO 數(shù)據(jù)集上以接近 65 FPS 的推理速度,YOLOv4 實現(xiàn)了 43.5% AP (65.7% AP??)的準(zhǔn)確度。但對于目標(biāo)檢測而言,高準(zhǔn)確度早已不是唯一的目標(biāo)。我們還希望邊緣設(shè)備也能流暢地運行這些模型。因此,如何使用低成本硬件實時地處理輸入視頻也成為了一個重要的研究方向。

YOLOv4 的開發(fā)歷程很有意思,其中評估、修改和整合了很多有趣的新技術(shù)。而且其也優(yōu)化了計算效率,使檢測器在單個 GPU 上也能很好地完成訓(xùn)練。

Bag of freebies (BoF) 與 Bag of specials (BoS)

為了提升準(zhǔn)確度,可以針對訓(xùn)練過程進(jìn)行一些優(yōu)化,比如數(shù)據(jù)增強、類別不平衡、成本函數(shù)、軟標(biāo)注…… 這些改進(jìn)不會影響推理速度,可被稱為「Bag of freebies」。另外還有一些改進(jìn)可稱為「bag of specials」,僅需在推理時間方面做少許犧牲,就能獲得優(yōu)良的性能回報。這類改進(jìn)包括增大感受野、使用注意力機(jī)制、集成跳過連接(skip-connection)或 FPN 等特性、使用非極大值抑制等后處理方法。本文將探討特征提取器和頸部的設(shè)計方式以及那些好用的 BoF 和 BoS 改進(jìn)策略。

骨干網(wǎng)絡(luò)

密集模塊與 DenseNet

為了提升準(zhǔn)確度,我們可通過提高網(wǎng)絡(luò)深度來擴(kuò)展感受野和增大模型復(fù)雜度。同時,為了降低訓(xùn)練難度,還可應(yīng)用跳過連接。我們還可以進(jìn)一步延伸這一概念,即使用高度互連的層。

密集模塊(Dense Block)包含多個卷積層,其中每一層 H_i 都由批歸一化、ReLU 與之后的卷積構(gòu)成。H_i 的輸入不僅包含前一層的輸出,還包含之前所有層的輸出以及原始輸入,即 x_?, x_?, …, x_{i-1}。下圖中每個 H_i 都輸出 4 個特征圖。因此,在每一層,特征圖的數(shù)量都增加 4 倍——增長率。

26.png

然后,通過組合多個密集模塊與其間的過渡層(由卷積和池化構(gòu)成),可以構(gòu)建出 DenseNet。

25.png

下面給出了這種架構(gòu)設(shè)計的詳情。

24.png

交叉階段部分連接(CSP)

CSPNet 將密集模塊的輸入特征圖分為了兩部分。第一部分 x_?’ 會繞過密集模塊,成為下個過渡層的輸入的一部分。第二部分 x_?’’ 則會通過密集模塊,如下圖所示。

23.png

這種新設(shè)計通過將輸入分為兩部分而降低了計算復(fù)雜度——此時僅有一部分輸入會經(jīng)過密集模塊。

22.png

CSPDarknet53

YOLOv4 使用了上面的 CSP 與下面的 Darknet-53 作為特征提取的骨干。

21.png

相比于基于 ResNet 的設(shè)計,CSPDarknet53 模型的目標(biāo)檢測準(zhǔn)確度更高,不過 ResNet 的分類性能更好一些。但是,借助后文將討論的 Mish 和其它技術(shù),CSPDarknet53 的分類準(zhǔn)確度可以得到提升。因此,YOLOv4 最終選擇了 CSPDarknet53。

頸部(Neck)

目標(biāo)檢測器由用于特征提取的骨干部分(backbone)和用于目標(biāo)檢測的頭部(head,下圖最右邊的模塊)構(gòu)成。而為了檢測不同大小的目標(biāo),需要使用一種分層結(jié)構(gòu),使得頭部可探測不同空間分辨率的特征圖。

20.png

為了讓輸入頭部的信息更豐富,在輸入頭部前,會將來自自底向上和自上而下的數(shù)據(jù)流按逐元素的方式相加或相連。因此,頭部的輸入將包含來自自底向上數(shù)據(jù)流的豐富空間信息以及來自自上而下數(shù)據(jù)流的豐富語義信息。該系統(tǒng)的這一部分稱為頸部(neck)。下面更詳細(xì)地談?wù)勥@一設(shè)計。

特征金字塔網(wǎng)絡(luò)(FPN)

YOLOv3 采用了與 FPN 類似的方法來實現(xiàn)不同大小層次的目標(biāo)檢測預(yù)測。

19.png

在針對特定尺寸大小進(jìn)行預(yù)測時,F(xiàn)PN 會對自上而下的數(shù)據(jù)流進(jìn)行上采樣(2 倍),并將其與自底向上的相鄰層相加(見下圖)。得到的結(jié)果會被傳遞給一個 3×3 的卷積核,以減少上采樣偽影以及為頭部創(chuàng)建下圖中的特征圖 P4。

18.png

SPP(空間金字塔池化層)

SPP 應(yīng)用了略有不同的策略來檢測不同尺寸大小的目標(biāo),即使用一個空間金字塔池化層替代了最后的池化層(在最后的卷積層之后)。其特征圖在空間上分成了 m×m 個 bin,其中 m 可以分別為 1、2、4 等值。然后針對每個通道,為每個 bin 應(yīng)用一次最大池化。這會形成一個長度固定的表征,然后可以使用 FC 層對該表征進(jìn)行進(jìn)一步的分析。

17.png

許多基于 CNN 的模型都包含 FC 層,因此只能接受指定尺寸的輸入圖像。相對而言,SPP 可使用不同大小的圖像。然而,也還存在不包含 FC 層的技術(shù),比如全卷積網(wǎng)絡(luò)(FCN);這些技術(shù)可以接受不同尺寸的圖像。對于空間信息非常重要的圖像分割等任務(wù)而言,這類設(shè)計尤為重要。因此,對于 YOLO,并不必需將 2D 特征圖轉(zhuǎn)化為固定大小的 1D 向量。

使用 SPP 的 YOLO

YOLO 中使用的 SPP 經(jīng)過修改,以保留輸出的空間尺寸大小。而且還在大小為 1×1、5×5、9×9、13×13 等的滑動核(sliding kernel)應(yīng)用了最大池化??臻g尺寸大小得以保留。然后將來自不同核大小的特征圖連接起來作為輸出。

16.jpg

下圖展示了 SPP 是如何整合進(jìn) YOLO 的。

15.jpg

路徑聚合網(wǎng)絡(luò)(PAN)

早期的深度學(xué)習(xí)的模型設(shè)計相對簡單。每一層的輸入都來自其上一層。更前面的層會提取局部的紋理和圖案信息,并構(gòu)建出后續(xù)層所需的語義信息。但是,隨著網(wǎng)絡(luò)向右側(cè)推進(jìn),微調(diào)優(yōu)化預(yù)測結(jié)果時所需的局部信息可能會丟失。

14.jpg

在后來的深度學(xué)習(xí)開發(fā)中,層之間的互連方式變得更加復(fù)雜。DenseNet 在這方面達(dá)到了極致。其中每一層都連接了其前面的所有層。

13.jpg

在 FPN 中,來自自底向上和自上而下數(shù)據(jù)流的鄰近層的信息會結(jié)合到一起。

12.jpg

層之間信息的流動方式變成了模型設(shè)計中需要考慮的又一關(guān)鍵事項。

下圖是用于目標(biāo)檢測的路徑聚合網(wǎng)絡(luò)(PAN)。其中,自底向上的路徑得到增強,使得低層信息更容易傳播到頂部。在 FPN 中,局部空間信息會向上傳播,如紅色箭頭所示。盡管圖中可能沒有展示清楚,但這條紅色路徑穿過了大約 100 多層。PAN 引入了一個捷徑路徑(綠色路徑),其僅需 10 層左右就能抵達(dá)頂部的 N? 層。這個短回路概念使得頂層也能獲取到細(xì)粒度的局部信息。

11.jpg

順帶一提,頸部設(shè)計可以進(jìn)行如下的可視化:

10.jpg

但是,YOLOv4 并沒有將鄰近層加到一起,而是將特征圖連接到一起。

9.jpg

在 FPN 中,不同尺寸大小的目標(biāo)是分開獨立檢測的。這可能會導(dǎo)致出現(xiàn)重復(fù)的預(yù)測結(jié)果,而且無法利用來自其它特征圖的信息。PAN 最早使用了逐元素最大運算將這些信息融合到一起(這里不再詳述相關(guān)細(xì)節(jié))。

8.png

空間注意力模塊(SAM)

注意力已經(jīng)在深度學(xué)習(xí)設(shè)計中得到了廣泛的應(yīng)用。SAM 會為輸入特征圖分別應(yīng)用最大池化和平均池化,從而得到兩個特征圖集合。其結(jié)果會被送入一個卷積層,之后再由一個 sigmoid 函數(shù)創(chuàng)建出空間注意力。

7.png

這個空間注意力掩碼再被應(yīng)用于輸入特征,從而輸出經(jīng)過優(yōu)化的特征圖。

6.png

YOLOv4 使用了一種修改版的 SAM,其中沒有使用最大池化和平均池化。

5.png

YOLOv4 使用修改版的 SPP、PAN 和 SAM 逐步實現(xiàn) / 替換了 FPN 概念。

用于骨干部分的 Bag of freebies (BoF)

用于 YOLOv4 骨干部分的 BoF 特征包括:

·  CutMix 和 Mosaic 數(shù)據(jù)增強

·  DropBlock 正則化

·  類別標(biāo)簽平滑化

CutMix 數(shù)據(jù)增強

Cutout 數(shù)據(jù)增強會移除圖像的部分區(qū)域(見下圖)。這會迫使模型在執(zhí)行分類時不過于相信特定的特征。但是,如果圖像的某部分充滿了無用信息,則這種操作就浪費了。CutMix 的做法則不同,其是將圖像的一部分剪切下來再粘貼到另一張圖像上。其基本真值標(biāo)簽會根據(jù)補丁的面積比例進(jìn)行調(diào)整,比如狗的部分占 0.6,貓的部分占 0.4。

4.png

從概念上講,CutMix 在目標(biāo)的可能組成成分方面有更寬廣的視角。裁減掉的部分會迫使模型學(xué)習(xí)使用不同的特征組合進(jìn)行分類。這可避免信心過高。因為是用另一張圖像替代該區(qū)域,所以圖像中的信息量和訓(xùn)練效率都不會受到顯著的影響。

Mosaic 數(shù)據(jù)增強

Mosaic 這種數(shù)據(jù)增強方法是將 4 張訓(xùn)練圖像組合成一張來進(jìn)行訓(xùn)練(而非 CutMix 中的 2 張)。這讓模型在非慣例的環(huán)境中能更好地執(zhí)行目標(biāo)檢測。此外,由于每個 mini-batch 都包含圖像的較多變體(4×),因此在估計均值和方差時,對較大 mini-batch 的需求會降低。

3.png

DropBlock 正則化

在全連接層中,我們可通過丟棄一些連接來迫使模型學(xué)習(xí)不同的特征,而不是過于依賴少量特征。但是,這可能不適用于卷積層。相鄰的位置可能高度相關(guān)。所以即使丟棄一些像素(如中部的圖所示),仍然可以檢測出空間信息。DropBlock 正則化基于類似的概念,但適用于卷積層。

2.png

不過 DropBlock 丟棄的不是各個像素,而是大小為 block_size × block_size 的一個像素塊。

1.png

類別標(biāo)簽平滑化

每當(dāng)你覺得自己完全正確時,你可能只是想錯了。如果一個預(yù)測結(jié)果的置信度為 100%,可能只是說明模型記憶了這個數(shù)據(jù),而非學(xué)習(xí)了什么東西。標(biāo)簽平滑化將預(yù)測結(jié)果的目標(biāo)上界調(diào)整至了一個更低的值,比如 0.9。然后在計算損失時,模型會以這個值為目標(biāo),而不是 1.0。這一方法可緩解過擬合問題。

p = tf.placeholder(tf.float32, shape=[None, 10])

# Use 0.9 instead of 1.0.

feed_dict = {

  p: [[0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0]] # Image with label "3"

}

# logits_real_image is the logits calculated by

# the discriminator for real images.

d_real_loss = tf.nn.sigmoid_cross_entropy_with_logits(

                    labels=p, logits=logits_real_image)


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉