1. 程式人生 > >YOLO演算法解讀

YOLO演算法解讀

本文以從頭實現YOLO的角度出發,解釋了YOLO目標檢測框架。本文不會描述網路的優點/缺點或每個設計選擇的原因,而是關注於它是如何工作的。在閱讀本文之前,假設讀者對神經網路,特別是CNN有一個基本的瞭解。

YOLO是什麼?

YOLO (You Only Look Once),是一個用於目標檢測的網路。目標檢測任務包括確定影象中存在某些物件的位置,以及對這些物件進行分類。以前的方法,比如R-CNN和它的變種,使用一個管道在多個步驟中執行這個任務。這可能執行緩慢,也很難優化,因為每個單獨的元件都必須單獨訓練。YOLO,只用一個神經網路就能搞定。原文中提到:

We reframe the object detection as a single regression problem, straight from image pixels to bounding box coordinates and class probabilities.

簡單地說,拿一個影象作為輸入,通過一個看起來像普通CNN的神經網路,你就會得到一個在輸出中包含邊界框和類別預測的向量。

那麼,這些預測是什麼樣的呢?

預測向量

理解YOLO的第一步是如何編碼輸出。輸入影象被分割成一個S x S網格單元格。對於影象中出現的每個物件,一個網格單元負責預測它。這就是物體中心所在的單元格。

每個網格單元預測B個邊界框以及C個類別的概率。邊界框的預測有5個組成部分:(x, y, w, h, confidence)。(x, y)座標表示框的中心,相對於網格單元格位置(記住,如果框的中心不落在網格單元格內,則此單元格不負責)。這些座標被歸一化在0到1之間。(w, h)框的尺寸也被歸一化到[0, 1],相對於影象的大小。讓我們來看一個例子: 在這裡插入圖片描述

在邊界框預測中還有一個部分,即置信度:

Formally we define confidence as Pr(Object) * IOU(pred, truth) . If no object exists in that cell, the confidence score should be zero. Otherwise we want the confidence score to equal the intersection over union (IOU) between the predicted box and the ground truth.

注意,置信度反映了任何類物件的存在或不存在,如果不知道什麼是IOU,請看

這裡.

現在我們已經瞭解了邊界框預測的5個組成部分,記住每個網格單元做了B次這樣的預測,所以總共有S x S x B x 5個與邊界框預測相關的輸出。

還需要預測類別的概率Pr(class (i) |Object)。這個概率取決於包含一個物件的網格單元。在實踐中,這意味著如果網格單元中沒有物件,損失函式將不會因為錯誤的類別預測而進行懲罰,我們將在後面看到這一點。一個網路只預測每個單元格的一組類別概率,而與邊界框的數量無關。這裡會得到總共S x S x C個類別概率。

將類別預測加到輸出向量中,我們得到一個S x S x (B x 5 +C)的張量作為輸出。 在這裡插入圖片描述

網路

一旦你理解了預測是如何編碼的,剩下的就很簡單了。網路結構看起來像一個普通的CNN,有卷積層和最大池化層,最後是兩個全連線層: 在這裡插入圖片描述 關於框架:

  • 注意,該體系結構是為Pascal VOC資料集而設計的,其中作者使用了S=7、B=2和C=20。這解釋了為什麼最終的feature map是7x7,也解釋了輸出的大小(7x7x(2*5+20))。使用具有不同網格大小或不同數量的類別的網路可能需要調整維度。
  • 作者提到有一個快速版本的YOLO,有更少的卷積層。不過上面的表格展示的是完整的版本。
  • 1x1簡化層和3x3卷積層的部分主要是根據GoogLeNet (Inception)模型得到的啟發
  • 最後一層使用線性啟用函式。而所有其他層使用leaky RELU(如果x > 0,Φ(x)= x,否則為0.1x)

損失函式

關於損失函式有很多東西要講,我們分幾部分來做。首先: 在這裡插入圖片描述 這個方程計算了與預測的邊界框位置(x, y)相關的損失。不要擔心λ,暫時認為它是一個給定的常數。該函式計算所有網格(i = 0 …S ^ 2)中所有邊界框預測器的和(j = 0…B)。?obj定義為:

  • 1, 如果一個物件存在於網格單元i中,第j個邊界框預測器“負責”該預測
  • 0, 其他情況

但是我們怎麼知道哪個預測器對物體負責呢?引用原文:

YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth.

方程中的其他項應該是容易理解的:(x,y)為預測的邊界框位置,(x̂, ŷ)為訓練資料的實際位置。

來看第二部分: 在這裡插入圖片描述

這是與預測邊界框寬度/高度相關的損失。這個方程和第一個方程很相似,除了平方根。這是怎麼回事?再次引用原文:

Our error metric should reflect that small deviations in large boxes matter less than in small boxes. To partially address this we predict the square root of the bounding box width and height instead of the width and height directly.

第三部分: 在這裡插入圖片描述 在這裡,我們計算與每個邊界框預測器的置信度得分相關的損失。C是置信度得分,Ĉ是預測的邊界框與真值的IOU。?obj等於1時,說明在網格中存在目標,而其他情況為0。? noobj 則代表相反的情況。

The λ parameters that appear here and also in the first part are used to differently weight parts of the loss functions. This is necessary to increase model stability. The highest penalty is for coordinate predictions (λ coord = 5) and the lowest for confidence predictions when no object is present (λ noobj = 0.5).出現在這裡的λ引數,同第一部分的λ一樣,用於為損失函式的不同部分指定權重。這對於提高模型的穩定性是必要的。最高懲罰(λcoord = 5)用於座標預測,最低懲罰用於當沒有物件存在時的置信度預測(λnoobj = 0.5)。

損失函式的最後一部分是分類損失: 在這裡插入圖片描述 它看起來類似於分類中的常規的平方和誤差,除了?obj。之所以使用它,是因為當單元格上沒有物件時,我們不會懲罰分類錯誤(因此前面討論了條件概率)。

訓練

作者用以下方式描述了訓練過程:

  • 首先,使用ImageNet 1000-class 競賽資料集預訓練前20個卷積層,輸入大小為224x224
  • 然後,將輸入解析度提高到448x448
  • 配置批次大小為64,動量為0.9,衰減為0.0005,訓練整個網路135個epoch
  • 學習率進度:第一個epoch,學習率從0.001緩慢提高到0.01。訓練大約75個epoch,然後開始減少。
  • 使用隨機縮放和平移,隨機調整曝光和飽和度,將資料增強。本文對這一過程進行了較詳細的描述。