你的NMS該換了!Confluence:實現更准、更強的目標檢測


圖片

本文轉載自:AI人工智能初學者圖片論文:https://arxiv.org/abs/2012.00257

本文提出了一種優於NMS的非IoU替代方案,其在邊界框保留和抑制方面不依賴IoU或最大置信度得分。在YOLOv3、RetinaNet和Mask R-CNN等檢測器上實驗證明,Confluence比NMS性能更強,更可靠!

1 簡介

本文提出了一種在目標檢測中的邊界框選擇和抑制任務中替代貪婪非極大值抑制(NMS)的新穎方法。它提出了Confluence,該方法不僅不依賴於置信度得分來選擇最佳邊界框,也不依賴於IoU來消除誤檢。其通過使用“曼哈頓距離”來選擇最接近群集中其他所有邊界框的邊界框,並刪除具有高度融合的相鄰框。

因此,Confluence與基於Greedy NMS及其變體具有根本不同的理論原理,Confluence代表了邊界框選擇和抑制的范式轉變。使用MS COCO和PASCAL VOC 2007數據集在RetinaNet,YOLOv3和Mask-RCNN上對Confluence進行了實驗驗證。使用具有挑戰性的0.50:0.95 mAP評估指標,在每個檢測器和數據集上,mAP改善了0.3-0.7%,而召回率則提高了1.4-2.5%。此外,跨mAP閾值的靈敏度分析實驗支持以下結論:Confluence比NMS更可靠

圖片

2 致敬NMS-們

2.1、NMS誕生的必要性

大多數基於深度卷積神經網絡(DCNN)的目標檢測方法,包括RetinaNet、Faster-RCNN和Mask R-CNN,都生成不同大小和尺度的獨立類別的Region Proposals。一個分類網絡分配每個類具體的置信度分數。通過建議的回歸來改具體坐標位置。這些經常匯聚到相同的感興趣區域(RoI),特別是當對象檢測器對RoI中存在的對象非常有信心時。這將導致在圖像中感興趣的區域周圍聚集建議的邊界框,如圖1所示。

圖片

YOLO v3基於不同的范式。它沒有使用不同大小和尺度的滑動窗口,而是將圖像分割成多個部分,並為每個部分分配特定類的置信值。排除低置信區間,由高置信區間生成邊界框,使用NMS選擇最優邊界框。與基於Region Proposal的網絡相比,這種方法產生的邊界框要少得多,因此效率更高。

非極大值抑制(NMS)的作用是通過選擇最佳的邊界框來代表每個對象進而細化這些檢測,同時抑制假陽性。圖1演示了此步驟的必要性。它演示了應用Greedy NMS之前RetinaNet的原始輸出,然后是通過NMS的輸出。Greedy NMS通常被認為是解決這個問題的首選解決方案,並且經常用於最先進的對象檢測器,比如Retininet-Resnet50、Yolo-V3、Mask R-CNN、Faster R-CNN和R-FCN等。

NMS操作流程

NMS用於剔除圖像中檢出的冗余bbox,標准NMS的具體做法為:

step-1:將所有檢出的output_bbox按cls score划分(如pascal voc分20個類,也即將output_bbox按照其對應的cls score划分為21個集合,1個bg類,只不過bg類就沒必要做NMS而已);

step-2:在每個集合內根據各個bbox的cls score做降序排列,得到一個降序的list_k;

step-3:從list_k中top1 cls score開始,計算該bbox_x與list中其他bbox_y的IoU,若IoU大於閾值T,則剔除該bbox_y,最終保留bbox_x,從list_k中取出;

step-4:選擇list_k中top2 cls score(步驟3取出top 1 bbox_x后,原list_k中的top 2就相當於現list_k中的top 1了,但如果step-3中剔除的bbox_y剛好是原list_k中的top 2,就依次找top 3即可,理解這么個意思就行),重復step-3中的迭代操作,直至list_k中所有bbox都完成篩選;

step-5:對每個集合的list_k,重復step-3、4中的迭代操作,直至所有list_k都完成篩選;

以上操作寫的有點繞,不過如果理解NMS操作流程的話,再結合下圖,應該還是非常好理解的;

圖片

def nms(boxes, scores, overlap=0.5, top_k=200):
    keep = torch.Tensor(scores.size(0)).fill_(0).long()
    if boxes.numel() == 0:
        return keep
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]
    area = torch.mul(x2 - x1, y2 - y1)    # IoU初步准備
    v, idx = scores.sort(0)  # sort in ascending order,對應step-2,不過是升序操作,非降序
    # I = I[v >= 0.01]
    idx = idx[-top_k:]  # indices of the top-k largest vals,依然是升序的結果
    xx1 = boxes.new()
    yy1 = boxes.new()
    xx2 = boxes.new()
    yy2 = boxes.new()
    w = boxes.new()
    h = boxes.new()

    # keep = torch.Tensor()
    count = 0
    while idx.numel() > 0:   # 對應step-4,若所有pred bbox都處理完畢,就可以結束循環啦~
        i = idx[-1]  # index of current largest val,top-1 score box,因為是升序的,所有返回index = -1的最后一個元素即可
        # keep.append(i)
        keep[count] = i
        count += 1    # 不僅記數NMS保留的bbox個數,也作為index存儲bbox
        if idx.size(0) == 1:
            break
        idx = idx[:-1]  # remove kept element from view,top-1已保存,不需要了~~~
        # load bboxes of next highest vals
        torch.index_select(x1, 0, idx, out=xx1)
        torch.index_select(y1, 0, idx, out=yy1)
        torch.index_select(x2, 0, idx, out=xx2)
        torch.index_select(y2, 0, idx, out=yy2)
        # store element-wise max with next highest score
        xx1 = torch.clamp(xx1, min=x1[i])   # 對應 np.maximum(x1[i], x1[order[1:]]) 
        yy1 = torch.clamp(yy1, min=y1[i])
        xx2 = torch.clamp(xx2, max=x2[i])
        yy2 = torch.clamp(yy2, max=y2[i])
        w.resize_as_(xx2)
        h.resize_as_(yy2)
        w = xx2 - xx1
        h = yy2 - yy1
        # check sizes of xx1 and xx2.. after each iteration
        w = torch.clamp(w, min=0.0)    # clamp函數可以去查查,類似max、mini的操作
        h = torch.clamp(h, min=0.0)
        inter = w*h
        # IoU = i / (area(a) + area(b) - i)     
        # 以下兩步操作做了個優化,area已經計算好了,就可以直接根據idx讀取結果了,area[i]同理,避免了不必要的冗余計算
        rem_areas = torch.index_select(area, 0, idx)  # load remaining areas)
        union = (rem_areas - inter) + area[i]     # 就是area(a) + area(b) - i
        IoU = inter/union  # store result in iou,# IoU來啦~~~
        # keep only elements with an IoU <= overlap
        idx = idx[IoU.le(overlap)]   # 這一輪NMS操作,IoU閾值小於overlap的idx,就是需要保留的bbox,其他的就直接忽略吧,並進行下一輪計算
    return keep, count

2.2、Soft-NMS

不同於在NMS中采用單一閾值,對與最大得分檢測結果M超過閾值的結果進行抑制,其主要考慮Soft-NMS,對所有目標的檢測得分以相應overlap with M的連續函數進行衰減。其偽代碼如下:

圖片

2.3、ConvNMS

其主要考慮IoU閾值設定得高一些,則可能抑制得不夠充分,而將IoU閾值設定得低一些,又可能多個ture positive被merge到一起。其設計一個卷積網絡組合具有不同overlap閾值的greedyNMS結果,通過學習的方法來獲得最佳的輸出。基礎框架如下:

圖片

2.4、Pure NMS Network

考慮目標間具有高遮擋的密集場景,其提出一個新的網絡架構來執行NMS。經分析,檢測器對於每個目標僅產生一個檢測結果有兩個關鍵點是必要的,一是一個loss懲罰double detections以告訴檢測器我們對於每個目標僅需一個檢測結果,二是相鄰檢測結果的joint processing以使得檢測器具有必要的信息來分辨一個目標是否被多次檢測。論文提出Gnet,其為第一個“pure”NMS網絡。Gnet圖示如下:

圖片

2.5、Greedy NMS

IoU本質上是計算兩個邊界框的交集與並集的比率(交並比)。然后利用聚類中每個框的平均坐標選擇一個最優的框。目前很多檢測任務中采用了這種方法,以產生現在所稱的Greedy NMS。Greedy NMS首先根據候選邊界框的置信度分數從最高到最低進行排序,從而提高了准確性。選擇置信值最高的邊界框,然后用所選框抑制所有IoU超過預定義閾值的邊界框。這一過程重復進行,直到候選集中沒有邊界框為止。實驗結果表明,與其他NMS變體相比,該方法的平均精度更高,因此具有更強的優越性。

3 本文方法

所提出的方法稱為Confluence。名稱來源於一個目標檢測器在檢測到一個對象時返回的檢測框的集合。Confluence並沒有將過多的建議視為一個問題,而是將其作為一種識別最優邊界框的方法。這是通過識別與其他邊界框最Confluence的邊界框來實現的,也就是說,該邊界框最能代表集群內其他框的相交集合。

Confluence是一個2階段的算法,它保留了最優邊界框,並消除了假陽性。第1階段使用置信加權曼哈頓距離啟發接近測量來評估邊界框的一致性。第2階段涉及移除所有與保留的邊界框Confluence邊界框。

3.1 曼哈頓距離

曼哈頓距離范數,是兩個點之間垂直和水平距離的總和。之間的可以表示為:

圖片

基於DCNN的傳統和現在目標檢測器都有一個明顯的特點,就是返回大量的檢測結果,在圖像中感興趣的位置周圍形成邊界框簇。

本文提出,任意兩個邊界框之間的接近程度可以用坐標對之間的之和表示:

圖片

圖2提供了接近測量的圖示:

圖片

P值比較小表示高度Confluence的邊界框,而P值比較高表示候選框不是由同一物體產生得到的,它們可能只是在某種程度上重疊,或者完全不相交。因此,可以推斷出,如果一個給定框的P與一組邊界框中的其他所有框進行比較,它將提供它與其他所有框Confluence度量。當邊界框密集匯聚時,這種計算將涉及大量的比較。

因此,被密集的一群邊界框包圍的邊界框,其P值會非常低,而沒有被相互競爭的邊界框包圍的邊界框,可以被正確地歸類為離群值。實際上,這提供了目標檢測器在給定位置存在對象時的置信度的度量。在此基礎上,本文提出,聚類內P值最低的邊界框b表示對給定對象的最自信檢測。

值得注意的是,這一理論方法克服了NMS及其替代方案所面臨的一個問題——在最高得分邊界框與另一個較低得分邊界框相比不是最優的情況下,NMS返回次優邊界框,如圖1所示。相比之下,P度量允許邊界框與指定一個給定對象的所有其他邊界框最Confluence,使其更魯棒。

3.2 標准化

前面討論的方法在邊界框大小相似的情況下有效地發揮作用。然而,在實踐中,目標及其對應的邊框將是不同大小的。當使用基於置信度加權的p的超參數來管理邊界框保留或刪除時,這就產生了一個問題。這是因為需要在刪除大量假陽性和保留少量真陽性之間進行權衡。

為了解決這個問題,作者使用歸一化算法將邊界框坐標縮放到0到1之間,同時保持它們之間的關系。歸一化算法對各坐標進行如下變換:

圖片

標准化允許通過使任意兩個大的目標內邊界框與任意兩個小的目標間邊界框的關系相比較來區分目標內邊界框和目標間邊界框,如圖3所示。

圖片

很明顯,在圖3中,右邊的兩個大邊框表示同一個對象。相反,左邊的兩個小邊框表示兩個獨立的對象。但當計算P時,得到相同的值,如下:

圖片

這就產生了區分屬於相同或不同對象的邊界框的問題。標准化通過保留邊界框之間的重疊關系來解決這個問題,同時確保可以比較任意兩個邊界框關系。

3.3 類內保留和刪除

由於所有坐標對都歸一化在0到1之間,因此任何一對相交的邊界框的接近值都小於2。因此,如果任意兩個邊界框的P值小於2,則假設它們屬於同一簇,因此指的是同一對象,或者指一個或多個高密度對象。一旦識別出簇,通過對P值升序排序,找到簇內最優邊界框。取第n個位置接近度最小的邊界框為最Confluence的邊界框保留。

然后分析P值的聚類內梯度,選擇最Confluence的邊界框。通過繪制P值的圖,可以顯示對象內和對象間邊界框之間的差異,這是由於類blob集群的性質,如下圖所示。每個水平斑點表示一個對象。Confluence選擇最能代表給定blob內其他所有框的邊界框。從本質上說,這意味着它在一個梯度趨近於零的數據范圍內選擇一個方框。

圖片

一旦選擇了最Confluence的邊界框,所有接近值低於預定義閾值的簇內邊界框將被移除。遞歸地重復這個過程,直到處理完所有的邊界框。

3.4 置信度得分加權

NMS使用由對象檢測器返回的單個置信度分數作為唯一的方法,通過它選擇一個“最佳的”邊界框。相反,Confluence通過考慮置信分數c和與之競爭的邊界框的P值來評估給定邊界框b的最優性。通過用除以其置信度得分,可以得到加權接近性:

圖片

由於c是一個介於0.05和1之間的值,通過人為地降低的值,這實際上提供了對高置信框的偏愛(注意,置信分數低於0.05的所有邊界框都不被考慮)。反之,低置信框的WP值會更大。這增加了選擇高置信度框的可能性,因為邊界框是基於小的WP值選擇的。

4. 算法實現的偽代碼

圖片

  • 第1步:變量, 是用來存儲邊框以及相應的分數和類標簽的集合,這些分數和標簽將返回並繪制在圖像上
  • 第2步:算法分別遍歷每個類,這使它能夠處理多類對象檢測。對於每個類,它選擇n個邊界框,每個邊界框代表一個對象
  • 第3步:定義變量臨時存儲邊界框和對應的分數,並選擇待處理類的最優邊界框
  • 第4步:變量被初始化為圖像的大小
  • 第5步:循環遍歷所有邊界框,將每個邊界框與集合中的每個邊界框進行比較:
    • 第5.1步:規范化坐標關系,然后進行鄰近計算
    • 第5.2步:如前所述,如果接近度計算值小於2,則邊界框是不相交的,將被視為單獨的對象。這個條件將的P值限制小於2
    • 第5.3步:通過對最小置信加權匯合值的收斂,選擇一個最優邊界框
  • 第6步:選擇最優邊界框后,將其添加到中,與其對應的類和置信值一起作為最終檢測返回,並從集合B,S中去除。
  • 第7步:隨后,將B中所有與預定義的超參數以下的最優邊界接近的邊界框移除。
  • 第8步:遞歸地執行步驟3-5,直到處理完所有的邊界框。

5 實驗

5.1 經典方法插入對比

圖片圖片

5.2 可視化對比

圖片圖片圖片

以上結果不難看出使用Confluence方法后檢測結果更加精准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM