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

46qrfjad  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(217)

我是深度学习和Keras的新手。我正在尝试使用keras训练感知损失的Unet。输出图像颜色有问题。我的输入图像是彩色图像(RGB)。
如果我不对输入图像进行预处理,这意味着输入是0~255的RGB。输出如下:output image(RGB with 0~255)label image暗。
我发现预先训练的vgg 16模型使用了“caffe”权重。函数keras。应用程序。vgg16.preprocess_input将RGB更改为BGR并减去平均值。所以我试着用keras。应用程序。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)))

如果你有什么想法,请告诉我。多谢了!!!

5ktev3wc

5ktev3wc1#

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

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

wsewodh2

wsewodh22#

我在实践中看到的是,当将BatchNormalization层放置在ReLU激活函数之后时,输出亮度会发生相当大的变化,导致更暗(或在某些情况下更亮)的图像。
这是有意义的,因为ReLU将丢弃过滤器Map中的所有负值,导致批处理规范将整个事情向下移动,逐渐降低每个像素上的强度。
如果没有更多关于您的模型的细节,很难告诉这是否是您的情况,但我想到发布这个,当我遇到这个问题时,我找不到任何关于为什么会发生这种情况的信息。

相关问题