CVPR2021-ClassSR | A General Framework to Accelerate Super-Resolution Networks

思想其实很早就有了,关注一下
论文地址:https://arxiv.org/pdf/2103.04039.pdf
Github地址:https://github.com/Xiangtaokong/ClassSR/tree/main/codes
在这里插入图片描述

Abstract:

我们旨在加速大图像(2K-8K)上的超分辨率(SR)网络。在实际使用中,通常将大图像分解为小子图像。基于此处理,我们发现不同的图像区域具有不同的复原难度,并且可以由具有不同容量的网络进行处理。凭直觉,光滑区域比复杂纹理更容易复原。为了利用此特性,我们可以采用适当的SR网络来处理分解后的不同子图像。在此基础上,我们提出了一个新的解决方案pipeline-ClassSR,它将分类和SR结合在一个统一的框架中。特别地,其首先使用类模块根据复原困难程度将子图像分类为不同的类别,然后应用SR模块对不同的类别执行SR。类模块是传统的分类网络,而SR模块是由待加速SR网络及其简化版本组成的网络容器。我们进一步介绍了一种新的分类方法,该方法具有两种损失-类别损失和平均损失,以产生分类结果。经过联合训练,大部分子图像将通过较小的网络,因此可以显着降低计算成本。实验表明,我们的ClassSR可以帮助大多数现有方法(例如FSRCNN,CARN,SRResNet,RCAN)在DIV8K数据集上节省多达50%的FLOPs。该通用框架也可以应用于其他低阶视觉任务。

Introduction:

1.现有的SR算法是将整幅图像分解为子图像块进行SR,然后进行拼接得到
2.现有的SR算法参数复杂度较大,一些加速方案也大多是基于轻量级网络上的设计

本文基于不同图像区域具有不同的复原难度,因此可以使用不同参数的网络进行复原这个观察,提出了一条新的SR pipeline-ClassSR
在这里插入图片描述
如上图所示。首先,图像中的更多区域相对容易还原。 根据本文的统计,对于DIV8K数据集,大约60%的LR子图像(32 x 32)属于平滑区域,而对于DIV2K数据集,该比例下降到30%。 因此,大图像的加速比会更高。 其次,子图像分解可以帮助节省实际应用中的存储空间,并且对于低内存处理芯片至关重要。 将子图像分配给并行处理器以进一步加速也是可行的。

本文提出的框架由两个模块组成-类模块和SR模块。类别模块是一个简单的分类网络,可根据复原难度将输入分类为特定类别,而SR模块则是一个网络容器,用于使用相应类别的SR网络处理分类后的输入。它们连接在一起,需要共同训练。新颖之处在于分类方法和训练策略。具体来说,本文引入了两个新的损失来约束分类结果。第一个是类损失,它会为单个子图像鼓励较高的所选类可能性。另一个是平均损失,可确保总体分类结果不会偏向单个类别。这两个损失协同工作,使分类有意义且分布均匀。还添加了图像损失(L1损失)以保证重建性能。对于训练策略,我们首先使用图像丢失对SR模块进行预训练。然后,我们修复SR-Module,并针对所有三个损失优化Class-Module。最后,我们同时优化两个模块,直到收敛为止。该流程对于不同的SR网络是通用且有效的。

classSR:

在这里插入图片描述
整体框架比较简单
1.class分支,对子图像块按照复原难度进行分类,simple, medium和hard类别
2.对于不同类别的图像块输入到对应SR网络中进行SR,最后拼接得到

重点看一下损失函数和训练策略。

A.Loss Functions:

损失函数包含三个损失,即Image-Loss(LI损失)、Class-Loss以及Average-Loss。具体来讲,Image-Loss用于确保图像重建质量;Class-Loss用于提升分类的有效性;Average-Loss用于确保每个SR分支可以被均等的选择。总体损失函数定义如下:
在这里插入图片描述
1.Class-Loss:

为了极大提升不同分类结果的概率差异,使得最大概率值接近1。比如,[0.90, 0.05, 0.05] 就比[0.34,0.33,0.33]结果要好。该损失函数的目的就是拉大不同类别预测得分,公式如下:
在这里插入图片描述
2.Average-Loss:

由于复杂分支更容易取得更好的结果, 因此仅仅采用Image-Loss与Class-Loss会使得子图倾向于选择最复杂分支,这就是使得ClassModule失其本意,进而SRModule将退化为基线模型。为避免该现象发生,本文为了确保每个SR分支被均等的选择。提出了Average-Loss以约束分类结果,定义如下:
在这里插入图片描述

B.Training Strategy:

三步训练法:

1.预训练SRModule。为预训练SRModule,我们采用PSNR值进行数据分类。具体来讲,以预训练MSRResNet的PSNR进行划分,前三分之一作为hard类,后三分之一作为simple类。然后,基于所划分的数据集进行不同复杂度的SR分支模型的训练

2.固定SRModule,训练ClassModule;

3.ClassModule与SRModule一起训练

Experiments:

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42096202/article/details/114677334