首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多类语义分割模型评价

多类语义分割模型评价
EN

Stack Overflow用户
提问于 2020-06-19 00:16:53
回答 1查看 6.2K关注 0票数 3

我正在做一个关于多类语义分割的项目。我已经制定了一个模型,输出相当下降分割图像通过减少损失值。但是,我不能用度量来评估模型的性能,例如meanIoU或Dice系数。在二值语义分割的情况下,只需将阈值设置为0.5,将输出作为目标或背景进行分类,但对于多类语义分割则不起作用。请告诉我如何获得上述指标的模型性能好吗?任何帮助都将不胜感激!

顺便说一下,我使用的是PyTorch框架和CamVid数据集。

EN

回答 1

Stack Overflow用户

发布于 2020-06-19 06:46:43

如果有人对这个答案感兴趣,也请看本期。该问题的作者指出,mIoU可以用一种不同的方法来计算(这一方法在文献中被更多地接受)。因此,在为任何正式发布使用实现之前,请考虑这一点。

基本上,问题海报建议的另一种方法是在整个数据集上分别积累交叉和联合,并在最后一步对它们进行划分。下面的原始答案中的方法计算一批图像的交集和合并,然后将它们分割为当前批的IoU,然后在整个数据集上取一个IoU的平均值。

但是,下面这个给定的原始方法是有问题的,因为最终的平均IoU会随批处理大小而变化。另一方面,mIoU不会随问题所在中提到的方法的批处理大小而变化,因为单独的累积将确保批大小无关(虽然更高的批大小肯定有助于加快评估)。

原始答案:

下面给出了一个在IoU中实现均值PyTorch (交集超过联合)的方法。

代码语言:javascript
复制
def mIOU(label, pred, num_classes=19):
    pred = F.softmax(pred, dim=1)              
    pred = torch.argmax(pred, dim=1).squeeze(1)
    iou_list = list()
    present_iou_list = list()

    pred = pred.view(-1)
    label = label.view(-1)
    # Note: Following for loop goes from 0 to (num_classes-1)
    # and ignore_index is num_classes, thus ignore_index is
    # not considered in computation of IoU.
    for sem_class in range(num_classes):
        pred_inds = (pred == sem_class)
        target_inds = (label == sem_class)
        if target_inds.long().sum().item() == 0:
            iou_now = float('nan')
        else: 
            intersection_now = (pred_inds[target_inds]).long().sum().item()
            union_now = pred_inds.long().sum().item() + target_inds.long().sum().item() - intersection_now
            iou_now = float(intersection_now) / float(union_now)
            present_iou_list.append(iou_now)
        iou_list.append(iou_now)
    return np.mean(present_iou_list)

您的模型的预测将是一个热门形式,所以首先以softmax (如果您的模型还没有),然后是argmax,以获得在每个像素的概率最高的索引。然后,我们计算每个类的IoU (并在结尾取平均值)。

我们可以将预测和标签都重塑为一维向量(我读到它使计算速度更快)。对于每个类,我们首先使用pred_inds = (pred == sem_class)target_inds = (label == sem_class)标识该类的索引。生成的pred_indstarget_inds将有1 at像素标记为该特定类,而对于任何其他类则为0。

然后,有可能目标根本不包含特定的类。这将使该类的IoU计算无效,因为它不存在于目标中。因此,您为这样的类分配一个NaN IoU (以便以后可以识别它们),而不让它们参与平均值的计算。

如果目标中存在特定的类,那么pred_inds[target_inds]将给出一个1s和0的向量,其中具有1的索引是预测和目标相等的,否则为零。取所有元素之和,就会给我们交集。

如果我们添加pred_indstarget_inds的所有元素,我们将得到该特定类像素的并+交点。因此,我们减去已经计算过的交点,得到合并。然后,我们可以将交集和联合除以得到特定类的IoU,并将其添加到有效的IoU列表中。

最后,取整个列表的平均值来获得mIoU。如果你想要骰子系数,你可以用类似的方式计算它。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62461379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档