比较两个 Matlab 边界框之间的差异

15
我有两个边界框的坐标,其中一个是实际情况,另一个是我的工作结果。我想评估我的准确性与实际情况相比。所以我想问问是否有任何建议。边界框细节以以下格式保存:[x,y,宽度,高度]

3
我不知道是谁给它点了踩……但这并不是一个很糟糕的问题。 - Autonomous
1
顺便问一下,你是否正在检测任何对象? - Autonomous
1
这是关于计算两个边界框重叠区域的问题吗? - michaeltang
@Parag 感谢您的回答,是的,这是用于检测物体。 - Tak
1
如果您觉得有帮助,请接受答案。 - Autonomous
6个回答

21

编辑:我已经更正了其他用户指出的错误。

我假设你正在检测某个物体,并在其周围绘制一个边界框。这属于广泛研究的目标检测领域。评估准确性的最佳方法是计算交并比。这来自PASCAL VOC挑战赛,可以在此处查看详细信息,也可参考此处的视觉效果。

如果您有一个包含边界框检测和真实边界框的数据集,则它们之间的重叠面积应大于或等于50%。假设真实边界框为gt=[x_g,y_g,width_g,height_g],预测边界框为pr=[x_p,y_p,width_p,height_p],那么可以使用以下公式计算重叠区域的面积:

intersectionArea = rectint(gt,pr); %If you don't have this function then write a simple one for yourself which calculates area of intersection of two rectangles.
unionArea = (width_g*height_g)+(width_p*height_p)-intersectionArea;
overlapArea = intersectionArea/unionArea; %This should be greater than 0.5 to consider it as a valid detection.

我希望现在你已经明白了。


请问为什么我们需要在训练中检查提取的建议与GT的IoU? - Aadnan Farooq A
我不完全理解你的问题。计算IoU是为了评估算法的性能。在训练过程中,我认为我们不需要检查IoU。你在哪里读到这个要求的? - Autonomous
是的,我在论文中看到过,并且也在这个问题中看到了。所以我想问你。如果你有,请回答这些问题,对我也会有帮助。 - Aadnan Farooq A
请把论文链接给我。 - Autonomous
我认为你计算unionArea的方式有误。请阅读我的答案以获取更多细节。 - saastn

9

尝试使用交并比

交并比是用于衡量特定数据集上物体检测器准确性的评估指标。

更正式地说,为了将交并比应用于评估(任意)物体检测器,我们需要:

  1. 基准真实边界框(即来自测试集的手动标注边界框,指定图像中对象的位置)。
  2. 来自模型的预测边界框。

下面我包含了一个基准真实边界框与预测边界框的视觉示例:

enter image description here

预测边界框为红色,而基准真实(即手动标注)边界框为绿色。

从上图中,我们可以看到我们的物体检测器已经在图像中检测到了停止标志的存在。

因此,计算交并比可以通过以下方式确定:

enter image description here

只要我们有这两组边界框,我们就可以应用交并比。

下面是Python代码:

# import the necessary packages
from collections import namedtuple
import numpy as np
import cv2

# define the `Detection` object
Detection = namedtuple("Detection", ["image_path", "gt", "pred"])

def bb_intersection_over_union(boxA, boxB):
    # determine the (x, y)-coordinates of the intersection rectangle
    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    # compute the area of intersection rectangle
    interArea = (xB - xA + 1) * (yB - yA + 1)

    # compute the area of both the prediction and ground-truth
    # rectangles
    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)

    # compute the intersection over union by taking the intersection
    # area and dividing it by the sum of prediction + ground-truth
    # areas - the interesection area
    iou = interArea / float(boxAArea + boxBArea - interArea)

    # return the intersection over union value
    return iou

gtpred分别代表:

  1. gt: 真实边界框。
  2. pred: 模型预测的边界框。

如需了解更多信息,请点击此文章


这应该是最好的答案。+1 - JLagana
但是在计算面积时,为什么要加上“+1”呢? - Marvin K

5

您需要计算交集和并集,然后使用Jaccard指数(交集/并集)得出一个介于0和1之间的值(1表示完美匹配,0表示完全不匹配)。


3
上面标记为最佳答案的回答是错误的。
@Parag 提出的解决方案实际上计算的是交集面积和最小覆盖矩形的面积比率。应该使用并集面积。
因此,代码应该是:
rect1 = [x1,y1,w1,h1]; 
rect2 = [x2,y2,w2,h2];
intersectionArea = rectint(rect1,rect2);
unionArea = w1*h1 + w2*h2 - intersectionArea;
overlap = intersectionArea/unionArea;

你可以检查 这份代码 来确认上述内容。(此代码赢得了Pascal挑战赛)。

3

所有问题的答案都建议使用交并比(IoU)度量标准。这是IoU的向量化版本,可用于多个匹配。

function [IoU, match] = rectIoU(R1, R2, treshold)
I = rectint(R1, R2);
A1 = R1(:, 3).*R1(:, 4);
A2 = R2(:, 3).*R2(:, 4);
U = bsxfun(@plus, A1, A2')-I;
IoU = I./U;
if nargout > 1
    if nargin<3
        treshold = 0.5;
    end
    match = IoU>treshold;
end
end

这个函数可以计算两组边界框的IoU值。如果R1R2各自指定一个矩形,则输出的IoU是一个标量。

R1R2也可以是矩阵,其中每一行都是位置向量([x y w h])。然后,IoU是一个矩阵,给出由R1指定的所有矩形与由R2指定的所有矩形的IoU值。也就是说,如果R1n-by-4,而R2m-by-4,那么IoU是一个n-by-m矩阵,其中IoU(i,j)是由R1的第i行指定的矩形和R2的第j行指定的矩形的IoU值。

它还接受一个标量参数“treshold”,以设置“match”输出。 “match”的大小与“IoU”完全相同。“match(i,j)”表示由“R1”的第“i”行和“R2”的第“j”行指定的矩形是否匹配。
例如,
R1 = [0 0 1 1; 2 1 1 1];
R2 = [-.5 2 1 1; flipud(R1)];
R2 = R2+rand(size(R2))*.4-.2;
[IoU, match] = rectIoU(R1, R2, 0.4)

返回:
IoU =
     0         0    0.7738
     0    0.6596         0


match =
     0     0     1
     0     1     0

这意味着 R1(1, :)R1(2, :) 分别与 R2(3, :)R2(2, :) 匹配。

enter image description here

注意: 在我发布这个答案的时候,Parag的答案(上面被接受的答案)存在一个小错误。我认为他们计算了联合区域的方式是错误的。在他们的答案中,unionCoords实际上是下图中蓝色正方形的坐标,而unionArea是它的面积,显然不是红色和绿色矩形的联合面积。

enter image description here


0

仅是对@Parag S. Chandakkar所说的内容的扩展。我已编辑他的代码,以获取多个框之间的重叠率矩阵。

如果您想构建函数并直接使用它来获取Box1(M,4)和Box2(N,4)的重叠矩阵(M,N)(每个条目位于[0,1]之间),则可以这样做。 (Box1和Box2分别包含M和N盒子的(x,y,width,height)数据)。

    function result= overlap_matrix(box1,box2)
    [m,y1]=size(box1);
    [n,y2]=size(box2);
    result=zeros(m,n,'double');
    for  i = 1:m 
      for j=1:n
         gt=box1(i,:);
         pr=box2(j,:);

         x_g=box1(i,1);
         y_g=box1(i,2);
         width_g=box1(i,3);
         height_g=box1(i,4);

         x_p=box2(j,1);
         y_p=box2(j,2);
         width_p=box2(j,3);
         height_p=box2(j,4);
         intersectionArea=rectint(gt,pr); 
         unionCoords=[min(x_g,x_p),min(y_g,y_p),max(x_g+width_g-1,x_p+width_p-1),max(y_g+height_g-1,y_p+height_p-1)];
         unionArea=(unionCoords(3)-unionCoords(1)+1)*(unionCoords(4)-unionCoords(2)+1);
         overlapArea=intersectionArea/unionArea; 
         result(i,j)=overlapArea;
      end
    end

这是一种类似于bboxOverlapRatio(http://in.mathworks.com/help/vision/ref/bboxoverlapratio.html)的并行函数,但在R2014a或更早版本中不可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接