多 class 的 mIoU

mIoU for multi-class

我想了解 mIoU 是如何计算多class class化的。每个 class 的公式是

IoU formula

然后在 classes 上取平均值以获得 mIoU。但是,我不明白未表示的 classes 会发生什么。公式变成除以 0,所以我忽略它们并且只计算所表示的 classes 的平均值。

问题在于,当预测错误时,准确率确实会降低。它添加了另一个 class 来计算平均值。例如:在语义分割中,图像的基本事实由 4 classes (0,1,2,3) 和 6 classes 表示在数据集上。预测也由 4 classes (0,1,4,5) 组成,但所有项目 class 在 2 和 3(在地面实况中)被 class 化在 4 和 5(在预测中)。在这种情况下,我们应该计算超过 6 classes 的 mIoU 吗?即使 4 classes 是完全错误的并且相应的 IoU 是 0 ?所以问题是,如果 class 中只有一个像素被预测,而不是 ground_truth,我们必须除以一个更高的分母,它会降低很多分数。

这是为 multi-class(和语义分割)计算 mIoU 的正确方法吗?

我不是计算每个图像的 miou,然后计算所有图像的“平均”miou,而是将 miou 作为一个大图像来计算。如果 class 不在图像中并且未被预测,我将相应的 iou 设置为 1。

从零开始:

def miou(gt,pred,nbr_mask):
    intersection = np.zeros(nbr_mask) # int = (A and B)
    den = np.zeros(nbr_mask) # den = A + B = (A or B) + (A and B)
    for i in range(len(gt)):
        for j in range(height):
            for k in range(width):
                if pred[i][j][k]==gt[i][j][k]:
                    intersection[gt[i][j][k]]+=1
                den[pred[i][j][k]] += 1
                den[gt[i][j][k]] += 1
    mIoU = 0
    for i in range(nbr_mask):
        if den[i]!=0:
            mIoU+=intersection[i]/(den[i]-intersection[i])
        else:
            mIoU+=1
    mIoU=mIoU/nbr_mask
    return mIoU

使用gt ground truth 标签数组和pred 关联图像的预测(必须在数组中对应且大小相同)。