之前總是對這個東西理解錯, 後來看了一遍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