xinntao / ESRGAN

ECCV18 Workshops - Enhanced SRGAN. Champion PIRM Challenge on Perceptual Super-Resolution. The training codes are in BasicSR.
https://github.com/xinntao/BasicSR
Apache License 2.0
5.95k stars 1.06k forks source link

测试结果图片的质量 #17

Open xxx2974 opened 5 years ago

xxx2974 commented 5 years ago

您好,当我直接用您训练好的模型拿来测试时,生成的高分图像质量比较差,有几个问题想请教, 1、LR图片的分辨率是128×64,格式是jpg格式的,不是等宽高的,这样对结果影响大吗? 2、如果想生成的分辨率是原来的两倍而不是四倍,需要从改变训练图片上入手吗?

xinntao commented 5 years ago

@xxx2974 如果图像不是bicubic downsampling, 并且有JPEG压缩的时候, 图像质量会较差. 因为现在的模型是针对MATLAB bicubic downsampling kernel的.

等宽高不重要, jpg压缩可能会会把jpg压缩也放大, 因此会出现明显的块状artifacts. 需要重新train一下网络, 可以从现有的4倍网络finetune过去,会更快.

xxx2974 commented 5 years ago

谢谢回复。那如果现在只有低分辨率的jpg图像,而没有高分辨率的,是不是没有办法重新训练模型??

suke27 commented 5 years ago

这个jpg 的问题,GAN 的方法有好的解决办法么?

xxx2974 commented 5 years ago

@xinntao 你好,还有个问题想请教,假如将高分图片下采样为原来的二分之一,而不是四分之一,具体应该修改哪些参数来重新训练一个2倍的超分模型呢?

xinntao commented 5 years ago

@xxx2974 如果只有低分辨率的jpg图像, 你可以参考 盲超分 的paper. 关于修改的参数, 主要是1) 准备好相应的训练数据集和测试集; 2) 修改模型(比如在.json文件中)的相应的配置参数. 这个主要影响的是网络的构建, 主要是upsampling layer. 一般可以从现有的其他scale的模型fine-tune过去.

xinntao commented 5 years ago

@suke27 jpg的问题, 我现在想到的有 1) 首先做Dejpeg, 然后做SR. 这个比较直接. 2) 训练数据中就加入jpeg的压缩, 先用MSE/L1的loss预训练, 然后再加入GAN fine-tune. 这样从训练数据角度, 网络有一定的能力同时去除jpeg和SR 3) 进一步得, 可以让网络同时做dejpeg和SR的两个任务, 通过multi-task的训练,应该能够更加有效. (也是通过准备有jpeg压缩的训练数据)

suke27 commented 5 years ago

@xinntao 方法2 我试过,没用,你可以再试下 方法3,我看有paper 有人这么干,2个网络级联,先做去噪,再SR

xinntao commented 5 years ago

方法3有paper这么做了, 那应该有效~你可以试试. 有JPEG的问题,在实际中还是很有必要的

xxx2974 commented 5 years ago

@xxx2974 如果只有低分辨率的jpg图像, 你可以参考 盲超分 的paper. 关于修改的参数, 主要是1) 准备好相应的训练数据集和测试集; 2) 修改模型(比如在.json文件中)的相应的配置参数. 这个主要影响的是网络的构建, 主要是upsampling layer. 一般可以从现有的其他scale的模型fine-tune过去.

谢谢!冒昧的问一下,我不太清楚具体要怎么做参数的修改,训练集与测试集我已准备好了,.json文件中我修改了一处"pretrain_model_G": "../experiments/pretrained_models/SRResNet_bicx2_in3nf64nb16.pth" 然后运行报错: 19-01-03 17:07:54.863 - INFO: Random seed: 0 19-01-03 17:07:54.868 - INFO: Read lmdb keys from cache: /home/xiaozhenzhen/data/BasicSR/datasets/DIV2K800/DIV2K800_sub_1.lmdb/_keys_cache.p 19-01-03 17:07:54.932 - INFO: Read lmdb keys from cache: /home/xiaozhenzhen/data/BasicSR/datasets/DIV2K800/DIV2K800_sub_bicLRx2_1.lmdb/_keys_cache.p 19-01-03 17:07:55.019 - INFO: Dataset [LRHRDataset - DIV2K] is created. 19-01-03 17:07:55.019 - INFO: Number of train images: 32,208, iters: 2,013 19-01-03 17:07:55.019 - INFO: Total epoches needed: 249 for iters 500,000 19-01-03 17:07:55.019 - INFO: Read lmdb keys from cache: /home/xiaozhenzhen/data/BasicSR/datasets/DIV2K_valid/val_sub_1.lmdb/_keys_cache.p 19-01-03 17:07:55.048 - INFO: Read lmdb keys from cache: /home/xiaozhenzhen/data/BasicSR/datasets/DIV2K_valid/val_sub_bicLRx2_1.lmdb/_keys_cache.p 19-01-03 17:07:55.061 - INFO: Dataset [LRHRDataset - val_set14_part] is created. 19-01-03 17:07:55.062 - INFO: Number of val images in [val_set14_part]: 4144 19-01-03 17:07:55.338 - INFO: Initialization method [kaiming] 19-01-03 17:08:06.983 - INFO: Initialization method [kaiming] 19-01-03 17:08:07.226 - INFO: Loading model for G [../experiments/pretrained_models/SRResNet_bicx2_in3nf64nb16.pth] ... Traceback (most recent call last): File "train.py", line 154, in main() File "train.py", line 74, in main model = create_model(opt) File "/home/xiaozhenzhen/data/BasicSR/codes/models/init.py", line 18, in create_model m = M(opt) File "/home/xiaozhenzhen/data/BasicSR/codes/models/SRRaGAN_model.py", line 26, in init self.load() # load G and D if needed File "/home/xiaozhenzhen/data/BasicSR/codes/models/SRRaGAN_model.py", line 243, in load self.load_network(load_path_G, self.netG) File "/home/xiaozhenzhen/data/BasicSR/codes/models/base_model.py", line 66, in load_network network.load_state_dict(torch.load(load_path), strict=strict) File "/home/xiaozhenzhen/anaconda2/envs/pytorch-basicsr/lib/python3.6/site-packages/torch/nn/modules/module.py", line 721, in load_state_dict self.class.name, "\n\t".join(error_msgs))) RuntimeError: Error(s) in loading state_dict for RRDBNet: Missing key(s) in state_dict: "model.1.sub.0.RDB1.conv1.0.weight", "model.1.sub.0.RDB1.conv1.0.bias", "model.1.sub.0.RDB1.conv2.0.weight", "model.1.sub.0.RDB1.conv2.0.bias", "model.1.sub.0.RDB1.conv3.0.weight", "model.1.sub.0.RDB1.conv3.0.bias", "model.1.sub.0.RDB1.conv4.0.weight", "model.1.sub.0.RDB1.conv4.0.bias", "model.1.sub.0.RDB1.conv5.0.weight", "model.1.sub.0.RDB1.conv5.0.bias", ......

xinntao commented 5 years ago

你应该写一个script, 把x4的model transfer过去, 可以参考一下transfer_params.py

xxx2974 commented 5 years ago

OK,thanks a lot.

yuxiaomu commented 5 years ago

@xxx2974 你好,请问你用自己的数据,就是只有低分辨率的图片怎么训练网络啊,我现在也想用这个代码吧自己低分辨率的图调清楚一些,但是我不知道该怎么做,特别感谢您的帮助

xinntao commented 5 years ago

@1810325 Currently, it is a data-driven method, so you need to prepare such training pairs. If you only have the low-resolution images, 1) try to synthesize training pairs that have a similar distribution as your test images. 2) try to search relevant papers