NMS的实现代码详解
NMS代码说明(来⾃Fast-RCNN)
说普通话写规范字内容个⼈觉得NMS包含很多框,其坐标为(x1,y1,x2,y2),每个框对应了⼀个score,我们将按照score得分降序,并将第⼀个最⾼的score的框(我们叫做标准框)作为标准框与其它框对⽐,即计算出其它框与标准框的IOU值,然后设定阈值,与保留框的最⼤数量,若超过阈值,就删除该框,以此类推,所选框最⼤不能超出设定的数量,最后得到保留的框,结束NMS
接下来,请看代码:
import numpy as np
def py_cpu_nms(dets, thresh):
"""Pure Python NMS baline."""
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]天下第一庙
应该近义词y2 = dets[:, 3]
scores = dets[:, 4]贫困理由
areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 我认为xy坐标应该包含了(0,0)坐标,所以需要+1(个⼈是这么认为)
order = scores.argsort()[::-1] # [::-1]表⽰降序排序,输出为其对应序号
keep = [] #需要保留的bounding box
while order.size > 0:
警惕的意思i = order[0] #取置信度最⼤的(即第⼀个)框
keep.append(i) #将其作为保留的框
#以下计算置信度最⼤的框(order[0])与其它所有的框(order[1:],即第⼆到最后⼀个)框的IOU,以下都是以向量形式表⽰和计算
多大上幼儿园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,我认为xy坐标应该包含了(0,0)坐标,所以需要+1(个⼈是这么认为)二年级乘除法
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] #本轮,order仅保留IOU不⼤于阈值的下标坐标,但是是从第⼆个数开始当成第⼀个数order = order[inds + 1] #删除IOU⼤于阈值的框,因为从第⼆个数开始,当作第⼀个数,所以需要+1,如[1,2,3,4],将从[2,3,4]开始,
#若选择第⼀个数2,下标为0,所以需要+1,才能对应原来数[1,2,3,4],选择为2.
return keep
单独对这句话的理解,如下:温庭筠