TensorFlow:如何处理图像分割中的无效标记数据?
Posted
技术标签:
【中文标题】TensorFlow:如何处理图像分割中的无效标记数据?【英文标题】:TensorFlow: How to handle void labeled data in image segmentation? 【发布时间】:2018-02-16 06:54:05 【问题描述】:我想知道如何使用 TensorFlow 在图像分割中处理未标记的图像部分。例如,我的输入是高度 * 宽度 * 通道的图像。标签也是高*宽的大小,每个像素一个标签。
图像的某些部分带有注释,而其他部分则没有。我希望这些部分对梯度计算没有任何影响。此外,我对预测这个“无效”标签的网络不感兴趣。
这有标签或功能吗?目前我正在使用tf.nn.sparse_softmax_cross_entropy_with_logits
。
【问题讨论】:
反问:你怎么知道哪些部分被错误地标记了?或者您的网络如何知道哪些部分被错误标记? 看看这个数据集,例如:host.robots.ox.ac.uk/pascal/VOC/voc2012/segexamples/index.html 图像的像素标记为“空”,甚至是背景数据。我就是这样知道的。网络如何知道这几乎是我的问题。 好的,所以不是图像的某些部分没有正确注释,只是它们被注释了一些应该被忽略的指示? 您所谓的“可能无效数据”可能是您需要半监督学习的情况,并且有多种方法可以使其工作,以及使用 Tensorflow 实现实现。您的问题太宽泛了,从表面上看,甚至与软件开发无关。考虑对半监督学习任务进行更多研究,因为目前还没有适合 Stack Overflow 答案的规范答案。 理想情况下,您将使用像素级“信息增益”损失(这是“交叉熵”损失的概括) 【参考方案1】:如果我理解正确,您对每个图像的一部分都带有标签 void,您对此根本不感兴趣。既然没有简单的方法来获得这些空点背后的真实值,为什么不将这些点映射到背景标签并尝试为您的模型获取结果呢?我会尝试在预处理状态下从这个空白标签中清除数据标签,并用背景标签替换它们。
另一种可能的策略,如果您只是想将 void 标签映射到背景,则运行一个遮罩(从右到左从上到下连续运动)以检查来自 void 像素的 neigthbooring 像素(假设5x5 像素的区域)并为 void 像素分配除 void 之外最常见的标签。
您还可以始终保留更好的数据子集,过滤无效标签百分比超过阈值的数据。您可以只保留没有空白标签的图像,或者更可能的是,您可以保留仅低于阈值(例如 5%)的未标记点的图像。在此图像中,您可以实施上述替换无效标签的策略。
【讨论】:
我已经尝试了您的第一个建议。我已将所有空白数据标记为标签 0,不幸的是,网络随后对非空白区域进行了标签 0 预测。这是由于我的数据的性质,我猜。这就是为什么我希望有一个可以在 caffe 中找到的 void 标签。 网络总是会错误分类像素,即使在训练数据中也无法达到完美的准确性。你替换了多少像素,你的图像中有多少百分比有空白标签?也许您应该过滤所有带有 void 标签的图像并运行您的模型,看看您的代码是否还有其他问题,而不是带有 void 标签的图像【参考方案2】:我对 TF 不是 100% 熟悉。但是,你有没有考虑过使用损失的weights
参数呢?
查看tf.loses.sparse_softmax_cross_entropy
有一个参数weights
weights
:损失系数。这必须是标量或与标签具有相同的等级
您可以将weight
of "void" 像素设置为零,从而使损失忽略它们。
您还可以从tf.nn.sparse_softmax_cross_entropy_with_logits
中删除减少并使用tf.losses.compute_weighted_loss
执行加权。
【讨论】:
仅供参考,参考tf.losses.softmax_cross_entropy
也存在,以满足您的非稀疏需求以上是关于TensorFlow:如何处理图像分割中的无效标记数据?的主要内容,如果未能解决你的问题,请参考以下文章
matlab图像显示中如何处理只对图像的一部分处理,是不相当于图像的分割?
如何处理 Google Map Direction API 中的 0,0 标记错误?
如何处理 Spring Boot Rest 和 Jackson Deserializer 的 Javax 验证中的无效数字