NMS: 非極大值抑制

之前總是對這個東西理解錯, 後來看了一遍code, 這次應該不會錯~~

自己的理解:

在nms之前先進行一個大的top-N, nms之後在進行一個恰當的top-N, 這樣可以非常好~

因爲如果不進行後面的top-n 之前過大, 那麼後面就可能很多, 之前過小, 那麼後面可能就沒幾個了

 

1. 把框的信息和對應的目標得分傳給函數(這裏都是目標分數, 多少框多少分數, 不是背景的分數, 僅僅提取目標分數top-N傳入nms)

框的信息是: [[x1, y1, x2, y2]1, ....., [x1, y1, x2, y2]n]

目標的分數是: [s1, s2...sn]

2. 然後開始處理, 我們先計算每個框的面積, 然後把分數從大到小排序, 然後返回未排序之前的數組索引.

order = score.sort(decending)[1]

 

3. 現在從分數最高的框開始處理

for _i = 1 to n

i = order[_i]

這個i就是最高得分的框.

獲得框i的信息 box[i]

 

for _j = _i+1 to n

j = order[_j]: 不要以爲這一步沒有必要, 仔細考慮一下: 框i一定要找比他自己得分小的對

比, 如果不這樣幹, 那麼可能一個高分框, 不加處理, 就可能被低分框抑制掉~~

 

如果這個框已經被抑制, 那麼continue

否則, 我們看box[j] 和 box[i] 的IoU.

如果IOU大於閾值, 我們就要抑制掉這個框.

 

4. 最後 return at::nonzero((suppressed_t) == 0).squeeze(1);

根據後續代碼推理, 這個返回值是: 沒有被抑制的框(或者得分), 其原始排序(sort之前)的index

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