如何处理语义分割中未知类的平均交集(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)?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理版本列表中包含的字符串导致的错误,按StrictVersion排序?