在當時較新的目標檢測算法中,R-CNN 算是速度快表現又好的方法。但是仍存在幾個缺點 :
- 無法被端到端的訓練
- 仍然無法實時計算
本論文提出的 YOLO 不但可以被端到端的訓練,也能夠實時運算 (45 FPS on Titan X)。
YOLO設計
目標檢測流程
- 輸入圖像被分成 S x S 個網格(grid)
- 每個網格負責預測中心點落自己裡面的物件
- 每個網格會預測以下這些東西:
- B 個物件框信息,每個物件框都包含:
- x, y: 物件中心的位置 (相對於網格左上角點,並且使用網格大小正規化)
- w, h: 物件框的大小 (使用輸入圖像大小正規化)
- confidence: 物件框中存在物件的機率 x 物件框與物件位置的 IoU,可表示為:
- 1 個類別信息 (你沒看錯,整個網格大家共用)
- 信息中包含了 C 類物件的條件機率
- 其意義為在網格存在物件條件下,物件所屬的類別機率,可表示為:
- B 個物件框信息,每個物件框都包含:
- [物件框 confidence] x [物件類別條件機率],意義上為該物件框中存在某類物件的機率
- 最後模型的輸出尺寸為 S x S x (B * 5 + C)
架構
- 受到 GoogLeNet 啟發,但未使用 inception module
- CNN + FC + CNN
- 用了類似 NiN 概念,也就是 1x1卷積 + 3x3卷積
訓練
預訓練
- 只取出模型的前 20 層卷積層
- 接上 average-pooling layer 與 fully connected layer
- 使用 ImageNet 的 1000 類物件分類資料集進行 pre-training
- 模型訓練一周之後,在 ImageNet 2012 validation set 上達到了 88% 的 top-5 accuracy
Fine-tuning
- 將上面模型的卷積層部分(backbone)取出
- 加上4層卷積層與2層全連接層 ( 隨機初始化 ),修改成用於 Detection 的架構
- 因為目標檢測任務通常需要比較細緻的影像,因此將輸入尺寸提升至預訓練時的2倍 (448x448)
損失
Sum-Squared Error (SSE)
- 這種方法雖然容易優化,卻無法最大化模型的 AP
- 對於 localization error 與 classification error 給予相同的權重
- 訓練數據大多數 grid 中不含物體,樣本類別不均產生的梯度不均,造成預測傾向於 conf=0
- 將大物件與小物件產生的損失值視為相同 (同樣都是誤差 1px,小物件損失值應該要比較大)
- 符號
- : 物件的位置、寬高
- : 物件存在的 confidence
- : 物件為 C 類物件的 probability
- : 物件是否存在於第 i 個網格中
- : 物件是否存在於第 i 個網格中,並且由第 j 個 bounding box 負責預測
優化後的 SSE
- 藉由兩個參數,調整不同損失的權重
-
- 全部損失中,位置損失權重 > Confidence損失權重
- confidence 損失中,減弱負樣本 (不存在物件的物件框) 的權重
- 使用BBox 寬高的平方根計算損失,降低大物件的損失權重
其他細節
- 只有當有物件存在該網格中,才會對分類損失懲罰
- 只有當該 predictor 有被分配到 ground-true box 時,才會對位置與寬高損失懲罰。
- ground true 的分配 :
- 每個物件,只由一個 predictor 負責預測
- 選取預測值與物件位置 IoU 最大的 predictor 負責預測
- 激勵函數部分,除了模型最後一層使用了線性函數,其餘皆使用 Leaky ReLU