Computer vision 如何计算图像分割中的平均IU分数?

Computer vision 如何计算图像分割中的平均IU分数?,computer-vision,image-segmentation,evaluation-strategy,Computer Vision,Image Segmentation,Evaluation Strategy,如何计算论文中的平均IU(联合平均交集)分数 朗、乔纳森、埃文·谢尔哈默和特雷弗·达雷尔。“用于语义分割的完全卷积网络。” 对于每个类别,联合交叉(IU)分数为: 真阳性/(真阳性+假阳性+假阴性) 平均IU只是所有类别的平均值 关于文件中的符号: n_cl:类的数量 t_i:类i中的像素总数 n_ij:预测属于j类的i类像素数。第一类: n_ii:正确分类的像素数(正数) n_ij:错误分类的像素数(误报) n_ji:错误分类的像素数(假阴性) 您可以在Pascak DevKit中找

如何计算论文中的平均IU(联合平均交集)分数

朗、乔纳森、埃文·谢尔哈默和特雷弗·达雷尔。“用于语义分割的完全卷积网络。”

对于每个类别,联合交叉(IU)分数为:

真阳性/(真阳性+假阳性+假阴性)

平均IU只是所有类别的平均值


关于文件中的符号:

  • n_cl:类的数量
  • t_i:类i中的像素总数
  • n_ij:预测属于j类的i类像素数。第一类:

    • n_ii:正确分类的像素数(正数)
    • n_ij:错误分类的像素数(误报)
    • n_ji:错误分类的像素数(假阴性)
您可以在Pascak DevKit中找到直接计算该值的matlab代码,这应该会有所帮助

def computeIoU(y_pred_batch, y_true_batch):
    return np.mean(np.asarray([pixelAccuracy(y_pred_batch[i], y_true_batch[i]) for i in range(len(y_true_batch))])) 

def pixelAccuracy(y_pred, y_true):
    y_pred = np.argmax(np.reshape(y_pred,[N_CLASSES_PASCAL,img_rows,img_cols]),axis=0)
    y_true = np.argmax(np.reshape(y_true,[N_CLASSES_PASCAL,img_rows,img_cols]),axis=0)
    y_pred = y_pred * (y_true>0)

    return 1.0 * np.sum((y_pred==y_true)*(y_true>0)) /  np.sum(y_true>0)

jaccard\u similarity\u score
(per)可用于获得与上述@Alex zhai代码相同的结果:

import numpy as np
from sklearn.metrics import jaccard_score

y_true = np.array([[0, 1, 1],
                   [1, 1, 0]])
y_pred = np.array([[1, 1, 1],
                   [1, 0, 0]])

labels = [0, 1]
jaccards = []
for label in labels:
    jaccard = jaccard_score(y_pred.flatten(),y_true.flatten(), pos_label=label)
    jaccards.append(jaccard)
print(f'avg={np.mean(jaccards)}')

@随机的时代精神检查我认为这只适用于矩形边界框。对于不规则形状,我认为应该有效。如果我对数据集中的每个图像计算IOU,如
真阳性/(真阳性+假阳性+假阴性)
,下一步该怎么办?我应该计算所有图像IOU的平均值吗?如果在某些图像上,某些类未显示且未预测,因此
I=0
U=0
,那么在平均IOU时,我是否需要为每个类分别设置“计数器”?您必须计算测试集中所有图像的tp/(tp+fp+fn)。这意味着您将测试集中每个类的所有图像的tp、fp、fn相加,然后计算IoU。取每个图像欠条的平均值会导致错误的全局欠条。“取每个图像欠条的平均值”我不是这么说的。计算每个类中所有像素的IoU,然后取所有类的平均IoU。另请参见:输出
y_pred
的形状是
n_classes*h*w
我们想将它们转换为一个图像,其中像素值等于该像素处的类,这就是为什么我们在类轴上取arg max。我必须在这里使用
返回np.nanmean
,因为0可以在一个有效的混淆矩阵中(正确地说,我们从不试图预测某些东西,留下0个混淆)
import numpy as np
from sklearn.metrics import jaccard_score

y_true = np.array([[0, 1, 1],
                   [1, 1, 0]])
y_pred = np.array([[1, 1, 1],
                   [1, 0, 0]])

labels = [0, 1]
jaccards = []
for label in labels:
    jaccard = jaccard_score(y_pred.flatten(),y_true.flatten(), pos_label=label)
    jaccards.append(jaccard)
print(f'avg={np.mean(jaccards)}')