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 #返回留下的边界框的下标