YOLO(You Only LOOK Once)論文詳讀

wuxin_studynote發表於2020-11-14

Abstract

       在此之前的方法是把分類器classifier用以進行執行檢測任務。
       本文把目標檢測視作迴歸問題,來把邊界框和相關的類別概率進行空間分離。因為YOLO使用單一網路,從整幅影像中一次性同時完成預測邊界框和生成類別概率的任務,從而可以在執行檢測時進行端到端的優化。

現有的檢測演算法都是使用分類器進行目標檢測的。

       為了檢測目標,為目標制定一個分類器,並在測試影像中從不同的位置和不同的尺度對其進行評估。
       DPM方法使用滑動視窗的方法,所以分類器可以執行在整個影像的所有的空間位置。
       RCNN使用候選區域的方法,首先在影像中生成潛在的邊界框,然後使用分類器對這些邊界框進行分類,分類後對邊界框進行微調,消除重複的邊界框,並根據場景中其他的物件對邊界框進行重新打分。這種方法速度慢且難以進行優化,因為每個獨立的功能模組都需要分別進行訓練。

YOLO

       YOLO把之前檢測網路中分離的各個功能元件放在一個網路中,使用來自整幅影像的特徵,通過網路在預測多尺寸的邊界框的同時生成對應的類別概率,因為直接訓練整個影像,所以可以直接優化檢測效能,這種設計使得模型可以進行端到端的訓練,從而可以得到較高的平均準確率。

YOLO的步驟:

在這裡插入圖片描述

YOLO模型實現步驟

  1. 把整幅影像分割成S×S個網格,如果某個網格中有目標物件,則該網格在檢測該目標的過程中起到重要作用。
  2. 每一個網格生成B個邊界框,對這些邊界框對應生成置信度(confidence score置信度:反映了模型對該邊框包含目標的信心和該邊框預測的準確率,置信度的計算公式為 P (object)× IOU,P(object)是該邊框包含目標物件的概率,IOU是預測的邊界框與ground-troth的IOU值;如果該邊框內不含有目標,則置信度為0)。一般是把置信度等於IOU
    每個邊界框包含五個預測值(x, y, w, h, confidence),(x, y)是邊框中心點的座標,(w, h)是寬和高,confidence是ground-truth與預測的邊界框的IOU值。
    每個網格同時預測得到C個條件概率P(class-i | object),這些條件概率表示該網格包含目標物件的概率(因為資料集中共C類,所以需要預測C個條件概率)。針對每個網格僅預測一組(C個)類別概率,而不是考慮B個邊界框,從而速度更快。

       測試時,把類別條件概率和每個邊界框的置信度相乘,從而得到每個邊框特定類別的置信度,這些置信度反映了該類別目標出現在邊框中的概率P(class-i)和預測結果與目標物件的契合度IOU。
在這裡插入圖片描述

       對於PASCAL VOC資料集,設S=7B=2,因為資料集有20類,所以C=20,卷積網路最後輸出一個7×7×(2×5+20)Tensor(計算公式為S×S×(B×5+C))。

YOLO方法的特點:

  1. 速度快。因為把檢測任務視為迴歸問題,從而不需要複雜的流程。因為可以達到45fps,最快可以達到155fps,從而可以對流媒體進行低於25ms延遲的實時處理。除此之外,YOLO具有比其他實時處理的系統高兩倍的平均精度。
  2. 因為YOLO針對整個圖片進行處理,所以比其他的方法擁有更多的關於類別的上下文資訊。正是因為Fast RCNN不能獲取到大面積的上下文,所以會在影像上產生大量錯誤背景正樣本(把背景區域識別為目標物件的正樣本),YOLO方法比Fast RCNN減少近一半數量的背景正樣本錯誤。
  3. YOLO學習的都是樣本的通用表現形式。正是因為高度的generalizable使得YOLO在遇到新型別的物件或unexcepted 輸入時不會輕易break down
  4. 除此之外,YOLO準確率也比其他方法高很多,但是YOLO對精確定位某些物件(正如前文中提到的,YOLO會產生較多的定位錯誤),尤其是針對一些小尺寸的物件很吃力

YOLO網路模型

       使用卷積層從整個影像中提取特徵,使用全連線層來預測、輸出概率和座標值。
基礎的YOLO模型有24個卷積層、2個全連線層。使用1×1的卷積層,然後加上3×3的卷積層來替代原本Google Net使用的卷積計算方式。
       Fast YOLO模型有9個卷積層、2個全連線層,不過每個卷積層的filter要比基礎YOLO模型小很多除了模型尺寸不一樣,Fast YOLO模型和基礎YOLO模型所有的訓練引數、測試引數都是一樣的
在這裡插入圖片描述

YOLO網路模型

網路模型結構

01——Conv2D(filter=64, kernel_size=(7,7), strides=(2,2))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

02——Conv2D(filter=192, kernel_size= (3,3))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

03——Conv2D(filter=128, kernel_size= (1,1))
04——Conv2D(filter=256, kernel_size= (3,3))
05——Conv2D(filter=256, kernel_size= (1,1))
06——Conv2D(filter=512, kernel_size= (3,3))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

07——Conv2D(filter=256, kernel_size= (1,1))
08——Conv2D(filter=512, kernel_size= (3,3))
09——Conv2D(filter=256, kernel_size= (1,1))
10——Conv2D(filter=512, kernel_size= (3,3))
11——Conv2D(filter=256, kernel_size= (1,1))
12——Conv2D(filter=512, kernel_size= (3,3))
13——Conv2D(filter=256, kernel_size= (1,1))
14——Conv2D(filter=512, kernel_size= (3,3))
15——Conv2D(filter=512, kernel_size= (1,1))
16——Conv2D(filter=1024, kernel_size= (3,3))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

17——Conv2D(filter=512, kernel_size= (1,1))
18——Conv2D(filter=1024, kernel_size= (3,3))
19——Conv2D(filter=512, kernel_size= (1,1))
20——Conv2D(filter=1024, kernel_size= (3,3))
21——Conv2D(filter=1024, kernel_size= (3,3))
22——Conv2D(filter=1024, kernel_size= (3,3), strides= (2,2))

23——Conv2D(filter=1024, kernel_size= (3,3))
24——Conv2D(filter=1024, kernel_size= (3,3))

FC(1024, 4096)
FC(4096, 30)

       在使用YOLO進行目標檢測時發現,增加摺積層層數和全連線層層數可以提升表現,原因是進行目標檢測時經常需要細粒度的視覺資訊,所以增加了模型的輸入解析度——輸入的大小從224×224增加至448×448
       因為最後一層的全連線層輸出類別概率和邊界框的座標值,所以使用輸入影像的長和寬正則化邊界框的長和寬,從而使得他們的值都位於0-1之間,然後引數化邊界框的x,y座標為特定網格位置的偏移量,也使得他們的值位於0-1之間
       除了最後一層全連線層使用線性啟用函式,其餘層使用下面的leaky 線性糾正啟用函式
在這裡插入圖片描述

       YOLO模型使用誤差平方和(sum of squared error),因為誤差平方和易於優化,但是它並不符合實現最大平均準確度的目標。因為誤差平方和會對定位誤差進行加權,導致分類誤差並不理想
       因為每個影像中都會有很多的網格內不含有目標物件,所以這些網格的置信度為0且數量總是壓倒性的超過包含物件的網格,從而導致訓練時結果很快就發散了
       為了補救這一問題,增加來自邊界框座標預測的損失,減少針對不包含物件的邊框置信度預測的損失,使用兩個引數來實現——λcoord=5和λnoobj=0.5在這裡插入圖片描述

損失函式

       其中obji表示目標物件出現在網格i中objij表示邊框中的第j個邊框對該目標物件的預測結果起決定性作用(即第j個邊框包含目標物件)

       誤差平方和會對大尺寸邊框、小尺寸邊框同時進行加權,誤差度量應該重點關注大邊框中的偏差而不是小邊框中的(同樣一個小的誤差在大尺寸邊框內不起眼,但是會在小尺寸邊框中對結果產生巨大的影響)。所以使用邊界框的寬和高的平方根√w 、√h來替代原有的邊界框的寬w和高h
       YOLO會在一個網格中預測多個邊界框,訓練時,想要一個邊界框預測器負責一個目標,所以通過當前的IOU值使用預測器進行預測。這樣使得預測器在預測尺寸、長寬比或目標類別時做的更好,從而提升了整體的效能。

本文的訓練在PASCAL VOC2007 和2012的訓練過程:

       迭代135次,資料集使用PASCAL VOC2007和2012,batch=64,decay=0.0005,momentum=0.9
       第一次迭代學習率從0.0001緩慢上升到0.001,然後使用0.01訓練75次,0.001訓練30次,0.0001訓練30次。
       為了防止過擬合,使用dropout(引數值設為0.5)和多種型別的資料增強。資料增強使用隨機尺寸縮放和旋轉,還有變化影像的曝光飽和度

YOLO的不足之處:

       因為網格方法的引入,使得可以在邊界框上執行分類。一般情況下,可以清晰的分析出哪個邊界框內含有目標,並且網路對於一種目標只需要預測一個邊框。針對一些大尺寸的目標物件,或是一些靠近多個邊框的目標物件,可以通過非極大值抑制方法,由多個網格來確定它的位置。
       因為YOLO對邊界框的空間限制,導致每個網格只能預測兩個邊界框,並且只能得到一類結果,從而限制了模型預測目標物件的數量。所以YOLO對出現在團體中的小尺寸的目標難以進行預測,比如成群的鳥。
       因為模型是從指定的資料集中學會預測的,所以對於新型別的目標物件、非普遍的大小的影像,很難對其進行精準預測
       因為模型中含有多個下采樣層,所以模型使用比較粗糙的特徵進行預測
       因為模型的損失函式對大邊界框和小邊界框中的錯誤一視同仁,而同樣一個小錯誤在大邊界框中很普遍,但是在小邊界框中會對IOU產生巨大影響,所以本演算法的error主要是localizations error
在這裡插入圖片描述

       從圖中可以看出YOLO方法的定位錯誤比較多Fast RCNN中出現的背景錯誤比較多,所以使用YOLO來評估Fast RCNN的背景檢測結果,可以減少把背景誤判為正樣本的error,從而使Fast RCNN的效能得到顯著提升
在這裡插入圖片描述

       因為是把兩部分分別進行訓練然後結合到一起,所以YOLO速度快的特點並沒有在結合方法中體現,但還是因為YOLO速度快的特點,所以結合的方法也沒有在原本Fast RCNN演算法上新增執行時間。

與其他方法的對比

        DPM使用滑動視窗進行目標檢測,使用分離的步驟分別進行提取固定的特徵、區域分類、預測邊界框的功能。
       一些基於DPM的方法,加快了HOG的計算速度,使用級聯結構,並在GPU上進行計算,即便這樣,也只有30HZ的DPM可以進行實時處理
       YOLO是把這些步驟壓縮在一個網路中進行併發進行,網路不使用固定的特徵,而是針對特徵進行線上訓練,根據檢測任務對其進行優化。YOLO更快更準確。

       RCNN及其變形的演算法是通過候選區域代替滑動視窗的作用。使用Selective Search的方法生成邊界框,使用卷積提取特徵,然後使用SVM進行打分,使用線性的模型對邊界框進行調整,最後使用非極大值抑制消除重複的邊界框。但是RCNN的每個步驟都需要分別進行訓練,測試時每張圖片的耗時在40s左右。
       YOLO在每個網格中使用卷積網路生成邊界框並進行打分,但是由於YOLO對網格的空間限制,使得對同一物件重複檢測的情況得以緩解。因為只在一張圖片中生成98個邊界框,使得速度得以加快。YOLO的所有步驟都在一個網路中完成,所以易於優化。
       Fast RCNN和Faster RCNN是在RCNN的基礎上針對速度進行優化的方案,通過共享計算結果、使用神經網路生成候選區域替代原本的SS方法,提升了準確率和速度。

       Deep Multi box使用卷積網路生成ROI,使用單一類別預測替代置信度預測方法。但是Multi Box只是檢測的一部分,還需要再進行分類操作。

       OverFeat使用卷積網路訓練一個定位器,然後使用定位器進行檢測。OverFeat同樣是使用滑動視窗進行檢測,但它也只是檢測的一部分。Over Feat只優化定位功能,而不是檢測效能。與DPM一樣,OverFeat的定位器預測時只能看到位置資訊,不能對全域性上下文進行推理,所以需要大量的後續處理才能得到完整、一致的檢測結果

       MultiGrasp只需要對影像包含的每一個物件預測一個單一的抓取區域,不需要對檢測物件的尺寸、位置、邊界框進行估計,也不需要對其進行分類。
       YOLO是對多檢測物件、多類別同時預測邊界框和類別概率。

       RCNN minus R方法將RCNN中的Selective Search替換為靜態的候選邊界框,速度更快了,但速度還是達不到實時處理的水平,並且可能會因為獲取不到好位置的邊界框從而影響準確度。

相關文章