目标检测---IoU计算公式

目标检测—IoU计算公式

在研究目标检测中,IOU的计算是肯定必不可少的。就比如说在R-CNN网络中,正负样本就是按照候选框与真实框之间的IOU值大小进行区分的,可见该细节还是值得单独拎出来写一篇blog的~~
下面的思路与代码是本人的理解结合百度飞浆的使用教程文档整理出来的(下面附上了飞浆的url,大家可以自主去研究~~~)
百度飞浆–IOU计算
废话不多说,直接上干货~

思路分析

例如,在R-CNN网络中,我们通过SS(selective search)算法可以实现在每张图片上获得2k左右的候选框,那么如何区分这么多的候选框到底是属于正样本还是负样本呢?
那么IOU这个概念就诞生了~它其实是来源于数学中的集合的概念,用来反应两个集合之间的空间关系;下面是它的计算公式:
在这里插入图片描述
该公式是用来描述两个框之间的重合度的。公式分子是两个框的交集,公式分母是两个框的并集,所以他们的比值就代表交并比。
在这里插入图片描述

两个框可能存在的所有空间位置

在这里插入图片描述
1.第一种情况:两个框之间存在部分重叠
2.第二种情况:两个框之间不存在任何重叠
3.第三种情况:一个框在另外一个框内部

分析

假设,按照第一种情况进行分析~
在这里插入图片描述
a,b分别表示两个框,其中1,2表示每个框的左上角坐标与右下角坐标
先计算交集部分(即公式分子部分):
相交部分左上角坐标为:
在这里插入图片描述
相交部分右下角坐标为:
在这里插入图片描述
那么相交部分的面积计算公式就是为:
在这里插入图片描述
这里,都+1的目的,我个人认为是为了排除两个框之间重叠的像素对面积的影响,取max(*,0)的目的是为了避免出现负数的情况

再来计算一下两个框的并集部分:
两个框的面积为:
在这里插入图片描述
计算相比部分面积:
在这里插入图片描述
所以,最终的iou计算公式为:
在这里插入图片描述

代码实现

在目标检测中,框一般都有两种表现手法,一种是(xyxy),一种是(xywh),其实二者之间实现方式都差不多,这里我就仅仅按照第一种方式进行代码实现了~

def cal_iou_xyxy(box1,box2):
    x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
    x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
    #计算两个框的面积
    s1 = (y1max - y1min + 1.) * (x1max - x1min + 1.)
    s2 = (y2max - y2min + 1.) * (x2max - x2min + 1.)

    #计算相交部分的坐标
    xmin = max(x1min,x2min)
    ymin = max(y1min,y2min)
    xmax = min(x1max,x2max)
    ymax = min(y1max,y2max)

    inter_h = max(ymax - ymin + 1, 0)
    inter_w = max(xmax - xmin + 1, 0)

    intersection = inter_h * inter_w
    union = s1 + s2 - intersection

    #计算iou
    iou = intersection / union
    return iou

box1 = [100,100,200,200]
box2 = [120,120,220,220]
iou = cal_iou_xyxy(box1,box2)
print(iou)

下面的代码是指在实战中使用的iou计算代码:

    def calc_iou(self, boxes1, boxes2, scope='iou'):
        """calculate ious
        Args:
          boxes1: 5-D tensor [BATCH_SIZE, CELL_SIZE, CELL_SIZE, BOXES_PER_CELL, 4]  ====> 4:(x_center, y_center, w, h)
          (2,7,7,2,4)
          boxes2: 5-D tensor [BATCH_SIZE, CELL_SIZE, CELL_SIZE, BOXES_PER_CELL, 4] ===> 4:(x_center, y_center, w, h)
          (2,7,7,2,4)
        Return:
          iou: 4-D tensor [BATCH_SIZE, CELL_SIZE, CELL_SIZE, BOXES_PER_CELL]  --(2,7,7,2)
        """
        with tf.variable_scope(scope):
            # transform (x_center, y_center, w, h) to (x1, y1, x2, y2)
            boxes1_t = tf.stack([boxes1[..., 0] - boxes1[..., 2] / 2.0,
                                 boxes1[..., 1] - boxes1[..., 3] / 2.0,
                                 boxes1[..., 0] + boxes1[..., 2] / 2.0,
                                 boxes1[..., 1] + boxes1[..., 3] / 2.0],
                                axis=-1)  #tf.stack:矩阵拼接

            boxes2_t = tf.stack([boxes2[..., 0] - boxes2[..., 2] / 2.0,
                                 boxes2[..., 1] - boxes2[..., 3] / 2.0,
                                 boxes2[..., 0] + boxes2[..., 2] / 2.0,
                                 boxes2[..., 1] + boxes2[..., 3] / 2.0],
                                axis=-1)

            # calculate the left up point & right down point
            lu = tf.maximum(boxes1_t[..., :2], boxes2_t[..., :2]) #左上角坐标最大值
            rd = tf.minimum(boxes1_t[..., 2:], boxes2_t[..., 2:]) #右下角坐标最小值

            # intersection
            intersection = tf.maximum(0.0, rd - lu)
            inter_square = intersection[..., 0] * intersection[..., 1]

            # calculate the boxs1 square and boxs2 square
            square1 = boxes1[..., 2] * boxes1[..., 3]
            square2 = boxes2[..., 2] * boxes2[..., 3]

            union_square = tf.maximum(square1 + square2 - inter_square, 1e-10)

        return tf.clip_by_value(inter_square / union_square, 0.0, 1.0) #截断操作,即如果值不在指定的范围里,那么就会进行最大小值截断

效果展示

在这里插入图片描述

  • 13
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: IoU (Intersection over Union)是计算两个区域重叠的程度的一种指标,常用于目标检测中评估预测框和真实框的匹配情况。 IoU可以有以下几种变形: - mIoU(mean IoU):对于数据集中所有样本,计算每一类的IoU并取平均值。 - gIoU(generalized IoU):对于两个区域A、B,gIoU计算如下:gIoU(A,B) = IoU(A,B) - IoU(A,B') + 1,其中B'是与B不相交的区域。 - cIoU(complete IoU):对于两个区域A、B,cIoU计算如下:cIoU(A,B) = IoU(A,B) - IoU(A,B') - IoU(A',B) + IoU(A',B') + IoU(A,B),其中A'、B'是与A、B不相交的区域。 - CIoU(confidence IoU):CIoU在cIoU的基础上再加入了预测框的置信度因素,公式如下:CIoU(A,B) = cIoU(A,B) - p2 * v(A) / (v(A) + v(B)),其中p2是置信度的超参数,v(A)和v(B)分别表示区域A、B的面积。 常见的目标检测任务常常使用mIoU作为性能度量指标。 ### 回答2: 目标检测中的交并比(IOU)是一种衡量检测框与真实框之间重叠程度的指标。在目标检测任务中,IOU通常用来评估检测结果的准确性。 在实际应用中,研究者对IOU进行了一些变形和扩展,以更好地适应不同的场景和需求。 1. GIOU(Generalized Intersection over Union):GIOU是对IOU的一种改进,考虑了目标框的尺寸和位置信息,同时考虑了检测框和真实框之间的平移和缩放关系。 2. DIOU(Distance-IoU):DIOU基于IOU和目标框的中心距离进行了修改。它考虑了物体的大小和位置信息,并通过计算中心距离来惩罚检测框与真实框之间的重叠不足。 3. CIOU(Complete-IoU):CIOU是对DIOU的改进,它还考虑了宽高比的一致性。CIOU通过计算对角线距离来衡量两个框之间的距离,从而更好地描述检测框和真实框之间的相似度。 以上是目标检测中常用的IOU变形的汇总。这些改进方法能够更准确地评估检测结果的质量,并帮助提升目标检测算法的性能和准确性。研究者们不断尝试更多的变体,并希望能够找到更好的方式来衡量目标检测的结果。 ### 回答3: 目标检测中的Intersection over Union(IoU)是一种常用的评估指标,用于衡量预测框与真实标注框之间的重叠程度。除了传统的IoU指标外,还有一些关于IoU的变形方法。 首先是GIoU(Generalized IoU),它通过计算预测框与真实标注框的最小闭包矩形(minimum enclosing rectangle,MER)的面积和真实标注框的面积之比来进行衡量。相比传统的IoU,GIoU考虑了预测框与真实标注框之间的位置偏移,能够更好地评估不同形状的目标。 接下来是DIoU(Distance IoU),它在GIoU的基础上还考虑了预测框与真实标注框之间的中心点距离。DIoU可以有效地解决多目标检测中的crowding问题,改进了目标之间的重叠度量。 还有CIoU(Complete IoU),它在DIoU的基础上进一步考虑了长宽比的相似性。CIoU使用一个参数来衡量长宽比的差异,可以更加准确地评估目标的匹配程度。 此外,还有EIoU(Efficient IoU)等其他变形方法,它们主要通过改进IoU的计算方式来提高检测算法的效率。 总的来说,这些IoU的变形方法在目标检测中起到了衡量目标检测精度的作用,能够更好地评估预测框与真实标注框之间的重叠程度,从而提高目标检测算法的准确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进我的收藏吃灰吧~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值