`class edgeSR_CNN(nn.Module):
def __init__(self, C, D, S, s):
super().__init__()
self.softmax = nn.Softmax(dim=1)
if D == 0:
self.filter = nn.Sequential(
nn.Conv2d(D, S, 3, 1, 1),
nn.Tanh(),
nn.Conv2d(S,2ss*C,3,1,1,bias=False),
nn.PixelShuffle(s))
else:
self.filter = nn.Sequential(
nn.Conv2d(1, D, 5, 1, 2),
nn.Tanh(),
nn.Conv2d(D, S, 3, 1, 1),
nn.Tanh(),
nn.Conv2d(S,2ss*C,3,1,1,bias=False),
nn.PixelShuffle(s))
def forward(self, input):
filtered = self.filter(input)
B, C, H, W = filtered.shape
filtered = filtered.view(B, 2, C, H, W)
upscaling = filtered[:, 0]
matching = filtered[:, 1]
return torch.sum(upscaling * self.softmax(matching), dim=1, keepdim=True)
`
Deep-Learning 作为对标,本文以FSRCNN、ESPCN为候选,结构见下图。两者的区别有两点:激活函数、上采样方式。
Experiments
上图所构建的1185超分模型池,训练数据采用General100与T91进行,模型的输入为1通道灰度图像。整个训练过程花费了两个月时间@tesla M40GPUX7。为测试最终模型,主要考虑了两种推理设备: Nvidia Jetson AGX Xavier:Nvidia公司的嵌入式GPU设备,功耗30Watt;
Raspberry Pi 400:树莓派CPU处理器,功耗15Watt。
测试过程中,每个模型的输出为14个Full-HD图像,测试集源自DIV2K。推理过程采用FP16推理。图像质量评价则采用了Set5、Set14、BSDS100、Urban100以及Manga109等基准数据集。
上图对比了不同方案的性能-速度,以bicubic作为基准,从中可以看拿到:
在端侧GPU设备上,所提edge-SR成功弥补了经典上采样与深度学习超分之间的空白,同时具有比bicubic上采样更好的速度-质量均衡;
在树莓派CPU设备上,edge-SR弥补了x2与x3倍率下的空白,但x4任务上bicubic上采样具有更佳的性能。
深度学习方案更擅长于提升图像质量,如ESPCN在高质量范围具有最快速度;
eSR-CNN并未提升ESPCN质量,但提升了其速度;
eSR-MAX具有最快速度,但质量不稳定;
eSR-TM与eSR-TR在中等速度-质量方面具有最佳性能。
上表给出了不同方案的性能,可以看到:eSR方案取得了最佳速度、最低功耗 ,同时具有比bicubic上采样更好的图像质量。
上述两个图对eSR-TM与eSR-TR进行了可视化解释,从中可以看到:
对于eSR-TM而言,不同滤波器处理不同频率带;尽管滤波器不平滑,但具有一定程度的方向辨别能力;
对于eSR-TR而言,matching与上采样滤波器同样不平滑,但有一定的方向性。
原作者:Happy