天天看點

目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1

目标檢測 YOLO 系列: 開宗立派 YOLO v1

  • 目标檢測 YOLO 系列: 開篇
  • 目标檢測 YOLO 系列: 開宗立派 YOLO v1
  • 目标檢測 YOLO 系列: 更快更準 YOLO v2
  • 目标檢測 YOLO 系列: 持續改進 YOLO v3
  • 目标檢測 YOLO 系列: 你有我有 YOLO v4
  • 目标檢測 YOLO 系列: 快速疊代 YOLO v5

作者:Joseph Redmon,Santosh Divvala , Ross Girshick , Ali Farhadi

發表時間:2015

Paper 原文:You Only Look Once:Unified, Real-Time Object Detection

1 網絡結構

先來看看 YOLO V1 的網絡結構,如下圖(來自目标檢測 YOLO)所示。這裡 backbone 是基于 GoogleNet 修改的。

目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1

具體來說,這裡的 GoogLeNet modification(20 layers)就是采用 1×1 卷積層加 3×3 卷積層替換了 GoogLeNet 中的 Inception 子產品,然後去掉了第二層 1x1 的卷積層和最後的 fc 層,更多關于 GoogLeNet 的介紹可以參考 CV 經典主幹網絡 (Backbone) 系列: GoogLeNet V1 到 V4。

YOLO v1 的具體結構如下。整個網絡有 24 個卷積層,2 個全連接配接層, 4 個 pooling 層,整個網絡 的 stride 為 64。

另外除了最後一層使用線性激活函數之外,其他層都使用 Leaky ReLU 激活函數,關于激活函數可以參考深度神經網絡中常用的激活函數的優缺點分析。

目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1
index kernal size feature map size
input - 3x448x448
conv1 64x3x7x7-S_2-P_3 64x224x224
pool1 2x2-S_2 64x112x112
conv2 192x3x3-S_1-P_1 192x112x112
pool2 2x2-S_2 192x56x56
conv3 128x1x1-S_1-P_0 128x56x56
conv4 256x3x3-S_1-P_1 256x56x56
conv5 256x1x1-S_1-P_0 256x56x56
conv6 512x3x3-S_1-P_1 512x56x56
pool3 2x2-S_2 512x28x28
conv7 256x1x1-S_1-P_0 256x28x28
conv8 512x3x3-S_1-P_1 512x28x28
conv9 256x1x1-S_1-P_0 256x28x28
conv10 512x3x3-S_1-P_1 512x28x28
conv11 256x1x1-S_1-P_0 256x28x28
conv12 512x3x3-S_1-P_1 512x28x28
conv13 256x1x1-S_1-P_0 256x28x28
conv14 512x3x3-S_1-P_1 512x28x28
conv15 512x1x1-S_1-P_0 512x28x28
conv16 1024x3x3-S_1-P_1 1024x28x28
pool4 2x2-S_2 1024x14x14
conv17 512x1x1-S_1-P_0 512x14x14
conv18 1024x3x3-S_1-P_1 1024x14x14
conv19 512x1x1-S_1-P_0 512x14x14
conv20 1024x3x3-S_1-P_1 1024x14x14
conv21 1024x3x3-S_1-P_1 1024x28x28
conv22 1024x3x3-S_2-P_1 1024x7x7
conv23 1024x3x3-S_1-P_1 1024x7x7
conv24 1024x3x3-S_1-P_1 1024x7x7
fc1 - 4096x1
fc2 - 1470x1

跳出具體的網絡結構,我們從全局的觀點來看看 YOLO v1 的結構。

目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1

從結構可以看出,YOLO v1 的整體結構很清晰,輸入圖檔(448x448x3)經過 24 conv + 2 fc 後得到的 feature map size 為 1470x1,然後做了一個 reshape 操作,将 1470x1 reshape 為 7x7x30,所有的操作都沒有什麼特别之處。

隻是為什麼要做這個 reshape 操作了,這就是非常關鍵的一步了。具體可以參考下面的網絡原理部分。

2 網絡原理

上面已經提到, YOLO V1 中将檢測任務視作一個回歸任務,即 location 和分類的結果都是通過回歸的方式得到。那麼 YOLO V1 到底是如何工作的呢?

    1. 輸入的圖像被劃分成 S×S 個網格單元。對于圖像上出現的每一個目标,有一個網格單元(目标的中心落入的那個單元格)負責預測它。
    1. 每一個網格單元預測 B 個 bbox 以及 C 類機率。每個 bbox 預測結果有 5 個組成部分,分别是 ( x , y , w , h , c o n f i d e n c e ) (x,y,w,h,confidence) (x,y,w,h,confidence),其中 ( x , y ) (x,y) (x,y) 坐标代表 bbox 的中心的坐标值,坐标值是相對于對應的網格單元而言的,左上頂點坐标記為 0, 右下坐标記為 1(記住,如果框的中心不在網格單元内,那麼這個單元格不負責檢測這個目标),這些坐标被歸一化到 0 到 1 之間。 ( w , h ) (w,h) (w,h) 框的尺寸也被歸一化為 [ 0 , 1 ] [0,1] [0,1](相對于圖像的大小)。confidence 的值,表示預測的 bbox 包含一個目标的置信度。計算公式為: P r ( O b j e c t ) × I O U ( p r e d , t r u t h ) Pr(Object)×IOU(pred, truth) Pr(Object)×IOU(pred,truth),從公式可以了解這個置信度衡量了兩個方面:一個是 bbox 是否包含物體,另一個是 bbox 對于物體的位置預測的準确率(IOU)。如果一個 bbox 不包含物體,那麼 P r ( O b j e c t ) Pr(Object) Pr(Object) 為 0, 即置信度為 0;如果一個 bbox 包含物體,那麼 P r ( O b j e c t ) Pr(Object) Pr(Object) 為 1,置信度就是 bbox 和 ground truth box 的 IOU 值了。最後從 B 個 bbox 中選擇 confidence 最大的那個作為最後的預測結果。
    1. 每個網格單元還需要預測出分類的結果, P r ( C l a s s ( i ) ∣ O b j e c t ) Pr(Class(i) | Object) Pr(Class(i)∣Object)。如果總共有 C 類目标,那麼每個網格單元将預測出目标屬于每一類的機率。下面的例子中 S = 3,B = 2, C = 3。
      目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1
    1. 預測的時候輸入一張圖檔,假設 S = 7,B = 2,C = 20,那麼最後将得到 49 個 cell,每個 cell 對應 2 個 bbox,即 98 個bbox,每個 cell 對應輸出一個 30(2x5+20)維的 tensor。98(7x7x2) 個 bbox, 對應輸出 98 個 confidence 值。這裡定義 class-specific confidence score 如下,這個 confidence score 将用來進行 NMS 操作。比如每個類别按照 confidence score 從大到小排序,對于同一個類别,如果 IOU 大于 0.5 就丢掉它對應的 bbox(避免重複檢測同一個物體)。這裡的 NMS 主要是針對預測較大的物體時,有可能出現多個區域預測同一個物體的情況。

      c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U ( p r e d , t r u t h ) confidence = Pr(Object)*IOU(pred, truth) confidence=Pr(Object)∗IOU(pred,truth)

      c o n f i d e n c e _ s c o r e = P r ( C l a s s ( i ) ∣ O b j e c t ) ∗ c o n f i d e n c e = P r ( C l a s s ( i ) ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U ( p r e d , t r u t h ) = P r ( C l a s s ( i ) ∗ I O U ( p r e d , t r u t h ) confidence\_score = Pr(Class(i) | Object) * confidence = Pr(Class(i) | Object) * Pr(Object)*IOU(pred, truth) = Pr(Class(i)*IOU(pred, truth) confidence_score=Pr(Class(i)∣Object)∗confidence=Pr(Class(i)∣Object)∗Pr(Object)∗IOU(pred,truth)=Pr(Class(i)∗IOU(pred,truth)

到這裡就可以了解上面為什麼要将 1470x1 reshape 為 7x7x30了。 30 是指 2x(4+1) + 20。這裡 2 就是 上面的 B,4+1 是指每個 bbox 的預測值,包括 ( x , y , w , h , c o n f i d e n c e ) (x,y,w,h,confidence) (x,y,w,h,confidence),這裡的 20 是 20 個類别對應的分類置信度(不包括背景)。

3 損失函數

YOLO 的損失函數由三部分組成,位置損失,置信度損失以及分類損失函數。

3.1 位置損失函數

L o s s 1 = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B Π i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B Π i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] Loss_1 = \lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B}\Pi_{ij}^{obj}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]+\lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B}\Pi_{ij}^{obj}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2] Loss1​=λcoord​i=0∑S2​j=0∑B​Πijobj​[(xi​−x^i​)2+(yi​−y^​i​)2]+λcoord​i=0∑S2​j=0∑B​Πijobj​[(wi​

​−w^i​

​)2+(hi​

​−h^i​

​)2]

其中

Π i j o b j = { 1   如 果 c e l l i 的 b b o x j 負 責 預 測 目 标 0   否 則 \Pi_{ij}^{obj} =\left\{ \begin{aligned} &1 \space如果 cell_i 的 bbox_j 負責預測目标\\ &0 \space 否則 \end{aligned} \right. Πijobj​={​1 如果celli​的bboxj​負責預測目标0 否則​

對于位置損失,主要是計算 bbox 的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 和對應的 ground truth box 的 ( x ^ , y ^ , w ^ , h ^ ) (\hat{x},\hat{y},\hat{w},\hat{h}) (x^,y^​,w^,h^) 之間的 sum-squared error,需要注意的是并不是所有的 bbox 都參與 loss 的計算,首先必須是 c e l l i cell_i celli​ 中存在 object,并且 c e l l i cell_i celli​ 中的第 j 個 bbox 和 ground truth box 有最大的 IoU 值,那麼這個 b b o x j bbox_j bboxj​ 才參與 loss 的計算,其他的不滿足條件的 bbox 不參與。即,一個 ground truth box 隻需要一個 bbox 來負責,而有最大 IoU 的 bbox 更接近 ground truth,是以學習起來更快。

對不同大小的box預測中,相比于大box預測偏一點,小box預測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。

為了緩和這個問題,作者用了一個比較取巧的辦法,就是将 bbox 的 width 和 height 取平方根代替原本的 height 和 width。這個參考下面的圖很容易了解,小 bbox 的橫軸值較小,發生偏移時,反應到y軸上相比大 bbox 要大。

目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1

3.2 置信度損失函數

L o s s 2 = ∑ i = 0 S 2 ∑ j = 0 B Π i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B Π i j n o o b j ( C i − C ^ i ) 2 Loss_2 = \sum_{i=0}^{S^2}\sum_{j=0}^{B}\Pi_{ij}^{obj}(C_i-\hat{C}_i)^2 + \lambda_{noobj} \sum_{i=0}^{S^2}\sum_{j=0}^{B}\Pi_{ij}^{noobj}(C_i-\hat{C}_i)^2 Loss2​=i=0∑S2​j=0∑B​Πijobj​(Ci​−C^i​)2+λnoobj​i=0∑S2​j=0∑B​Πijnoobj​(Ci​−C^i​)2

置信度損失的計算分兩種情況,一種是有 object 的 cell 的置信度計算,另一種是沒有 object 的 cell 的置信度計算。兩種情況都是 cell 中所有的 bbox 都參與計算。對于有 object 的 cell 中的 bbox 的置信度的 ground truth 就是 1 ∗ I O U ( p r e d , t r u t h ) 1*IOU(pred,truth) 1∗IOU(pred,truth)。需要注意的是這個IOU是在訓練過程中不斷計算出來的,因為網絡在訓練過程中每次預測的 bbox 是變化的,是以 bbox 和 ground truth 計算出來的 IOU 每次也會不一樣。而對于沒有 object 的 cell 中的 bbox 的置信度的 ground truth 為 0 ∗ I O U ( p r e d , t r u t h ) = 0 0*IOU(pred,truth) = 0 0∗IOU(pred,truth)=0 ,因為不包含物體。

3.3 分類損失函數

L o s s 3 = ∑ i = 0 S 2 Π i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 Loss_3 = \sum_{i=0}^{S^2}\Pi_{i}^{obj}\sum_{c \in classes}(p_i(c)-\hat{p}_i(c))^2 Loss3​=i=0∑S2​Πiobj​c∈classes∑​(pi​(c)−p^​i​(c))2

YOLO 中将分類損失當作回歸來計算,使用 sum-squared error 來計算分類誤差,需要注意的是隻有包含 object 的 cell 才參與分類 loss 的計算,即 object 中心點落入的 cell 才進行分類 loss 的計算,而這個 cell 的 ground truth label 就是該物體的label。

3.4 overview

YOLO 有 3 種 loss,顯然各種 loss 的重要程度是不一樣的,是以各個 loss 有不同的權重。

  • 首先在目标檢測問題中,localization的誤差比分類的誤差更重要,是以給位置誤差賦予更大的權重,記為 λ c o o r d = 5 \lambda_{coord} = 5 λcoord​=5。
  • 其次,因為一張圖中大多數的 bbox 都是不包含目标的,那麼這些 bbox 的 confidence 的 loss 就會産生比較大的影響,是以 λ n o o b j = 0.5 \lambda_{noobj} = 0.5 λnoobj​=0.5,有目标的權重為 1。

總結起來就是:

  • 對于有 object 的 cell,那麼計算 cell 的分類誤差,然後 cell 中兩個 bbox 的置信度誤差,然後 cell 中和 ground truth box 的 IoU 最大的 bbox 的位置誤差。
  • 對于沒有 object 的 cell,那就隻計算 cell 中兩個 bbox 的置信度誤差。

4 YOLO V1 的局限

  • 因為 YOLO V1 中每個 cell 隻預測兩個 bbox 和一個類别,這就限制了能預測重疊或鄰近物體的數量,比如說兩個物體的中心點都落在這個 cell 中,但是這個 cell 隻能預測一個類别。
  • YOLO 是根據訓練資料來預測 bbox 的(确切的說是對訓練圖像中目标的長寬比很依賴),但是當測試資料中的物體出現了訓練資料中的物體沒有的長寬比時,YOLO 的泛化能力就變弱了。
  • 同時經過多次下采樣,使得最終得到的 feature maps 的分辨率比較低,就是得到coarse feature,這可能會影響到物體的定位,導緻定位不準。
  • 損失函數的設計存在缺陷,使得物體的定位誤差有點兒大,尤其在不同尺寸大小的物體的處理上還有待加強。
  • 網絡中有 fc 層,是以隻能輸入固定尺寸的圖檔。

當然 YOLO V1 的優勢就是速度快,可以進行實時的檢測,而且準确度也還不錯。如下圖所示。

目标檢測 YOLO 系列: 開宗立派 YOLO v1目标檢測 YOLO 系列: 開宗立派 YOLO v1

參考

  • Review On YOLOv1
  • 目标檢測 YOLO

繼續閱讀