NMS 卷積網路改進實現

2021-08-28 01:22:03 字數 3302 閱讀 3418

未完待續

nms,非極大值抑制,在很多計算機視覺問題中有著重要應用,尤其是目標檢測領域。

以人臉檢測為例,通常的流程為3步:

(1)通過滑動視窗或者其它的object proposals方法產生大量的候選視窗;

(2)用訓練好的分類器對候選視窗進行分類,該過程可以看做是乙個打分的過程;

(3)使用nms對上面的檢測結果進行融合(因為乙個目標可能被檢測出多個視窗,而我們只希望保留乙個)。

如下圖是(2)分類檢測之後的結果: 

以此圖為例,傳統的nms,首先選定乙個iou閾值,例如為0.25。然後將所有4個視窗(bounding box)按照得分由高到低排序。然後選中得分最高的視窗,遍歷計算剩餘的3個視窗與該視窗的重疊面積比例(iou),如果iou大於閾值0.25,則將視窗刪除。然後,再從剩餘的視窗中選中乙個得分最高的,重複上述過程。直至所有視窗都被處理。

假如0.25是乙個不錯的閾值,那麼我們可以得到比較好的結果,如下圖:

如果,我們的iou閾值設定的特別小,比如說0.1。那麼2個人的視窗會被歸為乙個人而被融合。得到下面的錯誤結果:

如果,我們的iou閾值設定的特別大,比如說0.6。那麼又可能得到下面的錯誤結果: 

由上可知,對於傳統的nms演算法選擇乙個好的閾值是多麼重要的一件事,但又是一件很困難的事。傳統的nms是一種硬判決,是一種貪心演算法。因此在文章中,作者稱傳統的nms演算法為:greedynms

再提及一下,傳統的nms在判決融合的時候,只利用到了2個資訊:score 和 iou ,即每個框的得分和框與框之間的重疊比例。

文章用神經網路去實現nms,所利用的同樣也是這2個資訊。如下圖的整個流程圖: 

由網路結構圖中的紅色框可以得到,輸入data層有2個,乙個是score map,乙個是 iou layer.下面我們講述一下,如何由最初的bounding box去得到這兩個data層。

假定原影象尺寸為w×h,那麼我們要製作的score map大小為w×h,其中w=w/4, h=h/4,則score map上的乙個點對應著原圖的4×4的區域: 

對於乙個bounding box ,我們計算其中心然後判斷其屬於哪個區域,然後將該box的score填入score map對應的位置。如下圖: 

如果有多個bounding box的中心落入同一區域,則只記錄最高得分。

到此,我們已經得到了w×h×1的score map.

文章提到,傳統的nms需要排序,但在卷積神經網路中,很難用各種線性組合和非線性啟用去模擬排序。因此,文章先用傳統的nms處理一遍bounding boxes, 然後再生成一張同樣大小的score map,記作s(t),t為nms的閾值。

最終,我們得到了w×h×2的score map. 記作s(1,t)

iou,intersection-over-union。因此iou層描述的也就是bounding box之間的相交關係。

iou層大小為w×h×121,其中121=11×11,即描述的是相應中心點11×11範圍內存在的box的相交關係。 

如下圖所舉出的例子,左側的圖是score map s(1),粉色表明有值,則每個粉色處也對應著乙個bounding box。以紅色為中心劃乙個11×11的範圍,則可以依次計算每乙個位置對應的box與中心點對應box的iou,其值記作i,如右側所示。 同理,易知 i(7,8,i)一定為0。

我們再來看一下網路結構: 

注意2點:

(1):iou層的kernel size 為1,stride也為1。 

score map層的kernel size 為11×11,這是為了呼應iou層;stride 為1 ,pad 為5,這是為了獲得和輸入同樣尺寸的輸出:

(2):layer 2將之前的2個輸出拼接,之後所有的卷積都是1×1。最終的輸出仍然是乙個尺寸一致的score map .

理想的輸出是乙個同輸入尺寸完全一致的score map 圖,在該圖中,每乙個目標只擁有乙個score,相應地也只對應了乙個bounding box。

因此訓練的目標就是保留乙個,抑制其它。如下圖: 

(1)上圖a的score map 是我們的輸入,由圖易知,這裡面一共有5個有效的score,則也對應著5個bounding box。

(2)假設5個bounding box都是同乙個目標的檢測結果。則我們的訓練目的則是保留最好的乙個,抑制其餘4個。 

為此,我們首先分配標籤:5個bounding box 中滿足與ground truth 的iou大於0.5且得分最高的box作為正樣本,其餘均為負樣本,如上圖b所示。

(3)顯然正負樣本的數量嚴重不均衡,因此計算loss之前,我們要分配一下權重用於權衡這種失衡。權重的分配很簡單,如圖c所示,正樣本的權重總和與負樣本的權重總和相等。

(4)上右側的圖為理想的輸出。綜上,我們的loss function就可以很容易得出了(類似於pixel級別的分類): 

其中,p屬於g,表示score map 中有值的點。

NMS及其改進

1.只用於 不用於訓練 2.在每一類的所有box中進行篩選 3.iou太大則被刪除。公式 1.不要直接地刪除所有iou大於閾值的框,而是降低其置信度 2.分數降低常用兩種方法 線性法和高斯法。線性法 m為當前得分最高框,bi 為待處理框,bi 和m的iou越大,bi 的得分si 就下降的越厲害 而不...

NMS實現方法

想要做nms的優化所以 了解一下nms 原理不說了太簡單直接講 usr bin env python3 coding utf 8 created on mon may 7 21 45 37 2018 author lps import numpy as np boxes np.array 100,1...

實現NMS演算法

python3 import numpy as np defpy nms dets,thresh pure python nms baseline.x1 y1 x2 y2 以及score賦值 x1 dets 0 y1 dets 1 x2 dets 2 y2 dets 3 scores dets 4 ...