繁体   English   中英

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

[英]Output image color is not correct using perceptual loss with keras pretrained vgg16

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

如果我不对输入图像进行预处理,则表示输入为RGB,范围为0〜255。 输出如下: 输出图像(RGB,0〜255)标签图像暗。

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

然后我以比率-> 10:1(感性损失:MSE)添加MSE损失输出与输出图像没有区别(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)))

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

“您的”模型的输出与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)))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM