yolov1/v2/v3學習總結

yolov1的文章建立了yolo整個的模型思路,後面出現的v2/v3/v4都是在v1基礎上增加了當時流行的trick進行的修改。yolo屬於一階段的目標檢測模型,與rcnn系列相比,犧牲了一定的精度,但是速度更快。

yolov1

首先介紹yolov1。yolo通過將全圖作爲模型輸入,直接在卷積網絡後面加分類層得到目標的位置和類別。這個思路是很簡單直接的,會起作用主要在於很多實現細節。1. 如何針對整圖進行區域劃分,來預測目標位置?2. 如何基於區域設計損失函數,使得相應區域預測相應目標?

實現

  1. 首先將圖像劃分成7*7的網格,以網格爲單位來預測目標位置。如果某個目標中心落在某網格中,那這個網格就負責預測這個目標,其餘網格則不負責預測該目標。
  2. 假設圖像輸入爲448448,經過卷積網絡最後得到大小爲771024的特徵圖,然後經過兩個全連接層,假設一個網格負責預測2個迴歸框,預測類別20類,那麼得到7730的特徵圖,其中30有20+25得到。20即爲20個類別,2是指預測了兩個迴歸框,5是指一個框的四個位置和一個置信度。可以看出來每一個網格都有其相應的2個迴歸框,且有其相應的類別預測。不是每個迴歸框都預測了20種類別,而是一個網格預測了20種類別。所以這也就導致了一個網格只能得到一種類別的問題。
  3. 位置預測:輸出的是xywh,也就是中心座標和寬高,其中xy和wh都歸一化到0-1區間;
  4. 損失函數的設計:(1)公式第一部分:分別循環圖中每個網格和每個網格生成的迴歸框,計算迴歸框的損失,其中紅色圈出的參數是用來判斷這個迴歸框是否需要參與損失,如果這個網格中根本不含目標或者網格不負責預測目標,那麼這個位置迴歸是沒有作用的,因此不需要參與損失計算;如果這個網格負責預測某個目標,我們知道該網格會對應得到兩個迴歸框,但不是這兩個迴歸框都參與計算,只取其中與目標iou最大的迴歸框進行計算;(2)第二部分:對那些需要參與位置損失的迴歸框,計算置信度損失,目的是使置信度儘量接近1(3)第三部分:對那些不需要參與位置損失的迴歸框,使其置信度儘量接近0。λ(noobj)設置爲0.5,因爲一張圖中不需要參與位置損失的迴歸框較多,需要參與位置損失的迴歸框較少,如果保持兩個損失權重相同的話,容易使置信度全部趨向於0,因此需要在這裏進行一個權重平衡。(4)對每一個網格進行循環,計算每個網格的類別預測損失;這裏同樣需要判斷這個網格是否是含目標的網格,如果不是則不需要計算類別損失。(5)需要注意的是,這裏的wh的計算都開了根號,這是因爲作者想要使小目標也得到比較準確的位置預測。相對於大目標來說,小目標的位置偏移對目標預測的影響比較大,從下面那張圖可以看出來,在w比較小的時候,固定步長的移動對應的y的變化,比w較大時對應的y的變化要大,因此這裏加了開根號的處理就是爲了使小目標的位置預測在loss中佔據更大的比重。
    在這裏插入圖片描述
    在這裏插入圖片描述

訓練

  1. 預訓練:在ImageNet 1000類的224*224的圖像上預訓練一個分類網絡,網絡是Figure3中的前20個卷積網絡+average-pooling layer+ fully connected layer 。
  2. 訓練檢測網絡:在分類網絡基礎上增加捲積和全連接層,隨機初始化權重。檢測要求細粒度的視覺信息,所以把網絡輸入也又224224變成448448。

測試

  1. 模型會得到每個網格的分類概率和迴歸框的置信度,這兩個值相乘即得到該回歸框對每一種類別的預測信息,整張圖會得到772共98個值,設置閾值,濾掉得分低的boxes,對保留的boxes進行NMS處理,就得到最終的檢測結果。

缺點

  1. 對小物體效果不好;對互相靠的很近的物體效果不好;
  2. 由於損失函數的問題,定位誤差是影響檢測效果的主要原因;

yolov2

yolov2在v1基礎上增加了一些改進策略,主要有:

  1. batch norm:在YOLOv2中,每個卷積層後面都添加了Batch Normalization層,並且不再使用droput。

  2. Anchor:在YOLOv1中,輸入圖片最終被劃分爲7*7網格,每個單元格預測2個邊界框。YOLOv1最後採用的是全連接層直接對邊界框進行預測,其中邊界框的寬與高是相對整張圖片大小的,而由於各個圖片中存在不同尺度和長寬比(scales and ratios)的物體,YOLOv1在訓練過程中學習適應不同物體的形狀是比較困難的。YOLOv2借鑑了Faster R-CNN中RPN網絡的先驗框,YOLOv2移除了YOLOv1中的全連接層而採用了卷積和anchor boxes來預測邊界框,每個位置的各個anchor box都單獨預測一套分類概率值。

  3. anchor大小採用聚類來得到:在Faster R-CNN和SSD中,先驗框的維度(長和寬)都是手動設定的,帶有一定的主觀性。如果選取的先驗框維度比較合適,那麼模型更容易學習,從而做出更好的預測。因此,YOLOv2採用k-means聚類方法對訓練集中的邊界框做了聚類分析。因爲設置先驗框的主要目的是爲了使得預測框與ground truth的IOU更好,所以聚類分析時選用box與聚類中心box之間的IOU值作爲距離指標。
    在這裏插入圖片描述

  4. 新的卷積網絡:Darknet-19,最終採用全局平均池化做預測。
    在這裏插入圖片描述

  5. 位置預測:由於加入了anchor機制,所以不能沿用yolov1的位置預測方法。YOLOv2先是借鑑RPN網絡,預測邊界框相對先驗框的位置偏移,但是由於這個偏移可以偏移到圖像的任意位置,這導致模型的不穩定性,在訓練時需要很長時間來預測出正確的offsets。所以,YOLOv2棄用了這種預測方式,改爲預測邊界框中心點相對於對應cell左上角位置的相對偏移值,爲了將邊界框中心點約束在當前cell中,使用sigmoid函數處理偏移值,這樣預測的偏移值在(0,1)範圍內(每個cell的尺度看做1)。

  6. 多尺度訓練:由於YOLOv2模型中只有卷積層和池化層,所以YOLOv2的輸入可以不限於416*416大小的圖片。爲了增強模型的魯棒性,YOLOv2採用了多尺度輸入訓練策略,具體來說就是在訓練過程中每間隔一定的iterations之後改變模型的輸入圖片大小。由於YOLOv2的下采樣總步長爲32,輸入圖片大小選擇一系列爲32倍數的值。

  7. 損失函數:yolov2的損失函數基本上延續了v1的思想,仍採用均方誤差的形式進行計算。取目標中心所在位置的網格來負責預測該目標,每個網格會生成5個anchor,anchor的大小形狀是根據之前聚類得到的,這時取形狀與原始目標形狀iou最大的anchor得到的迴歸框計算位置迴歸的損失以及分類損失;設定一個iou閾值,這個閾值用來判斷某個迴歸框是否爲背景框,將該回歸框與所有目標計算iou,如果iou小於該閾值,則該回歸框爲背景框,所有的背景框的置信度都加入損失計算,目的是使其儘量接近0.
    總結來說,yolov2主要在1.網絡結構;2.anchor機制;3.bn層這三個地方做了比較大的優化;

yolov3

yolov3是在v2基礎上做的改進,主要有:

  1. 網絡結構darknet53:借鑑了殘差網絡residual network的做法,在一些層之間設置了short-cut;
  2. 利用多尺度特徵:借鑑fpn的思想,在第79/91/106層分別獲得特徵圖,這些特徵圖具有不同的尺度。第79層的特徵圖將原圖進行32倍的下采樣,91層的特徵圖融合了上層特徵,因此獲得了更細膩的語義特徵,第94層的特徵圖將原圖進行了16倍的下采樣,同樣的,第106層特徵圖融合了更千層淺層特徵,對原圖進行了8倍下采樣。因不同採用採樣尺度的特徵圖用於預測不同大小的目標。這裏延續了anchor的使用,在不同尺度的特徵圖上生成不同大小的anchor。anchor延續v2中的聚類機制來生成,在每種特徵圖上生成三個;在這裏插入圖片描述
  3. 分類由softmax改爲logistic:用於支持多標籤對象;
    總結:v3中更深的網絡層次,以及多尺度檢測,提升了mAP及小物體檢測效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章