def overlap_ratio(rect1, rect2): # 计算bounding box和ground truth的IOU
'''
target bbox (min_x,min_y,w,h)
'''
if rect1.ndim == 1: # 判断维度是否为一维
rect1 = rect1[None, :] # 给np.array增加新的维度
if rect2.ndim == 1:
rect2 = rect2[None, :]
left = np.maximum(rect1[:, 0], rect2[:, 0]) # 交集左侧对应的x坐标
right = np.minimum(rect1[:, 0]+rect1[:, 2], rect2[:, 0]+rect2[:, 2]) # 交集右侧对应的x坐标
top = np.maximum(rect1[:, 1], rect2[:, 1]) # 交集上侧对应的y坐标
bottom = np.minimum(rect1[:, 1]+rect1[:, 3], rect2[:, 1]+rect2[:, 3]) # 交集下侧对应的x坐标
intersect = np.maximum(0, right - left) * np.maximum(0, bottom - top) # 交集的面积
union = rect1[:, 2]*rect1[:, 3] + rect2[:, 2]*rect2[:, 3] - intersect # 并集的面积
iou = np.clip(intersect / union, 0, 1)
return iou
example:
代码执行过程:
>>> import numpy as np
>>> rect1 = np.array([2,1,2,4])
>>> rect2 = np.array([3,3,2,4])
>>> rect1 = rect1[None,:]
>>> rect2 = rect2[None,:]
>>> left = np.maximum(rect1[:, 0], rect2[:, 0])
>>> right = np.minimum(rect1[:, 0]+rect1[:, 2], rect2[:, 0]+rect2[:, 2])
>>> top = np.maximum(rect1[:, 1], rect2[:, 1])
>>> bottom = np.minimum(rect1[:, 1]+rect1[:, 3], rect2[:, 1]+rect2[:, 3])
>>> left
array([3])
>>> right
array([4])
>>> top
array([3])
>>> bottom
array([5])
>>> intersect = np.maximum(0, right - left) * np.maximum(0, bottom - top)
>>> intersect
array([2])
>>> union = rect1[:, 2]*rect1[:, 3] + rect2[:, 2]*rect2[:, 3] - intersect
>>> union
array([14])
>>> iou = np.clip(intersect / union, 0, 1)
>>> iou
array([0.14285714])