简介(很重要)
接下来介绍的是如何评估边界框预测,也就是我们现在有一个对象的一些目标边界框,而且我们还有一些相对应的预测边界框,我们希望有一些方法可以量化,或者测量我们的预测边界框的效果如何。为此我们将学习一个称为交并集的度量标准,然后我们还将再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)
代码考虑了角点和中心点两种情况,有问题请留言,或邮箱联系。