我想了解多类分类的mIoU是如何计算的。每个类的公式为
然后对这些类进行平均,以获得mIoU。但是,我不明白没有表示的类会发生什么。公式变成了除以0,所以我忽略了它们,并且只计算所表示的类的平均值。
问题是,当预测错误时,准确率就会真正降低。它添加了另一个类来计算平均值。例如:在语义分割中,图像的地面真实由4个类别(0,1,2,3)组成,并在数据集上表示6个类别。预测也是由4个类别(0,1,4,5)进行的,但分类为2和3(在地面真实中)的所有项目都被分类为4和5(在预测中)。在这种情况下,我们应该计算6个类的mIoU吗?即使4个类是完全错误的,并且它们各自的IoU是0?所以问题是,如果只预测了一个不在ground_truth中的类中的一个像素,我们必须除以一个更高的分母,这会大大降低得分。
这是计算多类(和语义分割)的mIoU的正确方法吗?
发布于 2020-11-27 16:08:09
我没有计算每个图像的miou,然后计算所有图像的“均值”miou,而是将miou计算为一个大图像。如果一个类不在图像中,并且没有被预测,我将相应的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
表示地面实况标签的数组,使用pred
表示关联图像的预测(数组中必须对应且大小相同)。
https://stackoverflow.com/questions/61886539
复制相似问题