DBPN的pytorch复现

1.首先在测试时遇到了一些问题:

2.解决好问题后,将给定的set进行测试,并尝试了自己的image:

此次测试数据所用模型为:DBPN_x8.pth
测试数据为:./Input/Set5_LR_x8/中的五组低分辨率图片
测试结果保存在Results文件夹中。
原始数据及处理完成结果对比: 

因为测试成功了,想试一试自己拍的图片是否能成功,所以找了一张我拍的虚焦的照片,但放入input中,运行结果提示处理不了之类的,我猜测这个图片太大了(大概有三百兆,远大于示例的图片的几兆),于是我选择了较小的表情包,送入网络中。

结果是:不仅从数据,从肉眼上也能明显感觉到分辨率的提高:

3.第二天继续进行,开始训练此模型,得到了训练好的模型(以及每四个epochs将训练过程中的模型保存下来)

3.1 DBPN训练:

(Windows10系统下)
(1)首先下载用于训练的数据集,下载地址如下:
链接:https://pan.baidu.com/s/1fUCDgjfa5ktHczgPaO89xw
提取码:4ymy
(2)将下载的DIV2K_train_HR数据集文件拷贝到项目工程文件夹Dataset下
(3)创建weights文件夹用来保存训练的模型,如下图

接下来修改main.py文件中的参数,根据自己的情况进行修改。
为了方便区分最后训练的模型,将数据集的名称体现在保存的模型名称中,所以单独加了一行参数设置 (下图第36行)

运行命令:

3.2 模型和代码相关的问题

3.2.1 model type到底是和谁相关的啊!!到底是DBPN还是DBPNLL啊!!

答:model type和自己选的相关,选哪个网络就用哪个相应的模型

3.2.2 模型和.py文件的对应关系:

·这涉及到每个模型具体使用什么代码实现什么样的功能

·比如下图,在main函数中: 

·为了更清晰,把上图的代码复制出来: 

print('===> Building model ', opt.model_type)
if opt.model_type == 'DBPNLL':  from dbpn_v1 import Net as DBPNLL
    model = DBPNLL(num_channels=3, base_filter=64,  feat = 256, num_stages=10, scale_factor=opt.upscale_factor) 

elif opt.model_type == 'DBPN-RES-MR64-3':  from dbpn_iterative import Net as DBPNITER
    model = DBPNITER(num_channels=3, base_filter=64,  feat = 256, num_stages=3(?存疑), scale_factor=opt.upscale_factor)

#为什么用num_stages=3 ?:这只是为了说明一个stage为3的情况,实际上等于几都可以
#我明白了:根据文件dbpn_iterative的代码,我发现里面有一个for i in range函数,在该文件末尾又加了一句results.append(h),作用是将上下投影单元们的最后一个上投影单元的输出以张量的形式拼接到result末尾(而result在前面定义的是一个空的向量),经过多次迭代拼接后,同样可以得到相应的HR相串联的图像,这样做的好处是:可以在for i in range函数处,通过改变参数num_stages的大小从而轻松改变迭代次数(迭代次数就是stage的数量)

else:                            #应该是 opt.model_type == ' DBPN ':  from dbpn import Net as DBPN
    model = DBPN(num_channels=3, base_filter=64,  feat = 256, num_stages=7, scale_factor=opt.upscale_factor) 

3.1.3 read me竟然有大作用!

起因是不知道这么多(权重相关的.pth)文件到底每个都是做什么的,猜了半天实在是在论文中也看不出,在代码中也看不出,问了师兄才知道应该去看看read me文件,里面可能会写TAT

果不其然,真的写了,还挺详细的,以后在做实验之前一定先看read me!!!

·对抗loss:

·循环过程+残差学习

3.1.4然后开始逐步看懂代码含义,我把代码和详细注释写在另外一篇文章中了:

http://t.csdnimg.cn/qdwD1

 4.用DIV2K_valid_HR测试一下3.1的训练结果:

4.1.1 具体测试过程和结果:

参数如下:

 结果如下:

我心力交瘁了。。。试了很多遍都是这样的,eval不就是评估的意思吗?为什么我用验证集DIV2K_valid_HR他说我GPU配置不够呢?有没有明白人告诉我这是什么情况,没有的话我默认是我电脑配置不行了TT

 4.1.2 自己随便试试:

上面这个既然不行,所以我决定只用小的数据集进行测试:

因为前面的训练是对x2的进行训练,所以选择尺度因子为x2的数据集,将set5中的其中一张图像变成我自己拍的虚焦照片进行测试(夹带私货^v^):

仔细对比,左右两张图片对比确实图像分辨率有所提高,而且数据也能证明这一点。

4.1.3 有一点问题

1.为什么在x8的时候用上方我自己的测试图像就说GPU不够,不可以实现超分呢?

答:首先我以为是图像格式的问题。我自己的图像的格式为JPG,而实际在数据集中的图像的格式都是PNG,于是我把JPG转换成PNG,同时图像的大小也有所增加,对应的模型没有那么强的处理能力,所以较大的图片是处理不了的,图像格式应该不是最主要的原因,(因为文章前面我自己处理的表情包也没有注意格式,但是因为本来就不大,所以还挺明显的)但因为图像格式的不同可能会导致图片的大小,从而反映在这个模型能不能处理上。

我猜测是因为我自己的图像的大小太大了(大概有上百兆),模型处理不了这么大的图片。

具体是什么原因我还不知道,我看是配置的问题,但也说不准,可能是模型的问题?我决定等下将epoch设置的再多一点再看看。如果有人知道的话可以给我评论或者私信我嘛?感谢感谢!

2.图像为___x2的时候,我发现数据集set5中的图像的分辨率都比___x8的要高,这是为啥?(一个和数据集相关的问题,基础问题)

首先每个集里面都有五张图片,所以它们叫set5;

它们都是用于测试的测试集,作为测试函数eval.py的input;

其次它们的名字中都包含LR,也包含x2或者x4,x8,说明它们是由HR图像经过尺度因子(scale factor)不同的下采样得到的测试集,所以正常的图像大小如果我设为X*Y,那么尺度因子为2的下采样得到的LR图像的大小应该是原图像的一半(X/2 * Y/2),而尺度因子为8的下采样应该比尺度因子为2的下采样更小,而且应该更模糊。(想不明白的话可以参考上采样的图像的尺寸大小的变化,下采样就是对应的逆过程。)

因此在图像超分辨率时,对应的参数设置部分,由低分辨率恢复高分辨率时,就应该是对应大小的scale factor:(很好理解,因为这样才能恢复到原来图像的大小)

5.参考

http://t.csdnimg.cn/xallk

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值