论文阅读:Graphics2RAW: Mapping Computer Graphics Images to Sensor RAW Images
这是一篇 ICCV 2023 的文章,主要介绍了一种数据仿真的方式。
Abstract
CG 渲染得到的图像与相机拍摄得到的图像越来越像了,这种摄影级的渲染逼近效果让越来越多的 CG 渲染图像参与到 high level 的计算机视觉任务的训练数据构建中,比如自动驾驶领域和图像分割领域,有很多的 CG 渲染图像构建的数据集。不过 CG 渲染图像,还无法像 high level 任务一样,可以很便捷地应用到 low level 的图像处理领域,尤其是对于处理对象会 sensor RAW 的图像。因为 sensor RAW 的图像的颜色空间是由 sensor 实际的光谱响应决定的,一般这些光谱响应也就决定了后端的白平衡的处理方式。而 CG 渲染的图像,一般是一个独立于设备的颜色空间,不需要考虑白平衡的问题。所以,为了能让 CG 渲染图像用于low level 视觉任务,需要构建一个映射关系,以消除 CG 图像与 RAW 图像之间的域差异。为了实现这个目标,这篇文章介绍了一种从CG 图像转换到 RAW 图像的框架。这个框架可以方便的实现一对多的映射,给定一张 CG 图像,可以快速地转换到多个不同的 sensor RAW 域或者不同环境光照下的图像。这个方法只要基于少量的记录目标 sensor 响应的 RAW-DNG 文件就可以实现映射参数的估计。文章将这个方法应用到不同的 low level 视觉任务中,包括 RAW 域降噪,光照估计以及夜晚场景下的神经渲染,都取得了不错的效果。
文章在上图中,展示了两张效果图,从 RAW 图中通过 Adobe Photoshop 处理得到的,这两张 RAW 图如图中的小图所示,一张是实拍的 RAW 图,一张是将 CG 渲染的图通过本文的方法仿真得到的,大家能看出两张的区别吗 ?
Introduction
这篇文章主要为了解决训练数据的构造问题,用 CG 渲染的图像来构造训练数据,应该不算是一个新的 idea,在 high level 的很多视觉任务,比如自动驾驶,语义分割中,已经有很多相关的工作尝试用 CG 渲染的图像来构造训练数据。不过在 low level 成像领域,这个问题要复杂地多,Camera 中的 ISP 通过将 sensor 捕获的 RAW 图像转换成 RGB 图像,虽然看起来和 CG 渲染一样,最终也是生成一张 sRGB 图像。不过 RAW 域的图像有其独特的性质,sensor RAW 代表了某款特定 sensor 对环境的光谱响应,不同的 sensor,其光谱响应可能不同。RAW 域图像显示了其特有的对环境光照的颜色倾向,在 ISP 中,一般会通过 AWB,也就是自动白平衡算法来纠正这种颜色偏向。在 low level 视觉任务里,很多时候需要的输入图像是 RAW 图,单独的 RAW 图或者 sRGB 图相对来说都比较好获取,难的是得到 RAW 和 sRGB 成对的数据。这篇文章就是想将 CG 渲染得到的 sRGB 图像,转换成特定 sensor 下的 RAW 图像,从而构建成对的数据。
上图展示了 ISP 处理的图像与 CG 渲染之间的差异,ISP 处理图像会与特定的 sensor 有关,不同的 sensor 获取的 sensor RAW 的颜色空间会有差异,所以ISP 中的颜色处理模块,一般是与 sensor 绑定的。而 CG 渲染一般会渲染得到一个独立于设备的 sRGB 颜色空间。
Graphics to RAW
接下来,重点介绍文章的方法部分,文章先介绍了成像的 pipeline,说明一个 sensor 是如何对环境光照进行记录的,sensor 的成像本质上是光电效应,也就是从光谱的能量积分的角度来建模,sensor 上一个像素积累的能量,是由环境光照的光谱分布,环境中物体的表面反射性质,以及 sensor 上的 CFA 的光谱响应曲线共同决定的,定向来看,可以写成如下的表达式:
I x c = ∫ λ ∈ L x , λ P x , λ F c , λ , c ∈ { R , G , B } (1) I_{x}^{c} = \int_{\lambda \in } L_{x, \lambda} P_{x, \lambda} F_{c, \lambda}, c \in \{ R, G, B \} \tag{1} Ixc=∫λ∈Lx,λPx,λFc,λ,c∈{R,G,B}(1)
从上面的表达式可以看出,不同的环境光照,不同物体表面的反射特性,都可能造成不同的能量积分,即使同样光照,同样的物体表面反射特性,不同 sensor 的 CFA 可能也不同,所以最后 sensor 上的像素值也会不同。camera 的 ISP 就是将 sensor 获取的 RAW 图,通过一系列的处理模块,将 sensor RAW 上的颜色空间通过白平衡算法校正,再通过后续的色调映射算法,将最终的 RAW 图变换到一个 sRGB 颜色空间,不过由于不同的 sensor 对应的 ISP 模块有差异,每个模块的参数也不同,所以最终映射到 sRGB 空间的图像看起来可能也会不同。
CG 渲染,本质上是模拟实际的光照过程,但是一般来说,渲染都不会包含颜色校正,白平衡校正等模块,而是直接渲染成 sRGB 空间的图像,所以从这点出发,理论上 CG 渲染的 sRGB 图像是可以通过建立某种映射关系,映射到不同 sensor 的 RAW 空间的。Graphics to RAW, 本质上是学习一个 sRGB 空间到 RAW 域颜色空间的映射关系。
未经处理过的 sensor RAW 记录的是环境的光照,为了适应人眼的感知特性(颜色常恒性),一般 ISP 流程里面,会用一个 AWB (自动白平衡)的算法进行补偿,AWB 算法一般包含两个步骤,i) 一是估计环境中的光谱 ii) 二是基于估计的光谱进行颜色校正。传统的 AWB 方法基于图像的统计信息,现在也有很大基于深度神经网络的方法。估计的环境光照信息存储在一个 ASN 的 DNG tag 里面,白平衡校正其实是用一个 3x3 的矩阵,对 sensor RAW 上的每个通道进行重映射,将 sensor RAW 上的颜色在某种光照下映射到一个参考光照下。经过白平衡的处理之后,sensor RAW 上的颜色可以认为消除了对环境光照的映射,不过白平衡这是校正了黑,白,灰几种色,让白的看起来是白的,灰的看起来是灰的,不过其它颜色需要进一步的调整,ISP 随后会再用一个 3x3 的 color space transform (CST) 颜色转换矩阵,做进一步的变换。CST 矩阵不是固定的,而是和光照相关的。特定的 CST 矩阵会通过估计的光照与插值来实现,ISP 里面会存储两个典型光照下的 CST,比如 D65 和 A 光,分别对应室外与室内的标准光照环境,其他光照下的 CST 通过插值实现,CST 将 sensor RAW 的色彩空间,映射到一个标准的颜色空间,比如 CIEXYZ。Camera 会在 CIEXYZ 空间,进行颜色调整,最后再转回 sRGB 空间,从 CIEXYZ 映射到 sRGB 也是用一个 3x3 的转换矩阵。CST 矩阵与 XYZ2sRGB 矩阵结合起来,被称为 CCM 矩阵。
为了将 CG 渲染的图像转换回 sensor RAW,文章中通过对某个特定 sensor 采集少量的 sensor RAW 图,用少量 sensor RAW 中的 ASN 统计信息,估计一个该 sensor 的光照分布,假设我们从 sensor RAW 中采集了 M 张 DNG 图,我们定义色度值 R / G , B / G R/G, B/G R/G,B/G,从这 M 张 sensor RAW 图中,统计这些色度值的分布,并用一个高斯函数去拟合该分布:
L ∼ N ( μ , Σ ) (2) L \sim \mathcal{N}(\mu, \Sigma) \tag{2} L∼N(μ,Σ)(2)
Σ = 1 M ∑ i = 1 M ( ( [ R G B G ] i − μ ) T ( [ R G B G ] i − μ ) ) (3) \Sigma = \frac{1}{M} \sum_{i=1}^{M} \left((\begin{bmatrix} \frac{R}{G} & \frac{B}{G} \end{bmatrix}_{i} - \mu)^T (\begin{bmatrix} \frac{R}{G} & \frac{B}{G} \end{bmatrix}_{i} - \mu) \right) \tag{3} Σ=M1i=1∑M(([GRGB]i−μ)T([GRGB]i−μ))(3)
μ \mu μ 与 Σ \Sigma Σ 分别表示归一化色度值下的均值,方差,从这个高斯分布中采样,模拟某个光照,从光照值 L 中计算 correlated color temperature (CCT),基于估计的 CCT 值,以及事先标定好的 CST 矩阵: S D 65 , S A S^{D65}, S^{A} SD65,SA, 插值得到当前采样光照下的 CST 矩阵:
S L = α S A + ( 1 − α ) S D 65 , α ≥ 0 (4) S^{L} = \alpha S^{A} + (1-\alpha) S^{D65}, \alpha \ge 0 \tag{4} SL=αSA+(1−α)SD65,α≥0(4)
α = C C T L − 1 − C C T D 65 − 1 C C T A − 1 − C C T D 65 − 1 (5) \alpha = \frac{CCT_{L}^{-1} - CCT_{D65}^{-1}}{CCT_{A}^{-1} - CCT_{D65}^{-1}} \tag{5} α=CCTA−1−CCTD65−1CCTL−1−CCTD65−1(5)
为了处理 CG 渲染图像,文章将 CG 渲染图像,通过一系列的逆变换,将 CG 图像从 sRGB 色彩空间,转换到 sensor RAW 的颜色空间。其它的模块,包括 tone mapping,Bayer 模式的生成,以及噪声的添加,都是参考相应的现有技术来实现的。比如噪声的模拟,就是利用一个泊松-高斯分布来模拟,Bayer 模式的生成,可以直接将 RGB 图像通过抽取相应的通道来实现。整体的算法框图如下所示:
上图展示了文章主要的流程,通过对目标 sensor 的 RAW 图进行少量的采样,然后进行统计,估计出一个光照分布,从光照分布中进行采样,计算出一个 CST 矩阵,然后将 sRGB 空间转换到 CIE XYZ,再从 CIEXYZ 转换到 sensor RGB 空间,通过逆 AWB 变换。
最后,文章给出了一系列的实验结果,包括仿真的实验和实拍的对比实验,这篇文章的创新性主要在于对色彩空间的还原,通过对特定 sensor RAW 进行采样,用一个高斯分布进行拟合,可以比较真实地模拟目标 sensor 的色彩空间。