本文所使用的代码为 https://github.com/open-mmlab/mmsr
所使用的环境为 python 3.7.4 , CUDA 9.0.176 , cuDNN 7.6.1 ,torch 1.1
查看cuda和cuDNN版本的代码如下:
查看cuda版本
cat /usr/local/cuda/version.txt
查看cuDNN版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
1. 登入服务器,激活torch环境
source activate torch1
(本人自己在anaconda创建的独立环境)
2. 使用dcn对网络进行编译
cd ./codes/models/archs/dcn
python setup.py develop
3. 生成LR(可选)
若你的数据集包含GT和LR,则跳过此步骤。
若只有GT,则通过 mmsr-master/codes/data_scripts/generate_mod_LR_bic.py
文件生成LR。
需要修改路径和放大倍数
up_scale = 3
mod_scale = 3
# set data dir
sourcedir = '../../datasets/changping-GF2/RSdata_train_HR'
savedir = '../../datasets/changping-GF2/train_mod_LR_bic'
运行后会生成3个文件夹,Bic,HR,LR,我们需要的LR图像保存在 mmsr-master/datasets/changping-GF2/train_mod_LR_bic/LR/x3
中。LR的尺寸为GT的1/scale。Bic的尺寸为LR通过双三次插值放大scale倍,即跟GT的尺寸一样,只是清晰度变低。这里注意LR图像不要用错成Bic。train和valid的数据集都要处理。
4. 裁剪数据集
本文使用的是自己的遥感数据集,尺寸非常大,大概为几万乘几万这样(在自己的小笔记本上根本跑不动- -,只能用服务器跑),所以首先使用 extract_subimages.py对图像进行裁剪,大小为480*480.
这里的mode可以有两种选择,
(1)mode == 'pair'
,可以同时对GT和LR进行裁剪,这里需要注意,裁剪的尺寸要为scale的倍数,比如GT的裁剪尺寸为480,scale=3,那么LR的尺寸就为480/3=160。除不尽会报错。
(2) mode == 'single'
,可单独对GT或LR进行裁剪。(不建议,容易出错)
运行前要将GT和LR的路径改为自己本地的路径,然后将比例改为实际用的比例。记得train和valid的数据集都要裁剪。
elif mode == 'pair':
GT_folder = '../../datasets/changping-GF2/RSdata_train_HR'
LR_folder = '../../datasets/changping-GF2/RSdata_train_LR/X3'
save_GT_folder = '../../datasets/changping-GF2/train_HR_sub'
save_LR_folder = '../../datasets/changping-GF2/train_LR_sub'
scale_ratio = 3
修改好后,cd ./mmsr-master/codes/data_scripts
, 运行 python extract_subimages.py
.
此时出现error1: no module named cv2
解决办法:pip install opencv-python
(这里要事先检查下pip是否为anaconda下的,还是服务器本身的,通过 which pip
命令检查路径)
继续运行,出现error2:no module named yaml
解决办法:pip install PyYAML
继续运行,出现error3: DecompressionBombWarning: Image size (176593032 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
原因是我的遥感图像太大,导致出现可能被解压炸弹DOS攻击。
解决办法:在extract_subimages.py中加入如下code,取消最大限制,
from PIL import Image
Image.MAX_IMAGE_PIXELS = None
终于成功运行。
查看train_HR_sub文件夹,出现裁剪好的几千张图片
此时,再去train_LR_sub文件夹查看文件,检查LR和HR的命名是否一致。
5. 创建lmdb文件
打开文件create_lmdb.py,对其中的GT和LR的路径进行修改
elif dataset == 'DIV2K_demo':
opt = {}
## GT
opt['img_folder'] = '../../datasets/changping-GF2/train_HR_sub'
opt['lmdb_save_path'] = '../../datasets/changping-GF2/train_sub_HR.lmdb'
opt['name'] = 'train_HR_sub'
general_image_folder(opt)
## LR
opt['img_folder'] = '../../datasets/changping-GF2/train_mod_LR_bic/LR/x3'
opt['lmdb_save_path'] = '../../datasets/changping-GF2/train_mod_LR_bic.lmdb'
opt['name'] = 'train_mod_LR_bic'
general_image_folder(opt)
修改好后,运行文件 python create_lmdb.py
出现error:no module named lmdb
解决方法:conda install python-lmdb
运行成功。
6. 测试数据加载器,检查数据是否准备好。
修改test_dataloader.py中的参数,主要是scale和路径,之后运行文件python test_dataloader.py
出现error: RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 128 and 126 in dimension 3 at /opt/conda/conda-bld/pytorch_1556653215914/work/aten/src/TH/generic/THTensor.cpp:711
原因是图像维度不一致。回去检查我裁剪后的图像的尺寸,GT均为480480,LR均为160160,说明裁剪没出错,看报错显示128和126,想到test_dataloader.py中有 GT_size=128
,查看代码发现GT_size是在训练过程中对图像进行随机裁剪的尺寸,裁剪过程在codes/data/LQGT_dataset.py文件下,查看代码发现98行有:
LQ_size = GT_size // scale
猜测可能原因是128/3除不尽,造成维度不一致。因此将128修改为129,再次运行,没有报错。这里注意GT_size要为scale的倍数。
至此,数据集准备成功。
7. 训练
修改配置文件 options/train/train_SRGAN.yml
,主要修改scale和路径,以及GT_size=129.之后开始训练python train.py -opt options/train/train_SRGAN.yml
出现error1:no module named tensorboard
解决办法:pip install tensorboard
出现error2:no module named past
解决办法:pip install future
出现error3:RuntimeError: The size of tensor a (172) must match the size of tensor b (129) at non-singleton dimension 3
又是维度问题,之前数据集已经检查完毕,再次查看配置文件train_SRGAN.yml,发现
pretrain_model_G: ../experiments/pretrained_models/MSRResNetx4.pth
预训练模型为4倍放大的SRResnet模型,而我的数据集为3倍的,肯定不匹配,因此不能用官方提供的预训练模型,只能自己先训练一下了。(头疼- -)
转去训练SR模型,先修改配置参数 train_SRResNet.yml文件,修改scale,路径,GT_size,然后训练 python train.py -opt options/train/train_SRResNet.yml
,成功运行。PSNR在32.7左右徘徊,运行了300k个iter之后,中断训练。不知道我的模型参数保存在哪里了(服务器没可视化界面啥也找不到- -),查找.pth文件,find -name '*.pth'
,找到了刚训练好的模型,在experiments文件夹下,将路径放到 train_SRGAN.yml中,再次训练SRGAN模型,python train.py -opt options/train/train_SRGAN.yml
,成功开始训练!
SRGAN训练好慢,决定让他自己跑一晚上,第二天睡醒再看结果。
第二天起来看结果发现PSNR没怎么提高,运行一下tensorboard看下结果,先将服务器的mmst-master/tb_logger/SRGAN_x3_use_bic文件夹传到本地来,在本地命令提示符上输入
pscp -r thrc_pyj@103.31.53.234:/home/thrc_pyj/mmsr-master/tb_logger/SRGAN_x3_use_bic C:\Users\ThinkPad\Desktop\SR
然后cd到SR目录下,tensorboard --logdir = SRGAN_x3_use_bic
,查看结果。结果如下。
难以理解。有大神告知为什么会下降吗?
接下来我将对这个网络的参数进行调试。争取提高PSNR。
补充:训练过程中每训练5000次对验证集进行一次测试,计算psnr,并将测试的超分图像保存在mmsr-master/experiments中,因此可以看到图像随着训练次数的增加的产生的变化。
8.测试
找到测试的配置文件mmsr-master/codes/options/test/test_SRGAN.yml。1.修改scale为自己数据集的放大倍数。2. 修改mode为LQGT或LQ。3. 修改GT(可选)和LR的路径。3.修改pretrain_model_G为自己训练的模型的位置,在/experiments/SRGAN_x3_use_bic/models/中,以及模型所对应的结构network_G。
test有两种模式,分别是评估模型和测试LR。
(1)评估模型的mode为LQGT,若想评估模型,计算PSNR和SSIM,则需要更改dataroot_GT和dataroot_LQ的路径,即验证集的GT和LQ的路径。则会输出测试集中每张图片的psnr和ssim的值,以及最终的平均值。
cd到mmsr-master/codes,输入 python test.py -opt options/test/test_SRGAN.yml
,开始评估。
name: MSRGANx3
suffix: ~ # add suffix to saved images 为图像名称增加后缀
model: sr
distortion: sr
scale: 3
crop_border: ~ # crop border when evaluation. If None(~), crop the scale pixels
gpu_ids: [1]
datasets:
test_1: # the 1st test dataset
name: RSdata_valid
mode: LQGT
dataroot_GT: ../datasets/changping-GF2/valid_HR_sub
dataroot_LQ: ../datasets/changping-GF2/valid_mod_LR_bic/LR/x3
#### network structures
network_G:
which_model_G: MSRResNet
in_nc: 3
out_nc: 3
nf: 64
nb: 16
upscale: 3
#### path
path:
pretrain_model_G: ../experiments/SRGAN_x3_use_bic/models/165000_G.pth
看起来效果并不是很好…
此种模式下也会保存生成的超分图片,在mmsr-master/results中。
(2)测试效果的mode要改为LQ,若想测试效果,则只需要输入dataroot_LQ的位置,即输入需要进行超分测试的图像的路径,dataroot_GT无需输入。其实作者已经给了用于只测试LR的配置文件,就是mmsr-master/codes/options/test/test_ESRGAN_woGT.yml 这个文件。这两个文件都可以使用。
datasets:
test_1: # the 1st test dataset
name: RSdata_valid
mode: LQ #这里要改为LQ
dataroot_GT:
dataroot_LQ: ../datasets/changping-GF2/valid_LR_sub
运行python test.py -opt options/test/test_SRGAN.yml
,图片已生成,保存在mmsr-master/results中。
由于服务器无法查看图片,所以把图片传到本地来。
pscp -r thrc_pyj@103.31.53.234:/home/thrc_pyj/mmsr-master/results/SRGAN_x3 C:\Users\ThinkPad\Desktop\SR
哇,效果真是不怎么样……这里就不放图了……
以上就是本人实现SRGAN的全部流程,如有错误欢迎大家批评指正。
希望大佬们多提宝贵意见鸭~~~