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超过某一阈值,则去除这些框。在剩下的框中重复该过程。
def nms(dets, thresh):
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4] #置信度 areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1] #从大到小排序的下标 keep = []
while order.size > 0:
i = order[0]
keep.append(i)
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(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]
return keep #返回留下的边界框的下标