圖解YOLO


YOLO核心思想:從R-CNNFast R-CNN一直採用的思路是proposal+分類 (proposal提供位置信息, 分類提供類別信息)精度已經很高,但是速度還不行。 YOLO提供了另一種更爲直接的思路: 直接在輸出層迴歸bounding box的位置和bounding box所屬的類別(整張圖作爲網絡的輸入,把Object Detection 的問題轉化成一個 Regression 問題)。

YOLO的主要特點:

  • 速度快,能夠達到實時的要求。在 Titan XGPU上能夠達到45幀每秒。
  • 使用全圖作爲Context信息,背景錯誤(把背景錯認爲物體)比較少。
  • 泛化能力強。

在這裏插入圖片描述

大致流程:

preview

  1. Resize448*448,圖片分割得到7*7網格(cell)

  2. CNN提取特徵和預測

    卷積部分負責提特徵。

    全鏈接部分負責預測:a) 7*7*2=98bounding box(bbox)的座標xcenter,ycenter,w,hx_{center},y_{center},w,h和是否有物體的confidenceconfidence 。b) 7*7=49cell所屬20個物體的概率。

  3. 過濾bbox(通過NMS

    img

1. 網絡設計

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XAfDh4Ea-1578016841510)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\image-20200102141859702.png)]

img

網絡結構借鑑了GoogLeNet。24個卷積層,2個全鏈接層。(用1×1 reduction layers緊跟3×3 convolutional layers 取代Googlenetinception modules

2. 訓練

預訓練分類網絡: 在 ImageNet 1000-class competition dataset上預訓練一個分類網絡,這個網絡是Figure3中的 前20個卷積網絡 + average-pooling layer + fully connected layer (此時網絡輸入是224*224)。

訓練檢測網絡:轉換模型去執行檢測任務,**《Object detection networks on convolutional feature maps》**提到說在預訓練網絡中增加捲積和全鏈接層可以改善性能。在他們例子基礎上添加4個卷積層和2個全鏈接層,隨機初始化權重。檢測要求細粒度的視覺信息,所以把網絡輸入也又224*224變成448*448。見Figure3

一幅圖片分成7x7個網格(grid cell),某個物體的中心落在這個網格中此網格就負責預測這個物體。
img
最後一層輸出爲 (7*7)*30的維度。每個 1*1*30的維度對應原圖7*7個cell中的一個,1*1*30中含有類別預測和bbox座標預測。總得來講就是讓網格負責類別信息,bounding box主要負責座標信息(部分負責類別信息:confidence也算類別信息)。具體如下:

(1) 每個網格(1*1*30維度對應原圖中的cell)要預測2個bounding box (圖中黃色實線框)的座標(xcenter,ycenter,w,h)(x_{center},y_{center},w,h) ,其中:中心座標的xcenter,ycenterx_{center},y_{center} 相對於對應的網格歸一化到0-1之間,ww, hh用圖像的widthwidthheightheight歸一化到0-1之間。 每個bounding box除了要回歸自身的位置之外,還要附帶預測一個confidenceconfidence值。 這個confidence代表了所預測的box中含有object的置信度和這個box預測的有多準兩重信息confidence=Pr(Object)IOUpredtruthconfidence=Pr(Object) *IOU_{pred}^{truth}。其中如果有ground true box(人工標記的物體)落在一個grid cell裏,第一項取1,否則取0。 第二項是預測的bounding box和實際的ground truth box之間的IOU值。即:每個bounding box要預測xcenter,ycenter,w,h,confidencex_{center},y_{center},w,h,confidence共5個值 ,2個bounding box共10個值,對應 1*1*30維度特徵中的前10個。

img

img

(2) 每個網格還要預測類別信息,論文中有20類。7x7的網格,每個網格要預測2個bounding box和 20個類別概率,輸出就是 7x7x(5x2+20)。 (通用公式: SxS個網格,每個網格要預測B個bounding box還要預測C個categories,輸出就是SxSx(5*B+C)的一個tensor。 注意:class信息是針對每個網格的,confidence信息是針對每個bounding box的)。

img

損失函數設計:

img

損失函數的設計目標就是讓座標(x,y,w,h)confidenceclassification(x,y,w,h),confidence,classification 這個三個方面達到很好的平衡。簡單的全部採用了sum-squared error loss來做這件事會有以下不足: a) 8維的localization error和20維的classification error同等重要顯然是不合理的; b) 如果一個網格中沒有object(一幅圖中這種網格很多),那麼就會將這些網格中的boxconfidence push到0,相比於較少的有object的網格,這種做法是overpowering的,這會導致網絡不穩定甚至發散。 解決方案如下:

  • 更重視8維的座標預測,給這些損失前面賦予更大的loss weight,記爲λcoord\lambda_{coord},在pascal VOC訓練中取5。(上圖藍色框)
  • 對沒有objectbboxconfidence loss,賦予小的loss weight,記爲λnoobj\lambda_{noobj} ,在pascal VOC訓練中取0.5。(上圖橙色框)
  • objectbboxconfidence loss (上圖紅色框) 和類別的loss(上圖紫色框)的loss weight正常取1。
  • 對不同大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏一點更不能忍受。而sum-square error loss中對同樣的偏移loss是一樣。 爲了緩和這個問題,作者用了一個比較取巧的辦法,就是將boxwidthheight取平方根代替原本的heightwidth。 如下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。

img

  • 一個網格預測多個bounding box,在訓練時我們希望每個object(ground true box)只有一個bounding box專門負責(一個object 一個bbox)。具體做法是與ground true box(object)IOU最大的bounding box 負責該ground true box(object)的預測。這種做法稱作bounding box predictorspecialization(專職化)。每個預測器會對特定(sizes,aspect ratio or classed of object)ground true box預測的越來越好。(個人理解:IOU最大者偏移會更少一些,可以更快速的學習到正確位置)。

3. 測試

Test的時候每個網格預測的class信息(Pr(ClassiObject))(Pr(Class_i|Object))bounding box預測的confidence信息

(Pr(Object)IOUpredtruth)(Pr(Object)*IOU_{pred}^{truth})相乘,就得到每個bounding boxclass-specific confidence score

Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruthPr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_i)*IOU_{pred}^{truth}

  • 等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個bounding box預測的confidence。這個乘積即encode了預測的box屬於某一類的概率,也有該box準確度的信息。

img

  • img
  • 對每一個網格的每一個bbox執行同樣操作:7x7x2 = 98 bbox (每個bbox既有對應的class信息又有座標信息)

img

img

img

  • 得到每個bboxclass-specific confidence score以後,設置閾值,濾掉得分低的boxes,對保留的boxes進行NMS處理,就得到最終的檢測結果。

img

缺陷:

  • YOLO對相互靠的很近的物體(挨在一起且中點都落在同一個格子上的情況),還有很小的羣體檢測效果不好,這是因爲一個網格中只預測了兩個框,並且只屬於一類。
  • 測試圖像中,當同一類物體出現的不常見的長寬比和其他情況時泛化能力偏弱。
  • 由於損失函數的問題,定位誤差是影響檢測效果的主要原因,尤其是大小物體的處理上,還有待加強。

本文圖片很多來自PPT:

內容主要參考如下博客:

RCNN學習筆記(6):You Only Look Once(YOLO):Unified, Real-Time Object Detection

You Only Look Once: Unified, Real-Time Object Detection

發佈了111 篇原創文章 · 獲贊 51 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章