15

Happy · 2023年03月09日

ARM | 内容&硬件感知超分方案,让图像超分自适应适配不用算力平台

image.png

本文提出一种Any-time super-Resolution Method(ARM)用以解决图像超分模型过参数问题,其出发点在于如下三个观察:

  • 不同图像块的性能会超分模型的大小而变化;
  • 在计算负载与重建性能之间存在一种均衡;
  • 图像的边缘信息是评估其PSNR的一种有效方法。

本文首先构建了一种包含不同大小子网络的ARM超网络,然后构建一个Edge-to-PSNR查找表以将图像块的边缘信息映射到每个子网络的PSNR性能及其计算消耗。在推理阶段,每个图像块将被送入不同子网络以需求更佳的计算复杂-性能均衡

值得一提的是,ARM模型的各个子网络具有参数共享性,故不会引入额外参数量。此外,ARM模型可以根据图像内容、硬件资源动态调整pipeline,真正做到了随时为您提供服务

image.png

Method

image.png
在网络结构方面,这篇论文的核心是其所采用的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    

image.png

上图给出了该方案的训练过程,每次迭代过程中图像块的重建难易程度在变化,故用于超分的子网络也在动态调整,进而确保了网络的全部参数都能参数到训练过程中

但是,常规的均匀采样策略不太适用于这里的模型训练。本文提出了一种计算感知采样方案,即计算量越大的子网络训练次数越多。第j个子网络的采样概率定义如下:

image.png
image.png
上图给出了ARM方案的推理示意图,整个处理流程总结如下:

  • 首先,将LR图像拆分为多个同尺寸的图像块;
  • 然后,在这些图像块上计算器边缘得分;
  • 其次,每个图像块的超分性能可以通过预构建的Edge-to-PSNR查找表进行粗估计,同时还可以估计所需计算消耗;
  • 再次, 我们选择具有更小计算消耗、更高PSNR指标的子网络进行处理以达成计算消耗-性能均衡;
  • 最后,我们将所有超分块合成最终的SR图像。

image.png
image.png

上图为笔者从作者开源的code中摘录出来的edge-psnr查找表信息,据笔者猜测:红色曲线对应插值,其他三条曲线分别对应不同复杂度的子网络。基本上,除了第一个区间(插值的性能反而更优)外,其他区间均为模型越大性能越好,即纹理越多的图像块不同模型的性能差异越大。

基于上述信息,我们可以通过如下公式确定每个图像块对应的子网络:

image.png

Experiments

在实验方面,本文参考ClassSR进行训练集、验证集的划分。这里仅提供主要结论,细枝末节建议查看原文。

image.png
image.png

从上面两个表可以看到:相比已有骨干和ClassSR,所提方案取得了更好的性能,同时计算量更少;相比ClassSR,在大多数场景下,ARM均具有相当或更好的结果

image.png

image.png

上图也给出了硬件资源相关的超参数的实验对比,可用看到:

  • 当可用资源接近于0时(见上图a),我们设置了一个非常小的,此时ARM自动选择了插值分支以满足计算约束;
  • 当有稍多一些计算资源时(见上图b和c),我们设置了稍大的。以b对应图示为例,对于边缘得分低(<10)的块选择了插值,对于边缘得分位于10-180之间的选择了稍大的子网络subnet1,对更大得分的选择更大的子网络subnet2;
  • 当有足够的计算资源时(见上图d),我们设置了更大的,此时ARM几乎对所有的块均选择了最大子网络subnet3。
  • 从下图也可以看到:伴随着eta的增大,越来越多的图像块选择更大的子网络进行超分,进而逐渐提升了PSNR指标;相比,ClassSR,ARM具有更高的PSNR、更低的FLOPs。

image.png
image.png

个人理解

从超分结构角度来讲,从ClassSR中的结构配置向ARM的转换是一种很自然的思路,SNN中的USConv天然的适合做这件事,但它并不适合唯一的候选,还有其他的参数共享策略。

事实上,从该研究方向上来看,网络结构从来就不曾是核心关注点,核心关注点应为是每个图像块应该根据何种信息选择何种大小的候选超分网络。在ClassSR一文中,作者提出了两种策略:(1) 分类器划分;(2) 梯度信息。ClassSR一文中的梯度信息与ARM中的边缘得分基本是一个意思。

ARM这里构建了一个包含个参数查找表T,先根据边缘得分划分区别再根据候选分拣不同子网络的粗估计PSNR确定子网络。但实际上,从统计信息来看,基本符合越大模型PSNR越大,所以也就退化成了全局选择最大子网络,可能应该是根据边缘得分选择对应大小的子网络(这就与ClassSR提到的梯度方案了,不过ARM方案可以划分的更细,比如文中的30份,而这是ClassSR所做不到的)。

ARM更进一步考虑每个块所需要的计算量以及实际可用计算量之间的均衡问题,而这才是这篇文章最大的一个价值:根据可用硬件资源动态调整推理pipeline(笔者个人观点)。

最后一点,ARM有一个“神来之笔”:将插值纳入到最终的部署网络中。这就使得该方案甚至可以部署到任意设备上,哪怕是无AI支撑的设备(直接调用插值就是了,哈哈)。

来源:AIWalker
作者: Happy

推荐阅读

本文章著作权归作者所有,任何形式的转载都请注明出处。更多动态滤波,图像质量,超分辨相关请关注我的专栏AIWalker。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
6194
内容数
191
夯实深度学习知识基础, 涵盖动态滤波,超分辨,轻量级框架等
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息