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 #返回留下的边界框的下标
原文地址:https://www.cnblogs.com/lxc1910/p/11678341.html