本文提出一种Any-time super-Resolution Method(ARM)用以解决图像超分模型过参数问题,其出发点在于如下三个观察:
不同图像块的性能会超分模型的大小而变化;
在计算负载与重建性能之间存在一种均衡;
图像的边缘信息是评估其PSNR的一种有效方法。
本文首先构建了一种包含不同大小子网络的ARM超网络,然后构建一个Edge-to-PSNR查找表以将图像块的边缘信息映射到每个子网络的PSNR性能及其计算消耗。在推理阶段,每个图像块将被送入不同子网络以需求更佳的计算复杂-性能均衡。
值得一提的是,ARM模型的各个子网络具有参数共享性,故不会引入额外参数量。此外,ARM模型可以根据图像内容、硬件资源动态调整pipeline,真正做到了随时为您提供服务。
Method
在网络结构方面,这篇论文的核心是其所采用的USConv,见上图,该卷积最早见诸于《Slimmable Neural Networks》一文。从图可以看到:不同宽度的网络共享部分卷积参数。下面给出了USConv的实现code,相比常规卷积,它的weight要根据width_mul调整,事实上这个width_mult参数作为forward的输入可能更好一些。
class USConv2d(nn.Conv2d):
def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, us=[False, False]):
super(USConv2d, self).__init__(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
self.width_mult = None
self.us = us
def forward(self, inputs):
in_channels = inputs.shape[1]//self.groups if self.us[0] else self.in_channels//self.groups
out_channels = int(self.out_channels * self.width_mult) if self.us[1] else self.out_channels
weight = self.weight[:out_channels, :in_channels, :, :]
if self.bias is not None:
bias = self.bias[:out_channels]
else:
bias = self.bias
y = F.conv2d(inputs, weight, bias, self.stride, self.padding, self.dilation, self.groups)
return y
本文则利用该卷积构建了尺寸可调的ARM超分架构。假设ARM超网络为,通过设置不同的网络宽度参数我们可以得到不同的子网络。
上图给出了该方案的训练过程,每次迭代过程中图像块的重建难易程度在变化,故用于超分的子网络也在动态调整,进而确保了网络的全部参数都能参数到训练过程中。
但是,常规的均匀采样策略不太适用于这里的模型训练。本文提出了一种计算感知采样方案,即计算量越大的子网络训练次数越多。第j个子网络的采样概率定义如下:
在完成训练后,我们可以得到一个包含M个子网络的超网络。此外,我们还引入了一个插值分支,即直接通过插值进行超分,表示为。因此,最终所得ARM超网络可以描述为**。
上图给出了ARM方案的推理示意图,整个处理流程总结如下:
首先,将LR图像拆分为多个同尺寸的图像块;
然后,在这些图像块上计算器边缘得分;
其次,每个图像块的超分性能可以通过预构建的Edge-to-PSNR查找表进行粗估计,同时还可以估计所需计算消耗;
再次, 我们选择具有更小计算消耗、更高PSNR指标的子网络进行处理以达成计算消耗-性能均衡;
最后,我们将所有超分块合成最终的SR图像。
上图a给出了图像块的边缘得分与PSNR指标的关系图(SRCC=0.85),注:这里采用拉普拉斯边缘检测算法计算边缘得分。这里的edge-psnr相关性促使我们构建一个Edge-to-PSNR查找表,见上图b。可以看到:所构建的查找表可以很好的拟合edge-psnr分布,是故可以用于估计PSNR性能。
上图为笔者从作者开源的code中摘录出来的edge-psnr查找表信息,据笔者猜测:红色曲线对应插值,其他三条曲线分别对应不同复杂度的子网络。基本上,除了第一个区间(插值的性能反而更优)外,其他区间均为模型越大性能越好,即纹理越多的图像块不同模型的性能差异越大。
基于上述信息,我们可以通过如下公式确定每个图像块对应的子网络:
注:表示根据边缘得分估计的区间,表示不同子网络在不同区别的PSNR(即上面的图)。在这种情况下,基本上每个区间都会选择最大的那个子网络(这个好像有悖于预期???)。
除了图像块的边缘得分外,作者还引入了另外一个因子:计算复杂度(尽管更大的子网络生成的图像块具有稍优的效果,但同时也带来了更大的计算量)。为此,本文进一步将每个子网络的计算负载也纳入考量。假设每个子网络的计算负载为,我们定义如下了如下计算量-性能均衡函数:
注:表示用于平衡计算复杂度与PSNR估计的超参数。需要注意的是,查找表与可以离线计算。在线推理时,图像块的PSNR值可以通过其边缘信息快速确定。因此,该方案并不会造成计算量的提升。此外,该方案还可以随硬件资源变动而进行动态调整,也即是说,该方案真正做到了随时为您提供服务。
Experiments
在实验方面,本文参考ClassSR进行训练集、验证集的划分。这里仅提供主要结论,细枝末节建议查看原文。
从上面两个表可以看到:相比已有骨干和ClassSR,所提方案取得了更好的性能,同时计算量更少;相比ClassSR,在大多数场景下,ARM均具有相当或更好的结果。
上图也给出了硬件资源相关的超参数的实验对比,可用看到:
个人理解
从超分结构角度来讲,从ClassSR中的结构配置向ARM的转换是一种很自然的思路,SNN中的USConv天然的适合做这件事,但它并不适合唯一的候选,还有其他的参数共享策略。
事实上,从该研究方向上来看,网络结构从来就不曾是核心关注点,核心关注点应为是每个图像块应该根据何种信息选择何种大小的候选超分网络。在ClassSR一文中,作者提出了两种策略:(1) 分类器划分;(2) 梯度信息。ClassSR一文中的梯度信息与ARM中的边缘得分基本是一个意思。
ARM更进一步考虑每个块所需要的计算量以及实际可用计算量之间的均衡问题,而这才是这篇文章最大的一个价值:根据可用硬件资源动态调整推理pipeline(笔者个人观点)。
最后一点,ARM有一个“神来之笔”:将插值纳入到最终的部署网络中。这就使得该方案甚至可以部署到任意设备上,哪怕是无AI支撑的设备(直接调用插值就是了,哈哈)。
原作者:Happy AIWalker
|