非极大值抑制(Non-Maximum Suppression,NMS)
大家好,这是我的第一篇blog,写作的主要是记录后面两个月的学习情况。
声明,该篇文章主要内容来源于:https://www.cnblogs.com/makefile/p/nms.html,其中NMS原理其实非常简单,就是首先排序它的置信度,然后从置信度高的位置开始找框的重合率,如果框的重合率大于某个阈值,则剔除该置信度小的框,下面上传他的代码部分:
def py_cpu_nms(dets, thresh): """Pure python NMS baseline.""" #x1、y1、x2、y2、以及score赋值 x1 = dets[:, 0] y1 = dets[;, 1] x2 = dets[;, 2] y2 = dets[;, 3] scores = dets[:, 4] #每一个检测框的面积 areas = (x2 - x1 + 1) * (y2 - y1 + 1) #按照score置信度降序排列 order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append[i] #保留该类剩余box中得分最高的一个 #得到相交区域,左上及下 xx1 = np.maximum(x1[i], x1[order[1:]]) yy1 = np.maximum(y1[i], y1[order[1:]]) xx2 = np.maximum(x2[i], x2[order[1:]]) yy2 = np.maximum(y2[i], y2[order[1:]]) #每一个检测框的面积 w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h ovr = inter / (areas[i] + areas[order[1:]] - inter) inds = np.where(ovr <= thresh)[0] order = order[inds + 1] #因为ovr数组的长度比order数组少一个,所以这里要将所有下标后移一位 return keep