zoukankan      html  css  js  c++  java
  • NMS(非极大值抑制)实现

    1、IOU计算

    设两个边界框分别为A,B。A的坐标为Ax1,Ax2,Ay1,Ay2,且Ax1 < Ax2,Ay1 < Ay2。B和A类似。

    则IOU为A∩B除以A∪B。

    当两个边界框有重叠部分时,即位于上面边框的y2大于下面边框的y1,且左边边框的x2大于右边边框的x1时,IOU才大于0.

    否则A和B不重叠,IOU等于0.

    若两个边框重叠,设重叠边框为C,x1 = maximum(Ax1,Bx1),x2 = minimum(Ax2,Bx2)。y坐标计算同理。

    那么C的w等于x2 - x1,h等于y2 - y1.

    但是需要注意,若A和B无重叠部分,则会出现x1 > x2或y1 > y2的情况,w或h会是负值,

    因此需要让w = maximum(x2 - x1, 0),h = maximum(y2 - y1, 0),这样当A和B无重叠部分时,重叠部分面积w * h 等于0.

    2、NMS(non maximum suppression)

    该算法是为了防止某目标被多个重叠度较高的框检测,

    在所有框中选取置信度最大的框a,若其它框与框a的IOU超过某一阈值,则去除这些框。在剩下的框中重复该过程。

     1 def nms(dets, thresh):
     2     x1 = dets[:, 0]
     3     y1 = dets[:, 1]
     4     x2 = dets[:, 2]
     5     y2 = dets[:, 3]
     6     scores = dets[:, 4] #置信度
     7 
     8     areas = (x2 - x1 + 1) * (y2 - y1 + 1)
     9     order = scores.argsort()[::-1] #从大到小排序的下标
    10 
    11     keep = []
    12     while order.size > 0:
    13         i = order[0]
    14         keep.append(i)
    15         xx1 = np.maximum(x1[i], x1[order[1:]])
    16         yy1 = np.maximum(y1[i], y1[order[1:]])
    17         xx2 = np.minimum(x2[i], x2[order[1:]])
    18         yy2 = np.minimum(y2[i], y2[order[1:]])
    19 
    20         w = np.maximum(0.0, xx2 - xx1 + 1)
    21         h = np.maximum(0.0, yy2 - yy1 + 1)
    22         inter = w * h
    23         ovr = inter / (areas[i] + areas[order[1:]] - inter)
    24 
    25         inds = np.where(ovr <= thresh)[0]
    26         order = order[inds + 1]
    27     return keep #返回留下的边界框的下标
  • 相关阅读:
    装载:深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
    装载: Matlab 提取矩阵 某一行 或者 某一列 的方法
    编码规范的作用
    转载:奇异值分解(SVD) --- 线性变换几何意义(下)
    转载:奇异值分解(SVD) --- 线性变换几何意义(上)
    转载:LBP代码详细注释
    转载:纹理分类(一)全局特征
    转载:LBP的初步理解
    转载:双线性插值
    Matlab位运算操作
  • 原文地址:https://www.cnblogs.com/lxc1910/p/11678341.html
Copyright © 2011-2022 走看看