Union的交集解释和PyTorch实现

简介(很重要)

接下来介绍的是如何评估边界框预测,也就是我们现在有一个对象的一些目标边界框,而且我们还有一些相对应的预测边界框,我们希望有一些方法可以量化,或者测量我们的预测边界框的效果如何。为此我们将学习一个称为交并集的度量标准,然后我们还将再pytorch中实现它。

交并集的解释

如图所以,对于一辆小汽车,我们标注了目标边框(绿色)和预测边界框(红色)。很明显这不是一个完美的边界框,但它也不可怕。首先我们需要量化这个边框有多好或者有多差。

量化的标准便是我们这篇文章的重点。将两个边框的交集比上这两个边框的并集,这便是我们量化的数值IoU(介于0-1之间)。如何IoU=1,这说明预测结果很完美,如果IoU=0,这说明这两个边框之间没有交集。

如何得到交集

一个边框我们可以用对角的两个坐标表示(还有用中心点的方式表示的,这里以对角为例),如图蓝色框可以表示为box1=[x1,y1,x2,y2],红色框可以表示为box2=[x1,y1,x2,y2]。这里我们假设图像的左上角为坐标原点(0,0)。当你移动到图像的右侧时,你的x值将会变大,然后随着你垂直向下移动,你的值y值也会变大。

以图中的黄色区域为例,就是本次度量中的交集,肉眼可看,黄色区域的左上角时红色边框的左上角,黄色区域的右下角就是蓝色边框的右下角。

因此交集黄色区域的x1=max(box1[0],box2[0]),y1=max(box1[1],box2[1]),x2=min(box1[2],box2[2]),y2=min(box1[3],box2[3]).这个公式一般成立,但是也会有不成立的时候,比如两个边框没有交集。

Pytorch代码实现

import torch

def intersection_over_union(boxes_preds,boxes_labels,box_format='midpoint'):
    if box_format == 'midpoint':
        box1_x1 = boxes_preds[...,0:1] - boxes-preds[...,2:3]/2
        box1_y1 = boxes_preds[...,1:2] - boxes-preds[...,3:4]/2
        box1_x2 = boxes_preds[...,0:1] - boxes-preds[...,2:3]/2
        box1_y2 = boxes_preds[...,1:2] - boxes-preds[...,3:4]/2
        box2_x1 = boxes_labels[...,0:1] - boxes_labels[...,2:3]/2
        box2_y1 = boxes_labels[...,1:2] - boxes_labels[...,3:4]/2
        box2_x2 = boxes_labels[...,0:1] - boxes_labels[...,2:3]/2
        box2_y2 = boxes_labels[...,1:2] - boxes_labels[...,3:4]/2
    if box_format ==  'corners':    
        box1_x1 = boxes_preds[...,0:1]
        box1_y1 = boxes_preds[...,1:2]
        box1_x2 = boxes_preds[...,2:3]
        box1_y2 = boxes_preds[...,3:4]
        box2_x1 = boxes_labels[...,0:1]
        box2_y1 = boxes_labels[...,1:2]
        box2_x2 = boxes_labels[...,2:3]
        box2_y2 = boxes_labels[...,3:4]
    x1=torch.max(box1_x1,box2_x1)
    y1=torch.max(box1_y1,box2_y1)
    x2=torch.min(box1_x2,box2_x2)
    y2=torch.min(box1_y2,box2_y2)
    
    intersection = (x2 - x1).clamp(0) * (y2 - y2).clamp(0)
    
    box1_area = abs((box1_x2-box1_x1)*(box1_y2-box1_y1))
    box2_area = abs((box2_x2-box2_x1)*(box2_y2-box2_y1))
    
    return intersecton/(box1_area + box2_area - intersection + 1e-6)

代码考虑了角点和中心点两种情况,有问题请留言,或邮箱联系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值