论文阅读: Practical Deep Raw Image Denoising on Mobile Devices
旷视 2020 ECCV
基于深度学习的降噪方法在近几年得到了大量的研究,这些方法的效果也霸榜了很多公开的数据集。不过这些方法用到的网络模型都很大,无法在手机端侧运行。这篇文章的作者设计了一种能够在手机端运行的轻量级地的降噪模型,而且在主流的旗舰机上还取得了不错的效果。这篇文章的方法有两个关键点:1) 通过对特定 sensor 的噪声模型进行标定,可以在特定噪声模型上去模拟数据从而指导小网络训练,这样的方式甚至比用大网络在基于一般的噪声模型模拟的数据训练的效果要好;2) 虽然对于特定 sensor 来说,不同 ISO 下的噪声形态会有较大差异,不过这篇文章的作者利用一个 K-simga 变换让这些不同的噪声形态变换之后变得比较统一,从而让小网络可以更好地进行处理。文章提到在手机端侧高通 855 平台的运行时间是 70ms 左右。
Introduction
随着智能手机的普及,越来越多的用户用智能手机来满足日常拍照摄影的需求。不过比起单反来说,智能手机由于镜头以及 sensor 上的制约,在夜景中更容易出现噪声。
图像降噪技术经过了十几二十年的发展,但是在手机上实现高质量的降噪依然是一个很大的挑战。最近随着深度学习的兴起,很多基于深度学习的方法取得了比传统方法更好的降噪效果,但是深度学习模型相对来说也很大,所以对在智能手机上用深度模型做降噪依然面临很多困难。
这篇文章的作者提出了一种简单而有效的方法来实现 RAW 域的降噪,文章的作者基于一个关键的观测,即对于某一款特定的 sensor 来说,噪声特性是连续的,并且可以很准确地测量出来。通过对 sensor 的噪声建模,就可以构建有噪声与干净图像的数据对,然后训练一个轻量级的网络,这个基于模拟数据训练的模型,在真实拍摄的数据上,依然可以有效地进行降噪,而且,基于噪声参数模型,文章作者设计了一种单一的线性变换,称为 K-sigma 变换,这个变换可以将不同 ISO 下的噪声形态变换到一个与 ISO 无关的噪声形态。这样可以很方便地对不同 ISO 下的噪声进行降噪。
Method
Noise Model
在 ISP 中,一个 Camera sensor 将入射的光线通过多个转换步骤,最后得到数字信号,每个转换步骤都可能引入特定的噪声,首先考虑一个理想的光电转换系统,每个像素的电路将光子通过一个线性放大系统转换为电信号:
x ∗ = g α u ∗ x^{*} = g \alpha u^{*} x∗=gαu∗
u ∗ u^{*} u∗ 表示照射到每个 pixel 上的平均期望光子数, α \alpha α 表示光电转换效率, g g g 表示模拟增益。
在一个实际的系统中,如果考虑每一步引入的噪声,则有:
x = g ( α u + n d ) + n r x = g(\alpha u + n_d) + n_r x=g(αu+nd)+nr
其中, u u u 表示实际的光子数, n d ∼ N ( 0 , σ d 2 ) n_d \sim \mathcal{N}(0, \sigma_{d}^{2}) nd∼N(0,σd2) 和 n r ∼ N ( 0 , σ r 2 ) n_r \sim \mathcal{N}(0, \sigma_{r}^{2}) nr∼N(0,σr2) 是满足高斯分布的噪声,其中 u u u 是服从期望为 u ∗ u^{*} u∗ 的泊松分布:
u ∼ P ( u ∗ ) u \sim \mathcal{P}(u^{*}) u∼P(u∗)
结合上面的式子,可以得到:
x ∼ ( g α ) P ( x ∗ g α ) + N ( 0 , g 2 σ d 2 + σ r 2 ) x \sim (g \alpha) \mathcal{P} (\frac{x^{*}}{g \alpha}) + \mathcal{N}(0, g^2 \sigma_{d}^{2} + \sigma_{r}^{2}) x∼(gα)P(gαx∗)+N(0,g2σd2+σr2)
上面的式子,就是我们常见的泊松-高斯分布,如果令 $ k = g \alpha$,同时 $\sigma^{2} = g^2 \sigma_{d}^{2} + \sigma_{r}^{2} $,那么上面的泊松-高斯分布可以写成:
x ∼ k P ( x ∗ k ) + N ( 0 , σ 2 ) x \sim k \mathcal{P} (\frac{x^{*}}{k}) + \mathcal{N}(0, \sigma^{2}) x∼kP(kx∗)+N(0,σ2)
其中 k k k 和 σ \sigma σ 都是和 ISO 相关的参数。
Parameter Estimation
有了上面的噪声模型,理论上来说,我们可以通过采样获取不同的噪声样本,从而构建数据对,因为 k k k 和 σ \sigma σ 都是和 ISO 相关的参数,一般来说,就需要对不同的 ISO 下进行 k k k 和 σ \sigma σ 的标定,不过,文章作者通过分析上面式子的期望均值与方差,发现他们满足如下的关系式:
E ( x ) = x ∗ E(x) = x^{*} E(x)=x∗
V a r ( x ) = k x ∗ + σ 2 Var(x) = k x^{*} + \sigma^{2} Var(x)=kx∗+σ2
文章的作者拍了一组静态的灰卡,然后将这些灰卡取平均值来获得期望均值, 同时将有同样平均值的像素值聚到一起,计算其方差,然后利用一个线性函数拟合得到 k , σ 2 k, \sigma^{2} k,σ2。
The k-Sigma Transform
在实际应用场景中,摄像头会根据实际的场景,自动调整 ISO,所以对于一个降噪模型来说,需要考虑到不同的 ISO。一种直观的方法,就是将不同 ISO 的 k , σ 2 k, \sigma^{2} k,σ2 都计算出来,然后构造不同 ISO 下的训练数据对,从而训练这个降噪模型,这样对网络的 Capacity 就有一定的要求。文章作者提出了一种 k-sigma 变换的方法,将不同 ISO 下的噪声形态进行了统一。
这个 k-sigma 变换的定义如下:
f ( x ) = x k + σ 2 k 2 f(x) = \frac{x}{k} + \frac{\sigma^{2}}{k^2} f(x)=kx+k2σ2
由 x x x 的噪声分布,可以得到 f ( x ) f(x) f(x) 的分布如下所示:
f ( x ) ∼ P ( x ∗ k ) + N ( σ 2 k 2 , σ 2 k 2 ) f(x) \sim \mathcal{P}(\frac{x^{*}}{k}) + \mathcal{N}(\frac{\sigma^{2}}{k^2}, \frac{\sigma^{2}}{k^2}) f(x)∼P(kx∗)+N(k2σ2,k2σ2)
泊松-高斯分布可以通过下面的近似变换成高斯分布:
P ( x ∗ k ) + N ( σ 2 k 2 , σ 2 k 2 ) ≈ N ( x ∗ k , x ∗ k ) + N ( σ 2 k 2 , σ 2 k 2 ) = N ( x ∗ k + σ 2 k 2 , x ∗ k + σ 2 k 2 ) = N [ f ( x ∗ ) , f ( x ∗ ) ] \begin{aligned} & \mathcal{P}(\frac{x^{*}}{k}) + \mathcal{N}(\frac{\sigma^{2}}{k^2}, \frac{\sigma^{2}}{k^2}) \\ & \approx \mathcal{N}(\frac{x^*}{k}, \frac{x^*}{k}) + \mathcal{N}(\frac{\sigma^{2}}{k^2}, \frac{\sigma^{2}}{k^2}) \\ & = \mathcal{N}(\frac{x^{*}}{k} + \frac{\sigma^{2}}{k^2} , \frac{x^{*}}{k} + \frac{\sigma^{2}}{k^2}) \\ & = \mathcal{N}[f(x^{*}), f(x^{*})] \end{aligned} P(kx∗)+N(k2σ2,k2σ2)≈N(kx∗,kx∗)+N(k2σ2,k2σ2)=N(kx∗+k2σ2,kx∗+k2σ2)=N[f(x∗),f(x∗)]
进而可以得到:
f ( x ) ∼ N [ f ( x ∗ ) , f ( x ∗ ) ] f(x) \sim \mathcal{N}[f(x^{*}), f(x^{*})] f(x)∼N[f(x∗),f(x∗)]
上面的式子表明,
f
(
x
)
f(x)
f(x) 的分布只和
f
(
x
∗
)
f(x^{*})
f(x∗) 有关,文章的作者基于这点观测,他们认为可以训练一个单一的网络,网络的输入就是
f
(
x
)
f(x)
f(x),网络的输出则是
f
(
x
∗
)
f(x^{*})
f(x∗) 的估计值,然后通过逆变换
f
−
1
(
⋅
)
f^{-1}(\cdot)
f−1(⋅) 得到降噪后的
x
x
x
Learning to Denoise
文章设计了一个对智能手机硬件来说更加友好地网络结构,不过整体看起来和常规的 U-net 的结构差别不大,唯一的区别就是里面的 block 大量采用了 separable-conv 的卷积方式,这种卷积形式可以减少很多的运算量,只在连接 Input 与 Output 的这一层用了常规的卷积。具体来说,Encoder 端,采用了 5 × 5 5 \times 5 5×5 的卷积核,Decoder 端,采用了 3 × 3 3 \times 3 3×3 的卷积,并且在 Encoder 与 Decoder 之间采用了跳连,最后的 Input 与 Output 还有一个很长的跨连,意味着整个个网络是学了一个残差。
这篇文章用到的数据集是 See-in-the-Dark (SID) 数据集,这个数据集包含了成对的 RAW 图,分别是用 Sony α7s II 和 Fujifilm X-T2 拍摄的,文章只挑选了这个数据集的一部分用来做验证,从 SID 数据集中,挑选了曝光时间为 10s 及 30s 的拍摄图像,同时去除了含有明显噪声的图像,最终得到了 214 张高质量的清晰 RAW 图。
为了构建训练数据,文章将 RAW 图裁成了 1024 × 1024 1024 \times 1024 1024×1024,同时利用水平与垂直翻转的方式对数据进行增广,增广的时候,确保数据是 RGGB 的 Bayer 模式,然后将数据变成 4 通道的输入,每个输入的 size 变成 512 × 512 512 \times 512 512×512,这些数据再加上模拟的噪声,就得到了有噪声的 Input,最后将有噪声的 Input 与干净的 Output 都进行 K-sigma 变换,变换到另外一个与 ISO 无关的空间,在这个空间里进行降噪的学习。
训练的时候,损失函数用的是 l1-loss,优化器是 Adam,学习率是一种循环的方式进行设置,从 1e-3 慢慢衰减到 1e-5,训练的 batchsize 为 1。
Experiments
为了验证这个方法在实际场景中的有效性,文章用了一个商用的手机来进行评估,文章中用的商用手机是 OPPO Reno-10x,评估的是这款手机后置的主摄镜头,这个主摄镜头搭配的是 Sony IMX586 sensor,一共 4800 万像素,每个像元的大小是 0.8um。
首先是标定这款镜头及sensor 对应的噪声参数,文章中提到,为了获得稳定的光照环境,文章是在一个暗室里用 Xrite SpectraLight QC 进行照明,每个 ISO 下, 通过调整光源的强度,来输出稳定的光照,在每个ISO 下,连续拍摄 64 张 RAW 图,然后对这 64 张 RAW 求平均作为无噪图的估计,然后再用上文提到的方法,对每个 ISO 下的 k , σ 2 k, \sigma^2 k,σ2 进行估计,进而可以得到不同 ISO 下的 k , σ 2 k, \sigma^2 k,σ2,然后可以拟合出不同 ISO 下的 k , σ 2 k, \sigma^2 k,σ2 的分布曲线,有了这样两条曲线,就能对噪声进行仿真模拟,从而构建有噪的图