SRMD:Learning a Single Convolutional Super-Resolution Network for Multiple Degradations

Learning a Single Convolutional Super-Resolution Network for Multiple Degradations

Kai Zhang, Wangmeng Zuo, Lei Zhang

CVPR2018

摘要

之前的方法都是用bicubic下采样的数据做LR,导致模型处理退化过程不符合bicubic的LR时效果差。另外一点就是前人的模型可扩展性差,因为用单一的退化模型训练得到的网络无法应对真实复杂的退化图像。基于这两个问题,论文同时考虑了模糊核和噪声等级,将模糊核、噪声、LR同时作为网络的输入,来得到一个更一般的适用于多种退化图像的超分辨率模型。

主要贡献

  1. 提出了扩展性较强的网络,更适用于处理实际问题。
  2. 提出了维度拉长策略,可以让模糊核和噪声的维度跟图像匹配。
  3. 论文提出的方法在合成图像和真实图像上效果突出。

主要方法

退化模型

y = (x\downarrow _{s})\otimes k +n,其中\downarrow_{s}表示下采样s倍,k是模糊核,n是加性噪声。

  1. k:超分辨率问题中不用将模糊核考虑的太复杂,简单的高斯模糊就可以。而对图像高斯模糊核的准确估计将对网络性能有显著提升。
  2. n:超分辨率问
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
class LinearMaskedCoupling(nn.Module): """ Coupling Layers """ def __init__(self, input_size, hidden_size, n_hidden, mask, cond_label_size=None): super().__init__() # stored in state_dict, but not trained & not returned by nn.parameters(); similar purpose as nn.Parameter objects # this is because tensors won't be saved in state_dict and won't be pushed to the device self.register_buffer('mask', mask) # 0,1,0,1 # scale function # for conditional version, just concat label as the input into the network (conditional way of SRMD) s_net = [nn.Linear(input_size + (cond_label_size if cond_label_size is not None else 0), hidden_size)] for _ in range(n_hidden): s_net += [nn.Tanh(), nn.Linear(hidden_size, hidden_size)] s_net += [nn.Tanh(), nn.Linear(hidden_size, input_size)] self.s_net = nn.Sequential(*s_net) # translation function, the same structure self.t_net = copy.deepcopy(self.s_net) # replace Tanh with ReLU's per MAF paper for i in range(len(self.t_net)): if not isinstance(self.t_net[i], nn.Linear): self.t_net[i] = nn.ReLU() def forward(self, x, y=None): # apply mask mx = x * self.mask # run through model log_s = self.s_net(mx if y is None else torch.cat([y, mx], dim=1)) t = self.t_net(mx if y is None else torch.cat([y, mx], dim=1)) u = mx + (1 - self.mask) * (x - t) * torch.exp( -log_s) # cf RealNVP eq 8 where u corresponds to x (here we're modeling u) log_abs_det_jacobian = (- (1 - self.mask) * log_s).sum( 1) # log det du/dx; cf RealNVP 8 and 6; note, sum over input_size done at model log_prob return u, log_abs_det_jacobian 帮我解析代码
最新发布
07-13
这段代码定义了一个名为LinearMaskedCoupling的类,该类继承自nn.Module。LinearMaskedCoupling是一种coupling层,用于在流式生成模型中实现可逆转换。下面对代码进行解析: 在__init__方法中,有以下几个参数: - input_size:输入数据的维度大小 - hidden_size:隐藏层的维度大小 - n_hidden:隐藏层的数量 - mask:掩码,用于指定哪些输入特征是要保留的(值为1),哪些是要忽略的(值为0) - cond_label_size:条件标签的维度大小,用于条件版本的生成(可选参数,默认为None) 在__init__方法中,首先调用父类nn.Module的构造函数super().__init__()。然后使用register_buffer方法注册了一个名为mask的缓冲区(buffer),用于存储掩码。这样做的目的是将mask保存在模型的state_dict中,但不作为需要训练的参数返回。 接下来定义了scale function和translation function。两者具有相同的结构,都是由一系列线性层和激活函数组成。其中,scale function用于计算尺度参数log_s,translation function用于计算平移参数t。 在forward方法中,首先根据掩码对输入x进行掩码操作,得到mx。然后根据是否有条件标签y,将mx与y进行拼接,作为输入传递给scale function和translation function,分别计算尺度参数log_s和平移参数t。 最后,根据RealNVP论文中的公式,通过对mx进行逆变换操作,得到u。同时计算对数绝对行列式的Jacobian矩阵(log_abs_det_jacobian)。 最终,函数返回u和log_abs_det_jacobian。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值