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

NMS: 非极大值抑制_第1张图片

你可能感兴趣的:(Object,Detection)