目标检测算法定位该汽车的位置时找出了一堆检测框,此时我们需要去除冗余的检测框。假设目标算法找到了6个检测框,而且算法还提供了每个框中内容属于汽车的概率或者得分 (在RCNN中,使用SVM计算检测框属于该类别的得分),NMS方法首先根据得分大小对检测框进行排序,假设从小到大的排序为 A, B, C, D, E, F。
从最大得分的检测框 F 开始,分别判断 A~E 与 F 的重叠度IoU是否大于某个设定的阈值。
假设检测框 B、D 与 F 的重叠度超过阈值,那么就抛弃 B、D,并将检测框 F 标记为要保留的检测框。
第2步去掉 B 和 D 后,剩余检测框 A、C、E,接着在剩下的检测框中选择得分最大检测框 E,然后判断 E 和 A、C 的重叠度,如果重叠度大于设定阈值,那就抛弃该检测框,否则留到下一轮的筛选过程,并将检测框 E 标记为要保留的检测框。
重复步骤 3,直到剩余待筛选的框个数为 0。
实现
关于单类别的NMS的实现,网上已经有实现好的,这里贴出 Ross Girshick (RCNN提出者) 写的Python实现 py_cpu_nms.py,并且加了个人的标注。