目标检测-Iou(交并比)理解

一、 IOU概述

IOU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。

二、IOU计算

IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实边框,B2为预测边框。
在这里插入图片描述
在对象检测任务中,你希望能够同时定位对象,所以如果实际边界框是这样的,你的算法给出这个紫色的边界框,那么这个结果是好还是坏?

所以交并比(loU)函数做的是计算两个边界框交集和并集之比。两个边界框的并集是这个区域,就是属于包含两个边界框区域(绿色阴影表示区域),而交集就是这个比较小的区域(橙色阴影表示区域),那么交并比就是交集的大小,这个橙色阴影面积,然后除以绿色阴影的并集面积。
在这里插入图片描述
一般约定,在计算机检测任务中,如果loU≥0.5,就说检测正确,如果预测器和实际边界框完美重叠,loU就是1,因为交集就等于并集。但一般来说只要loU≥0.5,那么结果是可以接受的,看起来还可以。一般约定,0.5是阈值,用来判断预测的边界框是否正确。一般是这么约定,但如果你希望更严格一点,你可以将loU定得更高,比如说大于0.6或者更大的数字,但loU越高,边界框越精确。

所以这是衡量定位精确度的一种方式,你只需要统计算法正确检测和定位对象的次数,你就可以用这样的定义判断对象定位是否准确。再次,0.5是人为约定,没有特别深的理论依据,如果你想更严格一点,可以把阈值定为0.6。有时我看到更严格的标准,比如0.6甚至0.7,但很少见到有人将阈值降到0.5以下。

三、IOU代码实现

现在有两个框A和B,如下图。A=[ a x 1 a_x1 ax1, a y 1 a_y1 ay1, a x 2 a_x2 ax2, a y 2 a_y2 ay2],B=[ b x 1 b_x1 bx1, b y 1 b_y1 by1, b x 2 b_x2 bx2, b y 2 b_y2 by2]。接下来想统计A和B的交集面积,A自己的面积和B自己的面积。三个待求值里面最关键的就是怎么求交集面积(图中红色框)。
在这里插入图片描述
假设A和B是相交的,存在交集。这个时候怎么求交集框(红色框)的左上角坐标和右下角坐标呢?我们发现,当A和B有交集的时候,交集框(红色框)的左上角坐标是max(A的左上角坐标,B的左上角坐标),右下角是min(A的右下角坐标,B的右下角坐标)。那么:
在这里插入图片描述
那么当A和B没有交集的时候,h和w的值小于0,如果没有交集,被减数一定小于减数。所以为了鲁棒性,我们最终的inter是这样计算的:
在这里插入图片描述
这样当A和B没有交集,inter的值就是0.分子为0,则IoU为0。

def iou(box1, box2):
    '''
    两个框(二维)的 iou 计算
    
    注意:边框以左上为原点
    
    box:[x1,y1,x2,y2],依次为左上右下坐标
    '''
    h = max(0, min(box1[2], box2[2]) - max(box1[0], box2[0]))
    w = max(0, min(box1[3], box2[3]) - max(box1[1], box2[1]))
    area_box1 = ((box1[2] - box1[0]) * (box1[3] - box1[1]))
    area_box2 = ((box2[2] - box2[0]) * (box2[3] - box2[1]))
    inter = w * h
    union = area_box1 + area_box2 - inter
    iou = inter / union
    return iou

box1 = [0,0,2,2]
box2 = [1,1,3,3]
IoU = iou(box1,box2)
print(IoU)

猜你喜欢

转载自blog.csdn.net/weixin_48167570/article/details/120697408