論文題目:YOLOv4: Optimal Speed and Accuracy of Object Detection
文獻地址:https://arxiv.org/pdf/2004.10934.pdf
源碼地址:https://github.com/AlexeyAB/darknet
YOLOv4中談及了一些B-Box回歸損失的方法,諸如MSE(L2 loss),Smooth L1 loss,IoU loss, GIoU loss,DIoU loss,CIoU loss。本篇主要介紹目標檢測任務中近幾年這些損失函數的具體操作。
MAE(L1 loss),MSE(L2 loss)與Smooth L1 loss
MAE和MSE在回歸任務中做損失函數早已屢見不鮮,
- MAE(L1 loss):
其圖像是與y軸對稱的折線:
- MSE(L2 loss):
其圖像為一條與y軸對稱且過原點的拋物線:
對於上述兩種損失函數中,L1損失函數的導數為常數,在訓練后期,當損失數值變小后,如果學習率不變,損失函數會在穩定值附近波動,很難收斂到跟高的精度。L2損失函數的導數與損失有關,在訓練初期,當損失較大時,其導數也很大,會造成訓練的不穩定。
Smooth L1 loss便是針對MSE和MAE的這些不足。Smooth L1 loss 的提出是在Fast RCNN中:
其中,vi表示ground-true 框的坐標,ti表示預測的框的坐標(其中包含x,y,w,h)。
上述的三種loss方法在計算B-Box損失時,會存在一些問題:
- 將框的坐標以相對獨立的方式進行損失的計算,這種做法的假設是這四個坐標相對獨立,但實際上是有一定關聯的。
- 不同的檢測框可能有相同大小的Smooth L1 loss,不能很好的衡量檢測框。
IoU loss
Smooth L1 loss不能很好的衡量預測框與ground true 之間的關系,相對獨立的處理坐標之間的關系。可能出現Smooth L1 loss相同,但實際IoU不同的情況。
因此,提出IoU loss,將四個點構成的box看成一個整體進行損失的衡量。通過計算兩個框的交並比,再求-ln(IoU),當然,很多時候可以直接定義IoU loss = 1-IoU。
算法流程如下:
YOLOv3中使用的便是IoU loss。
GIoU loss
文獻地址:https://arxiv.org/pdf/1902.09630.pdf
源碼地址:https://github.com/generalized-iou/g-darknet
IoU loss 其實並不完美,也會存在一些問題:
- IoU loss僅能衡量兩個框相交的情況,而不能反應預測框與目標框不相交的情況。即當IoU(a, b) = 0時,是不能反應a, b的遠近。
- 即使具有相同大小的交並比,IoU loss也不能很好的衡量兩個框是如何相交的。如下圖所示,具有相同的IoU=0.33,相交的情況卻大不相同。
GIoU loss的提出便是針對上述問題,GIoU中對於上述三幅圖,GIoU分別=0.33, 0.24, -0.1。感覺當框的對齊方向更好一些時,GIoU的值會更高一些。下圖可以對比一下MSE、IOU與GIoU的區別:
GIoU的算法流程:
通過上述算法流程可以看出,GIoU≤IoU; 並且,LGIoU = 1-GIoU。
C表示可以將A,B包含在內的最小的封閉形狀,這樣就可以衡量預測框與真實框不相交的情況。添加了C中非A、B區域部分占C的比例,從而添加不想交和相交情況的約束。
具體的計算方式:
DIoU loss
文獻地址:https://arxiv.org/pdf/1911.08287.pdf
DIoU可以使YOLOv3漲近3個百分點。https://github.com/Zzh-tju/DIoU-darknet
GIoU同樣也不是完美的,DIoU loss的作者發現當預測框被目標框完全包裹的時候,IoU和GIoU是一樣的,並不能區分此時的位置關系,此時GIoU退化為IoU。
因此,作者提出的DIoU引入了中心點歸一化距離的操作。如下圖所示,綠色框表示目標框,紅色框表示預測框。從下圖可以略微感覺到,DIoU loss的計算會包含中心點的指引。
在上述完全包裹的情況下,C的計算是一樣的,導致在優化時,對於不同的情況,並不能給予合適的懲罰項,導致放慢了收斂速度。
作者也給出了在不同代數下,DIoU和GIoU收斂情況的可視化。如下圖所示,第一行為GIoU的各代收斂情況;第二行為DIoU的各代收斂情況。綠色框為真實框,黑色框為anchor box,藍色框為GIoU loss 產生的預測框,紅色框為DIoU loss產生的預測框。可以看出,在DIoU loss 的指引下,僅需要120代,預測框便可以很好的滿足真實框。【損失函數其實就是你想讓它按照怎樣的方式去學習,指引的越好,收斂速度越快】
DIoU loss 的求取:
這個損失函數中,b和b(gt)表示anchor框和目標框的中心點,ρ表示兩個中心點的歐式距離(如下圖標記d)。c代表的是可以同時覆蓋Anchor框和目標框的最小矩形的對角線距離(如下圖標記c)。因此DIoU中對Anchor框和目標框之間的歸一化距離進行了建模。
使用中心點間距離d和覆蓋矩形對角線距離c的比值衡量彼此之間的關系,即可以對不相交有約束,也可以對包含有約束。這樣的指引,可以提供移動方向,加快收斂速度。
CIoU loss
DIoU loss 文章中還提出了一種CIoU loss(Complete IoU loss),作者歸納了一個好的目標框回歸損失應該考慮三個重要的幾何因素:重疊面積、中心點距離和長寬比。
- GIoU loss 解決了IoU為0時,無法優化的問題;
- DIoU loss 在GIoU Loss的基礎上考慮了邊界框的重疊面積和中心點距離。
所以,還沒有考慮長寬比一致性的約束,即CIoU loss 在DIoU loss的基礎上添加了長寬比的約束αv:
其中,α作為一個trade-off參數:
參數v用於衡量長寬比一致性:
下圖展示了DIoU和CIoU在YOLOv3性能上的提升。
YOLOv4中使用的便是DIoU loss!
AlexyAB大神在源碼的維護中添加了CIoU loss,使用CIoU loss可以進一步提升模型的精度!
yolov3/-tiny同樣可以修改原先的IoU loss為CIoU loss,也可以為yolov3/-tiny提升精度!