本文提出一种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的输入可能更好一些。
代码语言:javascript复制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均具有相当或更好的结果。
上图也给出了硬件资源相关的超参数的实验对比,可用看到:
- 当可用资源接近于0时(见上图a),我们设置了一个非常小的,此时ARM自动选择了插值分支以满足计算约束;
- 当有稍多一些计算资源时(见上图b和c),我们设置了稍大的。以b对应图示为例,对于边缘得分低(<10)的块选择了插值,对于边缘得分位于10-180之间的选择了稍大的子网络subnet1,对更大得分的选择更大的子网络subnet2;
- 当有足够的计算资源时(见上图d),我们设置了更大的
,此时ARM几乎对所有的块均选择了最大子网络subnet3。
- 从下图也可以看到:伴随着eta的增大,越来越多的图像块选择更大的子网络进行超分,进而逐渐提升了PSNR指标;相比,ClassSR,ARM具有更高的PSNR、更低的FLOPs。
个人理解
从超分结构角度来讲,从ClassSR中的结构配置向ARM的转换是一种很自然的思路,SNN中的USConv天然的适合做这件事,但它并不适合唯一的候选,还有其他的参数共享策略。
事实上,从该研究方向上来看,网络结构从来就不曾是核心关注点,核心关注点应为是每个图像块应该根据何种信息选择何种大小的候选超分网络。在ClassSR一文中,作者提出了两种策略:(1) 分类器划分;(2) 梯度信息。ClassSR一文中的梯度信息与ARM中的边缘得分基本是一个意思。
ARM这里构建了一个包含
个参数查找表T,先根据边缘得分划分区别再根据候选分拣不同子网络的粗估计PSNR确定子网络。但实际上,从统计信息来看,基本符合越大模型PSNR越大,所以也就退化成了全局选择最大子网络,可能应该是根据边缘得分选择对应大小的子网络(这就与ClassSR提到的梯度方案了,不过ARM方案可以划分的更细,比如文中的30份,而这是ClassSR所做不到的)。
ARM更进一步考虑每个块所需要的计算量以及实际可用计算量之间的均衡问题,而这才是这篇文章最大的一个价值:根据可用硬件资源动态调整推理pipeline(笔者个人观点)。
最后一点,ARM有一个“神来之笔”:将插值纳入到最终的部署网络中。这就使得该方案甚至可以部署到任意设备上,哪怕是无AI支撑的设备(直接调用插值就是了,哈哈)。
参考阅读
- CVPR2021|超分性能不变,计算量降低50%,董超等人提出ClassSR
- 超越SwinIR,Transformer再一次占领low-level三大任务
- 让Dropout在图像超分领域重焕光彩!
- AdaDM: 让超分网络不仅可以用BN,性能还可以更优
- 视频超分新标杆 | BasicVSR&IconVS
- HINet | 性能炸裂,旷视科技提出Half Instance Normalization
- 图像增强领域大突破!3DLUT以1.66ms的速度处理4K图像
- ETH开源业内首个广义盲图像超分退化模型,性能效果绝佳
- ICCV2021 FBCNN: 超灵活且强度可控的盲压缩伪影移除新思路