DIoU YOLOv3 | AAAI 2020:更加穩定有效的目標框迴歸損失
緊接著上面一篇文章,這次是對GIoU損失的一個改進,讓我們一起來看看吧。
前言:本篇論文是屬於對IOU/GIOU Loss的一個改進,IOU的計算在目標檢測裡面是一個非常重要的概念,將IOU引入到目標框的迴歸當中,也是一個常用的操作。而本文提出的DIOU是一種比GIOU更加符合目標框迴歸的機制,將目標與anchor之間的距離,重疊率以及尺度都考慮進去,使得目標框迴歸變得更加穩定,不會像IOU和GIOU一樣出現訓練過程中發散等問題。
一、IOU和GIOU回顧
IoU損失可以表示為:
![目標檢測損失之DIoU](http://p2.ttnews.xyz/loading.gif)
IoU的缺點是當兩個框不想相交時,IoU損失總是1,不能給出優化方向。
GIoU損失可以表示為:
![目標檢測損失之DIoU](http://p2.ttnews.xyz/loading.gif)
可以看到,GIoU在IoU的基礎上添加了一個項,其中C表示包含兩個框的最小矩形,因此可以優化兩個框不相交的情況。不過,GIoU也存在著問題。當兩個框相交時,GioU損失退化為IoU損失。因此,當包含預測框bbox和地面真值bbox時,特別是在水平和垂直方向上,很難進行優化。這裡的一個猜想是,在水平方向和垂直方向上,損失的值沒有在其他方向上增長得快,因此對這兩個方向的懲罰不夠,導致收斂速度減慢。如下圖所示:
在上圖的情況下,GIoU損耗退化為IoU損耗,而提出DIoU損耗仍然可以區分。 綠色和紅色分別表示目標框和預測框。
二、作者對Iou和GIoU的實驗分析
作者通從實驗結果的角度說明了IoU和GIoU存在的問題。實驗設定如下圖所示,
- 其中綠色框代表仿真實驗需要回歸的七個不同尺度的目標框,七個目標框的中心點座標都是(10 * 10)。
- 藍色的點代表了所有anchor的中心點,各個方向都有,各種距離都有。而且每個面積的anchor框又有7種比例尺寸。有5000個藍色點,因此總共有5000*7*7個anchor框,而且每個框都需要回歸到七個目標框去,因此一共有5000*7*7*7個迴歸案例。
最終的實驗結果如下:圖中展示的訓練同樣的代數後(200代),三個loss最終每個anchor的誤差分佈
- IoU:從IoU誤差的曲線可以發現,anchor越靠近邊緣,誤差越大,那些與目標框沒有重疊的anchor基本無法迴歸。
- GIoU:從GIoU誤差的曲線我們可以發現,對於一些沒有重疊的anchor,GIoU的表現要比IoU更好。但是由於GIoU仍然嚴重的依賴IoU,因此在兩個垂直方向,誤差很大,基本很難收斂,這就是GIoU不穩定的原因。
- DIoU:從DIoU誤差的曲線我們可以發現,對於不同距離,方向,面積和比例的anchor,DIoU都能做到較好的迴歸。
上圖進一步解釋了GIoU不穩定以及收斂很慢的原因。上圖中第一行是不同次數的迭代後,anchor的偏移結果。第二行是DIoU的迴歸過程,其中綠色框為目標框,黑色框為anchor,紅色框為不同次數的迭代後,anchor的偏移結果。
從圖中可以看到,GIoU在迴歸的過程中,從損失函數的形式我們發現,當IoU為0時,GIoU會先儘可能讓anchor能夠和目標框產生重疊,之後GIoU會漸漸退化成IoU迴歸策略,因此整個過程會非常緩慢而且存在發散的風險。而DIoU考慮到anchor和目標之間的中心點距離,可以更快更有效更穩定的進行迴歸。
三、作者的思考
基於GIoU存在的問題,作者提出了兩個問題:
- 直接最小化anchor框與目標框之間的歸一化距離是否可行,以達到更快的收斂速度。
- 如何使迴歸在與目標框有重疊甚至包含時更準確、更快。
四、DIoU的提出——第一個問題
DIoU的定義:
上述損失函數中,b,bgt分別代表了anchor框和目標框的中心點,且p代表的是計算兩個中心點間的歐式距離。c代表的是能夠同時覆蓋anchor和目標框的最小矩形的對角線距離。因此DIoU中對anchor框和目標框之間的歸一化距離進行了建模。直觀的展示如下圖所示。
DIoU的優點如下:
1.與GIoU loss類似,DIoU loss在與目標框不重疊時,仍然可以為邊界框提供移動方向。
2.DIoU loss可以直接最小化兩個目標框的距離,因此比GIoU loss收斂快得多。
3.對於包含兩個框在水平方向和垂直方向上這種情況,DIoU損失可以使迴歸非常快,而GIoU損失幾乎退化為IoU損失。
五、CIoU的提出——第二個問題
一個好的目標框迴歸損失應該考慮三個重要的幾何因素:重疊面積、中心點距離、長寬比。
- GIoU:為了歸一化座標尺度,利用IoU,初步解決IoU為零的情況。
- DIoU:DIoU損失同時考慮了邊界框的重疊面積和中心點距離。
anchor框和目標框之間的長寬比的一致性也是極其重要的。基於此,作者提出了Complete-IoU Loss。
上述損失函數中,CIoU比DIoU多出了α和v這兩個參數。其中α是用於平衡比例的參數。v用來衡量anchor框和目標框之間的比例一致性。 從的定義式來看,損失函數會更加傾向於往重疊區域增多的方向優化,尤其是IoU為0的情況,這滿足我們的要求。同時,在進行nms階段,一般的評判標準是IOU,這個地方作者推薦替換為DIOU,這樣考慮了中心點距離這一個信息,效果又有一定的提升。
DIoU Loss的優點:
- 與GIoU Loss類似,當邊界框不與目標框重疊時,DIoU Loss仍然可以為邊界框提供移動方向。
- DIoU損失可以直接最小化兩個目標盒之間的距離,因此它比GIoU損失收斂快得多。
- 在水平和垂直兩種情況下,DIoU損失可以使收益損失迅速下降,而GIoU損失幾乎退化為IoU損失。
SSD的DIoU計算,可惜是pytorch:
def Diou(bboxes1, bboxes2):
rows = bboxes1.shape[0]
cols = bboxes2.shape[0]
dious = torch.zeros((rows, cols))
if rows * cols == 0:#
return dious
exchange = False
if bboxes1.shape[0] > bboxes2.shape[0]:
bboxes1, bboxes2 = bboxes2, bboxes1
dious = torch.zeros((cols, rows))
exchange = True
# #xmin,ymin,xmax,ymax->[:,0],[:,1],[:,2],[:,3]
w1 = bboxes1[:, 2] - bboxes1[:, 0]
h1 = bboxes1[:, 3] - bboxes1[:, 1]
w2 = bboxes2[:, 2] - bboxes2[:, 0]
h2 = bboxes2[:, 3] - bboxes2[:, 1]
area1 = w1 * h1
area2 = w2 * h2
center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2
center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2
center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2
center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2
inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:])
inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2])
out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:])
out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2])
inter = torch.clamp((inter_max_xy - inter_min_xy), min=0)
inter_area = inter[:, 0] * inter[:, 1]
inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2
outer = torch.clamp((out_max_xy - out_min_xy), min=0)
outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2)
union = area1+area2-inter_area
dious = inter_area / union - (inter_diag) / outer_diag
dious = torch.clamp(dious,min=-1.0,max = 1.0)
if exchange:
dious = dious.T
return dious
閱讀更多 計算機視覺糖小白 的文章