目標檢測學習之路——YOLOv1

                                                     YOLOV1

因一些需要,對經典的檢測模型YOLOV1進行了學習,以下是自己對YOLOV1的一些見解,如有錯誤,還請大佬指正。

對於目標檢測任務,江湖上主要有兩大流派:1.two stage策略(即proposal+classifier的方法),經典模型有rcnn、fast-rcnn、faster-rcnn、mask-rcnn;2、用one stage策略(即輸入整幅圖像,直接在輸出層迴歸 bounding box(邊界框) 的位置及其所屬的類別),經典模型有YOLOv1、YOLOv2、YOLOv3、CornerNet、CenterNet。

論文地址:https://arxiv.org/abs/1506.02640

1.YOLOv1核心思想

 

YOLOv1巧妙的將傳統CNN所擅長的分類任務應用到目標檢測任務,利用整張圖作爲網絡的輸入,直接在輸出層迴歸 bounding box(邊界框) 的位置及其所屬的類別。

YOLOv1相比於RCNN系列模型少了proposal這一步驟,因此YOLOv1的檢測速度更快。其次,由於YOLOv1使用整幅圖像作爲輸入,因此YOLOv1相對於RCNN系列模型(RCNN模型對生成的proposal部分圖像進行預測)可以更加充分的利用目標物體的背景信息。

2.YOLOv1的實現方法

由於網絡中使用了全連接層,所以圖片的尺寸需reshape固定大小輸入到CNN中(原文中reshape後的尺寸爲448*448),然後將其將劃分成SxS的網格(原文中S=7),如果某個 object 的中心落在這個網格中,則這個網格就負責預測這個 object。 

每個網格要預測B個bounding box(原文中B=2),每個bounding box的迴歸預測結果有5個值( x,y,w,h,confidence),這裏的( x,y,w,h,confidence)是都被歸一化到[0,1]區間。此外,每個網格還要預測C個類別的分數(原文中C=20,因爲pascal voc數據集只要20類物體),注意這裏是爲每個網格預測C個類別,而不是爲每個預測的bounding box都要進行C個類別分數預測。

x,y:一般是相對於單元格左上角座標點的位置偏移,利用預測出的偏移量可以計算出object的中心座標。以原文爲例,輸入數據爲448*448,被劃分爲7*7的網格單元,每個網格單元的尺寸爲64*64。其中某一網格單元的左上角座標爲\left ( x_{left},{y_{left}} \right ),模型預測的座標偏移量爲(x,y),則模型預測object的中心座標爲:x_{center}= x_{left}+x*64,y_{center}= y_{left}+y*64

w,h:檢測框真實寬高相對於整幅圖像的比例(注意這裏不是實際的bounding box的寬和高)。以原文爲例,輸入數據爲448*448。模型預測的object寬和高爲(w,h),則模型預測的object寬和高爲:w_{target}= w*488h_{target}= h*488

confidence:代表了預測框中含有目標的置信度和這個預測框預測的準確度的雙重信息,公式和說明如下:

置信度confidence值只有2種情況,要麼爲0(網格中不包含目標,p_{r}\left ( object \right )= 0),要麼爲預測框與標註框的IOU。因爲p_{r}\left ( object \right )的取值只有0或1,兩種可能,當網格中含有object時,那麼P(object)=1,否則爲0,不存在(0,1)區間中的值。第二項是預測的 bounding box 和實際的 groundtruth 之間的 IoU 值。

測試階段,每個網格預測的 class 信息和 bounding box 預測的 confidence信息相乘,就得到這個bounding box是這類object的概率,公式如下所示。p_{r}\left ( Class_{i}\left | \right Object \right )就是每個網格預測的類別i的分數,第二、三項就是每個 bounding box 預測的 confidence。這個乘積即表示了預測的 bounding box 屬於某一類的概率,也有該 bounding box準確度的信息。

3.YOLOv1網絡結構

最後一層全連接層用線性激活函數,即沒采用任何激活函數,輸入是什麼輸出就是什麼,darknet的linear activation function定義如下所示:

其餘層採用leak RELU激活函數,激活函數公式如下所示:

 

4.YOLOv1的損失函數

這裏的損失函數,是針對某一object計算的loss函數,現實計算時需要對每個object進行loss計算,最後再求和。

:取值爲0或1,即第i個網格預測的第j個bounding box是否負責預測這個object(第一個條件爲object的中心是否落在這個網格中;第二個條件爲當前boundingbox與object的真實bounding box IOU 值,是該網格預測的B個bounding box中與真實bounding box的IOU值爲最大的。當滿足上述兩個條件,則爲1,否則爲0)。

:取值爲0或1,即第i個網格中是否含有這個object(當網格中含有這個object則爲1,否則爲0)。

一個object有與之唯一對應的網格(即object的中心落在這個網格,該網格對這個object唯一負責),但是會有很多網格中出現過這個object,而且也會出現一個網格中出現過多個object的現象,但是對這個object負責的網格確是惟一的。

YOLOv1對座標誤差,confidence誤差,分類誤差均使用了均方差作爲損失函數,三個誤差在損失函數中所佔的權重也不同。

座標誤差:一個網格預測2個bounding box,在計算損失函數的時候,只取與ground truth bounding box中IoU大的那個預測框來計算損失,權重係數最大(爲5)。

當兩個object的中心落在同一個網格時,該網格需要對兩個object的座標進行loss值進行計算。但是相同的位置誤差對大目標和小目標的影響是不同的,相同的偏差對於小目標來說影響要比大目標大,故作者選擇將預測的bounding box的w,h先取其平方根,再求均方差損失。

存在目標的網格預測的bounding box的confidence損失和分類損失,權重係數均爲1。

由於一副圖像中沒有目標的網格佔大多數,有目標的網格佔少數,所以損失函數中對沒有目標的網格中預測的bounding box的confidence誤差給予小的權重係數(爲0.5)。

5.YOLOv1的缺陷

每個單元格最多隻能預測一個object,若單個單元格中含有多個object中心,但是隻能檢測出其中的一個,導致小目標漏檢,因此YOLOv1對小目標檢測效果不好。

同一類物體出現的新的不常見的長寬比和其他情況時,泛化能力偏弱。

雖然YOLOv1中損失函數中位置誤差,對預測的w,h取平方根處理再求均方差,來緩解相同位置誤差對大目標,小目標影響不同的弊端,但是作用甚微,沒有根本解決問題對於小物體。小的目標的 置信度誤差也會對網絡優化過程造成很大的影響,從而降低了物體檢測的定位準確性。

由於網咯結構中使用了全連接層,因此在檢測時,YOLOv1 模型只支持與訓練圖像具有相同分辨率的圖片。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章