У меня есть следующий код для оценки искажения двух изображений с использованием предварительно обученной модели VGG16 (без полностью подключенного включения) в тензорном потоке.Это всего лишь небольшая исследовательская работа моего первого обучения по CNN.Таким образом, я просто пользуюсь моделями, прошедшими предварительную подготовку, и планирую отладить их в будущем для моего случая.
Итак, допустим, у меня есть исходные и зашумленные цветные изображения в качестве входных данных с размером 64x64, поданных на модель.Я извлекаю карты характеристик предварительно подготовленной модели VGG16 для обоих входных изображений, а затем вычисляю их разницу, используя SSIM в качестве функции потерь.Вкратце, моя цель - получить искажение восприятия на основе модели CNN.У меня есть несколько вопросов:
- Я понимаю, что стандартное входное измерение VGG16 составляет 224x224x3 (высота x ширина x цвет).Я использую 64x64x3, потому что это будет мой случай, и он слишком тяжел для моего компьютера, чтобы обработать 224x224x3.Я могу получить результаты SSIM для всех уровней, кроме последнего слоя свертки, с параметром SSIM
multichannel = False
или multichannel = False
.Для последнего слоя свертки мне выдается сообщение об ошибке: win_size exceeds image extent.
И я не знаю, как с этим справиться.Мое первое предположение: из-за того, что его размер слишком мал для SSIM - , я прочитал обсуждение, в котором говорилось, что, когда вход VGG16 не соответствует стандартному измерению, было бы лучше рассчитать разницу с
multichannel = False
.Это правда, но это заставило меня задуматься, что это означает, что я потеряю много информации о функциях, не вычисляя ее в цветных изображениях.Пожалуйста, поправьте меня. - Было бы лучше, если бы я вычислял искажение напрямую, без выравнивания и нормализации?Если да, то как мне это сделать?Без сглаживания и нормализации, это дает мне ту же ошибку, что и в пункте 1, потому что результаты свертки будут слишком большими, чтобы быть переданными в функцию SSIM.
- Я попытался оценить ssim, используя
tf.image.ssim
, но этотерпит неудачу в линии shape1 = img1.get_shape().with_rank_at_least(3)
.Я думаю, что это связано с тем, что эта функция основана на numpy, и она выполняет ту же операцию, что и функция ssim, которую я сделал в моем коде ниже. - Если есть другие более эффективные функции потерь, чем SSIM, которые подходят для моегоцель, я действительно открыт, чтобы использовать любое лучшее предложение.
Извините, что у меня много вопросов только по этому делу.Поскольку я действительно надеюсь, что кто-то может помочь мне и дать мне лучшее понимание в то же время.Ура ...
from __future__ import print_function
from skimage import measure as metric
import numpy as np
import tensorflow as tf
from numpy import array
from vgg16_new import Vgg16
from utils.utils import *
import cv2
import matplotlib.pyplot as plt
from lap import lapjv
class CNN(object):
def __init__(self):
self.height = 64
self.width = 64
self.shape = np.array([64.0, 64.0])
self.sift_weight = 2.0
self.cnn_weight = 1.0
self.cnnph = tf.placeholder("float", [1, 64, 64, 3])
self.vgg = Vgg16()
self.vgg.build(self.cnnph)
def feature_maps_distortion(self, I_org, I_noized):
I_org = array(I_org).reshape(1, self.height, self.width, 3)
I_noized = array(I_noized).reshape(1, self.height, self.width, 3)
#CNN feature: propagate the images through VGG16
with tf.Session() as sess:
feed_dict = {self.cnnph: I_org}
D1_org, D2_org, D3_org = sess.run([
self.vgg.pool3, self.vgg.pool4, self.vgg.pool5
], feed_dict=feed_dict)
feed_dict = {self.cnnph: I_noized}
D1_noised, D2_noised, D3_noised = sess.run([
self.vgg.pool3, self.vgg.pool4, self.vgg.pool5
], feed_dict=feed_dict)
#flatten original input
DX1_org = np.reshape(D1_org[0], [-1, 256])
DX2_org = np.reshape(D2_org[0], [-1, 512])
DX3_org = np.reshape(D3_org[0], [-1, 512])
#flatten noised input
DX1_noised = np.reshape(D1_noised[0], [-1, 256])
DX2_noised = np.reshape(D2_noised[0], [-1, 512])
DX3_noised = np.reshape(D3_noised[0], [-1, 512])
#normalize original input
DX1_org = DX1_org / np.std(DX1_org)
DX2_org = DX2_org / np.std(DX2_org)
DX3_org = DX3_org / np.std(DX3_org)
#normalize noised input
DX1_noised = DX1_noised / np.std(DX1_noised)
DX2_noised = DX2_noised / np.std(DX2_noised)
DX3_noised = DX3_noised / np.std(DX3_noised)
#compute distortion with SSIM
s1 = metric.compare_ssim(DX1_org, DX1_noised, multichannel=False)
s2 = metric.compare_ssim(DX2_org, DX2_noised, multichannel=False)
#s3 = metric.compare_ssim(DX3_org, DX3_noised, multichannel=False)
#Calculate SSIM for s3 gives me error:
#win_size exceeds image extent. If the input is a
#multichannel (color) image, set multichannel=True.
print("SSIM pool_3: %.2f" % s1)
print("SSIM pool_4: %.2f" % s2)
#print("SSIM pool_5: %.2f" % s3)
del D1_org, D1_noised