NMS總結

  • 2020 年 12 月 13 日
  • 筆記

導言:

    Non-Maximum Suppression(NMS)非極大值抑制,也有個別地方稱之為非最大值抑制。個人認為前者更為貼切,因為其具體實現原理是找到所有局部最大值,並抑制非局部最大值,而不是找全局最大值,後文會介紹代碼。從字面意思理解,抑制那些非極大值的元素,保留極大值元素。其主要用於目標檢測,目標跟蹤,3D重建,數據挖掘等。

    目前NMS常用的有標準NMS, Soft  NMS, DIOU NMS等。後續出現了新的Softer NMS,Weighted NMS等改進版。

 

標準NMS

    標準NMS(左圖1維,右圖2維)算法偽代碼如下:

圖片

圖片

左邊是只計算鄰域範圍為3的算法偽代碼。

 

實際應用

圖片

    以目標檢測為例,目標檢測推理過程中會產生很多檢測框(A,B,C,D,E,F等),其中很多檢測框都是檢測同一個目標,但最終每個目標只需要一個檢測框,NMS選擇那個得分最高的檢測框(假設是C),再將C與剩餘框計算相應的IOU值,當IOU值超過所設定的閾值(普遍設置為0.5,目標檢測中常設置為0.7,僅供參考),即對超過閾值的框進行抑制,抑制的做法是將檢測框的得分設置為0,如此一輪過後,在剩下檢測框中繼續尋找得分最高的,再抑制與之IOU超過閾值的框,直到最後會保留幾乎沒有重疊的框。這樣基本可以做到每個目標只剩下一個檢測框。

 

實現代碼:(以pytorch為例)

def NMS(boxes,scores, thresholds):
    x1 = boxes[:,0]
    y1 = boxes[:,1]
    x2 = boxes[:,2]
    y2 = boxes[:,3]
    areas = (x2-x1)*(y2-y1)
 
    _,order = scores.sort(0,descending=True)
    keep = []
    while order.numel() > 0:
        i = order[0]
        keep.append(i)
        if order.numel() == 1:
            break
        xx1 = x1[order[1:]].clamp(min=x1[i])
        yy1 = y1[order[1:]].clamp(min=y1[i])
        xx2 = x2[order[1:]].clamp(max=x2[i])
        yy2 = y2[order[1:]].clamp(max=y2[i])
 
        w = (xx2-xx1).clamp(min=0)
        h = (yy2-yy1).clamp(min=0)
        inter = w*h
 
        ovr = inter/(areas[i] + areas[order[1:]] - inter)
        ids = (ovr<=thresholds).nonzero().squeeze()
        if ids.numel() == 0:
            break
        order = order[ids+1]
    return torch.LongTensor(keep)

  

根據前面對目標檢測中NMS的算法描述,易得出標準NMS容易出現的幾個問題:當閾值過小時,如下圖所示,綠色框容易被抑制;當過大時,容易造成誤檢,即抑制效果不明顯。因此,出現升級版soft NMS。

圖片

 

Soft NMS

 

Soft NMS算法偽代碼如下:

圖片

標準的NMS的抑制函數如下:

圖片

    

    IOU超過閾值的檢測框的得分直接設置為0,而soft NMS主張將其得分進行懲罰衰減,有兩種衰減方式,第一種懲罰函數如下:

圖片

    

    這種方式使用1-Iou與得分的乘積作為衰減後的值,但這種方式在略低於閾值和略高於閾值的部分,經過懲罰衰減函數後,很容易導致得分排序的順序打亂,合理的懲罰函數應該是具有高iou的有高的懲罰,低iou的有低的懲罰,它們中間應該是逐漸過渡的。因此提出第二種高斯懲罰函數,具體如下:

圖片

    這樣soft NMS可以避免閾值設置大小的問題。

其他相關NMS

 

    為了避免閾值設置大小、目標太密集等問題,還有一些其他方法使用神經網絡去實現NMS,但並不常用,這裡只提一筆,感興趣的讀者請自行了解。如:

ConvNMS:A Convnet for Non-maximum Suppression

Pure NMS Network:Learning non-maximum suppression

Yes-Net: An effective Detector Based on Global Information

 

    Soft NMS還有後續改進版Softer-NMS,其主要解決的問題是:當所有候選框都不夠精確時該如何選擇,當得分高的候選框並不更精確,更精確的候選框得分並不是最高時怎麼選擇 。論文值得一看,本文不作更多的詳解。

 此外,針對這一閾值設置問題而提出的方式還有Weighted NMS和Adaptive NMS。

 

    Weighted NMS主要是對坐標進行加權平均,實現函數如下:

圖片

其中Wi = Si *IoU(M,Bi),表示得分與IoU的乘積。

 

    Adaptive NMS在目標分佈稀疏時使用小閾值,保證儘可能多地去除冗餘框,在目標分佈密集時採用大閾值,避免漏檢。

 

Softer NMS論文鏈接:

//arxiv.org/abs/1809.08545

Softer NMS論文代碼:

//github.com/yihui-he/softer-NMS

Weighted NMS論文鏈接://ieeexplore.ieee.org/document/8026312/

Adaptive NMS論文鏈接:

//arxiv.org/abs/1904.03629

 

DIoU NMS

 

圖片

    當IoU相同時,如上圖所示,當相鄰框的中心點越靠近當前最大得分框的中心點,則可認為其更有可能是冗餘框。第一種相比於第三種更不太可能是冗餘框。因此,研究者使用所提出的DIoU替代IoU作為NMS的評判準則,公式如下:

圖片

    DIoU定義為DIoU=IoU-d²/c²,其中c和d的定義如下圖所示

圖片

    在DIoU實際應用中還引入了參數β,用於控制對距離的懲罰程度。

圖片

    當 β趨向於無窮大時,DIoU退化為IoU,此時的DIoU-NMS與標準NMS效果相當。

    當 β趨向於0時,此時幾乎所有中心點與得分最大的框的中心點不重合的框都被保留了。

 

如有錯誤或疑問,歡迎留言指出。

本文來源於微信公眾號「 CV技術指南 」 。若有錯誤或疑問,歡迎在公眾號中留言指出。

歡迎關注公眾號「CV技術指南」,主要進行計算機視覺方向的論文解讀,最新技術跟蹤,以及CV技術的總結。正在進行的系列有網絡模型解讀、行為識別和CV技術總結。

原創文章第一時間在公眾號中更新,博客只在有空時間才更新公眾號文章