在⽬标检测算法中,IoU (intersection over union,交并⽐)是⽬标检测算法中⽤来评价2个矩形框之间相似度的指标:
IoU = 两个矩形框相交的⾯积 / 两个矩形框相并的⾯积
import numpy as np
import matplotlib.pyplot as plt
def iou(box1, box2,wh=False):
# 判断检测框位置信息表现形式
if wh == False:
# 极坐标
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
print(xmin1, ymin1, xmax1, ymax1)
print(xmin2, ymin2, xmax2, ymax2)
else:
# 中心坐标
# 左上角坐标
xmin1, ymin1 = int(box1[0])-int(box1[2]/2.0),int(box1[1])-int(box1[3]/2.0)
xmax1, ymax1 = int(box1[0])+int(box1[2]/2.0),int(box1[1])+int(box1[3]/2.0)
# 右下角坐标
xmin2, ymin2 = int(box2[0])-int(box2[2]/2.0),int(box2[1])-int(box2[3]/2.0)
xmax2, ymax2 = int(box2[0])+int(box2[2]/2.0),int(box2[1])+int(box2[3]/2.0)
# 获取交集的左上角和右下角坐标
xx1 = np.max([xmin1, xmin2])
yy1 = np.max([ymin1, ymin2])
xx2 = np.min([xmax1, xmax2])
yy2 = np.min([ymax1, ymax2])
# 计算交集面积
inter_area = (np.max([0,xx2 - xx1])) * (np.max([0,yy2 - yy1]))
# 计算并的面积
area1 = (xmax1 - xmin1) * (ymax1 - ymin1)
area2 = (xmax2 - xmin2) * (ymax2 - ymin2)
union_area = area1 + area2 - inter_area
# IOU
IOU = inter_area / (union_area + 1e-6)
return IOU
if __name__ == '__main__':
# 框的坐标
Pred_box = [25,40,165,190]
True_box = [10,30,120,180]
# 将框绘制在图像上
img = plt.imread('img_1.png')
fig = plt.imshow(img)
# 第一个参数是左上角的点坐标
# 第二个参数是宽,第三个参数是长
fig.axes.add_patch(plt.Rectangle((True_box[0],True_box[1]),True_box[2]-True_box[0],True_box[3]-True_box[1],fill=False,edgecolor='red',linewidth=2))
fig.axes.add_patch(plt.Rectangle((Pred_box[0],Pred_box[1]),Pred_box[2]-Pred_box[0],Pred_box[3]-Pred_box[1],fill=False,edgecolor='blue',linewidth=2))
plt.show()
print(iou(True_box,Pred_box))