我正在使用TensorFlow处理一个图像超分辨率问题(包括2D和3D),并使用SSIM作为eval_metrics之一。
我用的是TF的image.ssim和skimage的measure.comapre_ssim。这两种方法对2D的结果都是一样的,但是对于3D卷的结果总是有差异的。
我研究了TF-执行和skimage实训的源代码。在这两种实现中,在如何考虑和处理输入映像方面,似乎存在一些根本的差异。
复制问题的代码:
import numpy as np
import tensorflow as tf
from skimage import measure
# For 2-D case
np.random.seed(12345)
a = np.random.random([32, 32, 64])
b = np.random.random([32, 32, 64])
a_ = tf.convert_to_tensor(a)
b_ = tf.convert_to_tensor(b)
ssim_2d_tf = tf.image.ssim(a_, b_, 1.0)
ssim_2d_sk = measure.compare_ssim(a, b, multichannel=True, gaussian_weights=True, data_range=1.0, use_sample_covariance=False)
print (tf.Session().run(ssim_2d_tf), ssim_2d_sk)
# For 3-D case
np.random.seed(12345)
a = np.random.random([32, 32, 32, 64])
b = np.random.random([32, 32, 32, 64])
a_ = tf.convert_to_tensor(a)
b_ = tf.convert_to_tensor(b)
ssim_3d_tf = tf.image.ssim(a_, b_, 1.0)
ssim_3d_sk = measure.compare_ssim(a, b, multichannel=True, gaussian_weights=True, data_range=1.0, use_sample_covariance=False)
s_3d_tf = tf.Session().run(ssim_3d_tf)
print (np.mean(s_3d_tf), ssim_3d_sk)在3D情况下,我必须取输出的平均值,因为Tensorflow在最后的三维上计算SSIM,从而得到32 SSIM值。这表明TF以NHWC格式考虑SSIM的图像。这对SSIM比3D卷更好吗?
然而,skimage似乎在使用一维高斯滤波器。因此,很明显,即使这样,也没有考虑到3D卷的深度。
有人能给我一些启发,帮助我决定进一步使用哪一个吗?为什么?
发布于 2018-12-26 16:27:49
粗略地看一下代码,TensorFlow似乎总是为批处理中的每个图像和每个通道计算一个2D SSIM。它对跨通道的SSIM值进行平均值,并为批处理中的每个图像返回一个值。对于TF,4D阵列是多通道2D图像的集合。
相反,SciKit-Image计算所有维度上的SSIM,如果设置了multichannel,则不包括最后一个维度。因此,在4D阵列的情况下,它计算每个通道的3D SSIM,以及跨通道的平均值。
这与您对3D数组的相似结果的发现是一致的,但是对于4D数组则有不同的结果。
然而,skimage似乎使用的是一维高斯滤波器。
我不知道这是从哪里来的,SciKit-Image在n_D图像中使用_n_D高斯。然而,高斯滤波器是一个可分离的滤波器,这意味着它可以由一维滤波器的_n应用程序有效地实现。
https://stackoverflow.com/questions/53933528
复制相似问题