Unprocessing Images for Learned Raw Denoising
今天介绍谷歌发表在 2019 CVPR 上的一篇文章,Unprocessing Images for Learned Raw Denoising,这篇文章主要为了解决数据构造的问题,简单来说,就是将 ISP 的流程逆过来,从 sRGB 图像变到 RAW 图,然后进行模型训练,从而达到降噪的过程。
我们都知道,基于机器学习的图像处理技术,比如降噪,超分等,对数据的分布比较敏感,如果测试数据和训练数据的分布类似,那么效果会很理想,反之,如果测试数据的分布和训练数据差别比较大,那么效果就会出现差异,所以,现在基于深度学习的图像处理技术,对数据的构造是非常重要的一个环节,一个模型好不好,很多时候,依赖于训练数据的质量。文章也指出,很多 paper 由于只训练了理想的数据,或者说和实际环境偏差很大的数据,往往导致这样的模型,遇到实际场景的时候,不能很好的 work。
这篇文章主要讲去噪,在深度学习成为越来越主流的今天,这篇文章也不能免俗,不过这篇文章的重点不在于讲如何构造网络模型,这篇文章的重点在于介绍如何构造符合实际环境的训练数据,之前的方法,都是直接对 RGB 图像进行加噪,然后训练模型,这篇文章,不仅仅对 RGB 图像进行噪声模拟,而是对全 ISP 通路进行了分析,然后将 RGB 图像,沿着逆 ISP 通路,直接生成 RAW 图,文章作者指出,这样构造的训练数据,更加贴近真实场景拍摄的数据,利用这些数据训练的模型,会得到更好的降噪效果。
现在的手机或者单反,都力图在图像中将真实世界还原地和人眼感知的一样,为了达到这个目的,需要将 sensor 获取的 RAW 图,进行一系列的变化处理,这个过程一般称为 ISP,这篇文章也是对 ISP 中的每个流程进行分析,并且力图找到每个变换的逆变换,如果从 RAW 图到最终的 RGB 图的每一步变换都已知,那么理论上来说,应该存在一个相应的逆变换,能将 RGB 图变换回 RAW 图, 这样就达到了将 RGB 图构造成相应的 RAW 图,从而进行训练网络训练的目的。
首先,降噪一般来说在 ISP 中都是比较重要的一个环节,降噪的前提是对噪声模型要有一个准确的估计,虽然说图像中的噪声模型一般是比较复杂,但是在 RAW 域中,噪声的分布还是有规律可循的,噪声在 RAW 域中主要有两大类,一类是 shot noise, 一类是 read noise,shot noise 主要和环境光照有关,read noise 主要和 sensor 中的电路系统有关,shot noise 一般是满足泊松分布的,而 read noise 一般是满足高斯分布的,这篇文章将这两种噪声结合在一起,并且假设 RAW 图的像素值满足如下的分布:
y ∼ N ( μ = x , σ 2 = λ r e a d + λ s h o t x ) y \sim \mathcal{N}(\mu = x, \sigma^2 = \lambda_{read} + \lambda_{shot}x) y∼N(μ=x,σ2=λread+λshotx)
其中,参数 λ r e a d , λ s h o t \lambda_{read}, \lambda_{shot} λread,λshot 由 sensor 的数字增益和模拟增益决定,对于给定的数字增益 g d g_d gd 和模拟增益 g a g_a ga,以及固定的 sensor 读出电路的方差 σ r 2 \sigma_{r}^2 σr2,我们可以得到如下的关系:
λ r e a d = g d 2 σ r 2 λ s h o t = g d g a \lambda_{read} = g_{d}^2 \sigma_{r}^2 \quad \lambda_{shot} = g_d g_a λread=gd2σr2λshot=gdga
数字增益和模拟增益,一般是由 ISO 以及用户选择的曝光参数来确定的。
构造数据的时候,需要选择参数来模拟噪声,这篇文章将参数 λ r e a d , λ s h o t \lambda_{read}, \lambda_{shot} λread,λshot 写成某种分布的形式,
log ( λ s h o t ) ∼ U ( a = log ( 0.0001 ) , b = log ( 0.012 ) ) log ( λ r e a d ) ∣ log ( λ s h o t ) ∼ N ( μ = 2.18 log ( λ s h o t ) + 1.2 , σ = 2.6 ) \log(\lambda_{shot}) \sim \mathcal{U}(a=\log(0.0001), b=\log(0.012)) \\ \log(\lambda_{read}) | \log(\lambda_{shot}) \sim \mathcal{N} (\mu = 2.18 \log(\lambda_{shot}) + 1.2, \sigma = 2.6 ) log(λshot)∼U(a=log(0.0001),b=log(0.012))log(λread)∣log(λshot)∼N(μ=2.18log(λshot)+1.2,σ=2.6)
从上面的分布中,抽取参数,进而构造噪声。
ISP 流程中,去马赛克也是一个重要环节,因为绝大多数的 sensor 都是 Bayer 模式的,所以每个像素在 RAW 图上只有一个通道,一般来说,是按照 R, G, G, B 的方式排列,为了得到彩色图像,需要对 RAW 图进行去马赛克的操作,所以马赛克的逆操作,就是一个降采样的过程,这个相对来说比较简单,就是对每个通道进行降采样。
ISP 中,会有一个数字增益,对整体的图像亮度乘以一个 gain 值,以提升图像的整体亮度,这个增益在不同的相机 ISP 中,值会不一样,很难找到普适规律,文章作者认为可以寻找一个全局的 scale 值来代替这个 gain 值,假设图像的像素值服从如下的指数分布:
p ( x ; λ ) = λ e − λ x p(x; \lambda) = \lambda e^{-\lambda x} p(x;λ)=λe−λx
对 λ \lambda λ 的最大似然估计,就等于样本均值的倒数,文章统计了一些数据集,定下了一个 gain 值为 1.25,那么其倒数为 0.8,不过为了体现一定的鲁棒性,文章没有用一个定值,而是利用了一个高斯分布,均值为 0.8, 方差为 0.1,对这个分布进行采样,最后得到的 scale 值范围在 [ 0.5 , 1.1 ] [0.5, 1.1] [0.5,1.1] 之间。
白平衡也是 ISP 流程中比较重要的一个环节,sensor 记录的是环境的照度,人类视觉经过漫长的进化,对环境的光线感知有一套自己的适应系统,为了让最后的成像能符合人眼的感知,一般需要做一个白平衡校正,简单来说就是 R,G,B 三个通道分别乘以不同的 gain 值,不过一般 G 通道 gain 值 为 1,所以主要是看R,B 通道的概念值,一般相机系统的白平衡也是很难估计的,这为构造数据也带来了调整,不过文章提到所用的数据库记录了白平衡的 gain 值,文章用到的数据库,其 R 通道的gain值范围是 [ 1.9 , 2.4 ] [1.9, 2.4] [1.9,2.4],B 通道的 gain 值是 [ 1.5 , 1.9 ] [1.5, 1.9] [1.5,1.9] , 构造数据的时候,从 digital gain 和白平衡 gain 值进行采样,将两者的乘积作为逆向变换的系数,不过作者发现,这样设置的参数一般乘积都小于 1,这样导致构造的数据都是不饱和的,不符合实际,文章作者构造了一个函数,以模拟饱和截断,
α ( x ) = ( max ( x − t , 0 ) 1 − t ) 2 f ( x , g ) = max ( x g , ( 1 − α ( x ) ) ( x g ) + α ( x ) x ) \alpha(x) = \left( \frac{\max(x-t, 0)}{1-t} \right)^2 \\ f(x, g) = \max \left( \frac{x}{g}, (1-\alpha(x))(\frac{x}{g}) + \alpha(x)x \right) α(x)=(1−tmax(x−t,0))2f(x,g)=max(gx,(1−α(x))(gx)+α(x)x)
其中 t = 0.9 t=0.9 t=0.9,从上式可以看到,当 $ x \leq t $ 的时候, f ( x , g ) = x g f(x, g) = \frac{x}{g} f(x,g)=gx,当 x = 1 x = 1 x=1 的时候, f ( 1 , g ) = 1 f(1, g) = 1 f(1,g)=1
色彩校正,就是将 RAW-RGB 变成 sRGB 的过程,一般都是通过一个 3 × 3 3 \times 3 3×3 的矩阵来实现的,文章也是基于数据库提供的 CCM 来实现的。
gamma 校正,就是一个非线性的变换的过程,因为人眼视觉对暗区的对比度变化比较敏感,所以一般会有一个对暗区像素提升的过程,文章里用到的 gamma 变换是一个标准的变换式:
Γ ( x ) = max ( x , ϵ ) 1 / 2.2 \Gamma(x) = \max(x, \epsilon )^{1/2.2} Γ(x)=max(x,ϵ)1/2.2
那么构造训练数据,就是应用一个反变换:
Γ − 1 ( y ) = max ( y , ϵ ) 2.2 \Gamma^{-1}(y) = \max(y, \epsilon)^{2.2} Γ−1(y)=max(y,ϵ)2.2
tone mapping 算法,就是进一步调整图像的对比度,一般 ISP 里面,都会用到比较复杂的 tone mapping 算法,这篇文章做了一个简单 tone mapping 算法,其逆变换也会相对简单:
S ( x ) = 3 x 2 − 2 x 3 S − 1 ( y ) = 1 2 − sin ( sin − 1 ( 1 − 2 y ) 3 ) S(x) = 3x^2 - 2x^3 \\ S^{-1}(y) = \frac{1}{2} - \sin \left( \frac{\sin^{-1}(1 - 2y)}{3} \right) S(x)=3x2−2x3S−1(y)=21−sin(3sin−1(1−2y))
到这一步的时候,ISP 里面的主要步骤都已经做了,那么构造数据的时候,就是将上面的过程反过来走一遍,如下图所示:
文章指出,由于 RAW 图最终要经过 ISP 得到 sRGB 图像,所以 RAW 图经过降噪之后,也会经过 ISP,最终才和 ground truth 的 sRGB 进行比较,简单来说,这个模型不是在 RAW 域进行比较的,而是在 sRGB 域进行 loss 比较的。
RAW 域的降噪模型是典型的 U 型网络结构,不过输入除了 RAW 图的四个通道之外,还带有噪声估计的图,如下所示:
文章里面提到,用到的是 MIR Flickr extended dataset,预留了 5% 做 validation,5% 做 test,剩下的都用来训练了,为了减少其它的 artifacts,文章对图像先做了一个高斯模糊加 2X 的下采样,然后再进行数据的构造。
最后作者也在 Github 上发布了自己的仿真代码,有兴趣的可以去看看:
https://github.com/google-research/google-research/tree/master/unprocessing