yolov1-v3系列學習

參考:https://zhuanlan.zhihu.com/p/51727352
https://blog.csdn.net/qq_18941713/article/details/90776197

yolo系列算法是one stage思想的,即直接提取特徵來預測物體的類別和位置。

yolov1

其核心思想是輸入整個圖片,提取特徵後直接進行迴歸/分類
在這裏插入圖片描述

論文細節如下:

  • 首先將圖片分爲sxs的網格,圖中爲7x7=49個網格(grid),如果待檢測物體的中心點落在其中一個網格上,那麼這個網格負責去預測這個物體。其中,每個網格只能產生2個預測框(bounding box),那麼共產生了98個bbox並且帶有置信度confidence,這些框基本覆蓋了整個圖片。
    不同於一般的iou,訓練的時候,這裏的iou是這樣計算的:
    在這裏插入圖片描述
    這樣設計
    其中,若中心點在這個網格中,Pr(Object)=1,否則爲0。
    測試的時候:
    在這裏插入圖片描述
    這樣子設計,即保證了預測bbox屬於某一類的概率,又反應了bbox是否包含目標以及座標的信息。
  • 對每一個網格,將其對應的bbox輸入神經網絡後,輸出有(x,y,w,h,confidence)。其中x,y是指當前格子預測得到的物體的bounding box的中心位置的座標。w,h是bounding box的寬度和高度。注意:實際訓練過程中,w和h的值使用圖像的寬度和高度進行歸一化到[0,1]區間內;x,y是bounding box中心位置相對於當前格子位置的偏移值,並且被歸一化到[0,1]。此外,還有分類信息,即樣本總共有c類。B爲每個網格產生的bbox的個數,則對整個圖片來說,輸入神經網絡後,輸出的個數爲 SxSx(5*B+c)。例如, 在PASCAL VOC中,圖像輸入爲448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x30的一個tensor。
    關於x,y的計算,如下圖:
    在這裏插入圖片描述
    假設橢圓爲目標,綠色長方形爲標定的目標框,紅點爲框的中心點,即其座標爲(3,7),其處在(1,4)的網格中
    對於網格,紅點座標爲(0.5,0.5)。根據原圖位置計算得到相對於特徵圖位置的公式如下:可根據下面公式驗證。
    x=xSwidthint(xSwidth)y=ySwidthint(ySwidth){} x = \frac{{x*S}}{{width}} - {\mathop{\rm int}} \left( {\frac{{x*S}}{{width}}} \right)\\ y = \frac{{y*S}}{{width}} - {\mathop{\rm int}} \left( {\frac{{y*S}}{{width}}} \right)

網絡結構如下:
在這裏插入圖片描述
激活函數:最後一層使用的是標準的線性激活函數,其他的層都使用leaky relu 。
3.損失函數
  由上一步可知,yolov1的損失分爲3個方面,座標損失,置信度損失,分類損失,作者全部使用了mse作爲損失函數,但如果直接相加的話,無法權衡8維座標(因爲是2個bbox)損失和2維的置信度損失和20維的分類損失的重要程度。考慮到每個損失的貢獻率,作者給座標損失權重λcoord{{\bf{\lambda }}_{{\bf{coord}}}}=5。又因爲在一幅圖片中,沒有目標的網格佔多數,所給給沒有目標的置信度損失權重λnoobj{{\bf{\lambda }}_{{\bf{noobj}}}}=0.5,有目標的置信度損失爲1。如下:
在這裏插入圖片描述
其中 1ijobj={1,0}{\bf{1}}_{ij}^{obj} = \left\{ {1,0} \right\},表示第i個網格第j個bbox是否包含目標。1iobj{\bf{1}}_i^{obj}表示包含目標的第i個網格。對應到輸出tensor上如下圖:
注意到,對於分類損失,只有當網格包含目標時,纔會計算,不包含目標時,分類全置爲0,不參與運算,可參考吳恩達的相關課程。
在這裏插入圖片描述
  注意到,座標損失中關於w和h,採用的是開根號的形式,映射到下面這張圖上。這時因爲,對於不同大小的bbox,寬和高計算出的偏移量損失貢獻率是不一樣的,採用根號的形式,可以儘量減小對小bbox的敏感度。這樣子可以稍微平衡一下大bbox和bbox對損失的貢獻率。這樣子可以使得訓練波動更小一點。

在這裏插入圖片描述
總的來說,這樣設計損失函數可以讓座標,置信度,分類概率三者達到一個較好的平衡。
但仍存在一些不足

  • 雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作爲物體檢測輸出,即每個格子最多隻預測出一個物體,對於多個小目標中心在同一個網格中時,只能檢測出一個,對於小物體的召回率不夠高,羣體小物體檢測也不合適。

  • 文中產生的bbox的長寬是根據數據集的特性設定的,對於具有特殊長寬的物體,該網絡的泛化能力偏弱。

  • 對於不同大小目標的座標損失函數的設定權重是相同的,雖然採用了開根號的設定,但該loss function有待加強。

  • 因爲網絡的最後一層爲全連接層,導致測試時輸入圖像的分辨率要與訓練時的相同。

yolov2

yolov1的精度相對於其他網絡還比較低。
1)Batch normnization
2)相比於v1,採用了anchor box,把預測類別的機制從空間位置(cell)中解耦,由anchor box同時預測類別和座標。因爲YOLO是由每個cell來負責預測類別,每個cell對應的2個bounding box 負責預測座標(回想YOLO中 最後輸出7730的特徵,每個cell對應1130,前10個主要是2個bounding box用來預測座標,後20個表示該cell在假設包含物體的條件下屬於20個類別的概率,具體請參考 圖解YOLO 的圖示) 。YOLOv2中,不再讓類別的預測與每個cell(空間位置)綁定一起,而是讓全部放到anchor box中。下面是特徵維度示意圖(僅作示意並非完全正確)
在這裏插入圖片描述

在yolov1中,對每一個網格,作者都設計了2個預測框來預測裏面的目標,這兩個框的產生是人爲選擇的,大小的人爲設置的。yolov2不用自定義anchor box的尺寸,而是在訓練集上對anchor box進行kmeans聚類,自動找到良好的anchor box 尺寸,作者設置anchor box數量爲5。
傳統的kmeans算法,採用歐氏距離最小原則來更新質心,但是對於本文來說,由於anchor box刻畫形式爲(x1,y1,w,h),採用歐式距離的話,會導致大框比小框產生更多的誤差。所以,作者巧妙設計了用iou來度量這個距離公式。因爲不同尺寸的anchor box 與ground truth 的iou值與anchor box的尺寸無關。公式如下

注意,在計算anchor boxes時,將所有boxes中心點的x,y座標都置爲0,這樣所有的boxes都處在相同的位置上,方便我們通過新距離公式計算boxes之間的相似度,聚類只針對w和h,即以w和h爲特徵維度的anchor box
d(box,centroid)=1IOU(box,centroid)d\left( {{\rm{box,centroid}}} \right) = 1 - IOU\left( {{\rm{box,centroid}}} \right)

  由於待計算的anchor boxes的width和height都是相對於整張圖片的比例,而YOLOv2通過anchor boxes得到最優的框座標時,座標是相對於網格邊長的比例(0到1之間),因此要將anchor boxes的width和height也轉換爲相對於柵格邊長的比例。轉換公式如下:
w=anchor_width * input_width / downsamples
h=anchor_height * input_height / downsamples
例如;卷積神經網絡的輸入爲416*416時,YOLOv2網絡的降採樣倍率爲32,例如K-means計算得到的一個anchor
box的anchor_width=0.2,anchor_height=0.6,則:

w=0.2 * 416 / 32=0.2 * 13=2.6
h=0.6 * 416 / 32=0.6 * 13=7.8
參考:https://blog.csdn.net/hrsstudy/article/details/71173305?utm_source=itdadao&utm_medium=referral

3)高分辨率的分類器
在訓練物體檢測任務時,會使用在imagenet數據集上的預訓練模型作爲特徵提取器,而這個預訓練模型,輸入的圖像分辨率通常在224x224而在訓練物體檢測任務時,需要的圖像分辨率要更高(原因是圖像越大,物體越清晰,越容易檢測到物體),這樣會造成兩者的輸入圖像尺寸不一致。在YOLO V1中,作者先是在224x224大小的輸入圖像上訓練檢測模型,然後將圖像分辨率提升至448x448,在檢測數據集上Finetune。
爲了更好地適應分辨率的差異,YOLO V2選擇先在ImageNet上Finetune高分辨率(448x448)的模型(10 epochs),然後再訓練檢測模型,這樣就“弱化”了分類模型和檢測模型在輸入圖像分辨率上的“不一致”。

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