非极大值抑制(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

 

posted @ 2021-08-13 18:37  vegetable_chick  阅读(92)  评论(0编辑  收藏  举报