我有两个边界框的坐标,其中一个是底线,另一个是我工作的结果。我想评估一下我的准确性。所以我问是否有人有任何建议
边界框详细信息以此格式[x,y,width,height]
答案 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来评估我们需要的(任意)物体探测器:
下面我列出了一个地面实况边界框与预测边界框的可视化示例:
预测的边界框用红色绘制,而地面实况(即手工标记)边界框用绿色绘制。
在上图中,我们可以看到我们的物体探测器已检测到图像中存在停车标志。
因此可以通过以下方式确定计算联盟的交叉点:
只要我们有这两组边界框,我们就可以在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
gt
和pred
gt
:真实的边界框。pred
:我们模型中预测的边界框。有关详情,请点击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的矢量化版本,可用于多个roi匹配。
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。如果R1
和R2
分别指定一个矩形,则输出IoU
是标量。
R1
和R2
也可以是矩阵,其中每一行都是位置向量([x y w h]
)。然后IoU
是一个矩阵,给出由R1
指定的所有矩形的IoU以及R2
指定的所有矩形。也就是说,如果R1
为n-by-4
且R2
为m-by-4
,则IoU
为n-by-m
矩阵,其中IoU(i,j)
为由i
R1
行和j
R2
行指定的矩形的IoU。
它还接受标量参数treshold
来设置match
输出。 match
的大小与IoU
完全相同。 match(i,j)
表示第i
行R1
和j
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, :)
匹配。
<强> PS:强>
在我发布这个答案的时候,Parag的答案中存在一个小错误(上面接受的答案)。恕我直言他们以错误的方式计算联合区域。他们答案中的unionCoords
实际上是下图中的蓝色方块,unionArea
是它的区域,显然不是红色和绿色矩形的联合区域。
答案 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或更早版本中不可用。