计算掩码的并集交集

Calculation of Intersection over union for a mask

我的训练标签是像素值为 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的值。 这个计算正确吗?

这里的逻辑似乎是正确的,尽管嵌套的 for loops/if 语句使它有些混乱。 一个可能的替代方案可能是:

交集=总和((A.*B) > 0);

其中 A.*B 是图像的逐点乘法(即,如果任一图像在该点具有 0,则它们不相交并且相应像素的乘积为 0)。

并集 = 总和( (A+B) > 0);

其中A+B是图像逐点相加。 (即,如果其中一个非零,则它是并集的一部分并且总和大于 0)。

IoU = intersection/union;

我不知道您使用的是哪种语言,因此可能需要调整语法,但此结构将您的代码从 3 个 for 循环和 2 个条件变为 1 个 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;