Оценить искажение карты характеристик VGG16 с Tensorflow - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий код для оценки искажения двух изображений с использованием предварительно обученной модели VGG16 (без полностью подключенного включения) в тензорном потоке.Это всего лишь небольшая исследовательская работа моего первого обучения по CNN.Таким образом, я просто пользуюсь моделями, прошедшими предварительную подготовку, и планирую отладить их в будущем для моего случая.

Итак, допустим, у меня есть исходные и зашумленные цветные изображения в качестве входных данных с размером 64x64, поданных на модель.Я извлекаю карты характеристик предварительно подготовленной модели VGG16 для обоих входных изображений, а затем вычисляю их разницу, используя SSIM в качестве функции потерь.Вкратце, моя цель - получить искажение восприятия на основе модели CNN.У меня есть несколько вопросов:

  1. Я понимаю, что стандартное входное измерение VGG16 составляет 224x224x3 (высота x ширина x цвет).Я использую 64x64x3, потому что это будет мой случай, и он слишком тяжел для моего компьютера, чтобы обработать 224x224x3.Я могу получить результаты SSIM для всех уровней, кроме последнего слоя свертки, с параметром SSIM multichannel = False или multichannel = False.Для последнего слоя свертки мне выдается сообщение об ошибке: win_size exceeds image extent. И я не знаю, как с этим справиться.Мое первое предположение: из-за того, что его размер слишком мал для SSIM
  2. , я прочитал обсуждение, в котором говорилось, что, когда вход VGG16 не соответствует стандартному измерению, было бы лучше рассчитать разницу с multichannel = False.Это правда, но это заставило меня задуматься, что это означает, что я потеряю много информации о функциях, не вычисляя ее в цветных изображениях.Пожалуйста, поправьте меня.
  3. Было бы лучше, если бы я вычислял искажение напрямую, без выравнивания и нормализации?Если да, то как мне это сделать?Без сглаживания и нормализации, это дает мне ту же ошибку, что и в пункте 1, потому что результаты свертки будут слишком большими, чтобы быть переданными в функцию SSIM.
  4. Я попытался оценить ssim, используя tf.image.ssim, но этотерпит неудачу в линии shape1 = img1.get_shape().with_rank_at_least(3).Я думаю, что это связано с тем, что эта функция основана на numpy, и она выполняет ту же операцию, что и функция ssim, которую я сделал в моем коде ниже.
  5. Если есть другие более эффективные функции потерь, чем 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
...