誰人不識YOLOv1?

如需講解視頻,請關注個人我的微信公衆號:小紙屑算法

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

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

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

背景

能夠看出,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的原理。學習

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

因爲Fast R-CNN分爲Extract Feature和Region Proposal兩個過程,所以是two stage的,這致使了Fast R-CNN的經常準確度高,但速度作不到實時性。設計

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

Idea

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

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

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

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

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

有了輸出,有了GT,再設計設計網絡結構,即輸入到輸出的映射,就能夠利用梯度降低進行訓練了。

Network

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

下圖是詳細的網絡結構,

能夠看出,圖片先經由一個做者設計的24層的Feature Extractor,提取特徵,而後再通過兩個全鏈接層,就獲得最後7x7x30的輸出。

須要注意的是,這個7x7的輸出的意義就是做者說的將網格劃分爲7x7的網格。

Loss

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

上式中,SxS是輸出結果的分辨率,也是cell的個數,B是一個cell中的預測框的個數,兩個sigma意思是遍歷全部cell的全部box求和,lambda是損失權重,1函數是指示函數,條件爲真時取1,爲假時取0。

1)位置損失

這裏首要的是弄清楚給定一個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對應的標籤也是相同的計算方法。

2)置信度損失

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

3)類別損失

預測的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

總共訓練136個epoch,第一個epoch,學習率穩定從0.001升至0.01,接着保持0.01的學習率學習75個epoch,而後將學習率降至0.001訓練30個epoch,再將學習率降至0.0001訓練30個epoch。

Experiments

學習效果如上表,能夠看到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的偏差組成以下圖:

能夠看出,Fast R-CNN以背景錯誤爲主,YOLO以位置錯誤爲主。

結論

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

相關文章
相關標籤/搜索