发布时间:2022-11-15 11:00
代码地址: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个阶段。