版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。
本文連結:https://blog.csdn.net/chaipp0607/article/details/102094625
前言
Faster R-CNN,YOLO和SSD在通用目标檢測領域有着奠基一般的作用, 而YOLOv2和YOLOv3由于其靈活易用的特性,在工業界一直很受歡迎,下面這篇文章主要想從損失函數的角度集中讨論下這幾個主流架構的差別。
分類損失
分類在目标檢測任務中的作用是确定一個目标到底應該屬于哪個類别。
-
Faster R-CNN
需要注意的是,這裡的Faster R-CNN讨論的是RPN的損失,是以在分類損失中,Faster R-CNN的RPN用的是二值交叉熵,因為RPN分類是區分目前的區域是不是個目标的二分類問題。
-
SSD,YOLO,YOLOv2
SSD,YOLO和YOLOv2都是one-stage的結構,沒有區域建議,是以它們的分類損失是交叉熵,如果是針對VOC資料集,那麼類别應該是20類,針對COCO資料集,類别是80類。
此外還有一個小差別是,SSD有背景類,比如COCO資料集上,SSD要區域81類。
-
YOLOv3
YOLOv3大體上和YOLOv2其實沒什麼差別,在這裡把YOLOv3單獨摘出來,是因為它在分類損失上确實不使用softmax+交叉熵來做,而是使用n個二值交叉熵來做,比如在COCO上,使用一個80類的交叉熵是可以實作的,但是YOLOv3用了Logistic+二值交叉熵處理,将一個80分類問題轉化為80個二分類問題。
回歸損失
回歸在目标檢測任務中的作用是确定一個和Ground Truth重合度盡量高的邊界框,即xxx,yyy,www和hhh。下面提到的差別包含了邊界框的表示和損失函數,為了表達起來友善,我們把它拆成三個部分,分别是邊界框的中心(x,y)(x,y)(x,y),邊界框的尺寸(w,h)(w,h)(w,h)和損失函數LLL。
邊界框的中心點
-
Faster R-CNN和SSD
Faster R-CNN的RPN和SSD在處理邊界框的中心點時采用的是相同的思路,并且它們都有Anchor,其實是SSD借鑒了RPN,最後一層特征圖上的點決定了預設的中心點,RPN和SSD要預測的是Ground Truth對中心點的offset,并除Anchor的寬高後的結果,假設預設框為{dcx,dcy,dw,dh}\left \{d^{cx},d^{cy},d^{w},d^{h}\right \}{dcx,dcy,dw,dh},ground truth為{gcx,gcy,gw,gh}\left \{g^{cx},g^{cy},g^{w},g^{h}\right \}{gcx,gcy,gw,gh},從公式中可以看出來,{dcx,dcy}\left \{d^{cx},d^{cy}\right \}{dcx,dcy}和{gcx,gcy}\left \{g^{cx},g^{cy}\right \}{gcx,gcy}都表示中心點坐标。那麼轉換後的ground truth坐标{g^cx,g^cy}\left \{\hat{g}^{cx},\hat{g}^{cy}\right \}{g^cx,g^cy}依照下面方式求取:
g^cx=(gcx−dcx)dw\hat{g}^{cx}=\frac{\left (g^{cx}-d^{cx} \right )}{d^{w}}g^cx=dw(gcx−dcx)g^cy=(gcy−dcy)dh\hat{g}^{cy}=\frac{\left (g^{cy}-d^{cy} \right )}{d^{h}}g^cy=dh(gcy−dcy)
-
YOLO,YOLOv2和YOLOv3
YOLO系列的結構中,YOLO是沒有Anchor的,YOLO隻有格子,YOLOv2和YOLOv3帶Anchor,但是這并不影響它們邊界框中心點的選擇,它們的邊界框中心都是在預測距離格子左上角點的offset,這一點和Faster R-CNN與SSD是不同的。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5yNsFnZthmempGOvwlMyUzN0ETMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
特别說明,上圖來自《YOLO文章詳細解讀》
對于上圖中藍色框對應的格子(坐标為(xcol=1,yrow=4)(x_{col}=1,y_{row}=4)(xcol=1,yrow=4)),假設它預測的輸出是紅色框的bbox,設bbox的中心坐标為(xc,yc)(x_c,y_c)(xc,yc),那麼最終預測出來的(x,y)(x,y)(x,y)是經過歸一化處理的,表示的是中心相對于單元格的offset,計算公式如下。其中kkk是格子的數量,wimgw_{img}wimg和himgh_{img}himg是圖檔的寬高。
x=xcwimgk−xcolx= \frac{x_{c}}{w_{img}}k-x_{col}x=wimgxck−xcol
y=ychimgk−yrowy= \frac{y_{c}}{h_{img}}k-y_{row}y=himgyck−yrow
邊界框的尺寸
-
YOLO
在邊界框尺寸這個方面,YOLO顯得非常孤立,因為它是這5個結構中唯一無Anchor的,由于沒有先驗,是以YOLO在表達(w,h)(w,h)(w,h)時非常的簡單粗暴,就是相對于整個圖檔的比例做了歸一化。
w=wbwimgw= \frac{w_{b}}{w_{img}}w=wimgwbh=hbhimgh= \frac{h_{b}}{h_{img}}h=himghb
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5yNsFnZthmempGOvwlMyUzN0ETMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
特别說明,上圖來自《YOLO文章詳細解讀》
-
Faster R-CNN,SSD,YOLOv2和YOLOv3
Faster R-CNN,SSD,YOLOv2和YOLOv3都帶Anchor,是以它們對于(w,h)(w,h)(w,h)的處理是一緻的,就是根據Anchor,用對數函數,對預測值和ground truth去重新編碼。
下面是SSD中用Anchor編碼的ground truth例子:假設預設框為{dcx,dcy,dw,dh}\left \{d^{cx},d^{cy},d^{w},d^{h}\right \}{dcx,dcy,dw,dh},ground truth為{gcx,gcy,gw,gh}\left \{g^{cx},g^{cy},g^{w},g^{h}\right \}{gcx,gcy,gw,gh},從公式中可以看出來。那麼轉換後的ground truth坐标{g^w,g^h}\left \{\hat{g}^{w},\hat{g}^{h}\right \}{g^w,g^h}依照下面方式求取:
g^w=loggwdw\hat{g}^{w}=log{\frac{g_{w}}{d^{w}}}g^w=logdwgwg^h=logghdh\hat{g}^{h}=log{\frac{g_{h}}{d^{h}}}g^h=logdhgh
這裡使用的是logloglog,其實可以看做lnlnln。
在YOLOv2中這個形式會變一下,但是本質上是一樣的,總結來看,根據邊界框預測的4個offset{tx,ty,tw,th}\left \{ t_{x}, t_{y},t_{w},t_{h} \right \}{tx,ty,tw,th},可以按照下列公式計算出ground truth在特征圖上的相對值{bx,by,bw,bh}\left \{ b_{x}, b_{y},b_{w},b_{h} \right \}{bx,by,bw,bh}。
bw=pwetwb_{w}= p_{w}e^{t_{w}}bw=pwetwbh=phethb_{h}= p_{h}e^{t_{h}}bh=pheth
上式中把pwp_{w}pw除過來,然後兩邊取對數,就和SSD一樣了。
是以這就是為什麼Faster R-CNN,SSD,YOLOv2和YOLOv3中都有log,就是為了根據Anchor對預測值和ground truth去重新編碼。
損失函數
-
Faster R-CNN和SSD
SSD可以說在邊界框回歸問題上完全參考RPN,包括損失函數,是以它們都用smooth L1損失。
-
YOLO,YOLOv2和YOLOv3
YOLO系列在邊界框回歸損失上用的是L2,并沒有參考RPN。
其他損失
最後就是除了分類損失和回歸損失外的其他損失函數,主要是起到輔助作用。
-
Faster R-CNN和SSD
PRN和SSD是沒有其他損失函數的,因為RPN隻有兩類,其中包含了負類,SSD的類别中也包含背景類。
-
YOLO,YOLOv2和YOLOv3
YOLO系列在最後的類别輸出上是不包含背景類的,是以它在輸出上加上了一個confidence,是以YOLO系列處理基礎的分類損失和回歸損失外,還需要有一個confidence損失,去評價目前的區域是object還是no object。