编辑:我已经更正了其他用户指出的错误。
我假设你正在检测某个物体,并在其周围绘制一个边界框。这属于广泛研究的目标检测领域。评估准确性的最佳方法是计算交并比。这来自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.
我希望现在你已经明白了。
unionArea
的方式有误。请阅读我的答案以获取更多细节。 - saastn尝试使用交并比
交并比是用于衡量特定数据集上物体检测器准确性的评估指标。
更正式地说,为了将交并比应用于评估(任意)物体检测器,我们需要:
下面我包含了一个基准真实边界框与预测边界框的视觉示例:
预测边界框为红色,而基准真实(即手动标注)边界框为绿色。
从上图中,我们可以看到我们的物体检测器已经在图像中检测到了停止标志的存在。
因此,计算交并比可以通过以下方式确定:
只要我们有这两组边界框,我们就可以应用交并比。
下面是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
: 模型预测的边界框。如需了解更多信息,请点击此文章
rect1 = [x1,y1,w1,h1];
rect2 = [x2,y2,w2,h2];
intersectionArea = rectint(rect1,rect2);
unionArea = w1*h1 + w2*h2 - intersectionArea;
overlap = intersectionArea/unionArea;
所有问题的答案都建议使用交并比(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
指定的所有矩形与由R2
指定的所有矩形的IoU值。也就是说,如果R1
是n-by-4
,而R2
是m-by-4
,那么IoU
是一个n-by-m
矩阵,其中IoU(i,j)
是由R1
的第i行指定的矩形和R2
的第j行指定的矩形的IoU值。
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, :)
匹配。
注意:
在我发布这个答案的时候,Parag的答案(上面被接受的答案)存在一个小错误。我认为他们计算了联合区域的方式是错误的。在他们的答案中,unionCoords
实际上是下图中蓝色正方形的坐标,而unionArea
是它的面积,显然不是红色和绿色矩形的联合面积。
仅是对@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或更早版本中不可用。