目标检测基础(IoU)

IOU(交并比)是衡量两个矩形框重叠程度的关键指标,常用于对象检测。计算涉及求解交集和并集的面积,进而确定IOU值。当两个框完全重叠时,IOU为1;无重叠则为0。在非最大值抑制中,IOU用于选择最佳预测框。本文详细阐述了IOU的计算过程,并提供了Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标检测基础(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_inter2x_inter1)height_inter=(y_inter2y_inter1)area_inter=width_interheight_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_2x_1)height_box1=(y_2y_1)width_box2=(x_4x_3)height_box2=(y_4y_3)area_box1=width_box1height_box1area_box2=width_box2height_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_box2area_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之间。

运行结果如下:

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值