YOLOv4的Tricks解讀三--- 目標檢測後處理(Soft-NMS/DIoU-NMS)


YOLOv4中採用了DIoU-NMS 非極值抑制方法,本文就YOLOv4中涉及的Soft-NMS和DIoU-NMS方法做解讀學習。

Soft-NMS

論文:https://arxiv.org/abs/1704.04503
代碼:https://github.com/bharatsingh430/soft-nms
Pytorch版本:https://github.com/DocF/Soft-NMS

NMS是目標檢測中必備的後處理步驟,目的是用來去除重複框,留下最準確的box,如下圖所示。
在這裏插入圖片描述

NMS的僞代碼算法流程如下:
在這裏插入圖片描述
其中B是預測的框list,S是對應預測box的score分數list,N_t是IoU閾值。

  • 找出score分數最高的M
  • 將M從B中刪除
  • 將刪除的M添加進最後的集合D(D和M合併)
  • 將B中所有的box與M進行IoU計算,刪除B中 IoU > N_t的所有對應box
  • 重複上面的步驟

最後D中的框就是保留下來的。s_i可表述爲:
在這裏插入圖片描述
在最後留下的框中,刪除掉低於score閾值的框,剩下的就是最終的預測框了。

可以看到,NMS的處理方法過於粗暴,即將與M的IoU大於某個閾值的box直接置其score爲0,這不是抹掉了這個box框柱其它物體的可能性了嗎(漏檢,召回率低)?

那能不能溫柔一點,不是直接置0而是降低分數呢?
Soft-NMS即是這樣的操作。Soft-NMS的僞代碼流程如下:
在這裏插入圖片描述

可以看到,Soft-NMS與傳統NMS的區別在於對score分數調整的處理。如果是傳統的NMS操作,那麼當B中的b_i和M的IoU值大於閾值N_t,那麼就從B和S中去除該box;對於Soft-NMS而言是先計算M與b_i的IoU,然後IoU經過一個函數輸出最後與s_i相乘最終得到box的分數。

其中s_i的score遵循IoU越大,分數越低的原則(IoU越大,越可能是背景),所以s_i定義如下:
在這裏插入圖片描述
考慮到上式是不連續的,並且當達到N_t的NMS閾值時會施加突然的懲罰, 如果懲罰函數是連續的,那將是理想的,否則它可能導致檢測結果的排序列表的突然改變(集合D中的score出現斷層跳躍現象)。所以s_i的更新公式修改爲如下:
在這裏插入圖片描述
這樣就避免了檢測結果中的score會出現突然間的跳躍現象。

參考:
https://blog.csdn.net/Gentleman_Qin/article/details/84448155
https://arxiv.org/pdf/1704.04503.pdf

DIoU-NMS

論文:https://arxiv.org/pdf/1911.08287.pdf
代碼:https://github.com/Zzh-tju/DIoU-darknet

DIoU-NMS需要了解DIoU,它兩在同一篇論文被提出,關於DIoU知識請移步:目標檢測中的迴歸損失函數系列四:DIoU Loss / CIoU Loss

在傳統NMS中,IoU指標常用於抑制冗餘檢測盒,其中重疊區域是唯一因素,對於遮擋情況經常產生錯誤抑制。 DIoU-NMS將DIoU作爲NMS的準則,因爲在抑制準則中不僅應考慮重疊區域,而且還應考慮兩個box之間的中心點距離,而DIoU就是同時考慮了重疊區域和兩個box的中心距離。 對於score最高的預測box M,可以將DIoU-NMS的s_i更新公式正式定義爲:
在這裏插入圖片描述
其中通過同時考慮IoU和兩個box的中心點之間的距離來刪除box B_i,s_i是分類得分,ε是NMS閾值。DIoU-NMS建議兩個中心點較遠的box可能位於不同的對象上,不應將其刪除(這就是DIoU-NMS的與NMS的最大不同之處)

在這裏插入圖片描述
如圖所示,對於每個閾值,DIoU-NMS都比傳統NMS更好。 此外,值得注意的是,即使DIoU-NMS的性能最差,也至少可以與原始NMS的性能相媲美或更好。 也就是說,即使不小心調整閾值ε,DIoU-NMS通常也可以比原始NMS更好(最差的也比你最好的好)。
參考:
https://blog.csdn.net/c2250645962/article/details/106071294
https://cloud.tencent.com/developer/article/1596428

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