NMS算法简介
NMS(非极大值抑制)是目标检测中的后处理算法,用来过滤冗余的框。
算法步骤如下:
- 对候选框按照置信度进行排序
- 选择置信度最高的框放进结果框,并与其他框计算iou,去除iou大于阈值的框
- 重复2,直至候选框为空
NMS算法python代码实现
def nms(boxes, iou_thres):
""" 非极大值抑制 """
x1 = boxes[:, 0]
y1 = boxes[:, 1]
x2 = boxes[:, 2]
y2 = boxes[:, 3]
scores = boxes[:, 4]
areas = (x2-x1) * (y2-y1)
keep = []
# 按置信度进行排序
index = np.argsort(scores)[::-1]
while(index.size):
# 置信度最高的框
i = index[0]
keep.append(index[0])
if(index.size == 1): # 如果只剩一个框,直接返回
break
# 计算交集左下角与右上角坐标
inter_x1 = np.maximum(x1[i], x1[index[1:]])
inter_y1 = np.maximum(y1[i], y1[index[1:]])
inter_x2 = np.minimum(x2[i], x2[index[1:]])
inter_y2 = np.minimum(y2[i], y2[index[1:]])
# 计算交集的面积
inter_area = np.maximum(inter_x2-inter_x1, 0) * np.maximum(inter_y2-inter_y1, 0)
# 计算当前框与其余框的iou
iou = inter_area / (areas[index[1:]] + areas[i] - inter_area)
ids = np.where(iou < iou_thres)[0]
index = index[ids+1]
return boxes[keep]