使用 U-Net 作为单层进行语义分割的输入标签

Posted

技术标签:

【中文标题】使用 U-Net 作为单层进行语义分割的输入标签【英文标题】:Input labels for semantic segmentation with U-Net as single layer 【发布时间】:2019-07-19 01:23:49 【问题描述】:

例如,在使用 U-Net 进行语义分割时,将标签数据提供为 one-hot-encoded 张量似乎是一种常见的做法。 In another SO question,一位用户指出这是由于标签通常代表分类值。将它们作为仅一层内的类标签(作为灰度强度值)馈送到网络会带来困难。

然而,在another blog post,作者解释说标签

"[...] 有时 [get] 打包为灰度图像,其中像素强度表示类 id [...]。这种方法可能是最容易使用的。它允许使用较小的文件大小分布和 [...] 一个热向量表示 [使用] 比 [灰度编码格式] 更多的内存。”

我的硬件非常有限,我希望将标签编码为 1 层灰度张量,而不是 n 层(n 是要分段的类数),从而降低内存使用率。但是,该博客的作者随后也指出:

“即使您使用的深度学习框架接受标签数据作为类 id,如 [灰度格式],它也会在后台将该数据转换为 one-hot 编码。”

这是否意味着,在内存方面毕竟不会有任何节省?

如果值得,我将如何继续在数据集阅读器中实现它?我也没有遇到任何实现,实际上已经实践了灰度标签。因此,我还要感谢任何指向使用灰度标签进行语义分割的实现的链接!

我正在使用 PyTorch,我的代码基于 this implementation,不同之处在于我有 3 个类要分段。

非常感谢任何建议/链接!

【问题讨论】:

【参考方案1】:

这可以帮助您节省磁盘内存,因为您可以将标签(ground truth)存储为灰度图像(宽度、高度、1)而不是更大的 3D 形状张量(宽度、高度、n )。但是,在训练过程中,您必须将灰度地面实况图像转换为 3D 张量才能训练您的网络。所以它不会帮助您降低进程的 RAM 成本。

如果您确实需要减少 RAM 使用量,可以减少训练批次大小或图像大小。

【讨论】:

感谢您的回答!你知道为什么网络需要将灰度标签转换为 n 通道张量吗?也非常感谢任何对此进行解释的参考!

以上是关于使用 U-Net 作为单层进行语义分割的输入标签的主要内容,如果未能解决你的问题,请参考以下文章

使用 TensorRT 部署语义分割网络(U-Net)(不支持上采样)

U-Net图像语义分割实战:训练自己的数据集

语义分割初识U-Net

深度学习语义分割网络介绍对比-FCN,SegNet,U-net DeconvNet

语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;

U-Net 语义分割模型在新图像上测试时失败