我正在尝试使用 GAN 来填充图像的缺失部分,使用 SSIM 作为损失函数。填充很好,但是当我发现实际输出和预测输出之间的差异时,它会在差异图像中显示相同的缺失部分。我希望实际图像和预测图像的像素值差异尽可能小。
图像像素范围从 -7000 到 180000。我将其归一化为 [0,1]。
有什么办法可以改善吗?
我正在尝试使用 GAN 来填充图像的缺失部分,使用 SSIM 作为损失函数。填充很好,但是当我发现实际输出和预测输出之间的差异时,它会在差异图像中显示相同的缺失部分。我希望实际图像和预测图像的像素值差异尽可能小。
图像像素范围从 -7000 到 180000。我将其归一化为 [0,1]。
有什么办法可以改善吗?
GAN确实可以。事实上,填补图像的缺失部分是 GAN 最酷的应用之一。您可以在这篇关于 GAN 应用的优秀文章的图像修复主题下找到您需要的内容。
你可以在这里找到实现的图像修复代码。 https://github.com/pathak22/context-encoder
不过,您可能有一个巨大的(至少 10000 秒左右)完整的图像数据集。我建议的损失函数如下,它可以在生成器(G)和鉴别器(D)之间产生一场战斗。
def loss_func(logits_in,labels_in):
return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits_in,labels=labels_in))
G = generator(z)
D_output_real,D_logits_real=discriminator(real_images)
D_output_fake,D_logits_fake=discriminator(G,reuse=True)
D_real_loss=loss_func(D_logits_real,tf.ones_like(D_logits_real)*0.94) #Smoothing for generalization
D_fake_loss=loss_func(D_logits_fake,tf.zeros_like(D_logits_real))
D_loss=D_real_loss+D_fake_loss
G_loss= loss_func(D_logits_fake,tf.ones_like(D_logits_fake))
然而,GAN 的计算成本非常高。因为生成器和鉴别器之间的战斗可能会持续数周才能得到你想要的结果,特别是在图像分辨率很高的情况下。只是为了给你一些线索,我在我的 RTX 2080 Ti GPU 上运行用于图像生成的 GAN 运行了 3 周,在 200000 (218,160) 大小的图像中给出了可接受的结果。
所以要有耐心,祝你好运。