之前总是对这个东西理解错, 后来看了一遍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