Coder Social home page Coder Social logo

megvii-research / dcls-sr Goto Github PK

View Code? Open in Web Editor NEW
218.0 9.0 18.0 6.84 MB

Official PyTorch implementation of the paper "Deep Constrained Least Squares for Blind Image Super-Resolution", CVPR 2022.

License: MIT License

Python 92.98% Shell 0.55% MATLAB 6.47%
blind-super-resolution deblurring pytorch deep-learning super-resolution

dcls-sr's Issues

sos

您好,您在CLS的forward()方法中有一个循环16次的语句:
for i in range(feature_pad.shape[1]):
#对16个通道中的每个通道进行操作
feature_ch = feature_pad[:, i:i+1, :, :]
clear_feature_ch = get_uperleft_denominator(feature_ch, kernel, kernel_P[:, i:i+1, :, :])
clear_features[:, i:i+1, :, :] = clear_feature_ch[:, :, ks:-ks, ks:-ks]
其中get_uperleft_denominator(feature_ch, kernel, kernel_P[:, i:i+1, :, :])方法我看了好多遍,完全看不懂,只知道这个方法是对经过填充的原始特征,预测的平滑滤波器,模糊核进行一些傅里叶变换操作。您能对下列的4~8行解释下这几行代码是在干嘛吗?跪跪谢!
ps(第四行方法里进行的循环移位操作看的怀疑人生,能看懂但是不知道为什么要这样做!哭)

1.# ------------------------------------------------------
2.# -----------Constraint Least Square Filter-------------
3.def get_uperleft_denominator(img, kernel, grad_kernel):
4. ker_f = convert_psf2otf(kernel, img.size()) # discrete fourier transform of kernel 对模糊核进行离散傅里叶操作
5. ker_p = convert_psf2otf(grad_kernel, img.size()) # discrete fourier transform of kernel
6. denominator = inv_fft_kernel_est(ker_f, ker_p)
7. numerator = torch.rfft(img, 3, onesided=False)
8. deblur = deconv(denominator, numerator)
9. return deblur

关于预训练模型

刚接触深度学习,请问预训练模型是哪个呀,是DCLSx4_setting1.pth这个文件吗?文件里面也找不到DCLSx4_setting1.pth这个文件。

关于模糊核的对比实验

您好,大佬。我们在做对比试验中发现DCLS生成的模糊核偏离真实核,这应该是您重构后的核,应该怎么将其恢复呢?
img_043
img_096
DCLS生成的核
img_043
img_096
GT核

其他尺寸模糊核对应的filter_structures

作者您好,请问我想使用我自己的参数设置来验证算法,分别会出现kernelsize为15或者19的情况,请问filter_structures的设置有什么技巧吗,如图所示的参数设置可行吗?
image

模糊核的可视化

作者大大晚上好,在看了您的论文后受益颇多。感谢您对盲超分的贡献!
image
我在您的项目中没有找到模糊核可视化的方法,您能跟我说下在哪个文件下吗

关于setting2的测试情况

首先感谢您优秀的工作。
我在setting1测试的时候psnr和论文中表述一样。但在setting2测试的时候报错了。我的DIV2KRK数据集下载的应该是没问题的。请问这是怎么一回事呢?
未命名图片3
我看了下输出日志和setting1时相比模型参数量变少了很多,但print的网络没什么问题。报的错好像是SR图像和GT图像大小不对应。请教您这是哪里出了问题呢?
未命名图片
未命名图片2

關於train時發生的錯誤問題

您好,當我執行train.py時,在dcls_arch.py的檔案發生錯誤訊息如下
File "/home/wu/DCLS/codes/config/DCLS/models/modules/dcls_arch.py", line 87, in forward
clear_features[:, i:i+1, :, :] = clear_feature_ch[:, :, ks:-ks, ks:-ks]

RuntimeError: expand(torch.cuda.FloatTensor{[64, 1, 64, 64, 2, 2]}, size=[64, 1, 64, 64]): the number of sizes provided (4) must be greater or equal to the number of dimensions in the tensor (6)

原始碼的部分是在這邊:

    class CLS(nn.Module):
    
        def __init__(self, nf, reduction=4):
    
            super().__init__()
    
            self.reduce_feature = nn.Conv2d(nf, nf//reduction, 1, 1, 0)
    
            self.grad_filter = nn.Sequential(
                nn.Conv2d(nf//reduction, nf//reduction, 3),
                nn.LeakyReLU(0.1, inplace=True),
                nn.Conv2d(nf//reduction, nf//reduction, 3),
                nn.LeakyReLU(0.1, inplace=True),
                nn.Conv2d(nf//reduction, nf//reduction, 3),
                nn.AdaptiveAvgPool2d((3, 3)),
                nn.Conv2d(nf//reduction, nf//reduction, 1),
            )
    
            self.expand_feature = nn.Conv2d(nf//reduction, nf, 1, 1, 0)
    
        def forward(self, x, kernel):
            cls_feats = self.reduce_feature(x)
            kernel_P = torch.exp(self.grad_filter(cls_feats))
            kernel_P = kernel_P - kernel_P.mean(dim=(2, 3), keepdim=True)
            clear_features = torch.zeros(cls_feats.size()).to(x.device)
            print(clear_features.shape)
            ks = kernel.shape[-1]
            dim = (ks, ks, ks, ks)
            feature_pad = F.pad(cls_feats, dim, "replicate")
            for i in range(feature_pad.shape[1]):
                feature_ch = feature_pad[:, i:i+1, :, :]
                print(feature_ch.shape)
                clear_feature_ch = get_uperleft_denominator(feature_ch, kernel, kernel_P[:, i:i+1, :, :])
                print(clear_feature_ch)
                clear_features[:, i:i+1, :, :] = clear_feature_ch[:, :, ks:-ks, ks:-ks]
    
            x = self.expand_feature(clear_features)
    
            return x

這程式碼中 clear_feature_ch = get_uperleft_denominator(feature_ch, kernel, kernel_P[:, i:i+1, :, :])會用到get_uperleft_denominator的這個function
這function如下:

    def get_uperleft_denominator(img, kernel, grad_kernel):
          ker_f = convert_psf2otf(kernel, img.size()) # discrete fourier transform of kernel
          ker_p = convert_psf2otf(grad_kernel, img.size()) # discrete fourier transform of kernel
      
          denominator = inv_fft_kernel_est(ker_f, ker_p)
      
          numerator = torch.fft.fftn(img, dim=(-3, -2, -1))
          numerator = torch.stack((numerator.real, numerator.imag), -1)
          #numerator = torch.fft.ifft2(torch.complex(img[..., 0], img[..., 1]), dim=(-3, -2, -1))
          
          
          deblur = deconv(denominator, numerator)
          return deblur

其中convert_psf2otf這Function如下:

    def convert_psf2otf(ker, size):
            psf = torch.zeros(size).cuda()
            # circularly shift
            centre = ker.shape[2]//2 + 1
            psf[:, :, :centre, :centre] = ker[:, :, (centre-1):, (centre-1):]
            psf[:, :, :centre, -(centre-1):] = ker[:, :, (centre-1):, :(centre-1)]
            psf[:, :, -(centre-1):, :centre] = ker[:, :, : (centre-1), (centre-1):]
            psf[:, :, -(centre-1):, -(centre-1):] = ker[:, :, :(centre-1), :(centre-1)]
            # compute the otf
             #otf = torch.rfft(psf, 3, onesided=False)
             #otf = torch.fft.ifft2(torch.complex(psf[..., 0], psf[..., 1]), dim=(-3, -2, -1))
            
            otf = torch.fft.fftn(psf, dim=(-3, -2, -1))
            otf = torch.stack((otf.real, otf.imag), -1)
            return otf

我對 clear_features、clear_feature_ch以及 clear_features 分別進行.shape發現它們分別的維度如以下:
torch.Size([64, 16, 64, 64])
torch.Size([64, 1, 106, 106])
torch.Size([64, 1, 106, 106, 2, 2])
請問這是為甚麼會有這個情況以及這個部分要怎麼去修改呢?謝謝!

关于式10和11

感谢分享。

请问下,式子10和式子11,为什么是对第一项最小化?在知乎的解读中看到,“意味着使得图像趋近平滑,也就说明图像从模糊变清晰了”。

确实最小化会使得图像平滑,但是平滑是不是意味着更模糊了,为什么是平滑意味着更清晰了,这一点有些不理解,谢谢您。

算法相关问题

作者您好,感谢您的工作。
我在您的论文中理解到,模糊核是在算法中只在LR空间进行估计,并不像DAN算法那样将重建图像也加入到核估计算法中采用递归的进行迭代优化,我想了解一下这个理解是否正确,并想问在DCLS算法训练中对于图像的模糊核是只进行了一次估计吗?期待您的回复。

如何从上一次训练断开处重新训练?

您好,小白刚接触深度学习这方面,之前训练老是断开,还没有完成过一次。想问您怎么从上一次断开处重新训练?
我看见option的path里有
pretrain_model_G: ~
strict_load: true
resume_state: ~ # true
还有断开时的迭代次数和epoch怎么得到,我该怎么改代码?

训练效果越来越差

您好,在训练的过程中我发现训练的效果越来越差,我用的是自己的数据集(遥感图像的),我是在加载您提供的预训练权的基础上再训练的,就是我没有从头开始训练,然后我测试了训练出来的权的效果,发现训练的越久效果越差
原始权
image
训练了2000step
image
训练4000step
image
训练6000step
image
为啥会这样啊,我数据集总共874张图片,是因为数据不够吗,如果我只有874张图片,那么相应的训练参数(迭代次数,学习率)等都重新调整吗,或者是需要从头开始训练,不加载自然图像训练出来的权?
希望作者有时间给我解答一下,非常感谢!

mismatch size of tensor

image

Hi! I got this error during test.
clear_feature_ch[:, :, ks:-ks, ks:-ks] 's shape is torch.Size([1, 1, 256, 256, 2, 2])

I'm using 2 scale pretrained model and Set5 lmdb.
The only thing I modified from the existing code is the fft part in utils.
image

how can I solve this?

issue about x2 SR training process

image
Hi, when I train the model under setting1_x2, I can not obtain a good result. Maybe I missed something in my training. Could you give some advice on it?

#### general settings
name: DCLSx2_setting1
use_tb_logger: true
model: blind
distortion: sr
scale: 2
gpu_ids: [0, 1, 2, 3]
pca_matrix_path: ../../../pca_matrix/DCLS/pca_matrix.pth

degradation:
  random_kernel: True
  ksize: 21
  code_length: 10
  sig_min: 0.2
  sig_max: 2.0
  rate_iso: 1.0
  random_disturb: false

#### datasets
datasets:
  train:
    name: DIV2K
    mode: GT
    dataroot_GT: /datasets/DF2K/HR/x2HR.lmdb

    use_shuffle: true
    n_workers: 4  # per GPU
    batch_size: 64
    GT_size: 128
    LR_size: 64
    use_flip: true
    use_rot: true
    color: RGB
  val:
    name: Set5
    mode: LQGT
    dataroot_GT: /datasets/Set5/x2HR.lmdb
    dataroot_LQ: /datasets/Set5/x2LRblur.lmdb

#### network structures
network_G:
  which_model_G: DCLS
  setting:
    nf: 64
    nb: 10
    ng: 5
    input_para: 256
    kernel_size: 21

#### path
path:
  pretrain_model_G: ~
  strict_load: true
  resume_state: ~

#### training settings: learning rate scheme, loss
train:
  lr_G: !!float 4e-4
  lr_E: !!float 4e-4
  lr_scheme: MultiStepLR
  beta1: 0.9
  beta2: 0.99
  niter: 500000
  warmup_iter: -1  # no warm up
  lr_steps: [200000, 400000]
  lr_gamma: 0.5
  eta_min: !!float 1e-7

  pixel_criterion: l1
  pixel_weight: 1.0

  manual_seed: 0
  val_freq: !!float 100

#### logger
logger:
  print_freq: 20
  save_checkpoint_freq: !!float 1000

This is the config settings. Thank you for your reply!

合成数据的问题

您好,注意到您合成数据是用的各向同性高斯模糊核,并没有实现各向异性高斯模糊核的代码。你是认为各向同性高斯模糊核更有一般性吗?

训练数据准备的问题

您好,在您的README中“Dataset Preparation”节写到“To transform datasets to binary files for efficient IO, run:”,但是当我运行create_lmdb.py文件时,并不知道其中的img_folder应该指向什么样的训练数据路径。换句话说,在生成训练数据时,我应该将img_folder设置为DIV2K的HR图像,还是DIV2Kx4下的LR图像?

关于噪声数据集的问题

作者您好!感谢您做出的优秀工作。在您的实验中有关于噪声数据集的测试结果,请问这个数据集的退化参数是如何设置的?具体来讲,是采用模糊和噪声两个退化吗?还是单独加噪退化?
image

torch.rfft相关的一个小问题

因为新版torch的原因,在网络上查了一些新旧更替的资料,发现对于图像数据,torch.rfft(img, 3, onesided=False)这里的dim给的都是2,不是3,请问是有什么影响吗?

去模糊特徵圖R的可視化圖

作者您好,想請問你可以提供去模糊特徵圖R的可視化方法嗎?
有嘗試使用一些方法但可視化的圖片很奇怪。

关于公式9的问题

作者,您好,关于公式9我有一个疑惑,式中的Gi在文中表示的是特征提取线性模块,我不能理解式9是怎么得到的,如果是左右两边同时乘Gi的话,那公式右边应该是Gi k*x,中间应该是估计的模糊核卷积下采样之后的图像,但是在公式9中是相乘,希望作者有时间能给我解答一下,非常感谢!

image

关于对比方法的问题

你好我想请问一下论文对比方法中的IKC等是用了相同的退化参数重新训练了模型,还是使用的官方发布的预训练模型

About noise

Thanks for your interesting work! As I reproduce your work, I find that you don't add any noise for anisotropic kernel training as your paper claimed. So is there any bug?

New Super-Resolution Benchmarks

Hello,

MSU Graphics & Media Lab Video Group has recently launched two new Super-Resolution Benchmarks.

If you are interested in participating, you can add your algorithm following the submission steps:

We would be grateful for your feedback on our work!

sos

您好,按照setting1中设置训练50,0000。在每隔2000个迭代会进行一次验证,这些验证保存的结果让我满脸问号???以set5中的‘baby’为例,下面是每次验证保存的结果分别是lr,2000iter,4000iter,6000iter,8000iter,10000iter。10000iter后的图片和10000iter结果差不多,都是黑屏:
原始lr:
sig1 8_baby_LR
2000iter:
sig1 8_baby_2000
4000iter:
sig1 8_baby_4000
6000iter:
sig1 8_baby_6000
8000iter:
sig1 8_baby_8000
10000iter:
sig1 8_baby_10000
后面从第10000iter到20,0000的结果都是全黑图片。这是在第8000iter后过拟合了吗。第4000iter和6000iter结果也很离谱。求救,您认为为什么会这样

setting2的训练

1365F9EC756166DC7F094795CB1B6FCE

再次感谢您精彩的工作!当我在复现您的代码时,在训练过程中,验证集的PSNR值突然的下降,问题是出在哪里的呢?希望您能指点一下。

IndexError: list index out of range

作者,你好,请问
Traceback (most recent call last):
File "test.py", line 24, in
opt = option.parse(parser.parse_args().opt, is_train=False)
File "D:\pythonProject\7_4\DCLS-SR-master\DCLS-SR-master\codes\config\DCLS\options.py", line 60, in parse
config_dir = path.split("/")[-2]
IndexError: list index out of range
这个是为啥?一直不行,还有一个问题就是先验模型放在哪个位置呢?可以详细写下测试过程吗?测试过程不需要数据集吧?感谢

关于模糊和采样的顺序问题

想请教下,既然调转了采样和模糊的顺序,那么先去模糊再上采样,走样问题该如何解决?上采样的插值过程不会造成图片走样吗?

sos

作者你好,我在用你的训练权重测试时,出现了如下报错:
image
我的测试步骤如下:1. 将测试的HR、LR分别用create_lmbd.py生成lmbd文件;
2. 修改test_setting1_x4.yml文件中的路径;
image
3. 运行测试文件。
不知道是哪一步出了问题,望指正

关于论文中Figure11的问题

您好,请问这个模型可以泛化到真实世界的图像上吗?
我使用了论文中的权重,测试在真实图像上的效果,发现效果并不是很好,是因为Setting1和Setting2的权重只是使用了模糊,没有加噪声进去训练的缘故吗?
并且想请问您在论文中Figure11的真实图片的结果中,使用的是哪个权重?谢谢!

About comparisons in figure 7 and table 4.

您好,非常感谢您的工作!

在文中您提到,对于模糊核估计阶段,使用转换后的模糊核作为监督,因此估计出的也应该是转换后的模糊核。但在图7和表4中,似乎您展示的是在原始模糊核域上的对比,想请问是如何将估计出的模糊核变换回原始模糊核域的?

拉普拉斯算子p

您好,在文章的架構圖中,有一個部分是將gy特徵圖進行拉普拉斯算子後丟到DCLS去進行去模糊的操作,如下:

image

想請問作者,在程式中是在哪邊進行拉普拉斯算子操作的?
感謝您的答覆。

关于Deep Constrained Least Squares理论问题

Ri是去模糊之后的特征图, 那么如果用laplacian算子得到pRi特征图范数应该是更大的,因为边缘化更突出.不知道为什么这里写的是将pRi作为目标函数最小化去优化.

psnr很低的问题

为什么我使用set5数据集做四倍超分,结果只有23左右呢????望解答

关于训练时psnr提高不多的问题

image
image
image

您好您好,就是训练时psnr提高不了多少,一直在31、32左右浮动,这是正常的嘛,还有就是用您提供的代码框架去训练别的网络时,参数设置啥的都是一样的但是psnr一直在9和10之间浮动,但是我用它原始的算法去训练时,结果确实正常的,训练效果一直在变好,您能为我解答一下嘛,感激不尽!!!

预训练权重

您好,提供的预训练权重链接我这边无法下载,请问是否有百度网盘或者百度云其他的下载方式?

about paper

您好,关于您论文中3.3节,有几个问题:
1、公式(10)是怎么得到的,需要最小化的不应该是||GiX↓s—Ri||2吗,就像Deep Wiener Decovolution中的公式(4a)。
2、为什么在特征空间中,平滑滤波器P和拉格朗日乘子可能不一致?如何理解?
3、为什么利用神经网络也就是代码中的self.grad_filter可以预测出来一组具有隐式拉格朗日乘数的平滑滤波器,怎么体现的呢?什么原理?

关于feature的问题

您好,根据论文,DCLS是在特征空间上进行的,特征是在原始的lr上线性变换得到的。但是网络结构中使用了resblock得到了特征,显然resblock是有激活函数,因而是非线性的,请问这应该怎么理解呢?
1687850936451
1687851135855

数据集测试

你好,作者,我按照你的提示,使用自己的数据集测试你训练的权重时,出现了全黑状况:以下是我数据集位置以及测试设置、结果:
数据集位置:
image
测试设置:
image
结果:
image
sig1 8_img_0000

不知道哪里出现了问题,希望能得到你的帮助,感谢。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.