我将训练标签作为像素值为0或255的图像。我从机器学习模型预测的标签也是像素值为0或255的图像。
255是预测所关注的像素值。
现在我要计算IoU。 这是我的方法
for k in range(numImages):
for i in range(width){
for j in range(height){
if(label[i][j]==predicted[i][j]){
if(label[i][j]==255){
intersection++;
}
}
else if(label[i][j] ==255 || predicted[i][j]==255){
union++;
}
}
}
IoU+=intersection/(union-intersection)
IoU/=numImages
最终的IoU是IoU的价值。 这个计算是否正确?
答案 0 :(得分:2)
这里的逻辑似乎是正确的,虽然嵌套for loops / if语句使它有些混乱。 可能的替代方案可能是:
intersection = sum((A. * B)> 0);
其中A. * B是图像的逐点乘法(即,如果任一图像在该点处具有0,则它们不相交并且各个像素的乘积为0)。
union = sum((A + B)> 0);
其中A + B是图像的逐点添加。 (即如果其中任何一个非零,则它是并集的一部分,并且总和大于0)。
IoU = intersection / union;
我不知道你正在使用什么语言,所以语法可能需要调整,但是这个结构将你的代码从3 for for循环和2条件调整为1 for for循环而没有条件。
编辑:
如果您还想知道如何使用两个图像之间的逐点算术的类似方法计算其他常见相似性度量(例如Dice-Sorenson coefficient,precision, recall),请查看示例代码如下。语法适用于MATLAB,但它应该说明逻辑。 (注意:nnz =非零元素的数量。相当于上面使用的'sum(X> 0)')
%Generate complements of each image (0's to 1's, 1's to 0's)
ref_complement=(ref-1).*-1;
seg_complement=(seg-1).*-1;
%True Positives
TP=nnz(ref.*seg);
%True Negatives
TN=nnz(ref_complement.*seg_complement);
%False Positive
FP=nnz(ref_complement.*seg);
%False Negative
FN=nnz(ref.*seg_complement);
%%Calculate metrics
metrics.dice = 2*TP / (FP + 2*TP + FN);
metrics.recall = TP / (TP + FN);
metrics.precision = TP / (TP + FP);
metrics.AreaDifference = ((TP + FP) - (TP + FN)) * pixelSize^2;