千家信息网

Pytorch怎么搭建SRGAN平台提升图片超分辨率

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"Pytorch怎么搭建SRGAN平台提升图片超分辨率"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,
千家信息网最后更新 2026年11月01日Pytorch怎么搭建SRGAN平台提升图片超分辨率

本篇内容介绍了"Pytorch怎么搭建SRGAN平台提升图片超分辨率"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

网络构建

一、什么是SRGAN

SRGAN出自论文Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network。

如果将SRGAN看作一个黑匣子,其主要的功能就是输入一张低分辨率图片,生成高分辨率图片。


该文章提到,普通的超分辨率模型训练网络时只用到了均方差作为损失函数,虽然能够获得很高的峰值信噪比,但是恢复出来的图像通常会丢失高频细节。

SRGAN利用感知损失(perceptual loss)和对抗损失(adversarial loss)来提升恢复出的图片的真实感。

二、生成网络的构建


生成网络的构成如上图所示,生成网络的作用是输入一张低分辨率图片,生成高分辨率图片。:

SRGAN的生成网络由三个部分组成。

1、低分辨率图像进入后会经过一个卷积+RELU函数。

2、然后经过B个残差网络结构,每个残差结构都包含两个卷积+标准化+RELU,还有一个残差边。

3、然后进入上采样部分,在经过两次上采样后,原图的高宽变为原来的4倍,实现分辨率的提升。

前两个部分用于特征提取,第三部分用于提高分辨率。

import mathimport torchfrom torch import nnclass ResidualBlock(nn.Module):    def __init__(self, channels):        super(ResidualBlock, self).__init__()        self.conv1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)        self.bn1 = nn.BatchNorm2d(channels)        self.prelu = nn.PReLU(channels)        self.conv2 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)        self.bn2 = nn.BatchNorm2d(channels)    def forward(self, x):        short_cut = x        x = self.conv1(x)        x = self.bn1(x)        x = self.prelu(x)        x = self.conv2(x)        x = self.bn2(x)        return x + short_cutclass UpsampleBLock(nn.Module):    def __init__(self, in_channels, up_scale):        super(UpsampleBLock, self).__init__()        self.conv = nn.Conv2d(in_channels, in_channels * up_scale ** 2, kernel_size=3, padding=1)        self.pixel_shuffle = nn.PixelShuffle(up_scale)        self.prelu = nn.PReLU(in_channels)    def forward(self, x):        x = self.conv(x)        x = self.pixel_shuffle(x)        x = self.prelu(x)        return xclass Generator(nn.Module):    def __init__(self, scale_factor, num_residual=16):        upsample_block_num = int(math.log(scale_factor, 2))        super(Generator, self).__init__()        self.block_in = nn.Sequential(            nn.Conv2d(3, 64, kernel_size=9, padding=4),            nn.PReLU(64)        )        self.blocks = []        for _ in range(num_residual):            self.blocks.append(ResidualBlock(64))        self.blocks = nn.Sequential(*self.blocks)        self.block_out = nn.Sequential(            nn.Conv2d(64, 64, kernel_size=3, padding=1),            nn.BatchNorm2d(64)        )        self.upsample = [UpsampleBLock(64, 2) for _ in range(upsample_block_num)]        self.upsample.append(nn.Conv2d(64, 3, kernel_size=9, padding=4))        self.upsample = nn.Sequential(*self.upsample)    def forward(self, x):        x = self.block_in(x)        short_cut = x        x = self.blocks(x)        x = self.block_out(x)        upsample = self.upsample(x + short_cut)        return torch.tanh(upsample)

三、判别网络的构建


判别网络的构成如上图所示:

SRGAN的判别网络由不断重复的 卷积+LeakyRELU和标准化 组成。
对于判断网络来讲,它的目的是判断输入图片的真假,它的输入是图片,输出是判断结果。

判断结果处于0-1之间,利用接近1代表判断为真图片,接近0代表判断为假图片。

判断网络的构建和普通卷积网络差距不大,都是不断的卷积对图片进行下采用,在多次卷积后,最终接一次全连接判断结果。

实现代码如下:

class Discriminator(nn.Module):    def __init__(self):        super(Discriminator, self).__init__()        self.net = nn.Sequential(            nn.Conv2d(3, 64, kernel_size=3, padding=1),            nn.LeakyReLU(0.2),            nn.Conv2d(64, 64, kernel_size=3, stride=2, padding=1),            nn.BatchNorm2d(64),            nn.LeakyReLU(0.2),            nn.Conv2d(64, 128, kernel_size=3, padding=1),            nn.BatchNorm2d(128),            nn.LeakyReLU(0.2),            nn.Conv2d(128, 128, kernel_size=3, stride=2, padding=1),            nn.BatchNorm2d(128),            nn.LeakyReLU(0.2),            nn.Conv2d(128, 256, kernel_size=3, padding=1),            nn.BatchNorm2d(256),            nn.LeakyReLU(0.2),            nn.Conv2d(256, 256, kernel_size=3, stride=2, padding=1),            nn.BatchNorm2d(256),            nn.LeakyReLU(0.2),            nn.Conv2d(256, 512, kernel_size=3, padding=1),            nn.BatchNorm2d(512),            nn.LeakyReLU(0.2),            nn.Conv2d(512, 512, kernel_size=3, stride=2, padding=1),            nn.BatchNorm2d(512),            nn.LeakyReLU(0.2),            nn.AdaptiveAvgPool2d(1),            nn.Conv2d(512, 1024, kernel_size=1),            nn.LeakyReLU(0.2),            nn.Conv2d(1024, 1, kernel_size=1)        )    def forward(self, x):        batch_size = x.size(0)        return torch.sigmoid(self.net(x).view(batch_size))

训练思路

SRGAN的训练可以分为生成器训练和判别器训练:
每一个step中一般先训练判别器,然后训练生成器。

一、判别器的训练

在训练判别器的时候我们希望判别器可以判断输入图片的真伪,因此我们的输入就是真图片、假图片和它们对应的标签。

因此判别器的训练步骤如下:

1、随机选取batch_size个真实高分辨率图片。

2、利用resize后的低分辨率图片,传入到Generator中生成batch_size个虚假高分辨率图片。

3、真实图片的label为1,虚假图片的label为0,将真实图片和虚假图片当作训练集传入到Discriminator中进行训练。

二、生成器的训练

在训练生成器的时候我们希望生成器可以生成极为真实的假图片。因此我们在训练生成器需要知道判别器认为什么图片是真图片。

因此生成器的训练步骤如下:

1、将低分辨率图像传入生成模型,得到虚假高分辨率图像,将虚假高分辨率图像获得判别结果与1进行对比得到loss。(与1对比的意思是,让生成器根据判别器判别的结果进行训练)。

2、将真实高分辨率图像和虚假高分辨率图像传入VGG网络,获得两个图像的特征,通过这两个图像的特征进行比较获得loss

利用SRGAN生成图片

SRGAN的库整体结构如下:

一、数据集的准备

在训练前需要准备好数据集,数据集保存在datasets文件夹里面。

二、数据集的处理

打开txt_annotation.py,默认指向根目录下的datasets。运行txt_annotation.py。
此时生成根目录下面的train_lines.txt。

三、模型训练

在完成数据集处理后,运行train.py即可开始训练。


训练过程中,可在results文件夹内查看训练效果:

"Pytorch怎么搭建SRGAN平台提升图片超分辨率"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

图片 训练 分辨率 生成 网络 判别 图像 生成器 虚假 卷积 输入 数据 结果 两个 部分 损失 模型 残差 特征 结构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 互联网科技公司起名 互联网扶贫科技 互联网科技社 科技类互联网 互联网科技ppt模板 成都仁贤领冠互联网科技有限公司 山东吉时兔互联网科技有限公司 西藏七维空间互联网科技有限公司 昭通互联网科技选哪家 互联网科技革命什么开始 新兴科技互联网创新大赛颁奖典礼 徐州市互联网科技有限公司 山东有哪些互联网科技公司 西安有哪些互联网高科技企业 万物互联网智能科技 中国互联网公司的科技投入 华人运通互联网科技公司 科技互联网专业务虚会材料 互联网 科技节活动 微视频大赛 互联网金融 金融科技 广州宏创互联网科技 上海致骋互联网科技 火传媒上海互联网科技 须眉科技是互联网公司吗 杭州壁岐互联网科技有限公司 消费医药和互联网科技 求路客互联网科技电话 互联网科技对化妆品行业 中国主要互联网科技公司
0