Skip to content

fangshuiyun/SRGAN-Pytorch

Repository files navigation

This is an unofficial implementation of 《SRGAN:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network》。实现了4倍的超分!

My Environment:

pytorch==1.10.0+cu102
torchaudio==0.10.0+cu102
torchvision==0.11.0+cu102
numpy==1.24.4
pandas==2.0.3
tqdm==4.66.1
Pillow==10.1.0

Datasets:

DIV2K

目录结构:(注:我只下载了DIV2K_train_HR和DIV2K_valid_HR两个图像文件,至于低分辨率图像,我是直接通过高分辨率图像下采样得到的--不是很专业,玩一下嘛,别骂了别骂了)

├─datasets
│  ├─DIV2K_train_HR
│  │      0001.png
│  │      0002.png
│  │      0003.png
│  │      0004.png
│  │      ......
│  └─DIV2K_valid_HR
│          0801.png
│          0802.png
│          0803.png
│          0804.png
│  │      ......

Train

开始训练:

python main.py

注:没有设置命令行功能,想要更改参数,请在main.py文件中直接修改。如下:

parser.add_argument('--train_dataset', default="./datasets/DIV2K_train_HR", type=str,
                    help='训练集的图片路径')
parser.add_argument('--valid_dataset', default="./datasets/DIV2K_valid_HR", type=str,
                    help='测试集的图片路径')
parser.add_argument('--upscale_factor', default=4, type=int, choices=[2, 4, 8],
                    help='用于指定超分辨率的放大因子,默认为4')
parser.add_argument('--epochs', default=100, type=int, help='总训练轮数')
parser.add_argument('--batch_size', default=16, type=int, help='批次大小,显存不足可以调小一点')

丐版训练计划:

显存不足+其他资源不足怎么办?如下更改:

更改batch_size:

parser.add_argument('--batch_size', default=16, type=int, help='批次大小,显存不足可以调小一点')
#16不行就8,8不行就4,再不行就2,不是吧不是吧,你这也太小了吧!`

cpu资源不足怎么办?

train_loader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True, num_workers=16, pin_memory=True, drop_last=True)
#删掉多线程num_workers等等,变成如下
train_loader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True)
#其他的DataLoader也是如此

减少模型参数:可以考虑删掉几层卷积或者减小特征通道,懂得都懂嗷!

节约时间:

parser.add_argument('--epochs', default=100, type=int, help='总训练轮数')
#那就少训练几轮呗

图像大小:

transform = transforms.Compose([
            transforms.Resize(400),
            transforms.CenterCrop(400),#显存不足就缩小图像尺寸,400是Resize高分辨率图像
            transforms.ToTensor()    #400太大就200,200太大就100,100不行就88,不会吧不会吧,这么小的哇!
])

训练和验证的各项指标变化:

PSNR:平均峰值信噪比(MSE越小,则PSNR越大;所以PSNR越大,代表着图像质量越好。);SSIM:平均结构相似度指数(0-1之间,1说明两张图一模一样)。

Test

开始测试:

python test.py

我的测试集和验证集是一样的,没办法,不专业嘛!不同的地方是,训练期间的验证集是跟训练集一样Resize(400)然后再进行各个指标的评估;测试阶段并没有进行Resize操作,直接输入原图HR,下采样4倍LR,在输入模型输出Fake_HR,然后对(Fake_HR,原图HR)进行各项指标的评估。当然原图尺寸大,对显存和资源要求高,请参考上文丐版训练计划,要么我说啊,就别测试了,玩玩demo不香嘛。

测试指标变化:

一共99张图片,每张图片的PSNR和SSIM。

平均指标 PSNR SSIM
Average 73.40 0.72

Demo

python demo.py

注:模型参数和图片我都上传了,可以玩一玩,感谢二次元朋友亲情图片贡献!

左分辨率: 400×512 ->右分辨率: 1600×2048

左分辨率: 300×629 ->右分辨率: 1200×2516

左分辨率: 510×333 ->右分辨率: 2040×1332

左分辨率: 510×339 ->右分辨率: 2040×1356

Conclusion

若要实现其他倍数,也可进行1、2、3等其他倍数的训练。

优点:图像SR最广泛使用的优化目标是MSE,许多最先进的方法依赖于此。 然而,在实现特别高的PSNR的同时,MSE优化问题的解决方案通常缺乏高频内容, 这导致具有过度平滑纹理的感知上不满意的解决方案。论文提出了SRGAN,这是一个基于GAN的网络,针对新的感知损失进行了优化。 作者用基于VGG网络深度提取的特征图(激活层之后的)计算的损耗替换基于MSE的内容丢失,这对于像素空间的变化更加不变。此外,为了区分真实的HR图像和生成的SR样本, 作者还训练了一个鉴别器。

缺点:
1,作者在SRGAN网络中添加了许多BN层,BN层在训练期间使用batch中的均值和方差对特征进行规范化,在测试期间使用整个训练集的均值和方差。 在训练数据和测试数据差异很大时,BN层会引入伪影,限制模型的泛化能力。
2,激活特征稀少,激活前的特征包含的信息更多,如下图所示。激活后使用特征会导致重建亮度与地面真实图像不一致。 该图出自《ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks》

完结撒花!

About

SRGAN图像超分的Pytorch代码实现

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages