Вывести вывод слоя vgg19 как изображение - PullRequest
0 голосов
/ 22 ноября 2018

Я читал эту статью: Нейронный стиль передачи .В этой статье автор реконструирует изображение из выходных слоев vgg19.Я использую Keras.Размер вывода слоя block1_conv1 составляет (1, 400, 533, 64).Здесь 1 - количество изображений на входе, 400 - количество строк, 533 количество столбцов и 64 количество каналов.Когда я пытаюсь восстановить его как изображение, я получаю ошибку, так как размер изображения 13644800, который не кратен 3, поэтому я не могу отобразить изображение в трех каналах.Как я могу восстановить это изображение?

Я хочу восстановить изображения из слоев, как показано ниже: image reconstruction from vgg layers Ниже приведен код для того же:

from keras.preprocessing.image import load_img, img_to_array
from scipy.misc import imsave
import numpy as np
from keras.applications import vgg19
from keras import backend as K

CONTENT_IMAGE_FN = store image as input here

def preprocess_image(image_path):
    img = load_img(image_path, target_size=(img_nrows, img_ncols))
    img = img_to_array(img)
    img = np.expand_dims(img, axis=0)
    img = vgg19.preprocess_input(img)
    return img

width, height = load_img(CONTENT_IMAGE_FN).size
img_nrows = 400
img_ncols = int(width * img_nrows / height)
base_image = K.variable(preprocess_image(CONTENT_IMAGE_FN))

RESULT_DIR = "generated/"
RESULT_PREFIX = RESULT_DIR + "gen"
if not os.path.exists(RESULT_DIR):
  os.makedirs(RESULT_DIR)
result_prefix = RESULT_PREFIX

# this will contain our generated image
if K.image_data_format() == 'channels_first':
    combination_image = K.placeholder((1, 3, img_nrows, img_ncols))
else:
    combination_image = K.placeholder((1, img_nrows, img_ncols, 3))

x = preprocess_image(CONTENT_IMAGE_FN)

outputs_dict = dict([(layer.name, layer.output) for layer in model.layers])
feature_layers = ['block1_conv1', 'block2_conv1',
                  'block3_conv1', 'block4_conv1',
                  'block5_conv1']
outputs = []
for layer_name in feature_layers:
  outputs.append(outputs_dict[layer_name])
functor = K.function([combination_image], outputs )   # evaluation function

# Testing
test = x
layer_outs = functor([test])
print(layer_outs)

layer_outs[0].reshape(400, -1 , 3) //getting error here

Я получаю следующую ошибку:

ValueError: cannot reshape array of size 13644800 into shape (400,newaxis,3)

1 Ответ

0 голосов
/ 23 ноября 2018

Вы писали:

"Размер вывода слоя block1_conv1 равен (1, 400, 533, 64). Здесь 1 - количество изображений на входе, 400 - числострок, 533 числа столбцов и 64 количества каналов "Но это не правильно.Выход block1_conv1 соответствует одному измерению канала (канал первый), размеру изображения 400 * 533 и 64 фильтрам .

Ошибка возникает при попытке изменить векторVGG19 вывод изображения с 1-канальным (400 * 533 * 64 = 13644800) к вектору, который соответствует 3-канальному выходу.

Кроме того, вы должны передать 3 канала вход:

Из VGG19 код:

input_shape: необязательный кортеж формы, указывается только в том случае, если include_top имеет значение False (в противном случае форма ввода должна быть (224, 224, 3) (с форматом данных channels_last) или (3, 224, 224) (с форматом данных channels_first)Он должен иметь ровно 3 входных канала, а ширина и высота должны быть не меньше 32. Например, (200, 200, 3) будет одним допустимым значением.

Таким образом, ваши входные изображения должны быть 3 каналами.Вы даже хотите подавать изображения с 1 каналом (в градациях серого) на VGG19, если вы хотите channels first:

X = np.repeat(X, 3 , axis=0) 

или

X = np.repeat(X, 3 , axis=2) 

, если channels last без размера партии или

X = np.repeat(X, 3 , axis=3) 

с размером партии .

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

...