在图像预处理流水线中,是否应该先将每个像素值除以 255 重新缩放为 [0, 1],然后进行颜色失真、高斯模糊等数据变换?或相反亦然?
我相信正确性,它可能取决于特定的图像转换算法,或者您是否使用某些库。有什么一般性的建议吗?如果有人在之前或之后都有尝试过,请分享,特别是如果您使用可能对像素的值范围做出隐含假设的外部库或框架。
在图像预处理流水线中,是否应该先将每个像素值除以 255 重新缩放为 [0, 1],然后进行颜色失真、高斯模糊等数据变换?或相反亦然?
我相信正确性,它可能取决于特定的图像转换算法,或者您是否使用某些库。有什么一般性的建议吗?如果有人在之前或之后都有尝试过,请分享,特别是如果您使用可能对像素的值范围做出隐含假设的外部库或框架。
到目前为止,这似乎更像是一个软件“集成”问题。来自http://karpathy.github.io/2019/04/25/recipe/的一个很好的提示是在开发过程中尽可能频繁地可视化所有内容。对于数据增强,请尝试在图像进入您的卷积网络之前对其进行可视化。
我发现如果您的特定图像转换库尝试仅通过检查数据类型来检测您是否已重新缩放,则可能会发生错误。即,如果它看到浮点数,它将假定 [0, 1] 或者如果是整数,它将假定 [0, 255]。
如果您使用 tf.image.resize(...) 调整大小(不同时重新缩放),这可能会以失败告终。调整图像大小(例如到 224x224x3)具有将像素值转换为浮点数的“副作用”,同时仍然具有(大约)0.0-255.0 的范围。这样一来,下游库将看到一个浮点数并做出 [0, 1] 范围的错误假设,并完全搞砸了转换。如果您使用任何与颜色相关的变换,请务必小心,它们通常取决于像素值范围假设。
因此,如果您使用 tf.image,您可能会发现同时调整大小和重新缩放以确保 float => [0, 1] 更安全,这样您的下游颜色增强库最有可能工作。或者您只需要仔细管理类型并在必要时执行 tf.cast(...) 以满足任何库假设。
最后,人眼仍然需要验证它们。