如何处理语义分割中未知类的平均交集(mIOU)?

Posted

技术标签:

【中文标题】如何处理语义分割中未知类的平均交集(mIOU)?【英文标题】:How to handle the mean Intersection Over Union (mIOU) for unknown class in semantic segmentation? 【发布时间】:2019-08-01 22:06:50 【问题描述】:

我实现了一个 FCN 网络来进行语义分割。我使用 Cityscapes 作为我的数据集。如您所知,Cityscapes 中有一些类在训练期间被您忽略,它被标记为 255。我使用加权损失来忽略未知类的损失(将未知类的损失设置为零)。现在我想从我的评估指标中排除未知类(平均交叉联合(mIOU))。目前我不清楚如何排除未知类。

目前我正在考虑使用 tensorflow 方法的所有类,包括像这样的未知类:

 miou, confusion_mat = tf.metrics.mean_iou(labels=annotation, predictions=pred_annotation, num_classes=num_cls)

with tf.control_dependencies([tf.identity(confusion_mat)]):
    miou = tf.identity(miou)

我试过这个,但它给出了一个未绑定标签的错误(对于 unkonwn 标签)

miou, confusion_mat = tf.metrics.mean_iou(labels=annotation, predictions=pred_annotation, num_classes=(num_cls-1))

【问题讨论】:

我对 Cityscapes 数据集不熟悉,但是为什么你会在训练过程中忽略一些类呢?那么网络无法学习这些类,不是吗?您将在训练和测试中拆分数据集,但使用所有类,...? 感谢您的评论。重点是学习除未知类之外的所有类。未知类是为输入图像的任何像素定义的,这些像素超出了有趣的类,或者一些远离相机并且对于进行正确的类注释不明显的对象。正如我所提到的,由于未知类可能是由不同的根源产生的,所以我不想在我的训练中使用它。 【参考方案1】:

如果您想在计算 mIoU 期间忽略一个类,并且您可以访问混淆矩阵,那么您可以这样做:

    忽略由 tensorflow 计算的 miou(因为它考虑了所有类,这不是您想要的) 从混淆矩阵中删除与您要忽略的类相对应的行和列 使用新的混淆矩阵重新计算 miou 指标

如何从混淆矩阵中重新计算miou 度量?

第一堂课: iou_0 = conf_mat[0,0] / (sum(conf_mat[0,:]) + sum(conf_mat[:,0]) - conf_mat[0,0]) 二等奖: iou_1 = conf_mat[1,1] / (sum(conf_mat[1,:]) + sum(conf_mat[:,1]) - conf_mat[1,1]) ... 一般类j:iou_j = conf_matrix[j,j] / (sum(conf_mat[j,:]) + sum(conf_mat[:,j]) - conf_mat[j,j])

最后,对所有这些每个类求和并平均得到iou,得到miou

【讨论】:

以上是关于如何处理语义分割中未知类的平均交集(mIOU)?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 HTML 中可访问性的语义符号?

如何处理版本列表中包含的字符串导致的错误,按StrictVersion排序?

如何处理未知实体引用?

我应该如何处理 mysql 触发器中字段列表中未知的“Col_name”列?

TensorFlow:如何处理图像分割中的无效标记数据?

C getline() - 如何处理缓冲区/如何将未知数量的值读入数组