如何在语义分割中删除特定的标记像素

时间:2019-02-26 14:38:16

标签: tensorflow image-processing pytorch image-segmentation semantic-segmentation

我是语义分割的新手。我使用FCN训练我的数据集。在数据集中,有一些未知类的像素。我想从损失中排除此类。因此,我根据整个数据集的类分布定义了一个权重,并将未知类的权重设置为零,如下所示。但是我仍然对这堂课有所预测。您是否知道如何正确排除一个特定的班级?

loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits
                      (logits=logits, labels=tf.squeeze(annotation,
                                                        squeeze_dims=[3]),name="entropy"))
weighted_losses = (loss * weights)
train_op = optimizer.minimize(weighted_losses,
                                  var_list=tf.trainable_variables(),
                                  global_step=tf.train.get_global_step())

我不知道pytorch,但是我听说损失函数中有一些用于此目的的“ ignore_index”,您可以忽略特定的类。如果这是解决我的问题的正确方法,那么您是否知道张量流中是否存在等效的东西?

1 个答案:

答案 0 :(得分:1)

对于语义分割,您有2个“特殊”标签:一个是“背景”(通常为0),另一个是“忽略”(通常为255或-1)。

  • “背景”与所有其他语义标签一样,意味着“我知道该像素不属于我正在使用的任何语义类别”。在适当的情况下,模型正确输出“背景”非常重要。
  • “忽略”标签不是您的模型可以预测的标签-它在其范围“之外”。该标签仅存在于训练注释中,意思是“我们不确定应如何标记此像素,因此只需忽略它即可。”

当目标标签中有“忽略”像素时,您的模型无法(也不应该)输出“忽略”标签。但是,您的模型应该输出 something 。该像素被标记为“忽略”的事实意味着损失函数将忽略模型为该像素输出的任何结果(假设您告诉损失忽略“忽略”像素)。此外,如果您的测试/验证集带有“忽略”标签,则意味着您的模型为这些像素输出的任何内容都将被评分机制忽略,而不会被视为正确或错误的预测。

总结:即使地面真相具有“忽略”标签,模型也不能也不应该输出“忽略”。它只是输出任何感觉上有效的标签,而且完全可以。

对于张量流,您可以检出this thread