1. 程式人生 > 其它 >目標檢測之YOLOv3

目標檢測之YOLOv3

  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就不能使網路對資料進行很好的擬合。

(未完待續)

摘自:

參考:

  https://www.cnblogs.com/Lilu-1226/p/10587987.html

  https://zhuanlan.zhihu.com/p/76802514