Keras Style Transfer удаляет нулевой центр по среднему пикселю

Я работаю над передачей стиля изображения с помощью Keras, но я застрял в части удаления нулевого центра по среднему пикселю.

from __future__ import print_function
from keras.preprocessing.image import load_img, img_to_array
from scipy.misc import imsave
import numpy as np
from scipy.optimize import fmin_l_bfgs_b
import time
import argparse

from keras.applications import vgg19
from keras import backend as K

base_image_path = "images/input.jpg"
style_reference_image_path = "images/style.jpg"
result_prefix = "output"
iterations = 10

# Weights
content_weight = 0.025
style_weight = 1.0
# total variation weight
total_variation_weight = 1.0

# output 
width, height = load_img(base_image_path).size
img_nrows = 400
img_ncols = int(width * img_nrows / height)

# Fit into VGG19 format
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

# Turning feature vectors into image
def deprocess_image(x):
    if K.image_data_format() == 'channels_first':
        x = x.reshape((3, img_nrows, img_ncols))
        x = x.transpose((1, 2, 0))
    else:
        x = x.reshape((img_nrows, img_ncols, 3))
    # (Remove zero-center by mean pixel)
    x[:, :, 0] += 103.939
    x[:, :, 1] += 116.779
    x[:, :, 2] += 123.68
    # 'BGR'->'RGB'
    x = x[:, :, ::-1]
    x = np.clip(x, 0, 255).astype('uint8')
    return x

Заключительная часть (удалить нулевой центр по среднему пикселю) я искал в Google, но не смог найти аналогичный подход. 103,939, 116,779 и 123,68 --› Я не смог рассчитать эти цифры, используя средние значения изображения.

И зачем там БГР? Разве они не должны быть в RGB в начале?


person kelvin.aaa2    schedule 29.09.2020    source источник


Ответы (1)


1. Модель Vgg-19 функция preprocessing_input документы:

def preprocess_input(x, data_format=None, mode='caffe', **kwargs):
"""Preprocesses a tensor or Numpy array encoding a batch of images.
# Arguments
    x: Input Numpy or symbolic tensor, 3D or 4D.
        The preprocessed data is written over the input data
        if the data types are compatible. To avoid this
        behaviour, `numpy.copy(x)` can be used.
    data_format: Data format of the image tensor/array.
    mode: One of "caffe", "tf" or "torch".
        - caffe: will convert the images from RGB to BGR,
            then will zero-center each color channel with
            respect to the ImageNet dataset,
            without scaling.
        - tf: will scale pixels between -1 and 1,
            sample-wise.
        - torch: will scale pixels between 0 and 1 and then
            will normalize each channel with respect to the
            ImageNet dataset.
# Returns
    Preprocessed tensor or Numpy array.

2. Короче говоря, изображения преобразуются из RGB в BGR, затем каждый цветовой канал центрируется по отношению к набору данных ImageNet без масштабирования, а средние значения, используемые для центрирования нуля для каждого канала, составляют [103,939, 116,779, 123,68].

3. В функции deprocess_image() одни и те же средние значения ([103,939, 116,779, 123,68]) добавляются к каждому соответствующему каналу, а затем преобразуются обратно в исходную форму из 'BGR' -> 'RGB ' ,

Примечание. Среднее значение набора данных — это среднее значение пикселей всех изображений по всем цветовым каналам (например, RBG). Изображения в оттенках серого будут иметь только одно среднее значение, а цветные изображения, такие как ImageNet, будут иметь 3 средних значения.

Обычно среднее значение рассчитывается на обучающем наборе, и одно и то же среднее значение используется для нормализации как обучающих, так и тестовых изображений.

person chantya    schedule 09.10.2020