《You Only Look Once》
一 介紹
本文介紹的是Yolo演算法,全稱是You Only Look Once: Unified, Real-Time Object Detection。只需進行一次CNN運算,其核心思想就是利用整張圖作為網路的輸入,直接在輸出層迴歸bounding box.
二 實現方法
將整個影象分為S*S個網格,如果物體的中心落在這個網格中,那麼這個網格就負責檢測這個物體。
每個網格預測B個bounding box,除了預(x,y,w,h),還要預測一個confidence值。其代表了該box預測物體的置信度以及預測的有多準確。其計算公式如下:
如果有物體落在一個網格中,第一項為1,否則取0.第二項是預測bounding box和實際ground truth之間的IOU。
每個 bounding box 要預測 (x, y, w, h) 和 confidence 共5個值,每個網格還要預測一個類別資訊,記為 C 類。則 SxS個 網格,每個網格要預測 B 個 bounding box 還要預測 C 個 categories。輸出就是 S x S x (5*B+C) 的一個 tensor。
三 網路結構
在 test 的時候,每個網格預測的 class 資訊和 bounding box 預測的 confidence資訊相乘,就得到每個 bounding box 的 class-specific confidence score:
等式左邊第一項就是每個網格預測的類別資訊,第二、三項就是每個 bounding box 預測的 confidence。這個乘積即 encode 了預測的 box 屬於某一類的概率,也有該 box 準確度的資訊。得到每個 box 的 class-specific confidence score 以後,設定閾值,濾掉得分低的 boxes,對保留的 boxes 進行 NMS 處理,就得到最終的檢測結果。
四 一些細節
每個 grid 有 30 維,這 30 維中,8 維是迴歸 box 的座標,2 維是 box的 confidence,還有 20 維是類別。 其中座標的 x, y 用對應網格的 offset 歸一化到 0-1 之間,w, h 用影象的 width 和 height 歸一化到 0-1 之間。
在實現中,最主要的就是怎麼設計損失函式,讓這個三個方面得到很好的平衡。作者簡單粗暴的全部採用了 sum-squared error loss 來做這件事。
這種做法存在以下幾個問題:
第一,8維的 localization error 和20維的 classification error 同等重要顯然是不合理的;
第二,如果一個網格中沒有 object(一幅圖中這種網格很多),那麼就會將這些網格中的 box 的 confidence push 到 0,相比於較少的有 object 的網格,這種做法是 overpowering 的,這會導致網路不穩定甚至發散。
一個網格預測多個 box,希望的是每個 box predictor 專門負責預測某個 object。具體做法就是看當前預測的 box 與 ground truth box 中哪個 IoU 大,就負責哪個。這種做法稱作 box predictor 的 specialization。
五 缺點
YOLO 對相互靠的很近的物體,還有很小的群體檢測效果不好,這是因為一個網格中只預測了兩個框,並且只屬於一類。
同一類物體出現的新的不常見的長寬比和其他情況時,泛化能力偏弱。
由於損失函式的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。