天天看點

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

打個廣告,複現Yolov3之後的深度原理剖析請移步下文(含代碼):

【算法實驗】能檢測COCO并鑒黃的SexyYolo(含Yolov3的深度原理剖析)

Yolov1論文連結:You Only Look Once: Unified, Real-Time Object Detection

Yolov2解讀:【論文解讀】Yolo三部曲解讀——Yolov2

Yolov3解讀:【算法實驗】能檢測COCO并鑒黃的SexyYolo(含Yolov3的深度原理剖析)

【論文解讀】Yolo三部曲解讀——Yolov3

(您的點贊是對分享的最大認可,謝謝)

一、物體檢測算法概述

(算法原理可以直接看第二節)

物體檢測(object detection)是計算機視覺中一個重要的分支,其大緻功能是在一張圖檔中,用最小矩形框框出目标物體位置,并進行分類。先上圖,Yolo v1可以識别20個類别:

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖一 Yolo檢測示例圖

物體檢測的兩個步驟可以概括為:

步驟一:檢測目标位置(生成矩形框)

步驟二:對目标物體進行分類

物體檢測主流的算法架構大緻分為one-stage與two-stage。two-stage算法代表有R-CNN系列,one-stage算法代表有Yolo系列。按筆者了解,two-stage算法将步驟一與步驟二分開執行,輸入圖像先經過候選框生成網絡(例如faster rcnn中的RPN網絡),再經過分類網絡;one-stage算法将步驟一與步驟二同時執行,輸入圖像隻經過一個網絡,生成的結果中同時包含位置與類别資訊。two-stage與one-stage相比,精度高,但是計算量更大,是以運算較慢。

就R-CNN系列算法與Yolo系列算法簡單列出發表時間線:

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖二 RCNN、Yolo發表時間線

可見,Yolo系列發表日期全部在Faster RCNN之後,Faster RCNN算法的精度是state-of-the-art級别的,Yolo算法的精度沒有超越Faster RCNN,而是在速度與精度之間進行權衡。Yolo v3在改進多次之後,既有一定的精度,也保持了較高的運作速度。在很多邊緣計算、實時性要求較高的任務中,Yolo v3備受青睐。在RCNN算法日益成熟之後,Yolo算法卻能橫空出世,離不開其高性能和使用回歸思想做物體檢測的兩個特點。

First, YOLO is extremely fast. Since we frame detection as a regression problem we don’t need a complex pipeline.

Second, YOLO reasons globally about the image when making predictions. Unlike sliding window and region proposal-based techniques, YOLO sees the entire image.

Third, YOLO learns generalizable representations of objects. When trained on natural images and tested on art- work, YOLO outperforms top detection methods like DPM and R-CNN by a wide margin.

上述論文中提及的三點:

  1. Yolo很快,因為用回歸的方法,并且不用複雜的架構。
  2. Yolo會基于整張圖檔資訊進行預測,而其他滑窗式的檢測架構,隻能基于局部圖檔資訊進行推理。
  3. Yolo學到的圖檔特征更為通用。作者嘗試了用自然圖檔資料集進行訓練,用藝術畫作品進行預測,Yolo的檢測效果更佳。

本文重點講解Yolo v1算法細節。v1相比v2、v3以及其他物體檢測算法,思路簡單清晰,非常适合物體檢測初學者上手。即使沒有過任何物體檢測相關知識,隻需要一點卷積神經網絡基礎,便可以看懂Yolo v1。

二、Yolo v1算法原理

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖三 Yolo v1網絡結構

直接上結構圖,輸入圖像大小為448*448,經過若幹個卷積層與池化層,變為7*7*1024張量(圖一中倒數第三個立方體),最後經過兩層全連接配接層,輸出張量次元為7*7*30,這就是Yolo v1的整個神經網絡結構,和一般的卷積物體分類網絡沒有太多差別,最大的不同就是:分類網絡最後的全連接配接層,一般連接配接于一個一維向量,向量的不同位代表不同類别,而這裡的輸出向量是一個三維的張量(7*7*30)。上圖中Yolo的backbone網絡結構,受啟發于GoogLeNet,也是v2、v3中Darknet的先鋒。本質上來說沒有什麼特别,沒有使用BN層,用了一層Dropout。除了最後一層的輸出使用了線性激活函數,其他層全部使用Leaky Relu激活函數。網絡結構沒有特别的東西,不再贅述。

  • 網絡輸出張量次元

這裡的輸出次元非常重要,下面逐一解釋。

(1) 7*7的含義

7*7是指圖檔被分成了7*7個格子,如下所示:

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖四 初始格點

在Yolo中,如果一個物體的中心點,落在了某個格子中,那麼這個格子将負責預測這個物體。這句話怎麼了解,用上圖舉例,設左下角格子假設坐标為

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

,小狗所在的最小包圍矩形框的中心,落在了

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

這個格子中。那麼7*7個格子中,

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

這個格子所對應的物體置信度标簽為1,而那些沒有物體中心點落進來的格子,對應的物體置信度标簽為0。這個設定就好比該網絡在一開始,就将整個圖檔上的預測任務進行了分工,一共設定7*7個按照方陣列隊的檢測人員,每個人員負責檢測一個物體,大家的分工界線,就是看被檢測物體的中心點落在誰的格子裡。當然,是7*7還是9*9,是上圖中的參數S,可以自己修改,精度和性能會随之有些變化。

(2) 30的含義

剛才設定了49個檢測人員,那麼每個人員負責檢測的内容,就是這裡的30(注意,30是張量最後一維的長度)。在Yolo v1論文中,30是由

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

得到的。其中4+1是矩形框的中心點坐标

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

,長寬

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

以及是否屬于被檢測物體的置信度

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

;2是一個格子共回歸兩個矩形框,每個矩形框分别産生5個預測值(

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

);20代表預測20個類别。這裡有幾點需要注意:1. 每個方格(grid) 産生2個預測框,2也是參數,可以調,但是一旦設定為2以後,那麼每個方格隻産生兩個矩形框,最後標明置信度更大的矩形框作為輸出,

也就是最終每個方格隻輸出一個預測矩形框

。2.

每個方格隻能預測一個物體。

雖然可以通過調整參數,産生不同的矩形框,但這隻能提高矩形框的精度。是以當有很多個物體的中心點落在了同一個格子裡,該格子隻能預測一個物體。也就是格子數為7*7時,該網絡最多預測49個物體。

YOLO imposes strong spatial constraints on bounding box predictions since each grid cell only predicts two boxes and can only have one class. This spatial constraint limits the number of nearby objects that our model can predict. Our model struggles with small objects that appear in groups, such as flocks of birds.

如上述原文中提及,在強行施加了格點限制以後,每個格點隻能輸出一個預測結果,是以該算法最大的不足,就是對一些鄰近小物體的識别效果不是太好,例如成群結隊的小鳥。

  • Loss函數

看到這裡讀者或許會有疑問,Yolo裡的每個格點,是怎麼知道該預測哪個物體的?這就是神經網絡算法的能力。首先拿到一批标注好的圖檔資料集,按照規則打好标簽,之後讓神經網絡去拟合訓練資料集。訓練資料集中的标簽是通過人工标注獲得,當神經網絡對資料集拟合的足夠好時,那麼就相當于神經網絡具備了一定的和人一樣的識别能力。

神經網絡結構确定之後,訓練效果好壞,由Loss函數和優化器決定。Yolo v1使用普通的梯度下降法作為優化器。這裡重點解讀一下Yolo v1使用的Loss函數:

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖五 Yolo v1算法Loss函數

論文中Loss函數,密密麻麻的公式初看可能比較難懂。其實論文中給出了比較詳細的解釋。所有的損失都是使用平方和誤差公式,暫時先不看公式中的

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

,輸出的預測數值以及所造成的損失有:

  1. 預測框的中心點
    fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
    。造成的損失是圖五中的第一行。其中
    fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
    為控制函數,在标簽中包含物體的那些格點處,該值為 1 ;若格點不含有物體,該值為 0。也就是隻對那些有真實物體所屬的格點進行損失計算,若該格點不包含物體,那麼預測數值不對損失函數造成影響。
    fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
    數值與标簽用簡單的平方和誤差。
  2. 預測框的寬高
    fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
    。造成的損失是圖五的第二行。
    fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
    的含義一樣,也是使得隻有真實物體所屬的格點才會造成損失。這裡對
    fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
    在損失函數中的處理分别取了 根号 ,原因在于,如果不取根号,損失函數往往更傾向于調整尺寸比較大的預測框。例如,20個像素點的偏差,對于800*600的預測框幾乎沒有影響,此時的IOU數值還是很大,但是對于30*40的預測框影響就很大。取根号是為了盡可能的消除大尺寸框與小尺寸框之間的差異。
  3. 第三行與第四行,都是 預測框的置信度 C。當該格點不含有物體時,該置信度的标簽為0;若含有物體時,該置信度的标簽為預測框與真實物體框的IOU數值(IOU計算公式為:兩個框交集的面積除以并集的面積)。
  4. 第五行為 物體類别機率 P,對應的類别位置,該标簽數值為1,其餘位置為0,與分類網絡相同。

此時再來看

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

,Yolo面臨的物體檢測問題,是一個典型的類别數目不均衡的問題。其中49個格點,含有物體的格點往往隻有3、4個,其餘全是不含有物體的格點。此時如果不采取點措施,那麼物體檢測的mAP不會太高,因為模型更傾向于不含有物體的格點。

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

的作用,就是讓含有物體的格點,在損失函數中的權重更大,

讓模型更加“重視”含有物體的格點所造成的損失

。在論文中,

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

的取值分别為5與0.5。

  • 一些技巧
  1. 回歸offset代替直接回歸坐标
We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1
fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
不直接回歸中心點坐标數值,而是回歸相對于格點左上角坐标的位移值

。例如,第一個格點中物體坐标為

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

,另一個格點中的物體坐标為

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

,這四個數值讓神經網絡暴力回歸,有一定難度。是以這裡的offset是指,既然格點已知,那麼物體中心點的坐标一定在格點正方形裡,相對于格點左上角的位移值一定在區間[0, 1)中。讓神經網絡去預測

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

會更加容易,在使用時,加上格點左上角坐标

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

即可。

2. 同一格點的不同預測框有不同作用

At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth. This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall.

前文中提到,每個格點預測兩個或多個矩形框。此時假設每個格點預測兩個矩形框。那麼在訓練時,見到一個真實物體,我們是希望兩個框都去逼近這個物體的真實矩形框,還是隻用一個去逼近?或許通常來想,讓兩個人一起去做同一件事,比一個人做一件事成功率要高,是以可能會讓兩個框都去逼近這個真實物體。但是作者沒有這樣做,

在損失函數計算中,隻對和真實物體最接近的框計算損失,其餘框不進行修正

。這樣操作之後作者發現,一個格點的兩個框在尺寸、長寬比、或者某些類别上逐漸有所分工,總體的召回率有所提升。

3. 使用非極大抑制生成預測框

However, some large objects or objects near the border of multiple cells can be well localized by multiple cells. Non-maximal suppression can be used to fix these multiple detections. While not critical to performance as it is for R-CNN or DPM, non-maximal suppression adds 2 - 3% in mAP.

通常來說,在預測的時候,格點與格點并不會沖突,但是在預測一些大物體或者鄰近物體時,會有多個格點預測了同一個物體。此時采用非極大抑制技巧,過濾掉一些重疊的矩形框。但是mAP提升并沒有顯著提升。(非極大抑制,物體檢測的老套路,這裡不再贅述)

4. 推理時将

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

作為輸出置信度

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

在推理時,

使用物體的類别預測最大值
fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
乘以 預測框的最大值
fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1
,作為輸出預測物體的置信度

。這樣也可以過濾掉一些大部分重疊的矩形框。輸出檢測物體的置信度,同時考慮了矩形框與類别,滿足門檻值的輸出更加可信。

三、Yolo v1與其他算法比較

與其他算法比較的結論照搬論文,如下性能的硬體環境都是GPU Titan X。

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖六 Yolo算法性能比較

backbone同為VGG-16,Yolo比Faster R-CNN少了将近7點mAP,但是速度變為三倍,Fast Yolo和Yolo相比,少11點mAP,但是速度可以達到155張圖檔每秒。後續的Yolo v3中,準确率和速度綜合再一次提升,是以v1的性能不再過多分析。

下面重點看論文中的錯誤分析:

fasterrcnn論文_【論文解讀】Yolo三部曲解讀——Yolov1

圖七 錯誤對比分析

首先給出圖中各個單詞的含義:

• Correct: correct class and IOU > .5

• Localization: correct class, .1 < IOU < .5

• Similar: class is similar, IOU > .1

• Other: class is wrong, IOU > .1

• Background: IOU < .1 for any object

其中,Yolo的Localization錯誤率更高,直接對位置進行回歸,确實不如滑窗式的檢測方式準确率高。但是Yolo對于背景的誤檢率更低,由于Yolo在推理時,可以“看到”整張圖檔,是以能夠更好的區分背景與待測物體。作者提到Yolo對于小物體檢測效果欠佳,不過在v2與v3中都做了不少改進。

四、小結

Yolo v1整體思路簡單清晰,但是透徹的了解還是需要花點功夫。從上次自以為全部看懂了Yolo v1,到寫完這篇文章,這期間又明白了不少細節。v1中埋了不少伏筆,都成為了v2和v3的突破口。雖然版本演進,Yolo算法在不斷完善,但是v1版本才是用回歸做物體檢測的開山之作。

PS:Yolo v2與v3的解讀正在路上。随時歡迎指正與補充。