1. 概述

交并比(Intersection over Union, IoU)是目标检测、语义分割、追踪等任务最常用的评估指标。交并比,顾名思义是两区域交集与并集的比值,当两区域完全重叠时交并比最大,为1;当两区域完全不重叠时交并比最小,为0。

2. IoU计算公式

要计算候选框(candidate bound) A与真实框(ground truth bound) B的交并比。
在这里插入图片描述

B1框与B2框的IoU计算公式为:
IoU=∣A∩B∣∣A∪B∣ IoU = \frac{\mid A\cap B\mid}{\mid A\cup B\mid} IoU=ABAB

A、B的坐标如下图:

img

交集的左上角坐标为:
x1=max(xa1,xb1) x_{1} = max\big(x_{a1}, x_{b1}) x1=max(xa1,xb1)

y1=max(ya1,yb1) y_{1} = max\big(y_{a1}, y_{b1}) y1=max(ya1,yb1)

交集的右下角坐标为:
x2=min(xa2,xb2) x_{2} = min\big(x_{a2}, x_{b2}) x2=min(xa2,xb2)

y2=min(ya2,yb2) y_{2} = min\big(y_{a2}, y_{b2}) y2=min(ya2,yb2)

交集部分的宽、高、面积:
width=max(x2−x1,0) width = max\big(x_{2}-x_{1}, 0) width=max(x2x1,0)

height=max(y2−y1,0) height = max\big(y_{2}-y_{1}, 0) height=max(y2y1,0)

SA∩B=width∗height S_{A \cap B} = width * height SAB=widthheight

A框的面积:
SA=(xa2−xa1)⋅(ya2−ya1) S_{A} = \big(x_{a2}-x_{a1})\cdot\big(y_{a2}-y_{a1}) SA=(xa2xa1)(ya2ya1)
B框的面积:
SB=(xb2−xb1)⋅(yb2−yb1) S_{B} = \big(x_{b2}-x_{b1})\cdot\big(y_{b2}-y_{b1}) SB=(xb2xb1)(yb2yb1)
并集部分:
SA∪B=SA+SB−SA∩B S_{A \cup B} = S_{A} + S_{B} - S_{A \cap B} SAB=SA+SBSAB
交并比为:

IoU=SA∩BSA∪B IoU = \frac{S_{A \cap B}}{S_{A \cup B}} IoU=SABSAB
3. IoU公式的python实现

def IoU(box1, box2) -> float:
    """
    IOU, Intersection over Union

    :param box1: list, 第一个框的两个坐标点位置 box1[x1, y1, x2, y2]
    :param box2: list, 第二个框的两个坐标点位置 box2[x1, y1, x2, y2]
    :return: float, 交并比
    """
    weight = max(min(box1[2], box2[2]) - max(box1[0], box2[0]), 0)
    height = max(min(box1[3], box2[3]) - max(box1[1], box2[1]), 0)
    s_inter = weight * height
    s_box1 = (box1[2] - box1[0]) * (box1[3] - box1[1])
    s_box2 = (box2[2] - box2[0]) * (box2[3] - box2[1])
    s_union = s_box1 + s_box2 - s_inter
    return s_inter / s_union


if __name__ == '__main__':
    box1 = [0, 0, 50, 50]
    box2 = [0, 0, 100, 100]
    print('IoU is %f' % IoU(box1, box2))
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐