This is an unofficial implementation of 《SRGAN:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network》。实现了4倍的超分!
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
目录结构:(注:我只下载了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
│ │ ......
开始训练:
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='批次大小,显存不足可以调小一点')
显存不足+其他资源不足怎么办?如下更改:
parser.add_argument('--batch_size', default=16, type=int, help='批次大小,显存不足可以调小一点')
#16不行就8,8不行就4,再不行就2,不是吧不是吧,你这也太小了吧!`
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说明两张图一模一样)。
开始测试:
python test.py
我的测试集和验证集是一样的,没办法,不专业嘛!不同的地方是,训练期间的验证集是跟训练集一样Resize(400)然后再进行各个指标的评估;测试阶段并没有进行Resize操作,直接输入原图HR,下采样4倍LR,在输入模型输出Fake_HR,然后对(Fake_HR,原图HR)进行各项指标的评估。当然原图尺寸大,对显存和资源要求高,请参考上文丐版训练计划,要么我说啊,就别测试了,玩玩demo不香嘛。
平均指标 | PSNR | SSIM |
---|---|---|
Average | 73.40 | 0.72 |
python demo.py
注:模型参数和图片我都上传了,可以玩一玩,感谢二次元朋友亲情图片贡献!
左分辨率: 400×512 ->右分辨率: 1600×2048
左分辨率: 300×629 ->右分辨率: 1200×2516
左分辨率: 510×333 ->右分辨率: 2040×1332
左分辨率: 510×339 ->右分辨率: 2040×1356
若要实现其他倍数,也可进行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》