目标检测基础(IoU)
什么是IOU?
IOU(交并比 Intersection over Union)是一个术语,用于描述两个框的重叠程度。重叠区域越大,IOU越大。
IOU主要用于与对象检测相关的应用程序中,在该应用程序中,我们训练模型输出一个完全包围目标的外接矩形框。例如,在上图中,我们有一个绿色框和一个蓝色框。绿色框表示真实框,蓝色框表示我们模型的预测框。训练模型的目的是不断改进其预测框的输出,直到蓝色框和绿色框完全重叠,即两个框之间的IOU等于1。
IOU经常用于非最大值抑制中,基于检测框的置信度消除同一个对象的多个预测框,用以保留置信度最高的预测框.
IOU计算公式
在目标检测中,我们假设框1由[x1,y1,x2,y2]表示,同样框2由[x3,y3,x4,y4]表示,如下图1所示。
此时IOU的计算公式如下:
I
o
U
=
A
r
e
a
o
f
I
n
t
e
r
s
e
c
t
i
o
n
o
f
t
w
o
b
o
x
e
s
A
r
e
a
o
f
U
n
i
o
n
o
f
t
w
o
b
o
x
e
s
IoU=\frac{Area\ of\ Intersection\ of\ two\ boxes}{Area\ of\ Union\ of\ two\ boxes}
IoU=Area of Union of two boxesArea of Intersection of two boxes
用图2表示如下:
接下来我们来一步一步计算相应的矩形框的交集和并集对应的面积.
计算交集面积
直观来看,两个矩形框的交集有多种情况,我们直观的来观察下图3,明显右下两个矩形框完全重合交集面积最大.
首先我们将相交矩形的坐标表示为 [x_inter1,y_inter1,x_inter2,y_inter2],分别代表相交矩形的左上角和右下角的坐标。
接着从定义参考坐标系开始。我们使用+X轴向右移动,+Y轴向下移动的计算机图形学惯例。
为了计算相交矩形的左上角坐标,我们比较每个框的左上角。我们可以从上面的例子中看到,x_inter1可以通过查看哪个框的左上角更靠右找到。类似地,可以通过查看哪个框的左上角低于另一个框来找到y_inter1。从数学上讲,它们可以总结为: x _ i n t e r 1 = m a x ( x 1 , x 3 ) x\_inter1=max(x1,x3) x_inter1=max(x1,x3), y y y_ i n t e r 1 = m a x ( y 1 , y 3 ) inter1=max(y1,y3) inter1=max(y1,y3)
为了计算相交矩形的右下角坐标,我们比较每个框的右下角。
x_inter2可以通过查看哪个框的右下角更偏左来找到。
类似地,可以通过查看哪个框的右下角高于另一个框来找到y_inter2。
类似地,它们可以总结为: x _ i n t e r 2 = m a x ( x 2 , x 4 ) x\_inter2=max(x2,x4) x_inter2=max(x2,x4), y y y_ i n t e r 2 = m a x ( y 2 , y 4 ) inter2=max(y2,y4) inter2=max(y2,y4)
现在我们有了相交矩形的坐标,则交集的面积就是矩形的面积。(在实际应用中,我们将采用宽度和高度的绝对值,以确保即使框的顺序发生变化,宽度和高度仍为正值;即,如果x_inter1>x_inter2,我们仍将获得宽度的正值)
w
i
d
t
h
_
i
n
t
e
r
=
(
x
_
i
n
t
e
r
2
−
x
_
i
n
t
e
r
1
)
h
e
i
g
h
t
_
i
n
t
e
r
=
(
y
_
i
n
t
e
r
2
−
y
_
i
n
t
e
r
1
)
a
r
e
a
_
i
n
t
e
r
=
w
i
d
t
h
_
i
n
t
e
r
∗
h
e
i
g
h
t
_
i
n
t
e
r
width\_inter=(x\_inter2-x\_inter1) \\height\_inter=(y\_inter2-y\_inter1) \\area\_inter=width\_inter*height\_inter
width_inter=(x_inter2−x_inter1)height_inter=(y_inter2−y_inter1)area_inter=width_inter∗height_inter
计算并集面积
框的并集是两个框所覆盖的总面积,如图2所示。
为了找到总面积,我们首先计算各个矩形框的面积
w
i
d
t
h
_
b
o
x
1
=
(
x
_
2
−
x
_
1
)
h
e
i
g
h
t
_
b
o
x
1
=
(
y
_
2
−
y
_
1
)
w
i
d
t
h
_
b
o
x
2
=
(
x
_
4
−
x
_
3
)
h
e
i
g
h
t
_
b
o
x
2
=
(
y
_
4
−
y
_
3
)
a
r
e
a
_
b
o
x
1
=
w
i
d
t
h
_
b
o
x
1
∗
h
e
i
g
h
t
_
b
o
x
1
a
r
e
a
_
b
o
x
2
=
w
i
d
t
h
_
b
o
x
2
∗
h
e
i
g
h
t
_
b
o
x
2
width\_box1=(x\_2-x\_1) \\height\_box1=(y\_2-y\_1) \\width\_box2=(x\_4-x\_3) \\height\_box2=(y\_4-y\_3) \\area\_box1=width\_box1*height\_box1 \\area\_box2=width\_box2*height\_box2
width_box1=(x_2−x_1)height_box1=(y_2−y_1)width_box2=(x_4−x_3)height_box2=(y_4−y_3)area_box1=width_box1∗height_box1area_box2=width_box2∗height_box2
如果我们查看两个框所覆盖的总面积,我们会看到两个框都覆盖了相交矩形的部分,即相交矩形的面积包括在box1区域和box2区域中。
由于我们只想计算一次公共相交面积,我们可以从两个框的总面积中减去我们计算的相交面积。即:
a
r
e
a
_
u
n
i
o
n
=
a
r
e
a
_
b
o
x
1
+
a
r
e
a
_
b
o
x
2
−
a
r
e
a
_
i
n
t
e
r
s
e
c
t
i
o
n
area\_union=area\_box1+area\_box2-area\_intersection
area_union=area_box1+area_box2−area_intersection
计算交并比
通过上述计算公式,我们计算出了两个矩形框相应的交集和并集的面积,此时矩形框的IOU计算公式如下:
I
o
U
=
a
r
e
a
_
i
n
t
e
r
a
r
e
a
_
u
n
i
o
n
IoU=\frac{area\_inter}{area\_union}
IoU=area_unionarea_inter
观察上述公式,可以得到如下结论:
- 两个框的IOU可以取0到1之间的任何值。
- 如果两个框不相交,则它们的相交区域将为0,因此IOU也将为0。
- 如果两个完全重叠的矩形框,则交集的面积将等于其并集的面积,因此IOU将为1
代码实现
def IOU(box1, box2):
x1, y1, x2, y2 = box1
x3, y3, x4, y4 = box2
x_inter1 = max(x1, x3)
y_inter1 = max(y1, y3)
x_inter2 = min(x2, x4)
y_inter2 = min(y2, y4)
width_inter = abs(x_inter2 - x_inter1)
height_inter = abs(y_inter2 - y_inter1)
area_inter = width_inter * height_inter
width_box1 = abs(x2 - x1)
height_box1 = abs(y2 - y1)
width_box2 = abs(x4 - x3)
height_box2 = abs(y4 - y3)
area_box1 = width_box1 * height_box1
area_box2 = width_box2 * height_box2
area_union = area_box1 + area_box2 - area_inter
iou = area_inter / area_union
return iou
- 函数IOU接受两个框,即box1和box2作为输入。每个框中的数据都是一个包含[x1,y1,x2,y2]的列表,它表示左上角和右下角的坐标。
- 如前文所述,我们先计算相交矩形的面积,然后是并集的面积。
- abs函数是python中用于计算取绝对值的内置函数。这确保了我们永远不会以负宽度或负高度计算结果。
- 返回的IOU是float类型的值,介于0和1之间。
运行结果如下: