天天看點

YOLO-V1

經典的one-stage方法,把檢測問題轉化為回歸問題,一個CNN就可以搞定,非常适合對視訊進行實時檢測。

核心思想

YOLO-V1

想要預測圖像中的物體(狗、自行車、小汽車),先将輸入圖像轉換為S*S的矩形方格,每個格子(圖中紅色框)都負責預測自己領域内的物體。

但是每個小格子可能并不知道預測的結果的形态,我們需要提供一些經驗值(圖中黃色框),但經驗值可能并不是真實值,是以我們要對經驗值通過CNN進行微調,讓它預測的更加準确。

簡單梳理一下:我們現在有了一個輸入資料,然後把輸入資料分成很多個小格子,之後每個小格子産生兩種候選框,再後計算每個預選框跟真實值之間的IOU,誰的IOU比較大,則對誰進行微調。

預測的過程中對于每一個格子會計算出一個置信度(confidence),是以最後得到的結果中會有四個值(x, y, w, h, confidence),對于置信度比較小的可以直接過濾掉。

網絡架構

YOLO-V1

輸入圖像大小需要resize到448 * 448 * 3(在後續的改進版本中對此有優化),到時候還可以根據映射規則再映射到原始的輸入資料當中。

卷積神經網絡中對輸入圖像的大小有限制是為什麼?

其實卷積核對輸入資料的小仙的沒有要求,但是全連接配接層是定死的,最後一層卷積和全連接配接層之間的權重矩陣和偏置矩陣的大小必須是固定的。

經過多次卷積最終得到了一個7 * 7 * 1024的特征圖,通過第一個全連接配接層轉換為4096個特征,通過第二個全連接配接層轉換為1470個特征,然後reshape為7 * 7 * 30的特征。

轉換為7 * 7 * 30的矩陣之後就比較友善了,對于輸入圖像,我們分隔為7 * 7的小格子,每個格子當中有30個值,關于這個我們要好好分析一下。

對于每個小格子我們産生兩個預選框,并且還有五個值(x, y, w, h, confidence),是以30個位置中前5個我們存放第一個預選框的值,其次5個我們存放第二個預選框的值,然後的20個值,就是一個20分類的機率。

YOLO-V1

最終的結果大小:(S * S) * (B * 5 + C)

損失函數

YOLO-V1

位置損失

現在我們還差一個損失還是,定義預測值(x, y, w, h)和真實值(x0, y0, w0, h0)之間的差距,也就是我們的位置誤差。

系數λ表示權重項,S * S的網格,是以i從0到S2,每個格子有B個預測框,是以j從0到B,在B個候選框中選擇IOU最大的那一個,計算與真實值之間的差異。

x, y和w, h的計算方式不同是為什麼?

有些物體的w, h比較大,有些比較小,對于比較小的,我們需要稍微重視一點。

對于y=根号(x),切線的斜率随着x的增大而減小,并且變換的幅度逐漸減小,随意對于x比較小的,y=根号(x)更加敏感,而對于x比較大的,y=根号(x)沒有那麼敏感。

置信度誤差

當預測框與真實框之間的IOU比較高的時候,我們認為它可能是一個前景,對于真實框我們設定為1,希望IOU與真實框的1越接近越好。

對于一個樣本來說,很多地方是不包含object的,這些位置就是一個負樣本,為了不讓負樣本影響我們的預測,我們需要給它提供一個權重項λ。

分類誤差

YOLO-V1 存在的問題

  1. 每個Cell隻預測一個類别,如果重疊則無法解決;
  2. 小物體檢測效果一般,長寬比可選的但單一。