YOLOv3沒有太多的創新,主要是借鑒一些好的方案融合到YOLO里面。不過效果還是不錯的,在保持速度優勢的前提下,提升了預測精度,尤其是加強了對小物體的識別能力。本文主要講v3的改進,由於是以v1和v2為基礎,關於YOLOv1和YOLOv2的分析請移步YOLOv1 深入理解和YOLOv2/YOLO 9000深入理解。
YOLOv3的改進有:調整了網絡結構;利用多尺度特征進行對象檢測;對象分類用Logistic取代了softmax。
一,YOLOv3算法

YOLOv3 處理流程
首先如上圖所示,在訓練過程中對於每幅輸入圖像,YOLOv3會預測三個不同大小的3D tensor,對應着三個不同的scale。設計這三個scale的目的就是為了能夠檢測出不同大小的物體。在這里我們以13*13的tensor為例做一個簡單講解。對於這個scale,原始輸入圖像會被分割成13*13的grid cell,每個grid cell對應着3D tensor中的1*1*255這樣一個長條形voxel。255這個數字來源於(3*(4+1+80)),其中的數字代表bounding box的坐標,物體識別度(objectness score),以及相對應的每個class的confidence,具體釋義見上圖。
其次,如果訓練集中某一個ground truth對應的bounding box中心恰好落在了輸入圖像的某一個grid cell中(如圖中的紅色grid cell),那么這個grid cell就負責預測此物體的bounding box,於時這個grid cell所對應的objectness score就被賦予1,其余的grid cell 則為0。此外,每個grid cell還被賦予3個不同大小的prior box。在學習過程中,這個grid cell會逐漸學會如何選擇哪個大小的prior box,以及對這個prior 波形進行微調(即offset/coordinate)。但是grid cell是如何知道該選取哪個prior box呢?在這里作者定義了一個規則,即只選取與ground truth bounding box的IOU重合度最高的那個prior box。
上面說了有三個預設的不同大小的prior box,但是這三個大小是怎么計算得來的呢?作者首先在訓練前,提前將COCO數據集中的所有bbox使用K-means clustering分成9個類別,每3個類別對應一個scale,這樣總共3個scale。這種關於box大小的先驗信息極大地幫助網絡准確的預測每個box的offset/coordinate,因為從直觀上,大小合適的box將會使網絡更快速精准地學習。
YOLOv2已經開始采用K-means據類得到先驗框的尺寸,YOLOv3延續了這種方法,為每種下采樣尺度設定3種先驗框,總共聚類出9種尺寸的先驗框。在COCO數據集這9個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。分配上,在最小的13*13特征圖上(有最大的感受野)應用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的對象。中等的26*26特征圖上(中等感受野)應用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的對象。較大的52*52特征圖上(較小的感受野)應用較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的對象。YOLOv3使用logistic regression為每個bounding box預測一個objectness score(用來表示該bounding box包含一個object的可能性)。在訓練時,如果該bounding box對應的prior(即anchor box)與一個ground truth box的IOU高於其它任何bounding box prior,那么該bounding box的objectness score就被置為1;如果該bounding box對應的prior不是最好的但是又確實與一個ground truth box的IOU高於設定的閾值,那么該bounding box會被忽略。論文中作者使用的閾值是0.5。另外,YOLOv3在訓練時為每個ground truth object只分配一個bounding box prior(相當於一個bounding box,因為每個cell有k個bounding box prior,每個bounding box prior對應一個bounding box)。如果一個bounding box沒有分配到ground truth object,那么在計算定位損失和分類損失時它不會被考慮在內,也就是說只有包含ground truth object的bounding box才會參與訓練損失的計算。
1.1,網絡模型結構
下圖是YOLOv3的網絡模型結構圖,此結構主要由75個卷積層構成,卷積層對於分析物體特征最為有效。由於沒有使用全連接層,該網絡可以對應任意大小的輸入圖像。此外,池化層也沒有出現在YOLOv3當中,取而代之的是將卷積層的stride設為2來達到下采樣的效果,同時將尺度不變特征傳送到下一層。除此之外,YOLOv3中還使用了類似ResNet和FPN網絡的結構,這兩個結構對於提高檢測精度也是大有裨益。

1.2 3 Scales:更好的對應不同大小的目標物體
通常一幅圖像包含各種不同的物體,並且有大有小。比較理想的是一次就可以將所有大小的物體同時檢測出來。因此,網絡必須具備能夠“看到”不同大小的物體的能力。並且網絡越深,特征圖就會越小,所以越往后的物體也就越難檢測出來。SSD中的做法是,在不同深度的feature map獲得后,直接進行目標檢測,這樣小的物體會在相對較大的feature map中被檢測出來,而大的物體會在相對較小的feature map中被檢測出來,從而達到對應不同scale的物體的目的。
然而在實際的feature map中,深度不同所對應的feature map包含的信息就不是絕對相同的。舉例說明,隨着網絡深度的加深,淺層的feature map中主要包含低級的信息(物體邊緣,顏色,初級位置信息等),深層的feature map中包含高等信息(例如物體的語義信息:狗,貓,汽車等等)。因此在 不同級別的feature map中進行檢測,聽起來好像可以對應不同的scale,但是實際上精度並沒有期待的那么高。
在YOLOv3中,這一點是通過采用FPN結構來提高對應多重scale的精度的。

多重scale主流方法
如圖所示,對於多重scale,目前主要有以下幾種主流方法。
(a) 這種方法最直觀。首先對一幅圖像建立圖像金字塔,不同級別的金字塔圖像被輸入到對應的網絡當中,用於不同scale物體的檢測。但這樣做的結果就是每個級別的金字塔都需要進行一次處理,速度很慢。
(b) 檢測直再最后一個feature map階段進行,這個結構無法檢測不同大小的物體。
(c) 對不同深度的feature map分別進行目標檢測。SSD中采用的便是這樣的結構。每一個feature map獲得的信息僅來源於之前的層,之后的層的特征信息無法獲取並加以利用。
(d) 與(c)很接近,但有一點不同的是,當前層的feature map會對未來層的feature map進行上采樣,並加以利用。這是一個有跨越性的設計。因為有了這樣一個結構,當前的feature map就可以獲得“未來”層的信息,這樣的話低階特征與高階特征就有機融合起來了,提升檢測精度。
1.3 ResNet殘差結構:更好的獲取物體特征
YOLOv3中使用了ResNet結構(對應着在上面的YOLOv3結構圖中的Residual Block)。Residual Block是有一系列卷積層和一條shortcut path組成。shortcut如下圖所示:

圖中曲線箭頭代表的便是shortcut path。除此之外,此結構與普通的CNN結構並無區別。隨着網絡越深,學習特征的難度也就越來越大。但是如果我們加一條shortcut path的話,學習過程就從直接學習特征,變成在之前學習的特征的基礎上添加某些特征,來獲得更好的特征。這樣一來,一個復雜的特征H(x),之前是獨立一層一層學習的,現在就變成了這樣一個模型H(x)=F(x)+x,其中x是shortcut開始時的特征,而F(x)就是對x進行的填補與增加,成為殘差。因此學習的目標就從學習完整的信息,變成學習殘差了。這樣以來學習優質特征的難度就大大減小了。
1.4 替換softmax層:對應多重label分類
Softmax層被替換為一個1*1的卷積層+logistic激活函數的結構。使用softmax層的時候其實已經假設每個輸出僅對應某一個單個的class,但是在某些class存在重疊情況(例如woman和person)的數據集中,使用softmax就不能使網絡對數據進行很好的擬合。
二,解釋輸入輸出
YOLOv3僅使用卷積層,使其成為一個全卷積網絡(FCN)。文章中,作者提出一個新的特征提取網絡,Darknet-53。正如其名,它包含53個卷積層,每個后面跟隨着batch normalization層和leaky ReLU層。沒有池化層,使用步幅為2的卷積層替代池化層進行特征圖的降采樣過程,這樣可以有效阻止由於池化層導致的低層級特征的損失。
輸入:輸入是(m, 416, 416, 3),m是batch-size大小
輸出:帶有識別類的邊界框列表,每個邊界框由$(p_c, b_x, b_y, b_h, b_w, c)$六個參數表示,c表示類別數。在YOLO中,預測過程使用一個1*1卷積,輸入是一個特征圖。1*1卷積只是用於改變通道數。從YOLOv3開始,每個錨點對應三個錨框(錨框大小和尺寸比例可以通過K-means聚類得到)。由於FPN結構,如1.1圖中scale1, scale2和scale3每層分別負責3個錨框。因此,輸出大小為3*(5+C),例如預測類別為80,scale3輸出深度為 13*13*255.
摘自:
參考:
https://www.cnblogs.com/Lilu-1226/p/10587987.html
https://zhuanlan.zhihu.com/p/76802514
