Работа с функцией потерь SSIM в тензорном потоке для изображений RGB

Я хочу использовать метрику SSIM в качестве функции потерь для модели, над которой я работаю в тензорном потоке. 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 (с точки зрения реконструированных каналов изображения) в тензорном потоке?


person Yousif H    schedule 14.10.2018    source источник
comment
Могу я спросить, какую функцию вы использовали для обновления градиента во время этих экспериментов? Я пытаюсь реализовать SSIM как функцию потерь в тензорном потоке, но он выдает значения NaN, и через 1 эпоху нет выходного изображения. Тот же код работал для среднеквадратичных потерь. Спасибо.   -  person shaurov2253    schedule 28.11.2020
comment
@ shaurov2253 Мне просто нужно было указать «оптимизатор 2-го порядка», как в приведенном ниже ответе (Адам), вместе со скоростью обучения и УВЕЛИЧЕНИЕМ функции потерь вместо ее уменьшения (поскольку здесь выше функция потерь (SSIM), тем лучше). Остальную часть процедуры оптимизации я оставил на выполнение функции tensoflow (значения и функции по умолчанию).   -  person Yousif H    schedule 29.11.2020
comment
Я использую tf.GradientTape () для вычисления градиента в TF2. Не уверен, что это вызывает проблему.   -  person shaurov2253    schedule 03.12.2020


Ответы (3)


Мне удалось решить эту проблему, изменив динамический диапазон изображений на 2.0, так как у меня изображения масштабируются между [-1, 1] с помощью:

loss_rec = tf.reduce_mean(tf.image.ssim(truth, reconstructed, 2.0))

А поскольку лучшее качество изображения демонстрирует более высокое значение SSIM, мне пришлось минимизировать отрицательный моей функции потерь (SSIM), чтобы оптимизировать мою модель:

optimizer = tf.train.AdamOptimizer(learning_rate).minimize(-1 * loss_rec)

person Yousif H    schedule 18.11.2018
comment
Я проверил SSIM с помощью этой функции для двух изображений в случае ненормализованного с maxval = 255, нормализованного между 0 и 1 с maxval = 1 и нормализованного между -1 и 1 с maxval = 2. Первые два случая дают аналогичный результат, а последний - нет. Это заставило меня подумать, что, возможно, это не решение. - person shaurov2253; 25.11.2020

SSIM предназначен только для измерения разницы между двумя сигналами яркости. Перед измерением сходства изображения RGB преобразуются в оттенки серого. Если бы это было возвращено в функцию потерь, она не узнала бы, теряет ли изображение насыщенность цвета, потому что это не будет отображаться в метрике ошибки. Это всего лишь теория.

person James Stanard    schedule 16.11.2018

В документации TensorFlow сказано, что преобразование цветового пространства не применяется.

https://www.tensorflow.org/api_docs/python/tf/image/ssim

«Примечание. Настоящий SSIM определяется только в градациях серого. Эта функция не выполняет никакого преобразования цветового пространства. (Если ввод уже является YUV, тогда будет вычислено среднее значение YUV SSIM.)»

person ai2ys    schedule 26.06.2019