dets = np.array([
[204, 102, 358, 250, 0.5],
[257, 118, 380, 250, 0.7],
[280, 135, 400, 250, 0.6],
[255, 118, 360, 235, 0.7]])
thresh = 0.7
#输入两个数据,一个是dets,为N×5的矩阵,分别代表bb左上坐标(x1,y1),右下坐标(x2,y2),及置信的;第二个是阈值。
def py_cpu_nms(dets, thresh):
"""Pure Python NMS baseline."""
x1 = dets[:, 0]#取出det中的X1
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1] # 按置信度的大小降序排列
keep = [] # 需要保留的bounding box
while order.size > 0:
i = order[0] # 取置信度最大的框 NMS的原则是det中,取最大的置信度最大的一个先保留。剩下的分别计算与最大置信度框的交并比,若交并比大于阈值,则判定该框与最大置信度框的目标为同一目标,删去该框。之后选择置信度第二高的框,再执行上面的过程。
keep.append(i) # 将其作为保留的框
xx1 = np.maximum(x1[i], x1[order[1:]]) # 计算xmin的max,即overlap的xmin 将置信度最大的框与其他框的坐标相比,若最大框的坐标在右,则用其坐标替换,目的是求出两框的交集。
yy1 = np.maximum(y1[i], y1[order[1:]]) # 计算ymin的max,即overlap的ymin
xx2 = np.minimum(x2[i], x2[order[1:]]) # 计算xmax的min,即overlap的xmax
yy2 = np.minimum(y2[i], y2[order[1:]]) # 计算ymax的min,即overlap的ymax
w = np.maximum(0.0, xx2 - xx1 + 1) # 计算overlap的width
h = np.maximum(0.0, yy2 - yy1 + 1) # 计算overlap的hight
inter = w * h # 计算overlap的面积
ovr = inter / (areas[i] + areas[order[1:]] - inter) # 计算并,-inter是因为交集部分加了两次。
inds = np.where(ovr <= thresh)[0] # 若ovr中的数没超过阈值,则保存ovr中该数的下标至inds
order = order[inds + 1] # 删除IOU大于阈值的框
return keep
index = py_cpu_nms(dets, thresh)
print(index)
print(dets[index])
NMS代码详解
最新推荐文章于 2023-11-15 16:01:59 发布