论文阅读:Real-time Controllable Denoising for Image and Video
这篇文章是 CVPR 2023 的一篇文章,探讨了在图像与视频降噪中,如何实时控制降噪强度的问题。
Abstract
图像或者视频降噪,是在细节与平滑度之间的一个微妙的平衡,因为噪声与细节都属于高频信息,降噪在去除噪声的同时,也会对纹理细节造成一定的损害,而且最终的图像效果与人的主观感受有关,所以降噪强度也是一个众口难调的问题。所以文章的主旨非常明确,就是要做可控的降噪,而且是实时可控。这个在传统的降噪方法中,可以通过调整算法中的某些超参进行控制。不过对于目前主流的神经网络一类的方法来说,调整降噪强度,需要每次重新跑一遍推理,这个对于实时性要求很高的场景来说,这种耗时是很难接受的。所以这篇文章提出了一种可以实时控制降噪程度的方法,方法的名字也很直白,Real-time Controllable Denoising (RCD),这个方法可以只用一次推理,实现不同程度的降噪水平。RCD 主要是把降噪网络的最后一层的输出,通常是一个单一的 noise map,替换成了一个轻量级的模型,该模型可以输出多个 noise maps。而且文章作者设计了一种新的噪声去相关的处理方式,以保证输出的多个 noise map 是正交的,类似一组正交基,然后任意的降噪强度,可以由这组正交集插值表示。这个过程不依赖网络,也不需要网络的推理。这个类似一个 plug-and-play 的模块,可以接在不同的降噪模型上面使用,并取得很好的降噪效果。
Methods
Conventional Deep Denoising
文章先大概介绍了一下之前基于深度学习的降噪方法,主要是基于学习的方法,利用神经网络强大的特征学习能力,去实现传统方法中的滤波方法。绝大部分降噪方法通过回归预测一个噪声图来构建清晰图与噪声图之间的关系。特别的,给定一张输入的噪声图 I n \mathbf{I}_n In 以及一个模型, M : R H × W × C → R H × W × C \mathcal{M}: \mathbb{R}^{H \times W \times C} \rightarrow \mathbb{R}^{H \times W \times C} M:RH×W×C→RH×W×C,我们可以预测清晰图与噪声图之间满足如下关系: I c = I n + M ( I n ) \mathbf{I}_c = \mathbf{I}_n + \mathcal{M}(\mathbf{I}_n) Ic=In+M(In), M \mathcal{M} M 表示神经网络模型,通过学习优化的方法更新模型的参数。这种方法我们可以看到,最终输出的是单张清晰图像,无法显式地进行降噪的调整。
- 图2
图 2 展示了文章的 RCD 方法与传统的可控降噪方法之间的根本差异。与依赖控制网络的传统方法相比,RCD 流程生成了强度/级别不同的可编辑噪声,通过外部参数提供显性的控制,并实现了无网络的实时降噪编辑。RCD 提供的实时编辑功能为许多以前使用传统技术无法实现的应用创造了新的机会,例如在线视频降噪编辑,甚至在播放过程中(例如,为 ISP 调优工程师进行手机摄像头视频质量调优),以及在端侧设备和嵌入式系统上部署可控降噪。由于 RCD 的编辑阶段仅涉及图像插值,用户可以在性能较低的设备上编辑他们想要的结果,而无需使用 GPU/DSP。
Pipeline Overview
接下来作者介绍文章的方法,Real-time Controllable Denoising (RCD),整体的算法框架如图 3 所示,
- 图 3
RCD 包括三部分:
- 第一部分是一个 backbone 网络, M b : R H × W × C → R H × W × L C \mathcal{M}_b: \mathbb{R}^{H \times W \times C} \rightarrow \mathbb{R}^{H \times W \times LC} Mb:RH×W×C→RH×W×LC,这个网络会生成多张不同噪声水平的 noise maps,其中 L 表示定义好的噪声水平数量
- 第二部分是一个噪声解耦模块,将 backbone 网络输出的各个 noise maps 进行正交化,这样可以方便后面的调整
- 第三部分是一个 AutoTune 模块,给定一组控制参数,生成最好的降噪效果
假设 backbone 网络输出一组噪声图 noise maps, { N i } i = 1 L \{\mathcal{N}_i\}_{i=1}^{L} {Ni}i=1L,这组噪声图会经过后面的 Noise Decorrelation (ND) 模块,将噪声图正交化,类似生成一组基, { N ~ i } i = 1 L \{\tilde{\mathcal{N}}_i\}_{i=1}^{L} {N~i}i=1L,然后对 noise map 的这组基进行线性叠加,可以得到不同程度的降噪结果
I c = I n + ∑ i = 1 L c ˉ i N ~ i (1) \mathbf{I}_c = \mathbf{I}_n + \sum_{i=1}^{L} \bar{c}_i \tilde{\mathcal{N}}_i \tag{1} Ic=In+i=1∑LcˉiN~i(1)
其中, ∑ i = 1 L c ˉ i = 1 \sum_{i=1}^{L} \bar{c}_i = 1 ∑i=1Lcˉi=1
Multi-level Noise Generation
给定一张输入的噪声图像 I n \mathbf{I}_n In,backbone 网络的目标是输出一组 noise maps, { N i } i = 1 L \{\mathcal{N}_i\}_{i=1}^{L} {Ni}i=1L,这组噪声图对应事先定义好的噪声水平,比如噪声水平为 { 5 , 10 , 15 , . . . , 60 } \{5, 10, 15, ..., 60\} {5,10,15,...,60},因此,可以定义如下:
σ ( N i ) = l i , ∀ i ∈ 1 , 2 , . . . , L (2) \sigma(\mathcal{N}_i) = l_i, \forall i \in 1, 2, ..., L \tag{2} σ(Ni)=li,∀i∈1,2,...,L(2)
其中, σ \sigma σ 表示噪声水平的估计,计算每张 noise map 的标准差,为了得到多张 noise maps,文章在设计 backbone 网络的时候,把最后一层的卷积层做了替换,每个噪声水平的 noise map 通过如下的归一化形式得到:
N i = l i M b ( I n ) i σ ( M b ( I n ) i ) , ∀ i ∈ 1 , 2 , . . . , L (3) \mathcal{N}_i = l_i \frac{\mathcal{M_b}(\mathbf{I}_n)^{i}}{\sigma(\mathcal{M_b}(\mathbf{I}_n)^{i})}, \forall i \in 1, 2, ..., L \tag{3} Ni=liσ(Mb(In)i)Mb(In)i,∀i∈1,2,...,L(3)
其中, M b ( I n ) ∈ R H × W × L C \mathcal{M_b}(\mathbf{I}_n) \in \mathbb{R}^{H \times W \times LC} Mb(In)∈RH×W×LC 是网络的输出, M b ( I n ) i ∈ R H × W × C \mathcal{M_b}(\mathbf{I}_n)^{i} \in \mathbb{R}^{H \times W \times C} Mb(In)i∈RH×W×C 表示某个噪声水平下的在通道维度的分量,那么式 3 得到的 N i \mathcal{N}_i Ni 可以看成是某个噪声水平下的 noise map。
文章也提到说,不同于之前的一些控制降噪程度的方法隐式地在网络中进行插值,文章提出的方法,通过求出不同噪声水平的 noise maps,然后可以显示地线性插值得到不同程度的降噪,通过这种方法,可以通过改变加权系数 c c c 从而实现快速实时的交互式可控降噪。
不过,因为网络直接输出的noise maps N i \mathcal{N}_i Ni 一般来说是高度相关的,这对于 noise map 的线性加权带来很多问题,为了让每个 noise map 之间的相关性尽量减少,文章提出了 Noise Decorrelation (ND) 模块。
Noise Decorrelation
Noise Decorrelation 模块是用来对 backbone 网络进行正则,以使得网络可以生成不同噪声水平的 noise maps。这个模块本身没有额外的参数,主要是通过统计计算,以让 N i \mathcal{N}_i Ni 之间尽量不相关,即, c o v ( N i , N j ) ≈ 0 , ∀ i , j ∈ { 1 , 2 , . . . , L } \mathbf{cov}(\mathcal{N}_i, \mathcal{N}_j) \approx 0, \forall i, j \in \{1, 2,..., L \} cov(Ni,Nj)≈0,∀i,j∈{1,2,...,L},其中 c o v \mathbf{cov} cov 表示求两个向量的协方差系数。
对于每个 noise map N i \mathcal{N}_i Ni,先进行维度变换, N i ∈ R 1 × M \mathcal{N}_i \in \mathbb{R}^{1 \times M} Ni∈R1×M,其中, M = H W C M=HWC M=HWC,相当于将之前的一个张量重新变成一个一维向量,然后将 L L L 张 noise map 叠在一起,得到 N ∈ R L × M \mathbf{N} \in \mathbb{R}^{L \times M} N∈RL×M,然后计算协方差矩阵, Σ = 1 M − 1 ( N − N ˉ ) ( N − N ˉ ) T {\Sigma} = \frac{1}{M-1}(\mathbf{N} - \bar{\mathbf{N}})(\mathbf{N} - \bar{\mathbf{N}})^{T} Σ=M−11(N−Nˉ)(N−Nˉ)T,其中, N ˉ \bar{\mathbf{N}} Nˉ 表示均值向量。
为了实现 Noise Decorrelation,文章求解了协方差矩阵的逆开根号矩阵 Σ − 1 / 2 {\Sigma}^{-1/2} Σ−1/2,这个求解为了提升效率,文章使用了牛顿迭代法:
Σ 0 = I Σ k = 1 2 ( 3 Σ k − 1 − ( Σ k − 1 ) 3 Σ ) , k = 1 , 2 , . . . T (4) \Sigma_0 = \mathbf{I} \\ \Sigma_k = \frac{1}{2}(3\Sigma_{k-1} - (\Sigma_{k-1})^3\Sigma), k=1,2,...T \tag{4} Σ0=IΣk=21(3Σk−1−(Σk−1)3Σ),k=1,2,...T(4)
其中, T T T 表示总的迭代次数,文章中提到 T 一般取 3 或者 4 基本可以收敛到合理范围。求得 Σ − 1 / 2 {\Sigma}^{-1/2} Σ−1/2 的近似值之后,可以得到解耦后的 noise map, N ~ = N Σ − 1 / 2 \tilde{\mathbf{N}} = \mathbf{N} \Sigma^{-1/2} N~=NΣ−1/2,然后将 N ~ \tilde{\mathbf{N}} N~ 进一步做变换,得到 L L L 张可编辑的 noise map, N ~ i \tilde{\mathcal{N}}_i N~i, 解耦后的 nosie map 有非常好的线性性质,可以满足如下的式子:
V a r ( ∑ i = 1 L c i N ~ i ) = ∑ i = 1 L c i 2 V a r ( N ~ i ) (5) \mathbf{Var}(\sum_{i=1}^{L} c_i \tilde{\mathcal{N}}_i) = \sum_{i=1}^{L} c_i^2 \mathbf{Var}(\tilde{\mathcal{N}}_i) \tag{5} Var(i=1∑LciN~i)=i=1∑Lci2Var(N~i)(5)
公式 5 展示了最终的噪声水平与控制参数 c i c_i ci 之间的关系,除此之外,Noise Decorrelation 模块可以促使模型取学习不同水平下的噪声形式,以增强降噪模型的表达能力。图 4 展示了 ND 模块如何发挥作用。有了 ND 模块作为正则, ∣ Σ ∣ F |\Sigma|_F ∣Σ∣F 可以趋近于 0,从而可以让模型通过线性加权得到想要的噪声强度,如果没有 ND 模块,噪声水平难以保证与想要的设定值一致。
- 图 4
AutoTune Module
有了上面介绍的 Noise Decorrelation 模块输出的 noise maps,接下来 AutoTune 模块将预测一组模型建议的控制参数 { c i } i = 1 L \{c_i\}_{i=1}^{L} {ci}i=1L 进而生成最终的降噪效果。用户可以在这组控制参数的基础上,进行调整,从而得到不同强度的降噪结果。AutoTune 模块也是一个非常轻量化的模块,直接用一个单层的模型,利用 t-softmax 激活函数进行计算:
c i = e A ( f ) i τ ∑ j = 1 n A ( f ) j τ c_i = \frac{e^{ \frac{\mathcal{A(f)_i}}{\tau}} }{\sum_{j=1}^{n} \frac{\mathcal{A(f)_j}}{\tau}} ci=∑j=1nτA(f)jeτA(f)i
其中 A \mathcal{A} A 表示一个 NN 网络层, f f f 表示输入的特征图, τ = 0.05 \tau = 0.05 τ=0.05 表示温度系数,为了让 backbone 模型尽量高效,文章直接用未曾归一的模型输出作为特征图,如图 3 中的模块 C 所示。
New Cardinality for Denoising Control
与之前仅仅调节噪声强度的方法不同,文章提出的 RCD 方案可以让用户在给定噪声强度的情况下,通过调节 { c i } \{c_i\} {ci} 进一步优化降噪结果,只要关于噪声水平 l i l_i li 关于 c i c_i ci 的加权平均和是固定的,公式 5 已经证明,当 ∑ i = 1 L c i 2 V a r ( N ~ i ) = ∑ i = 1 L c i 2 l i 2 \sum_{i=1}^{L} c_i^2 \mathbf{Var}(\tilde{\mathcal{N}}_i) = \sum_{i=1}^{L} c_{i}^{2}l_{i}^{2} ∑i=1Lci2Var(N~i)=∑i=1Lci2li2 不变的时候,那么最终输出结果的方差 V a r ( ∑ i = 1 L c i N ~ i ) \mathbf{Var}(\sum_{i=1}^{L} c_i \tilde{\mathcal{N}}_i) Var(∑i=1LciN~i) 也是固定的,在保持 ∑ i = 1 L c i 2 l i 2 \sum_{i=1}^{L} c_{i}^{2}l_{i}^{2} ∑i=1Lci2li2 不变的情况下,通过改变 l i l_i li,即引入不同噪声水平的 noise map N i \mathcal{N}_i Ni,可以优化得到不同的降噪结果。
Optimization Targets
为了让模型对不同的噪声水平的组合 ∑ i = 1 L c i N ~ i \sum_{i=1}^{L} c_i \tilde{\mathcal{N}}_i ∑i=1LciN~i 都有一个好的降噪效果,我们采用了一种多级并行训练策略,通过最小化每个级别噪声输出与真实噪声之间的差异来实现,即:
L l e v e l = 1 L ∑ i = 1 L L ( I g t , I n + N ~ i ) (6) \mathcal{L}_{level} = \frac{1}{L} \sum_{i=1}^{L} \mathcal{L}(\mathbf{I}_{gt}, \mathbf{I}_n + \tilde{\mathcal{N}}_i) \tag{6} Llevel=L1i=1∑LL(Igt,In+N~i)(6)
结合 AutoTune 模块的输出,最终总的 loss 函数为:
L t o t a l = λ L l e v e l + L ( I g t , I n + ∑ i = 1 L c ˉ i N ~ i ) (7) \mathcal{L}_{total} = \lambda \mathcal{L}_{level} + \mathcal{L}(\mathbf{I}_{gt}, \mathbf{I}_n + \sum_{i=1}^{L} \bar{c}_i \tilde{\mathcal{N}}_i) \tag{7} Ltotal=λLlevel+L(Igt,In+i=1∑LcˉiN~i)(7)
其中, λ = 0.1 \lambda = 0.1 λ=0.1 表示两种 loss 的权重分配。
文章在仿真的高斯分布噪声以及真实噪声分布的数据集上都进行了实验。