1、NMS
基础中的基础,直接放代码(有注释)
import numpy as np
def NMS(dets, nms_th):
#检测结果解析
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[: 4]
#获得置信度从大到小的索引信息
order = scores.argsort()[::-1]
#计算所有候选框的面积
areas = (x2-x1+1)*(y2-y1+1)
#保存抑制后的检测框的索引
keep = []
while order.size > 0:
#当前置信度最大的肯定要被保留下来
i = order[0]
keep.append(i)
#计算重叠区域的坐标,这里用到numpy的broadcast机制
xx1 = np.maximum(x1[i], x1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
yy2 = np.maximum(y2[i], y2[order[1:]])
#计算重叠区域面积
width = np.maximum(0, xx2-xx1+1)
hight = np.maximum(0, yy2-yy1+1)
inter = width*hight
#计算IOU
iou = inter/(areas[i]+areas[[order[1:]]]-inter)
#抑制后剩余的检测框在order中的索引
inds = np.where(iou<=nms_th)[0]
#更新order(因为inds对应的是order[1:]中的索引,所以需要对保留的索引加1)
order = order[inds+1]
return keep