论文解读:Unprocessing Images for Learned Raw Denoising

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 图,文章作者指出,这样构造的训练数据,更加贴近真实场景拍摄的数据,利用这些数据训练的模型,会得到更好的降噪效果。

RAW Image Pipeline

现在的手机或者单反,都力图在图像中将真实世界还原地和人眼感知的一样,为了达到这个目的,需要将 sensor 获取的 RAW 图,进行一系列的变化处理,这个过程一般称为 ISP,这篇文章也是对 ISP 中的每个流程进行分析,并且力图找到每个变换的逆变换,如果从 RAW 图到最终的 RGB 图的每一步变换都已知,那么理论上来说,应该存在一个相应的逆变换,能将 RGB 图变换回 RAW 图, 这样就达到了将 RGB 图构造成相应的 RAW 图,从而进行训练网络训练的目的。

Shot and Read Noise

首先,降噪一般来说在 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) yN(μ=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)

从上面的分布中,抽取参数,进而构造噪声。

Demosaicing

ISP 流程中,去马赛克也是一个重要环节,因为绝大多数的 sensor 都是 Bayer 模式的,所以每个像素在 RAW 图上只有一个通道,一般来说,是按照 R, G, G, B 的方式排列,为了得到彩色图像,需要对 RAW 图进行去马赛克的操作,所以马赛克的逆操作,就是一个降采样的过程,这个相对来说比较简单,就是对每个通道进行降采样。

Digital Gain

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] 之间。

White Balance

白平衡也是 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)=(1tmax(xt,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

Color Correction

色彩校正,就是将 RAW-RGB 变成 sRGB 的过程,一般都是通过一个 3 × 3 3 \times 3 3×3 的矩阵来实现的,文章也是基于数据库提供的 CCM 来实现的。

Gamma Compression

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

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)=3x22x3S1(y)=21sin(3sin1(12y))

到这一步的时候,ISP 里面的主要步骤都已经做了,那么构造数据的时候,就是将上面的过程反过来走一遍,如下图所示:

论文解读:Unprocessing Images for Learned Raw Denoising_第1张图片
文章指出,由于 RAW 图最终要经过 ISP 得到 sRGB 图像,所以 RAW 图经过降噪之后,也会经过 ISP,最终才和 ground truth 的 sRGB 进行比较,简单来说,这个模型不是在 RAW 域进行比较的,而是在 sRGB 域进行 loss 比较的。

RAW 域的降噪模型是典型的 U 型网络结构,不过输入除了 RAW 图的四个通道之外,还带有噪声估计的图,如下所示:

论文解读:Unprocessing Images for Learned Raw Denoising_第2张图片

文章里面提到,用到的是 MIR Flickr extended dataset,预留了 5% 做 validation,5% 做 test,剩下的都用来训练了,为了减少其它的 artifacts,文章对图像先做了一个高斯模糊加 2X 的下采样,然后再进行数据的构造。

最后作者也在 Github 上发布了自己的仿真代码,有兴趣的可以去看看:

https://github.com/google-research/google-research/tree/master/unprocessing

你可能感兴趣的:(计算摄影与图像处理)