论文地址:https://arxiv.org/abs/2105.10288
代码地址:https://github.com/cxzhou95/XLSR
论文小结
本文的方法名为 XLSR ,名义上获得了2021年Mobile AI SISR比赛的冠军。该比赛目标是移动平台,模型的所有参数和推理都需要是INT8量化的,所以该比赛下的论文模型都是INT8量化的。总得来说,论文所做基本可分为两点:(1)选择一个合适的基础框架模块;(2)为SR模型的输出添加一个Clip ReLU模块;
Mobile AI SISR的评价指标为:
S
c
o
r
e
(
P
S
N
R
,
r
u
n
t
i
m
e
)
=
2
2
∗
P
S
N
R
C
∗
r
u
n
t
i
m
e
Score(PSNR,runtime)=\frac{2^{2*PSNR}}{C*runtime}
Score(PSNR,runtime)=C∗runtime22∗PSNR其中
C
C
C是常数,经过计算,
C
=
35.5278
C=35.5278
C=35.5278,XLSR的最后得分为
51.02
51.02
51.02,运行时间为44.85ms;
得到的量化模型在Sumsung Galaxy A21s上使用AI-Benchmark Tool的运行时间为:
- CPU运行时间:1130ms;
- NNAPI运行时间 1150ms;
- GPU Delegate运行时间 620ms;
论文简介
从参数量上来说,XLSR比VDSR参数量要少30多倍,但在Div2K验证集上的指标要更好。
因为比赛的需求是全量化为INT8,所以无法保留第一层和最后一层(可以借此保留精度)。
在网络模块的选择上,使用channel shuffle是不现实的,因为reshape和transpose操作在目标硬件上是没有优化的,这限制了ShuffleNet Block。
在常规SR算法上,会使用Skip Connections和Residual 加速收敛,但多数平行Skip Connection是较慢的,同时element addition操作也没有被优化,所以ResNet Block也不是很友好。
所以,作者基于ResNext block,取除了channel shuffle和skip connection,得到了下图所示的基础模块。
同时,depthwise Conv尽管在移动端也频繁使用,但量化后会扩大量化损失,所以Depthwise Conv也没有使用。
另一个方面,作者考虑到了,elementwise 操作在硬件平台上没有进行优化。所以作者避免了所有的加法和乘法算子,选择在必要时使用Concat算子,输入没有进行归一化处理。
在模型输出时,常规SISR会使用线性模型输出,即不对输出范围进行强约束。这样的模型在量化时会掉
5
−
7
d
B
5-7 dB
5−7dB。作者认为原因在于输出不受限,导致前期训练时中间的激活层不稳定,可能产生离群点。作为对比的是,作者添加了一个Clip ReLU的非线性激活函数在网络的最后一层,即模型输出处。两种处理的对比如下表所示。
网络最后一层添加的Clipped ReLU是ReLU1,表示为 C l i p p e d _ R e L U ( x ) = m a x ( 0 , m i n ( x , 1 ) ) Clipped\_ReLU(x)=max(0,min(x, 1)) Clipped_ReLU(x)=max(0,min(x,1))。
同时,作者选择将其中一些ReLU激活函数替换成Clipped ReLU。作者认为一部分ReLU激活函数已经足够正则化中间的激活层输出了。中间激活层的Clipped ReLU不需要Clip到1,可以经验性地进行选择,也可以像[19]一样优化。
在网络最后一层添加Clipped ReLU会带来更难优化的缺点。因为负值被平坦了,没有相应的梯度传回去。作者声称在训练细节中有一些训练技巧解决该问题。
论文实验
和其他模型进行对比的时候,使用的是浮点模型。计算指标时,使用的是Y通道的图像。0
在数据增加方面,除了常规的旋转和翻转,还使用了亮度增强的方法。损失函数使用的是 CharBonnier loss ,相当于平滑版本的 L 1 L_1 L1 loss,表达如下所示,其中 ϵ = 0.1 \epsilon=0.1 ϵ=0.1: C h a r b o n n i e r ( x ) = x 2 + ϵ 2 Charbonnier(x)=\sqrt{x^2+\epsilon^2} Charbonnier(x)=x2+ϵ2
使用Clipped ReLU后更难优化,使用了如下tricks:
- 使用了triangular cylic learning rate scheduling strategy,其开始(第一个epoch)使用很低的lr( 5 e − 5 5e{-5} 5e−5),然后在50个epoch内快速升到 25 e − 4 25e{-4} 25e−4,然后在5000个epoch周期内开始缓慢下降,直到 1 e − 4 1e{-4} 1e−4;
- 使用mini batch为16,每个epoch有100个mini batch,一共训练5000个epoch。在每次epoch,计算PSNR(用训练集没使用到的后8张),保留最好的模型进行量化;
- 使用He-Normal初始化Conv2D,Variance Scaling为0.1。这个的灵感来自于想要尽量让核的初始化为0,同时避免较大的激活值离群点。
为了量化模型,使用Tensorflow Post-Quatization策略,使用NVIDIA RTX 2080 Super进行训练。在DIV2K上训练该模型需要2个小时。得到的量化模型在Sumsung Galaxy A21s上使用AI-Benchmark Tool的运行时间为:
- CPU运行时间:1130ms;
- NNAPI运行时间 1150ms;
- GPU Delegate运行时间 620ms;
XLSR在目标平台的运行时间为45ms。下表展示了参加Mobile AI 2021 实时超分辨率挑战的结果。
下表是浮点模型比较的结果。
下表是与FSRCNN比较在量化损失上的结果。
下图是不同量化模型的比较结果。