誰人不識YOLOv1?

輕墨發表於2019-04-30

如需講解視訊,請關注我的個人微信公眾號:AI研究小院

麻煩大家給我點個贊,就是那種讓我看起來,寫的還不錯的樣子!?????

YOLOv1是繼Faster R-CNN後,第一個one stage物體檢測演算法,開創了物體檢測演算法一個全新流派,自YOLOv1後,物體檢測基本分為one stage和two stage兩個流派。

下圖是YOLO在整個物體檢測演算法歷史上的座標。

誰人不識YOLOv1?

背景

可以看出,YOLOv1是在Faster R-CNN之後提出的,但檢視首次上傳arXiv的時間可知(見下圖),YOLOv1和Faster R-CNN基本是同時提出的,因此YOLO作者動筆之時,Fast R-CNN是SOTA(state of the art),Faster R-CNN尚未出世,因此YOLO作者的主要對比物件是Fast R-CNN。當然,作者後續還是補充了與Faster R-CNN的對比結果做參考。

下面簡單分析下Fast R-CNN的原理。

誰人不識YOLOv1?

Fast R-CNN主要由四部分組成(如下圖),首先是共用的Feature Extractor,然後是傳統的Region Proposal演算法,有了共用的Extracted Feature Map和ROI(Region Of Interest)後,將Extracted Feature Map上對應ROI部分擷取出來,經過ROI Pooling,轉成解析度固定的Feature Map,輸入到物體檢測部分,以迴歸物體類別和bounding box,完成整個物體檢測流程。

誰人不識YOLOv1?

由於Fast R-CNN分為Extract Feature和Region Proposal兩個過程,因此是two stage的,這導致了Fast R-CNN的常常準確度高,但速度做不到實時性。

YOLO的提出就是解決Fast R-CNN的缺點,將two stage合成為一個stage,從而達到實時性。

Idea

具體YOLO是如何將two stage合成為一個stage的呢?

1)首先,將輸入圖片劃分為7x7的網格

誰人不識YOLOv1?
2)然後,每一個網格cell輸出兩個bounding box的預測和一個共享的類別預測。如下圖。 每一個bounding box的預測包含五個值C,x,y,w,h,其中C表示預測框的置信度,x,y,w,h表示預測框的位置和尺寸,p_ci表示預測框屬於類別ci的概率。

誰人不識YOLOv1?

可以看出,一個cell預測兩個框,但輸出的時候只能輸出一個預測結果,一般取置信度C值大的那個預測框作為這個cell的預測結果,框的類別取p_ci最大的類別。 3)既然一個cell有兩個預測框,那每個預測框的Ground Truth怎麼計算呢? 首先,一個Ground Truth框分配給其center所在的cell,如下圖,自行車的綠色Ground Truth框分配給粉色的cell,

誰人不識YOLOv1?

其次,在一個cell內部,Ground Truth會分配給與其IOU最大的predictor,如下圖,粉色cell中的兩個預測框是紅色框,綠色GT框會分配給寬矮的紅色預測框。

誰人不識YOLOv1?

有了輸出,有了GT,再設計設計網路結構,即輸入到輸出的對映,就可以利用梯度下降進行訓練了。

Network

下圖是簡化版的網路結構,

誰人不識YOLOv1?

下圖是詳細的網路結構,

誰人不識YOLOv1?

可以看出,圖片先經由一個作者設計的24層的Feature Extractor,提取特徵,然後再經過兩個全連線層,就得到最後7x7x30的輸出。

需要注意的是,這個7x7的輸出的意義就是作者說的將網格劃分為7x7的網格。

Loss

Loss主要分為三個部分,位置損失、置信度損失和類別損失。

誰人不識YOLOv1?
上式中,SxS是輸出結果的解析度,也是cell的個數,B是一個cell中的預測框的個數,兩個sigma意思是遍歷所有cell的所有box求和,lambda是損失權重,1函式是指示函式,條件為真時取1,為假時取0。

1)位置損失

誰人不識YOLOv1?
這裡首要的是弄清楚給定一個predictor,其預測的x,y,w,h的含義,紅色框住的是對應的標籤。 x,y的含義是預測框的中心點相對cell左上角的相對座標,其值在0~1之間。 w,h的含義是預測框的寬度與圖片寬度的比值,預測框的高度與圖片高度的比值,其值也在0~1之間。 也即predictor預測的x,y,w,h都是歸一化後的的相對值,以下圖為例,紅色框是綠色GT框的預測框,則 預測的x=X/64,y=Y/64,w=W/448,h=H/448。 預測框x,y,w,h對應的標籤也是相同的計算方法。

誰人不識YOLOv1?

2)置信度損失

誰人不識YOLOv1?

Ci預測的是Pr(object)*IOU,綜合反映了預測框有object的概率和預測框與truth的IOU大小。 所以對於一個cell的C_i的標籤的計算方法是:

誰人不識YOLOv1?

3)類別損失

誰人不識YOLOv1?

預測的p_ci是條件概率,即Object已知的情況下,Class_i的概率,如果GT的類別是ci,則p_ci的標籤是1,其他p_ci的標籤為0。

Training

YOLO模型訓練採用了以下技巧: 1)資料增強 包括隨機縮放,隨機擷取,隨機調整曝光度和飽和度 2)dropout 估計是全連線層,使用了dropout,dropout rate取0.5 3)優化器 採用momentum優化器,超引數beta取0.9 4)weight decay 採用了權重衰減,係數為0.0005 5)batch size為64 6)learning rate

誰人不識YOLOv1?
總共訓練136個epoch,第一個epoch,學習率穩定從0.001升至0.01,接著保持0.01的學習率學習75個epoch,然後將學習率降至0.001訓練30個epoch,再將學習率降至0.0001訓練30個epoch。

Experiments

誰人不識YOLOv1?
學習效果如上表,可以看到YOLO的速度成碾壓態勢,而準確率依然很高。

Error Analysis

作者還對YOLO進行了誤差分析,對比了Fast R-CNN與YOLO的誤差來源。 首先作者將識別結果分為五類:

  1. 正確分類:類別正確,IOU>0.5
  2. 位置錯誤:類別正確,0.1<IOU<0.5
  3. 近似錯誤:類別識別為近似類別,IOU>0.1
  4. 其他錯誤:類別錯誤,IOU>0.1
  5. 背景錯誤:IOU<0.1

Fast R-CNN與YOLO的誤差組成如下圖:

誰人不識YOLOv1?

可以看出,Fast R-CNN以背景錯誤為主,YOLO以位置錯誤為主。

結論

YOLO開創性的提出了一步式演算法,做到了實時檢測和高準確率。

相關文章