论文代码:https://github.com/HongguangZhang/DMPHN-cvpr19-master
论文地址:https://arxiv.org/pdf/1904.03468.pdf
论文解读:https://blog.csdn.net/weixin_42784951/article/details/106108196
文章使用 1-2-4-8 的结构模式。其中1-2-4-8 代表由粗到细网络所使用的图像块。
网络的每个层都由一对编码器/解码器组成。 通过将模糊图像输入B1分成多个不重叠的图像块块来生成每个级别的输入。 较低级别(对应于更精细的网格)的编码器和解码器的输出将被添加到较高级别(高于一个级别),以便顶层包含在较精细级别中推断出的所有信息。 请注意,每个级别的输入和输出图像块的数量是不同的,因为我们工作的主要思想是使较低级别的注意力集中在局部信息(更细的网格)上,从而为较粗的网格提供残差信息(通过级联卷积获得特征)。
下面我们从编码器开始对论文进行解读:
如文章所述,编码器由简单卷积和激活函数组成
self.layer1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.layer2 = nn.Sequential(
nn.Conv2d(32, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(32, 32, kernel_size=3, padding=1)
)
self.layer3 = nn.Sequential(
nn.Conv2d(32, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(32, 32, kernel_size=3, padding=1)
)
#Conv2
self.layer5 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1)
self.layer6 = nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(64, 64, kernel_size=3, padding=1)
)
self.layer7 = nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(64, 64, kernel_size=3, padding=1)
)
#Conv3
self.layer9 = nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1)
self.layer10 = nn.Sequential(
nn.Conv2d