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

21

我在思考如何使用TensorFlow处理图像分割中未标记的部分。例如,我的输入是一个高度*宽度*通道数的图像。标签也是相同大小的高度*宽度,每个像素有一个标签。

图像的某些部分已经注释,其他部分没有。我希望这些部分对梯度计算没有任何影响。此外,我对网络预测“空”标签不感兴趣。

是否有一个标签或函数可以实现这一功能?目前我正在使用tf.nn.sparse_softmax_cross_entropy_with_logits


以这个数据集为例:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/segexamples/index.html 这些图像的像素被标记为“void”或者背景数据。这是我知道的方式。那么网络如何知道呢?这基本上就是我的问题。 - Gizmo
1
好的,所以图像的某些部分并没有被正确地注释,只是它们被注释为应该被忽略的一些指示? - Engineero
1
你所谓的“可能为空的数据”可能是需要半监督学习的情况,有多种方法可以使其工作,并且可以使用Tensorflow实现。你的问题太过宽泛,而且看起来甚至与软件开发无关。考虑在半监督学习任务上进行更多研究,因为目前没有一个标准答案适用于Stack Overflow的回答。 - E net4
可能是重复的问题:https://dev59.com/HZ7ha4cB1Zd3GeqPnbQo - Shai
2
理想情况下,您可以使用像素级的“信息增益”损失(这是“交叉熵”损失的一种推广)。 - user2469775
显示剩余2条评论
2个回答

13

我对TF不是100%熟悉。不过,你考虑过使用损失的weights参数吗?
查看tf.loses.sparse_softmax_cross_entropy,它具有一个weights参数。

weights:用于损失的系数。这必须是标量或与标签相同的等级

您可以将“void”像素的weight设置为零,从而使损失忽略它们。

您还可以从tf.nn.sparse_softmax_cross_entropy_with_logits中删除减少,并使用tf.losses.compute_weighted_loss执行加权。


2
只是提供信息和参考,tf.losses.softmax_cross_entropy也存在,适用于您的非稀疏需求。 - Toke Faurby
1
tf.keras.losses.SparseCategoricalCrossentropy: 它具有参数“ignore_class” (https://www.tensorflow.org/api_docs/python/tf/keras/losses/SparseCategoricalCrossentropy) - Víctor

2
如果我理解正确,您的每个图像都有一个标签为void的部分,而您对此部分完全不感兴趣。由于没有一种简单的方法可以获取这些虚空点背后的真实值,为什么不将这些点映射到背景标签,并尝试为模型获得结果呢?在预处理阶段,我建议清除数据标签中的这些虚空标签,并用背景标签替换它们。
另一种可能的策略是,在不仅仅将虚空标签映射到背景的情况下,运行一个掩码(从上到下从右到左连续运动),以检查虚空像素周围的像素(假设是一个5x5像素的区域),并将最常见的标签赋给虚空像素。
此外,您还可以始终保留更好的数据子集,过滤掉百分比超过阈值的虚空标签数据。您可以仅保留没有虚空标签的图像,或者更可能地,您可以保留仅具有少于阈值(例如5%)的未标记点的图像。在这些图像中,您可以实施前面提到的替换虚空标签的策略。

1
我已经尝试了您的第一个建议。我已将所有的void数据标记为标签0,但不幸的是,网络随后对非void区域进行了标签0的预测。我想这是由于我的数据性质所致。这就是为什么我希望能够像在caffe中一样找到void标签。 - Gizmo
1
网络总是会误分类像素,即使在训练数据中也无法达到完美的准确性。你替换了多少像素?你的图像中有多少百分比是空标签?也许你应该过滤掉所有带有空标签的图像,并运行你的模型,看看你的代码是否存在其他问题,而不是与具有空标签的图像有关的问题。 - Michail N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接