Python 如何使用高频灰度图像训练超分辨率生成对抗网络(SRGAN)?

Python 如何使用高频灰度图像训练超分辨率生成对抗网络(SRGAN)?,python,machine-learning,pytorch,loss-function,generative-adversarial-network,Python,Machine Learning,Pytorch,Loss Function,Generative Adversarial Network,这个问题几乎是来自交叉验证的问题的重复,但是没有人回答这个问题,我希望我在这里问的问题几乎是相同的 我一直在阅读和研究SRGAN的实现,从。我为3通道图像实现了SRGAN的功能,并制作了一些像样的超分辨率图像。然而,当我尝试使用单通道图像时,它无法生成合理的图像 我使用的灰度图像来自于MSTAR公开发布的高分辨率合成孔径雷达(SAR)数据。该数据集包含2774幅图像,共有10个类。部分样本如下所示: 由于SRGAN使用VGG作为网络之一,我不得不将灰度图像转换为RGB。我将第一个通道复制到其他

这个问题几乎是来自交叉验证的问题的重复,但是没有人回答这个问题,我希望我在这里问的问题几乎是相同的

我一直在阅读和研究SRGAN的实现,从。我为3通道图像实现了SRGAN的功能,并制作了一些像样的超分辨率图像。然而,当我尝试使用单通道图像时,它无法生成合理的图像

我使用的灰度图像来自于MSTAR公开发布的高分辨率合成孔径雷达(SAR)数据。该数据集包含2774幅图像,共有10个类。部分样本如下所示:

由于SRGAN使用VGG作为网络之一,我不得不将灰度图像转换为RGB。我将第一个通道复制到其他两个通道,并通过以下方法创建了一个3通道图像:

    w, h = hr_image.shape
    ret = np.empty((w, h, 3), dtype=np.uint8)
    ret[:, :, :] = hr_image[:, :, np.newaxis]
    hr_image = ret
以下是34个时代后的输出(继续),是低分辨率、高分辨率和超分辨率。

我注意到鉴别器的损失很快变为0,生成器的损失变为0.08,生成器的分数变为0,鉴别器的分数变为1。我假设这意味着鉴别器很容易区分真假图像。这可能导致生成器不学习任何新内容,只是停止学习

我试图在MSTAR数据集中隔离一个类,但这并没有改变任何事情。我注意到其他人确实在SAR图像中使用了SRGAN,而且它似乎可以工作,但他们的论文没有解释他们是如何实现它的

我想知道我是否使用了错误的方法,需要更改损失函数。SRGAN使用MSE、TVLoss和知觉损失。MSE本身并不是最好的损失函数,并且在理论上得到了很好的解释。但将图像保留在MSE超球体内可能是好的。但我问自己,使用一个在低频图像上训练过的网络并在高频图像上使用它是否有意义?据我所知,损耗函数在低频图像(我们的眼睛喜欢看的东西)上设计得非常好,而在高频图像上设计得不太好。因此,我的问题是:

  • 我应该改变损失函数吗?我是否应该用高频灰度图像对自己的网络进行预训练,使网络更适合这些图像
  • 为什么发电机在经历了几个时代后就崩溃了?为什么生成器很难做出合理的转换?图像是否太“嘈杂”
  • 我应该改变发生器和鉴别器的结构吗?我是否应该尝试使用另一个更适合灰度图像的预训练网络,如果是,是哪一个?
    • 我是否应该使用一个经过高频图像训练的预训练网络
因新结果于2020年6月11日更新了文本

我没有将所有图像转换为3个通道,而是在VGG网络进入之前通过以下命令执行此操作:

    out_images = out_images.repeat(1,3, 1,1)
    target_images = target_images.repeat(1, 3, 1,1)
我还在代码中做了一些小改动,这改变了250后模型的输出:

然而,正如可以看到的那样,它在制作超分辨率图像方面并没有改善。鉴别器快速学会区分真假图像,如下图所示:


有人对我如何使发电机更坚固有什么建议吗?我试图在生成器中添加更多层,并删除了一些鉴别器,但没有成功。

您是否设法改进了SR图像?我现在的问题和你以前的一样。我将尝试使用较早的VGG层(我怀疑,高级功能不适用于嘈杂的数据)。@igotBAWS是的,我设法改进了SR图像。然而,在经历了几个时代之后,发电机仍然崩溃。我在所有通道上复制了一个通道作为VGG网络的输入。你走近了吗?你也在处理SAR图像吗?是的,我是。事实上,即使使用VDSR,我也取得了相当好的效果。如果你想聊天,请在discord上添加我-IgotBAWS#2364@igotBAWS好啊我会让你陷入不和。我的是凯尔文