代码地址:https://github.com/ofsoundof/NTIRE2022_ESR
由于AIM2021没有展开,所以NTIRE2022是ESR方向的第三届。AIM2019冠军方法为IMDN,AIM2020冠军方法为RFDN,这两种方法也成为本次竞赛的baseline和大部分团队的主要借鉴方向。
为了多维度进行综合评比,本次竞赛分为了三个主要赛道:(1)运行时间(runtime);(2)模型复杂度(model complexity);(3)整体表现(overall performance)。子赛道1的模型复杂度以参数量和FLOPs为参考,两指标的排名和来决定排序。子赛道2的整体性能是参考 5 5 5个指标,包括运行时间,参数量,FLOPs,激活层(feature map)大小,显存消耗。和子赛道1相似,子赛道2的排名是5个参考指标的排名的和作为排序指标。
由于实际时间是最重要的,所以团队的名次排名按照主赛道的运行时间来排序。软件环境为Pytorch 1.11.0,CUDA 10.2,CuDNN 7.6.2,硬件环境为一块 Titan Xo GPU。FLOPS、特征层大小(activations)和最大显存(GPU memory)消耗是按照 256 ∗ 256 256*256 256∗256输入算的。
NITRE超分的尺度因子为4,算法模型在DIV2K验证集的PSNR最低标准为29.0,超过29.0的模型才会进行各赛道指标的评比。共303注册参赛者 ,共43个团队有有效提交。
字节跳动的ByteESR获得了主赛道的第一名,XPiel和NJUST_ESR团队获得了子赛道1的并列第一名,NEESR获得了子赛道2的第一名。
同时开展的NTIRE 2022相关挑战还有:(1)光谱恢复(spectral recovery);(2)光谱去马赛克(spectral demosaicing);(3)感知图像质量评估(perceptual image quality assessment);(4)修复(inpainting);(5)夜间摄影渲染(night photography rendering);(6)高效超分辨率(efficient super-resolution);(7)学习超分辨率空间(learning the super-resolution space);(8)压缩视频的超分辨率和视频增强(super-resolution and quality enhancement of compression video);(9)高范围动态(high dynamic range);(10)双目超分辨率(stereo super-resolution);(11)真实世界超分辨率(burst super resolution);
DIV2K的HR图像是1404*2040大小(随便打开了一张看的,不确定普遍性)的2K图像,一共有1000张。其中800张是训练集,100张是验证集,100张是测试集。制作数据集采用的是下采样因子为4的双三次差值(bicubicly downsampled)。在挑战进行的过程当中,测试集的HR图像不对外开放。
IMDN是AIM 2019的受限超分挑战的冠军,一共有43个卷积。
IMDN使用 1 1 1个 C o n v 3 ∗ 3 Conv3*3 Conv3∗3提取特征,再用 8 8 8个信息多路蒸馏块(information multi-distillation block,IMDN)进行信息校正(refine)。每个IMDB包含 4 4 4阶段的渐进式校正特征表示。在每个阶段,都将输入特征分成两个独立的特征(channel split),一路直接传递到block的底部,一路进行高维空间的信息校正。上采样层采用pixel Shuffle算子,在上采样前使用一个卷积进行最终的矫正。
一堆指标中,运行时间(runtime)被认为是最重要的一个。该挑战要求参赛者的算法在验证集上的PSNR在29.00db以上。对于最终排名,准确度的微小下降是可以容忍的。其中,验证集PSNR大于28.95db,测试集的PSNR高于28.65的提交即可进入最终排名中。
各团队的排名如下,其中PSNR和Conv数量不计入统计指标。FLOPs、Acts和GPU Mem是以256*256为输入计算的。GPU Mem是由pytorch的接口(torch.cuda.max_memory_allocated)推断出来的最大的GPU内存消耗。每个数字后面的括号内容,就是在该项的排名。计算指标的代码示例在https://github.com/ofsoundof/NTIRE2022_ESR可以找到,提交的解决方案和预训练权重代码也可在上面网址中获得。
运行时间的主赛道冠军是ByteESR,主赛道的前三算法都在30ms以内,第13名也比AIM 2020冠军RFDN要快。可以关注到的是,在DIV2K的数据集下,PSNR指标都是要比baseline要低的,说明只能在某个需要的应用方向进行折中设计。
模型复杂度赛道有两个冠军,是XPiel和NJUST_ESR。9个解决方案的参数量都低于0.3M,要比IMDN和RFDN好上不少。
整体表现赛道的冠军是NEESR,ByteESR和rainbow是二三名。
在运行时间和参数量比baseline的IMDN要低的解决方案中,xilinuxSR的PSNR指标最高(验证集29.05,测试集28.75)。IMDN与xilinux相比,PSNR在验证集提升比测试集的提升大。相对而言,TeamInception和Just Try在测试集的提升更大些,而验证集的PSNR和IMDB相近。这些现象表明IMDN更倾向于验证集的高PSNR,这也是验证集的PSNR指标低位设置为29.00db而不是29.13db的原因。
主体思想就是利用重参数的思想,将一些边缘信息放入重参数模块中,比如sobel算子,Laplcaian算子,最后使用一个 C o n v 3 ∗ 3 Conv3*3 Conv3∗3代替。
这是RFDN中的主要模块,使用SRB(shallow residual block)作为其中组件,多使用 C o n v 1 Conv1 Conv1做信息蒸馏,使用concat算子聚合特征。
1. 在架构的设计上,改IMDN和RFDN仍是主要的技巧方向。ByteESR用RLEB代替SRB和IMDB,主要区别为去掉了concat层和 1 ∗ 1 1*1 1∗1蒸馏层,这是为了runtime特别考虑的。此外,ByteESR也减少了ESA模块的卷积数。
2. 在runtime主赛道的前两名都没有包含多阶段信息蒸馏模块。在[85]有提到,太多的skip connection和 1 ∗ 1 1*1 1∗1信息蒸馏会损害runtime。
3. 重参数模块可以带来轻微的性能提升。比如NJU_Jet用一个重参数residual block代替了平常的residual block。NEESR使用一个edge-oriented Convolution block重参数重组成一个正常的卷积。
4. 滤波器分解方法可以有效减少模型复杂度。XPiel使用了depthwise + 1*1 Conv,NJUST_ESR使用逆残差结构,这两个解决方案赢得模型复杂度赛道的冠军。
5. 模型裁剪开始起到关键的作用。ByteESR从 48 48 48 Channel略微减到 46 46 46 Channel,MegSR和xlinxSR也使用到了channel prune技术。
6. 激活函数是一个重要因子。rainbow使用SiLU激活函数,很多团队使用了GeLU激活函数。
7. 损失函数的设计也是需要考虑的。大部分方法使用L1或者L2损失函数。一些团队设计损失函数让PSNR有所增长。比如ByteESR团队使用对比损失(constrastive loss)带来了验证集的PSNR有 0.01 0.01 0.01dB到 0.02 0.02 0.02dB的提升。而NKU-ESR团队提出了 edge-enhanced gradient-variance损失函数。
8. 先进的训练策略可以保证网络的性能。比如,大多数团队使用了延长训练。因为模型的容量是很小的,使用更大的patchSize和batchSize就变得可行了。一些团队使用周期学习率策略和余弦学习率策略,可以帮助模型训练跳出局部最小点。冠军解决方案使用了经典的包含多次训练阶段。
竞赛的时候,训练允许使用额外的数据及,如Flickr2K,但DIV2K验证集和测试集不能进入训练中。
ByteESR团队提出的ESR解决方案名为RLFN(Residual Local Feature Network)。RLRN使用经典的一种SR架构,与IMDN类似,不同点在于RLFN使用的是RLFB(Residual Local Feature Block)。RLFB由SRB改动而来。SRB用 3 3 3个 1 ∗ 1 1*1 1∗1Conv进行特征蒸馏,然后将所有的蒸馏特征进行concat。作者认为,尽管聚合多层的蒸馏特征能有更好的表现特征,但concat会花费大部分的推理时间。考虑到要减少GPU占用和减少推理时间,RLFB移除了Concat操作和相关的特征蒸馏层,使用Add代替。此外,RLFB使用了ESA[52],但简化成只有一个Conv 3 3 3来减少模型深度和复杂度。模型结构如下图所示。
论文[53]和[72]发现,一个随机初始化特征提取器,不需要任何训练,可以提升模型在几个密集预测任务上的性能。受这些论文启发,RLFN建立了一个两层网络用于特征提取,卷积的权重是随机初始化的。对比损失定义如下:其中 ϕ \phi ϕ被定义为由特征提取器生成的特征图(feature map), ∥ ⋅ ∥ \|\cdot\| ∥⋅∥表示 L 1 L_1 L1 loss。有一个疑问就是分母中的lr和sr是怎么对应上的。
C L = ∥ ϕ ( y s r ) − ϕ ( y h r ) ∥ ∥ ϕ ( y s r ) − ϕ ( y l r ) ∥ CL=\frac{\| \phi(y_{sr}) - \phi(y_{hr}) \| }{\|\phi(y_{sr})-\phi(y_{lr})\|} CL=∥ϕ(ysr)−ϕ(ylr)∥∥ϕ(ysr)−ϕ(yhr)∥
RLFN有4个RLFBs,初始的特征Channel为48,ESA Channel为16,训练时使用DIV2K和Flickr2K。训练分为4个阶段。
论文[31]和[51]为代表的EISI使用大量Channel Split 和聚合操作来充分利用有限的层次特征。相比之下,顺序网络操作避免了频繁访问前面的状态和额外的节点,这有利于减少内存消耗和运行时间开销。基于此,NJU_Jet团队减少了特征融合的使用,通过叠加多个高度优化(各推理框架)的卷积层和激活层,设计了轻量网络backbone。特征提取与重构部分,是和[31, 51]一致的。高频学习部分由所提出的增强残差块(ERB,enhanced residual block)和高频注意力模块(HFAB, high-frequency attention block)组成。结构如下图所示,其中Rep block是一个重参数模块,在Infence阶段会重组为一个 C o n v 3 Conv3 Conv3。
在ESR模块中。为了减少skip connection内存访问消耗(MAC,memory access cost),该团队使用ESR代替EDSR平常的RB。如上图所示,主要区别在于使用了重参数模块,以及不使用skip connection,但在训练的时候,在重参数模块中使用了两个skip connect来减轻训练难度。
在HFAB模块中。作者认为之前的attention方案缺少两方面的考虑:(1)一些attention方案如CCA,ESA,有多分支拓扑结构,这会引入太多额外的内存消耗。(2)一些attention的算子不是计算高效优化的,比如ESA的 C o n v 7 Conv7 Conv7。考虑到这些多方面,作者设计了图4的HFAB模块。
训练时使用DIV2K和Flickr2k数据,模型使用5个ERB-HFAB模块堆叠的序列。ERB的feature map Channel为50,HFAB的feature map Channel为16,batchSize为64,HR patchSize为256,使用随机翻转和旋转。初始lr为 5 ∗ 1 0 − 4 5* 10^{-4} 5∗10−4,每 2 ∗ 1 0 5 2 * 10^5 2∗105次迭代减半学习率,共迭代 1 0 6 10^6 106次。使用L1 loss,Adam优化器,使用上述参数策略finetune训练 4 4 4次。然后再使用L2 loss进行finetune,初始lr为 5 ∗ 1 0 − 5 5*10^{-5} 5∗10−5,迭代 2 ∗ 1 0 5 2*10^5 2∗105次学习率减半。最后的重构阶段,使用batchSize为 256 256 256,HR patchSize为 640 640 640迭代 1 0 5 10^5 105次, L2 loss。
NEESR团队提出的方法名为EFDN(edge-oriented feature distillation network)。EFDN也由RFDN改来,出于一些效率上的考虑,做了一些设计:例如通道数更少,使用ECB(edge-oriented convolution block)代替SRB(shallow residual block)。与RFDN不同,EFDN使用 42 42 42Channel来加速(减少了Channel),受ECBSR启发,EFDN使用重参数技术(也就是ECB)来提高SR性能,如下图所示。EFDN由4个RFDECB堆叠而成。
训练可以分为两个阶段,3个步骤;
XPixel团队提出的网络名叫BSRN(Blurprint Separable Residual Network),整体架构也是追随RFDN的,网络组成模块为ESDB,上采样重构模块包含一个 C o n v 3 Conv3 Conv3和pixelShuffle算子,如下图所示。ESDB在多阶段特征融合结构上与RFDB一样,只是将RB替换成了BSRB,区别在于 C o n v 3 Conv3 Conv3换成了线性层+DW Conv,激活函数也替换为GELU。也就是说,BSRN是在RFDN上进行算子方面的魔改,而基本架构保持不变 。ESA是spatial attention,作者发现再添加一个channel attention可以有效提升精确度,所以在每一个ESDB下都增加一个channel attention,即下图中的channel Weighting。作者认为,这个额外花费是很轻微的。在网络设计上,BSRN增加了多个skip connection,每个BSRN的输出channel为48,所以channel Weighting的shape为 1 ∗ 1 ∗ 48 1*1*48 1∗1∗48,使用 σ = 0.9 , μ = 1 \sigma=0.9,\mu=1 σ=0.9,μ=1的正态分布初始化。
使用DIV2K和FlickrK数据集,随机旋转( 90 ° , 180 ° , 270 ° 90°,180°,270° 90°,180°,270°)和水平翻转作为数据增强。在每个GPU中,HR patchSize为 128 128 128,batchSize为 72 72 72。Adam优化器, β 1 = 0.9 , β 2 = 0.999 \beta_1=0.9,\beta_2=0.999 β1=0.9,β2=0.999,初始 l r lr lr为 5 ∗ 1 0 − 4 5*10^{-4} 5∗10−4,使用余弦衰减学习率策略,L_2 loss,从头训练 1 ∗ 1 0 6 1*10^6 1∗106次迭代。使用Pytorch1.9.1,共4块2080Ti的GPU。
NJUST_ESR使用vision transformer(ViT),结合了卷积和多头自注意的优势。具体来说,使用包含一个ViT block和逆残差模块的混合模块来同时提取局部和全局信息。多次堆叠该模块来学习判别特征表示。网络如下图所示,
提出的模型MobileSR在DIV2K数据集上训练。HR patchSize为 128 128 128,batchSize为 64 64 64,L1 loss和frequency loss [10] 的结合,Adam优化器,初始学习率为 5 − 1 0 − 4 5-10^{-4} 5−10−4,每 100 100 100个epoch学习率减半,一共训练 450 450 450个epoch。
HiImageTeam团队也是跟随IMDN和RFDN的架构,设计了他们的网络ARFDN(Asymmetric Residual Feature Distillation Network)。IMDN是为了efficient SR设计的,但作者认为还存在着冗余和非高效的算子,如下图(a)所示。相比IMDB,RFDB在计算上有明显的效率上的进步,如下图(b)所示。在充足的训练情况下,RFDN中的SRB模块和一个普通的卷积是等效的,如下图©所示。也就是说,RFDN中也有冗余运算, 在 RFANet [52] 的蒸馏信息增强阶段使用了一个有效的注意力模块,即 ESA 模块。因此,该团队设计的网络也借鉴了这个模块,如下图(d)所示,设计了一个不对称(asymmetric)的残差特征蒸馏块,它由不对称信息蒸馏和、信息重组和利用算子组成。
ARFDN由4个ARFDBs组成,整个框架管道和RFDN一致,其中全局特征聚合用于增强最终特征,特征通道数设置为 50。HR patchSize设为 256 256 256,batchSize为 36 36 36,整个训练过程分为两阶段。第一阶段,训练 1000 1000 1000个epoch,用 L 1 L_1 L1 loss,Adam,初始 l r lr lr为 2 ∗ 1 0 − 4 2*10^{-4} 2∗10−4,每 30 30 30个epoch减半,共训练 1000 1000 1000个epoch。第二阶段,finetune训练,使用 L 2 L_2 L2 Loss,初始 l r lr lr为 1 ∗ 1 0 − 4 1*10^{-4} 1∗10−4。训练数据集使用DIV2K,OST,Flickr2K.。
rainbow是IMDN的设计者,本次的提交方案也是基于IMDN的改进,主要还是将IMDB改了一下,从效率上进行了设计。如下图14所示,用了 5 5 5个channel split,算子在改进版IMDB上(IMDB+),input channel设置为了36,也使用了重参数模块,如图13所示。重参数模块能带来 0.03 d B 0.03dB 0.03dB的性能提升。与ECBSR提出的ECB不同,rainbow移除了Conv1 Sobel和Conv1*1 Laplacian分支,目的是为了训练更快,因为这两个分支使用的是depthwise卷积。
Super团队提出的方案RePAFDN(Reparam Pixel Attention Feature Distillation Network)主要基于RFDN提出的设计,把IMDB中的channel split算子替换成了信息蒸馏为目标的 C o n v 1 Conv1 Conv1。该团队总结,有三点与RFDN不同:(1)使用了pixel Attention来有效改进特征表示容量(原来是spatial attention);(2)模型训练时使用了重参数技术;(3)模型的进一步压缩是通过减少前三个block的大小完成的。
RePAFDN的网络架构如下图15所示。FDB和FDB-S的特征融合采用的是Concat,Conv3的长连接特征融合采用的是Element-ADD,然后进行上采样的重构(Conv3 + pixelShuffle)。FDB如下图(a)所示,与RFDB不同的地方在于移除了一个残差连接以及使用一个重参数模块替换了SRB。重参数模块如下图17所示,重参数模块能提升 0.02 d B 0.02dB 0.02dB。pixel attention如下图18所示,与PAN不同,由于PA对运行速度不友好,所以不在FDB中使用,只在特征提取的最后使用。
使用DIV2K和Flickr2K数据集训练。Channel设置为48,FDB中每个信息蒸馏 C o n v 1 Conv1 Conv1的输出Channel为 12 12 12。训练也分为两个阶段。第一个阶段,HR patchSize为 256 256 256。第二个阶段,HR patchSize为 320 320 320。
MegSR团队提出的方法名为PFDNet。作者认为IMDN和RFDN是从特征蒸馏块,也达到不错的性能。所以作者从prune策略出发进行设计网络,受RFDN和ASSL启发,MegSR团队探索如何合并prune和特征蒸馏网络。
训练分为2个阶段。
从改善IMDN信息流的表示容量角度上出发,VMCL_Taobao团队设计了一个多尺度信息蒸馏网络(Multi-Scale information Distillation Network,MSDN)。MSDN是通过堆叠多尺度信息蒸馏块(Multi-Scale information Distillation Blocks,MSDB)组成的。受RFDN启发,MSDB采用 C o n v 1 Conv1 Conv1进行信息蒸馏, C o n v 3 Conv3 Conv3进行特征校正,以减轻IMDB中的channel split算子的限制。如下图所示,绿框中表示的就是多尺度校正模块,用于替代RFDB中的 C o n v 3 Conv3 Conv3,第一个绿框中 C o n v 1 Conv1 Conv1升了Channel, C o n v 3 Conv3 Conv3的groups参数为2,最后一个 C o n v 3 Conv3 Conv3的dilated参数为2。如下图左边展示,MSDB也设计了一个尺度因子为2的上采样校正模块。
Bilibili团队在RFDN的基础下,使用了重参数技术,如下图所示,除了ESA 层,其他的 C o n v 3 Conv3 Conv3都使用RepBlocks(RB)代替。RFDB的一般Channel为50,而该团队的block选择Channel为40。
NKU-ESR团队提出一个边缘增强特征蒸馏网络(edge-enhanced feature distillation network,EFDN),在网络和损失设计的协同作用下保留高频信息。使用重参数方法ECB保留边缘信息。EFDN的backbone是通过NAS搜索得到的。同时,提出了一种边缘增强梯度损失来校准重新参数化的块训练。下图展示了3中重参数块。RepVGG、DBB和ECB,一共有8中重参数模块的分支,可以提高卷积在不同场景下的特征提取能力。
有越多的重参数分支,网络的表达能力可能会越高。但直接集成会带来无法承受的昂贵的训练成本。同时,在并行分支的合并过程中,边缘和结构信息可能被衰减。为解决这个问题,设计了下图的EDBB(实际上,就减少了一个avg pooling分支)。
在网络架构上,EFDN的主体设计思路与IMDN、RFDN一致,如下图所示。
受gradient variance(GV)loss [1] 的启发,作者提出了边缘增强梯度方差损失(edge-enhanced gradient-variance loss,EG loss)。具体如下:
该团队提出的方法名为自适应特征蒸馏网络(Adaptive Feature Distillation Network,AFDN)。提出的AFDN如下图所示,是从RFDN改进的,取得了细小的改善。AFB在使用channel split时将通道数分成两半,分别进行卷积。
感觉都没啥大区别。。。先这样吧,总结太累了。这也统计了前十几名了。