目标识别中NMS的理解
NMS(Non-Maximum Suppression)翻译过来就是:非极大值抑制,意思就是抑制不是极大值的元素,可以理解为局部最大搜索, 其作用是可以快速去除重合度很高的且标定相对不是很准确的预测框,但是这种方法有一个缺点:对于重合度很高的目标不友好。 NMS在计算机视觉领域有着非常重要的应用,如视频目标跟踪、数据挖掘、3D重建、目标识别以及纹理分析等
如下图所示:
左图中是网络预测的人脸框,每个框对应一个置信度,那要如何才能得到右边的结果呢?
其实也不难,大致分为一下三步:
1、对所有置信度进行排序,拿到置信度最高的框(添加到列表中)
2、与其余剩下的所有框做IOU,去除大于阈值的框
3、从剩下的框中继续拿出置信度最高的框与其余框做IOU,继续筛选,直到剩下最后一个。
代码:
def nms(boxes,thresh=0.3,isMin=False): if boxes.shape[0]==0: return np.array([]) _boxes=boxes[(-boxes[:,4]).argsort()] r_boxes=[] while _boxes.shape[0] > 1: a_box = _boxes[0] b_boxes = _boxes[1:] r_boxes.append(a_box) index = np.where(iou(a_box, b_boxes, isMin) < thresh) _boxes = b_boxes[index] if _boxes.shape[0] > 0: r_boxes.append(_boxes[0]) return np.stack(r_boxes)