目標檢測損失之DIoU

DIoU YOLOv3 | AAAI 2020:更加穩定有效的目標框迴歸損失

緊接著上面一篇文章,這次是對GIoU損失的一個改進,讓我們一起來看看吧。

前言:本篇論文是屬於對IOU/GIOU Loss的一個改進,IOU的計算在目標檢測裡面是一個非常重要的概念,將IOU引入到目標框的迴歸當中,也是一個常用的操作。而本文提出的DIOU是一種比GIOU更加符合目標框迴歸的機制,將目標與anchor之間的距離,重疊率以及尺度都考慮進去,使得目標框迴歸變得更加穩定,不會像IOU和GIOU一樣出現訓練過程中發散等問題。

一、IOU和GIOU回顧

IoU損失可以表示為:

目標檢測損失之DIoU

IoU的缺點是當兩個框不想相交時,IoU損失總是1,不能給出優化方向。

GIoU損失可以表示為:

目標檢測損失之DIoU

目標檢測損失之DIoU

可以看到,GIoU在IoU的基礎上添加了一個項,其中C表示包含兩個框的最小矩形,因此可以優化兩個框不相交的情況。不過,GIoU也存在著問題。當兩個框相交時,GioU損失退化為IoU損失。因此,當包含預測框bbox和地面真值bbox時,特別是在水平和垂直方向上,很難進行優化。這裡的一個猜想是,在水平方向和垂直方向上,損失的值沒有在其他方向上增長得快,因此對這兩個方向的懲罰不夠,導致收斂速度減慢。如下圖所示:

目標檢測損失之DIoU

在上圖的情況下,GIoU損耗退化為IoU損耗,而提出DIoU損耗仍然可以區分。 綠色和紅色分別表示目標框和預測框。

二、作者對Iou和GIoU的實驗分析

作者通從實驗結果的角度說明了IoU和GIoU存在的問題。實驗設定如下圖所示,

目標檢測損失之DIoU

  1. 其中綠色框代表仿真實驗需要回歸的七個不同尺度的目標框,七個目標框的中心點座標都是(10 * 10)。
  2. 藍色的點代表了所有anchor的中心點,各個方向都有,各種距離都有。而且每個面積的anchor框又有7種比例尺寸。有5000個藍色點,因此總共有5000*7*7個anchor框,而且每個框都需要回歸到七個目標框去,因此一共有5000*7*7*7個迴歸案例。

最終的實驗結果如下:圖中展示的訓練同樣的代數後(200代),三個loss最終每個anchor的誤差分佈

目標檢測損失之DIoU

  1. IoU:從IoU誤差的曲線可以發現,anchor越靠近邊緣,誤差越大,那些與目標框沒有重疊的anchor基本無法迴歸。
  2. GIoU:從GIoU誤差的曲線我們可以發現,對於一些沒有重疊的anchor,GIoU的表現要比IoU更好。但是由於GIoU仍然嚴重的依賴IoU,因此在兩個垂直方向,誤差很大,基本很難收斂,這就是GIoU不穩定的原因。
  3. DIoU:從DIoU誤差的曲線我們可以發現,對於不同距離,方向,面積和比例的anchor,DIoU都能做到較好的迴歸。
目標檢測損失之DIoU


上圖進一步解釋了GIoU不穩定以及收斂很慢的原因。上圖中第一行是不同次數的迭代後,anchor的偏移結果。第二行是DIoU的迴歸過程,其中綠色框為目標框,黑色框為anchor,紅色框為不同次數的迭代後,anchor的偏移結果。

從圖中可以看到,GIoU在迴歸的過程中,從損失函數的形式我們發現,當IoU為0時,GIoU會先儘可能讓anchor能夠和目標框產生重疊,之後GIoU會漸漸退化成IoU迴歸策略,因此整個過程會非常緩慢而且存在發散的風險。而DIoU考慮到anchor和目標之間的中心點距離,可以更快更有效更穩定的進行迴歸。


三、作者的思考

基於GIoU存在的問題,作者提出了兩個問題:

  1. 直接最小化anchor框與目標框之間的歸一化距離是否可行,以達到更快的收斂速度。
  2. 如何使迴歸在與目標框有重疊甚至包含時更準確、更快。

四、DIoU的提出——第一個問題

DIoU的定義:

目標檢測損失之DIoU

上述損失函數中,b,bgt分別代表了anchor框和目標框的中心點,且p代表的是計算兩個中心點間的歐式距離。c代表的是能夠同時覆蓋anchor和目標框的最小矩形的對角線距離。因此DIoU中對anchor框和目標框之間的歸一化距離進行了建模。直觀的展示如下圖所示。

目標檢測損失之DIoU

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。

目標檢測損失之DIoU

目標檢測損失之DIoU

目標檢測損失之DIoU

上述損失函數中,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


分享到:


相關文章: