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

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

我是语义分割的新手。我使用 FCN 来训练我的数据集。在数据集中有一些未知类的像素。我想把这个类(class)排除在我的损失之外。所以我根据整个数据集的类分布定义了一个权重,并将未知类的权重设置为零,如下所示。但我仍然得到这门课的预测。您知道如何正确排除一个特定类别吗?

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”,你可以忽略一个特定的类。如果这是解决我的问题的正确方法,你知道 tensorflow 中是否有等效的东西吗?

最佳答案

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

  • “背景”就像所有其他语义标签一样,意思是“我知道这个像素不属于我正在使用的任何语义类别”。重要的是您的模型在适用时正确输出“背景”。
  • “忽略”标签不是您的模型可以预测的标签 - 它“超出”其范围。该标签只存在于训练注释中,意思是“我们不确定应该如何标记这个像素,所以忽略它”。

当目标标签中有“忽略”像素时,您的模型不能(也不应该)输出“忽略”标签。尽管如此,您的模型应该输出一些东西。这个像素被标记为“忽略”的事实意味着无论你的模型为该像素输出什么,都会被损失函数忽略(假设你告诉损失忽略“忽略”像素)。此外,如果您的测试/验证集具有“忽略”标签,则意味着无论您的模型为这些像素输出什么,它都会被评分机制简单地忽略,并且不会被计为正确或错误的预测。

总结一下:即使 ground truth 有“ignore”标签,模型也不能也不应该输出“ignore”。它只是输出它感觉的任何有效标签,这完全没问题。

对于 tensorflow,您可以查看 this thread .

关于tensorflow - 如何在语义分割中删除特定标记的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54887933/

相关文章:

python - 自定义 keras 损失函数

python - 使用 Python 进行图像变形

ios - 如何在 ios 中显示带有 wmf 图像的 rtf 文件

pytorch - 使用 autograd 计算相对于输入的输出雅可比矩阵

python - `images, labels = dataiter.next() ` 在 PyTorch 教程中如何工作?

tensorflow - Tensorflow 的 DirectoryIterator 是如何工作的?

tensorflow - Keras CNN 对四个以上类别的过度拟合

c++ - 构建 Tensorflow 调试时出错 LNK2019

python - 使用 PIL 在 python 2.7 中将文本写入图像

pytorch - 运行 TRTorch 示例时为 "error while loading shared libraries: libnvinfer.so.7: cannot open shared object file: No such file or directory"