交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。
计算公式:
输入假设:bbox = [xt, yt, xb, yb], 左上角为(xt, yt),右下角为(xb, yb)
代码如下,重点关注交集的计算思路:分别计算横轴和纵轴的交集长度。
def cal_iou(bbox1, bbox2):
xt1, yt1, xb1, yb1 = bbox1
xt2, yt2, xb2, yb2 = bbox2
# 计算每个矩形面积
area1 = (xb1 - xt1) * (yb1 - yb1)
area2 = (xb2 - xt2) * (yb2 - yb1)
# 计算两个矩形的相较面积
xl = max(xt1, xt2)
xr = min(xb1, xb2)
yt = max(yt1. yt2)
yb = min(yb1, yb2)
h = max(0, yb - yt)
w = max(0, xr - xl)
area = h * w
# 计算iou
iou = area / (area1 + area2 - area)
return iou
当然真实使用应该考虑使用下面的版本,因为像素是离散的,像素2到5其实是4个像素,并不是5-2=3个像素,所以需要加1。
def cal_iou(bbox1, bbox2):
xt1, yt1, xb1, yb1 = bbox1
xt2, yt2, xb2, yb2 = bbox2
# 计算每个矩形面积
area1 = (xb1 - xt1 + 1) * (yb1 - yb1 + 1)
area2 = (xb2 - xt2 + 1) * (yb2 - yb1 + 1)
# 计算两个矩形的相较面积
xl = max(xt1, xt2)
xr = min(xb1, xb2)
yt = max(yt1. yt2)
yb = min(yb1, yb2)
h = max(0, yb - yt)
w = max(0, xr - xl)
area = (h + 1) * (w + 1)
# 计算iou
iou = area / (area1 + area2 - area)
return iou