YOLO:工業界翹楚的成長

一些參考博客:CSDN人工智能頭條洲洲_starryshishi_m037192554fariver圖像所浩南哥AI之路

YOLO系列的官方網站:https://pjreddie.com/darknet/yolo/

雖然網上關於YOLO的介紹非常多,思想闡述的非常透徹,但總是覺得有種理解不透徹的感覺。因此另開一貼,記錄下我的感悟。

YOLOv1

原文鏈接:https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf

首先,YOLO的思想很簡單:在它之前的方法都是將檢測問題轉化爲分類問題進行的,即“生成候選框->識別”的two-stage方式。雖然準確率不錯,但實時性差了太多。YOLO對此的解決方法也很粗暴:把檢測問題變成迴歸問題,物體的邊框座標和分類置信度通通用一個網絡給你搞定。網絡的結構如下圖,非常清晰。

YOLO將全圖分成了S×S塊(上圖取的7×7),每一塊檢測B個物體(上圖取2個)和這些物體的C分類置信度值(上圖取20類),每個物體的參數包含邊框的角點位置和寬高(4),置信度值(1),因此對於20分類問題其輸出就是7×7×(2×(4+1)+20)=7×7×30,也即最右側的輸出。

也即,每個格子中,有B個邊框預測器(用來輸出邊框位置和大小),而這B個邊框預測器共享類別預測器。自然的,需要一個B選1的方式。

網絡有了以後,另一個重點就是訓練細節。YOLO使用的損失函數是sum-squared error,相關的講解和圖片都引自CSDN人工智能頭條

 

直接使用sum-squared error存在以下幾個問題: 


第一,8維的 localization error 和20維的 classification error 同等重要顯然是不合理的; 


第二,如果一個網格中沒有 object(一幅圖中這種網格很多),那麼就會將這些網格中的 box 的 confidence push 到 0,相比於較少的有 object 的網格,這種做法是 overpowering 的,這會導致網絡不穩定甚至發散。


解決辦法:

 

  • 更重視8維的座標預測,給這些損失前面賦予更大的 loss weight, 記爲在 pascal VOC 訓練中取 5。

  • 對沒有 object 的 box 的 confidence loss,賦予小的 loss weight,記爲在 pascal VOC 訓練中取 0.5。

  • 有 object 的 box 的 confidence loss 和類別的 loss 的 loss weight 正常取 1。

  • 對不同大小的 box 預測中,相比於大 box 預測偏一點,小 box 預測偏一點肯定更不能被忍受的。而 sum-square error loss 中對同樣的偏移 loss 是一樣。

  • 爲了緩和這個問題,作者用了一個比較取巧的辦法,就是將 box 的 width 和 height 取平方根代替原本的 height 和 width。這個參考下面的圖很容易理解,小box 的橫軸值較小,發生偏移時,反應到y軸上相比大 box 要大。(也是個近似逼近方式)

 

 

一個網格預測多個 box,希望的是每個 box predictor 專門負責預測某個 object。具體做法就是看當前預測的 box 與 ground truth box 中哪個 IoU 大,就負責哪個。這種做法稱作 box predictor 的 specialization。

最後整個的損失函數如下所示: 

爲什麼把圖放在引用外面?因爲我發現這圖的原圖畫錯了……還因此誤導了我好久。原文中寫的是:\mathbb{I}^{obj}_i表示物體是否出現在網格i中。上面的圖已經修正了這一錯誤。

其實這個損失函數,我們看一眼就能很清楚它的工作機理了。而最令人困惑的是:\mathbb{I}^{obj}_i\mathbb{I}^{obj}_{ij}到底是如何取值的?這裏參考了下洲洲_starry的圖和代碼,引用如下:

在這裏插入圖片描述

假設一個物體的輪廓是這樣的,那麼,\mathbb{I}^{obj}_i的輸出,是這樣的:

[[0. 1. 1. 1. 0.]
 [0. 1. 1. 1. 0.]
 [0. 1. 1. 1. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

也即,只要邊框部分包含的格子,都納入了類別損失函數的計算。

\mathbb{I}^{obj}_{ij}的輸出,是這樣的

[[(0,0). (0,0). (0,0). (0,0). (0,0).]
 [(0,0). (0,0). (1,0). (0,0). (0,0).]
 [(0,0). (0,0). (0,0). (0,0). (0,0).]
 [(0,0). (0,0). (0,0). (0,0). (0,0).]
 [(0,0). (0,0). (0,0). (0,0). (0,0).]]

也就是說,只有標註物體的中心所在的那個格子的其中一個邊框預測器的輸出是1。那具體是哪個呢?原文的描述是“這個格子中IoU最大的預測器”,也即邊框迴歸結果與真實結果最接近的那個。

瞭解了這些以後,再回頭去看損失函數,就能更加明確訓練過程:

  • 只有需要“負責”的邊框預測器的預測結果會通過損失函數優化。由於這樣的預測器很少,因此權值很高(原文是5)
  • 需要和不需要負責的邊框預測器的置信度值都會以一定權值通過損失函數優化(原文分別是1和0.5)。
  • 有物體在其中的塊的分類結果要通過損失函數優化。(原文權值是1)

其他一些細節,例如使用leak ReLU等,這裏就不再贅述了。

最後在預測階段,參考shishi_m037192554的博客,最終會首先設置置信度閾值對98個框進行初步篩選,然後留下的框有兩種篩選方法:全部NMS篩選再分類,以及先分類再根據類別進行NMS篩選。這裏原文好像使用的是前面的那種,不過後面那種的結果應當更好。

爲了進一步分析Yolo算法,文章還做了誤差分析,將預測結果按照分類與定位準確性分成以下5類:

  • Correct:類別正確,IOU>0.5;(準確度)
  • Localization:類別正確,0.1 < IOU<0.5(定位不準);
  • Similar:類別相似,IOU>0.1;
  • Other:類別錯誤,IOU>0.1;
  • Background:對任何目標其IOU<0.1。(誤把背景當物體)

    Yolo與Fast R-CNN的誤差對比分析如下圖所示:

這裏寫圖片描述

可以看出,YOLO相比於Faster RCNN,定位的準確率較低,但也更不容易把背景識別成物體。

最後,YOLO自身的主要缺點是:

  • 因爲物體檢測基於分塊這一強約束,導致處在相近中心點的不同物體無法檢出。
  • 兩個邊框以及只有負責部分優化的做法,導致非常依賴訓練數據集的物體和邊框分佈。

YOLOv2(YOLO9000)

論文鏈接:https://arxiv.org/abs/1612.08242

首先,對於YOLOv2的改進,原文中有一張圖很寫的很明白,這裏給一張fariver博客中的中文版圖:

圖像所浩南哥的博客裏關於YOLOv2的改正寫的十分詳細,推薦各位閱讀。

1.使用批標準化。相關的原理見我寫的BN介紹

2.YOLOv1是用224×224的圖像進行預訓練,然後用448×448做fine-tune,這導致輸入圖像尺度不匹配問題。因此這裏換成了直接用448×448做預訓練,效果提升顯著。也說明了尺度匹配的重要性。

3.將網格數量由7×7提高到13×13(輸入圖像爲416×416),主要是提升了小物體檢測能力。

4.使用Faster-RCN中的anchor機制,具體來說,YOLOv1中直接回歸出了邊框的座標,這種只有正值的方法在很多實驗中都不如通過偏移量表示的方法(更接近0平均分佈,不至於偏移太遠)。anchor box的具體原理如下圖,即預設了幾個邊框,每個邊框具有不同的長寬比(1:1,1:2,2:1等),而最終輸出的值是在這個確定的(x,y,width,height)基礎上的偏移值。如此其實就通過預設使網絡具備了多尺度,多比例形狀的檢測能力。

這裏YOLOv2比YOLOv1還有一個變動,就是特徵數據結構方面,每一個邊框有自己的分類結果了。如下圖所示。

5.使用新網絡結構Darknet-19。其與其他經典網絡架構的效果比較如下圖所示。

6.加入Anchor box的先驗。作者通過K-means實驗發現當Anchor數量設置爲5,取一些特定比例形狀時,這樣預設最接近ImageNet和COCO數據的邊框。因此用上,結構實現了效果提升。

7.作者實驗發現,直接回歸出offset值的方法會導致訓練過程的不穩定,因此最終使用數學對結果進行了限制。這裏我直接引用圖像所浩南哥的博客:

直接對Bounding Boxes求迴歸會導致模型不穩定,其中心點可能會出現在圖像任何位置,有可能導致迴歸過程震盪,甚至無法收斂,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測Bounding Box的中心座標(x,y)位置的時候。

YOLOv2的網絡在特徵圖(13*13)的每一個單元格中預測出5個Bounding Boxes(對應5個Anchor Boxes),每個Bounding Box預測出5個值(tx,ty,tw,th,t0),其中前4個是座標偏移值,t0是置信度結果(類似YOLOv1中的邊界框置信度Confidence)。YOLOv2借鑑瞭如下的預測方式,即當Anchor Box的中心座標和寬高分別是(xa,ya)和(wa,wh)時,Bounding Box座標的預測偏移值(tx,ty,tw,th)與其座標寬高(x,y,w,h)的關係如下:                         


基於這種思想,YOLOv2在預測Bounding Box的位置參數時採用瞭如下強約束方法:


圖中,黑色虛線框是Anchor Box,藍色矩形框就是預測的Bounding Box結果,預測出的Bounding Box的座標和寬高爲(bx,by)和(bw,bh),計算方式如圖2-8中所示,其中:對每個Bounding Box預測出5個值(tx,ty,tw,th,t0),Cell與圖像左上角的橫縱座標距離爲(cx,cy),σ定義爲sigmoid激活函數(將函數值約束到[0,1]),該Cell對應的Anchor Box對應的寬高爲(pw,ph)。

簡而言之,(bx,by)就是(cx,cy)這個Cell附近的Anchor Box針對預測值(tx,ty)得到的Bounding Box的座標預測結果,同時可以發現這種方式對於較遠距離的Bounding Box預測值(tx,ty)能夠得到很大的限制。

8.細粒度特徵融合

YOLOv2通過添加一個轉移層(Passthrough Layer:Route + Reorg),把高分辨率的淺層特徵連接到低分辨率的深層特徵(把特徵堆積在不同Channel中)而後進行融合和檢測。具體操作是先獲取前層的26*26的特徵圖,將其同最後輸出的13*13的特徵圖進行連接,而後輸入檢測器進行檢測(檢測器的FC層起到了全局特徵融合的作用),以此來提高對小目標的檢測能力。    

9.在訓練時使用多尺度輸入,從而使網絡在輸入尺度不同時也能產生較好的效果。

之後,YOLOv2還介紹瞭如何融合分類和檢測網絡(ImageNet和COCO),作者提出了一種將分類數據集和檢測數據集聯合訓練的方法,在訓練的過程,我們將這兩類數據集混合,當輸入的檢測數據集時,反向傳播全部的誤差損失(YOLOv2的loss),當遇到分類數據集時,只反向傳播分類誤差損失。具體請參照原文。

YOLOv3

論文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf

AI之路CSDN人工智能頭條寫的都不錯,這裏就主要摘抄其中的重要思想。

1.分類方面將原來用於單標籤多分類的softmax層換成用於多標籤多分類的邏輯迴歸層。事實證明準確度不會下降。

2.使用了多尺度預測,類似FPN,在3個不同尺度的每個格子各輸出3個結果。因此最終的檢測框數量比v2要多(5 vs 3×3)。

3.提出了Darknet-53架構,完全使用卷積實現下采樣等操作。

 

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