比较两个边界框相互之间的Matlab

时间:2014-03-11 01:54:21

标签: matlab image-processing computer-vision video-tracking

我有两个边界框的坐标,其中一个是底线,另一个是我工作的结果。我想评估一下我的准确性。所以我问是否有人有任何建议

边界框详细信息以此格式[x,y,width,height]

保存

6 个答案:

答案 0 :(得分:16)

修改:我已更正其他用户指出的错误。

我假设您正在检测某个对象,并且您正在绘制一个围绕它的边界框。这是在广泛研究/研究的物体检测领域。评估准确性的最佳方法是计算交叉联合。这取自here的PASCAL VOC挑战。有关视觉效果,请参阅here

如果您有边界框检测和地面实况边界框,则它们之间的重叠区域应大于或等于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.

我希望你现在明白它。

答案 1 :(得分:5)

你应该计算交集和联合,然后Jaccard index(交集/联合)是0到1之间的值(1表示完全匹配,0表示完全不匹配)。

答案 2 :(得分:5)

尝试交叉联盟

Intersection over Union是一个评估指标,用于衡量特定数据集上对象检测器的准确度。

更正式地说,为了应用Intersection over Union来评估我们需要的(任意)物体探测器:

  1. 地面实况边界框(即,测试集中标记为边界框的手,指定图像中我们的对象所在的位置)。
  2. 我们模型中预测的边界框。
  3. 下面我列出了一个地面实况边界框与预测边界框的可视化示例:

    enter image description here

    预测的边界框用红色绘制,而地面实况(即手工标记)边界框用绿色绘制。

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

    因此可以通过以下方式确定计算联盟的交叉点:

    enter image description here

    只要我们有这两组边界框,我们就可以在Union上应用Intersection。

    这是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:我们模型中预测的边界框。
    3. 有关详情,请点击this post

答案 3 :(得分: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;

您可以检查this代码以确认上述内容(此代码赢得了Pascal挑战)。

答案 4 :(得分: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指定的所有矩形的IoU以及R2指定的所有矩形。也就是说,如果R1n-by-4R2m-by-4,则IoUn-by-m矩阵,其中IoU(i,j)为由i R1行和j R2行指定的矩形的IoU。

它还接受标量参数treshold来设置match输出。 match的大小与IoU完全相同。 match(i,j)表示第iR1j R2行指定的矩形是否匹配。

例如,

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

<强> PS: 在我发布这个答案的时候,Parag的答案中存在一个小错误(上面接受的答案)。恕我直言他们以错误的方式计算联合区域。他们答案中的unionCoords实际上是下图中的蓝色方块,unionArea是它的区域,显然不是红色和绿色矩形的联合区域。

enter image description here

答案 5 :(得分:0)

只是@Parag S. Chandakkar所说的扩展。我编辑了他的代码以获得许多方框的重叠率矩阵。

如果您想要构建函数并直接使用它来获取Box1(M,4)和Box2(N,4)的重叠矩阵(M,N)(每个条目位于[0,1]之间)。 (方框1和方框2分别包含M和N方框的(x,y,宽度,高度)数据)。

    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或更早版本中不可用。