Я работаю над проблемой сверхвысокого разрешения изображения (как 2D, так и 3D) с использованием TensorFlow и использую SSIM в качестве одного из eval_metrics
.
Я использую image.ssim
от TF и measure.comapre_ssim
от skimage
. Оба они дают одинаковые результаты для 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 рассматривает изображения для SSIM в формате NHWC. Подходит ли это для SSIM по сравнению с 3D-томами?
skimage
однако, похоже, использует одномерные фильтры Гаусса. Так что ясно, что даже здесь не учитывается глубина 3D-объемов.
Может ли кто-нибудь пролить свет на них и помочь мне решить, какой из них использовать дальше и почему?