(ML) YOLOv1 : You Only Look Once: Unified, Real-Time Object Detection

YEN HUNG CHENG
7 min readSep 17, 2023

--

Photo by Ion Fet on Unsplash

Abstract

這篇論文提出了一種新的物體檢測方法 YOLO。

YOLO 不像以前的方法那樣重用分類器來進行檢測,而是將物體檢測視為一個回歸問題,直接預測物體的邊界框坐標和類別機率。一個單一的神經網絡可以在一次前向傳播中直接從整張圖像中預測出邊界框和類別機率。因為整個檢測流程是一個單一的網絡,所以可以直接對檢測性能進行端到端的優化。

YOLO 的統一架構非常快速。它的基本模型可以以每秒45幀的速度實時處理圖像。一個較小的模型 Fast YOLO 每秒可達155幀,同時mAP還是其他實時檢測器的兩倍。與目前最好的檢測系統相比,YOLO 在定位時誤差較大,但在背景錯誤檢測方面較少。最後 YOLO 學習到了非常泛化的物體表示,從自然圖像推廣到其他領域時,優於其它檢測方法。

YOLO

最常看見將圖片放入 yolo 後的輸出結果如下:

我們能夠得知物體的位置在哪(bndBox),以及物體是什麼類別(class)

Before Training

通常會使用 LabelImage 來手動標記物件在圖片中的位置(Ground Truth)

Inference

進行推論前,我們會先將圖片變成 448 x 448,再切為 7 x 7 個網格(grid)

Keypoint

若被偵測(Detect)物體的中心落入某個網格(grid)內,這個網格就要負責去偵測該物體

而每個網格(grid)的輸出有 兩個 bndBox,每個 bndBox 有 五個輸出:

bndBox 中心座標:(x, y)

bndBox 大小:(w, h)

confidence : Pr(object) x IoU truth pred

  • Pr(object) 代表 Bbox 是否包含物體,若有包含物體則為 1,沒有包含物體則為 0
  • IoU truth pred 代表 Bbox 與 Ground truth 的 IoU

IOU

IOU = Ground Truth 與 Prediction 的交集 / Ground Truth 與 Prediction 的聯集

Architecture

此時可以對照 yolov1 的模型架構,我們就能知道為何輸出維度為 7 x 7 x 30

Inference first step

剛剛全部的流程,僅為推理的第一步而已,實際上 yolo 輸出時為中間的圖,因為每一個網格會有兩個 bndBox 輸出對吧,也就是說會像中間的圖一樣,圖片會有至少 7 x 7 x 2 個 bndBox 在圖中顯示

接下來我們會透過 NMS(Non-Maximum Suppression) 非極大值抑制 來濾除重複以及不重要的 bndBox

NMS(Non-Maximum Suppression)

此時我們需要每個網格(grid)中兩個數值,每個 bndBox 中的 confidence 以及 class probability

接下來將 bndBox 與 class probability 相乘 可以得到 class confidence score

將所有的 class confidence score 可視化後,就能得到右下角的圖

接下來我們可以假設第一行為貓的分數(cat score),且每一個 cat score 中都有數值,這時我們會設定一個 threshold 來進行濾除,濾除掉分數過低的 cat score

濾除後的值為 0,接下來我們會進行排序(sort),由左至右,由大至小

接下來先將 cat score 先抽取出來👉🏻 class cat score for each bbox

將 class cat score for each bbox 可視化,分數越高的框會越接近 Ground Truth,接下來我們要繼續濾除重複的框

首先先將第一名與第二名進行比較,也就是算第一名與第二名之間的 IOU,當大於 0.5(通常都設為 0.5)時,我們就會濾除掉那個框

第一名跟第二名比完後,接下來第一名會與第三名做比較,重複剛剛的動作算第一名與第三名之間的 IOU ,若大於 0.5 就濾除掉

當設定較大的IOU閾值(例如0.75)時,它要求第二名的邊界框與第一名非常貼合,以便其IOU(交集過聯集)值才有可能大於0.75。這意味著只有當第二個候選框幾乎完全包含在第一個候選框內時,才會保留第一個候選框,並剔除第二個候選框。

iou = 0.75

以上就是 yolov1 大致的推論過程

loss function

bndBox 的中心點的座標 loss

bndBox 的長與寬的大小 loss

該網格(grid)有偵測到物件時的 loss

該網格(grid)沒有偵測到物件時的 loss

該物件的類別的 loss

⭐️為了避免損失過於著重在背景(即圖像中不包含物體的部分),通常會在計算沒有背景的損失之前對它們進行加權,並使用 λnoobj(通常設定為0.5)進行乘法調整。這樣可以平衡物體和背景的損失,使得模型更加穩健,不會過度關注圖像中的背景區域。

⭐️ 這時可以發現 bndBox 的長與寬的大小 loss 計算的方式為 先開根號,再進行相減算平方,這是為為何呢?可以想像一個狀況:

如果模型預測出的 bndBox 數值相同,則偏移量確實對於不同大小的物體來說會有不同的影響。對於大物體來說,偏移量相對較小,對小物體來說,偏移量相對較大。如果不對預測的長度和寬度進行調整,則可能會導致模型傾向於預測大物體而忽略小物體,因為對於大物體的誤差相對較小。

因此,這種平方根損失的計算方式可以幫助平衡不同大小的物體之間的損失,使得模型更有能力捕捉到各種大小的物體。這有助於提高YOLOv1的性能,使其能夠更好地處理不同大小的物體。

--

--