使用 keras 预训练 vgg16 的感知损失,输出图像颜色不正确

Posted

技术标签:

【中文标题】使用 keras 预训练 vgg16 的感知损失,输出图像颜色不正确【英文标题】:Output image color is not correct using perceptual loss with keras pretrained vgg16 【发布时间】:2018-11-12 20:46:01 【问题描述】:

我是深度学习和 keras 的新手。 我正在尝试使用 keras 训练具有感知损失的 Unet。 我的输出图像颜色有问题。 我的输入图像是彩色图像(RGB)。

如果我不对输入图像进行预处理,这意味着输入是 0~255 的 RGB。 输出如下: output image(RGB with 0~255) 它比label image 更暗。

我发现预训练的 vgg16 模型使用的是“caffe”权重。并且函数 keras.applications.vgg16.preprocess_input 会将 RGB 更改为 BGR 并减去平均值。 所以我尝试使用 keras.applications.vgg16.preprocess_input 然后通过添加平均值然后变回 RGB 来处理输出图像。 但是输出图像太白了: output image(vgg16.preprocess_input)

然后我添加 MSE 损失,比例为 -> 10:1(感知损失:MSE) 输出没有什么不同 output image(vgg16.preprocess_input)

我想知道这是感知损失的常见问题还是我的代码有问题?

这是我的代码

预处理图像:

img = load_img(datapath, grayscale = False)
img = img.resize( (resize_size, resize_size), Image.BILINEAR )
img = img_to_array(img)
img = preprocess_input(img)

处理图像:

mean = [103.939, 116.779, 123.68]
img[..., 0] += mean[0]
img[..., 1] += mean[1]
img[..., 2] += mean[2]
img = img[..., ::-1]

知觉损失:

def perceptual_loss(y_true, y_pred): 
    vgg = VGG16(include_top=False, weights='imagenet', input_shape=(resize_size, resize_size, 3)) 
    loss_model = Model(inputs=vgg.input, 
    outputs=vgg.get_layer('block3_conv3').output) 
    loss_model.trainable = False
    return K.mean(K.square(loss_model(y_true) - loss_model(y_pred)))

如果您有任何想法,请告诉我。非常感谢!!!

【问题讨论】:

【参考方案1】:

“你的”模型的输出与任何关于 VGG、caffe 等的东西都没有关系。

在您创建模型时定义它的是“您”。

因此,如果您的模型的输出必须介于 0 和 255 之间,一种可能性是将其最后一层设置为:

Activation('sigmoid')   
Lambda(lambda x: x*255)

然后你需要在感知损失中使用preprocess_input 函数:

def perceptual_loss(y_true, y_pred): 
    y_true = preprocess_input(y_true)
    y_pred = preprocess_input(y_pred)
    vgg = VGG16(include_top=False, weights='imagenet', input_shape=(resize_size, resize_size, 3)) 
    loss_model = Model(inputs=vgg.input, 
    outputs=vgg.get_layer('block3_conv3').output) 
    loss_model.trainable = False
    return K.mean(K.square(loss_model(y_true) - loss_model(y_pred)))

另一种可能性是对模型的输出进行后处理。 (但同样,输出的范围完全由您定义)。

【讨论】:

以上是关于使用 keras 预训练 vgg16 的感知损失,输出图像颜色不正确的主要内容,如果未能解决你的问题,请参考以下文章

使用预训练 vgg19 tensorflow,Keras 在 CNN 自动编码器中定义自定义损失(感知损失)

使用预训练的卷积神经网络__keras实现VGG16

markdown VGG-16预训练的Keras模型

如何取出预训练的 keras 模型的中间层

当用作预训练特征提取器时,VGG16 应该提取多少特征?

Keras深度学习实战——基于VGG19模型实现性别分类