综述
NMS 主要就是通过迭代的形式, 不断地以最大得分的框去与其他框做 IoU
操作, 并过滤那些 IoU
较大的框。 其实现的思想主要是将各个框的置信度进行排序, 然后选择其中置信度最高的框 F
, 将其作为标准选择其他框, 同时设置一个阈值, 当其他框 B
与 F
的重合程度超过阈值就将 B
舍弃掉, 然后在剩余的框中选择置信度最大的框, 重复上述操作.
算法过程如下
- 根据候选框类别分类概率排序:
F>E>D>C>B>A
, 并标记最大概率的矩形框F
作为标准框; - 分别判断
A~E
与F
的重叠度IOU
(两框的交并比) 是否大于某个设定的阈值, 假设B
、D
与F
的重叠度超过阈值, 那么就扔掉B
、D
; - 从剩下的矩形框
A
、C
、E
中, 选择概率最大的E
, 标记为要保留下来的, 然后判读E
与A
、C
的重叠度, 扔掉重叠度超过设定阈值的矩形框; - 对剩下的
bbx
, 循环执行(2)
和(3)
直到所有的bbx
均满足要求(即不能再移除bbx)
.
NMS 代码实现
1 | import numpy as np |
程序输出如下:
1 | [0, 2, 3] [[ 30. 20. 230. 200. 1. ] [210. 30. 420. 5. 0.8] [430. 280. 460. 360. 0.7]] |
Q&A
Q: 直接使用置信度最高的窗口不就可以了吗,为什么还需要逐步过滤掉其他窗口?
A: 一张图只有一个全局的框,这里这个目标只挑最大的把剩下的都删除以后,那么下个目标的时候会没有检测框。