我想使用 SSIM指标作为我在 tensorflow 中正在研究的模型的损失函数。 SSIM应该测量我的去噪自动编码器的重构输出图像与输入的未破坏图像(RGB)之间的相似性。
据我了解,为了在张量流中使用SSIM指标,图像应归一化为[0,1]或[0,255],而不是[-1,1]。将张量转换为[0,1]并将SSIM作为损失函数实现后,重建的图像将是黑白图像,而不是彩色RGB图像。
tf.reduce_mean(tf.image.ssim(reconstructed, truth, 1.0))
我的模型在 MSE (均方误差)下工作正常,重建的图像是彩色(RGB)。
使用tf.losses.mean_squared_error(truth, reconstructed)
重建的图像将是RGB图像,而使用SSIM则将获得一维图像。
为什么使用 SSIM作为损失函数在张量流中给我的结果与MSE 不同(在重建图像通道方面)?
答案 0 :(得分:2)
我能够通过将图像的动态范围更改为 2.0 来解决此问题,因为我在 [-1,1] 之间缩放了图像,范围为:< / p>
loss_rec = tf.reduce_mean(tf.image.ssim(truth, reconstructed, 2.0))
由于较高的 SSIM 值可显示更好的图像质量,因此我必须最小化损失函数(SSIM)的负数以优化模型:< / p>
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(-1 * loss_rec)
答案 1 :(得分:0)
SSIM旨在仅测量两个亮度信号之间的差异。在测量相似度之前,将RGB图像转换为灰度。如果将其反馈到损失函数中,它将不会知道图像是否正在失去色彩饱和度,因为它不会显示在误差指标中。那只是一个理论。
答案 2 :(得分:0)
TensorFlow文档说没有应用色彩空间转换。
https://www.tensorflow.org/api_docs/python/tf/image/ssim
“注意:真正的SSIM仅在灰度上定义。此函数不执行任何色彩空间转换。(如果输入已经是YUV,则它将计算YUV SSIM平均值。)”