这是谷歌影像团队 2023 年发表在 Siggraph Asia 上的一篇文章,主要介绍的是利用多摄融合的思路进行变焦。
单反相机因为卓越的硬件性能,可以非常方便的实现光学变焦。不过目前的智能手机,受制于物理空间的限制,还不能做到像单反一样的光学变焦。目前主流的智能手机,都是采用多摄的设计,一般来说一个主摄搭配一个长焦,为了实现主摄与长焦之间的变焦,目前都是采用数字变焦的方式,数字变焦相比于光学变焦,细节会损失很多。这篇文章提出一种混合变焦的方法,就是拍摄的时候,同时获取主摄和长焦的图像,然后利用机器学习模型将两张图像对齐,并且将长焦的细节迁移到主摄上。同时,这篇文章也设计了一种自适应的融合方法,去处理两个镜头的景深差异,遮挡,匹配误差等问题,为了尽量减少两个镜头之间的域差异,文章作者还设计了一个双目的采集系统,获取真实图像的输入和GT,用于有监督的训练。最终,这篇文章的方法,可以在手机上实现对 12M 像素的图像处理耗时在 500ms 左右,相比其它 SOTA 方法,在真实场景下的效果更好。
HYBRID ZOOM SUPER-RESOLUTION
文章将主摄的图像称为 W \mathbf{W} W,长焦的图像称为 T \mathbf{T} T
这篇文章的目标是设计一个高效的算法系统,能够运行在手机设备上。由于手机设备的限制,耗时耗内存的大模型无法使用,所以需要对整个算法流程进行精细的设计。整个算法流程如图 3 所示。当用户按下拍照按钮的时候,算法系统会同时拍摄两张图像。首先利用一个粗粒度的匹配算法,将主摄图像 W \mathbf{W} W 和长焦图像 T \mathbf{T} T 对齐,然后后面再接一个局部稠密的匹配算法,比如光流。接下来,文章作者采用 UNet 模型将从 W \mathbf{W} W 中 crop 出来的图像和长焦图像 T \mathbf{T} T 中的亮度通道进行融合。最后,利用一个自适应的融合算法,将景深差异,遮挡,匹配误差等考虑进去,将融合后的图像重新贴回主摄图像 W \mathbf{W} W。整个算法系统的算法模块都尽量轻量化,以保证整个系统的效果和效率。
Image Alignment
Coarse alignment:文章首先将 W \mathbf{W} W 进行裁剪,让其与 T \mathbf{T} T 的 FOV 基本一致,然后将裁剪后的图像利用 bicubic 的方法上采样,让两张图像的尺寸保持一致,然后作者估计了一个 2D 的转换矩阵,将裁剪后的上采样图像与 T \mathbf{T} T 进行对齐,这个变换后的图像称为 I s r c I_{src} Isrc,同时,文章也将 T \mathbf{T} T 的颜色,利用一个颜色对齐的方式,与 I s r c I_{src} Isrc 对齐,颜色对齐后的 T \mathbf{T} T 图像称为 I r e f I_{ref} Iref
Dense alignment:做完粗对齐之后,文章接下来要做一个精对齐,需要用到稠密的光流,文章作者利用 PWC-Net 去估计 I s r c I_{src} Isrc 与 I r e f I_{ref} Iref 之间的稠密光流,先对 I s r c I_{src} Isrc 与 I r e f I_{ref} Iref 做一个下采样到 384 × 512 384 \times 512 384×512,然后利用 PWC-Net 估计其光流,然后将估计得到光流图上采样回原始图像尺寸。为了加速,文章中将 PWC-Net 进行了剪枝,将一些运算复杂度高的模块去除了。
Image Fusion
为了保持 W \mathbf{W} W 的颜色,文章在亮度空间进行融合,文章作者构建了一个 5 层的 UNet,将两路图像的亮度通道输入网络,此外还有前面光流估计输出的遮挡图也输入网络,最终输出得到一个灰度图像。然后这个输出的灰度图像 Y 与 UV 通道一起,做一个颜色转换,得到最终的 RGB 图像。
Adaptive Blending
前面基于 AI 的配准对齐和融合模型对大部分场景都能取得不错的效果,但是依然会有一些场景可能会在输出结果上看到明显的 artifacts。由于景深差异,遮挡,以及误匹配。因此,文章作者设计了一个策略来自适应地对 Y s r c Y_{src} Ysrc 以及 Y f u s i o n Y_{fusion} Yfusion 进行融合,这个策略就是将 defocus map,occlusion map,flow uncertainty map 以及 alignment rejection map 最终统一成一个 alpha mask,然后基于这个 alpha mask 做融合。具体框架如图 4 所示:
Narrow DoF on T \mathbf{T} T 一般来说,长焦的景深比主摄要小,因为一般来说景深和焦距成反比,焦距越长,景深会越浅,从论文中的图 2 可以看到,长焦的离焦区域比主摄要模糊,如果将离焦区域直接融合,会使最终的图像反而变得模糊,所以文章设计了一种方法,将 defocus map 计算出来,作为融合的引导信息。
- Defocus map:为了估计出 defocus map,首先需要知道对焦的中心区域,同时需要知道图像中的像素相对对焦中心区域的距离,也就是深度信息,因为主摄和长焦镜头基本是平行的,根据双目视觉的测距原理,两路图像中的光流大小与视差及空间深度是成正比的。基于这个假设,文章作者提出了一种估计 defocus map 的算法,如图 5 所示。首先,根据相机的自动对焦模块,获得图像中的对焦区域 ROI,一般是一个矩形区域。然后,基于双目匹配的原理,可以认为光流反映了深度信息,进而可以假设对于静态场景来说,像素在同样的深度面上,有近似的光流。为了找到这个对焦中心,文章作者用 K-means 聚类算法对光流信息进行聚类,然后选择这个聚焦中心 x f x_f xf 作为最大聚类的中心。再利用如下的表达式,计算不同像素的光流与这个聚类中心的相对深度:
M d e f o c u s ( x ) = sigmoid ( ∥ F f w d ( x ) − F f w d ( x f ) ∥ 2 2 − γ σ f ) (1) \mathbf{M}_{defocus}(\mathbf{x}) = \text{sigmoid}(\frac{ \left \| F_{fwd}(\mathbf{x}) - F_{fwd}(\mathbf{x}_f) \right \|_{2}^{2} - \gamma}{\sigma_f}) \tag{1} Mdefocus(x)=sigmoid(σf∥Ffwd(x)−Ffwd(xf)∥22−γ)(1)
F f w d F_{fwd} Ffwd 是前面计算的光流信息, γ \gamma γ 控制光流位移的阈值,让对焦区域容许一定的位移变化, σ f \sigma_{f} σf 控制 defocus map 的平滑程度。
- Occlusion map:对于某些场景, W \mathbf{W} W 和 T \mathbf{T} T 之间可能因为遮挡,存在有些区域不能在两路图像中都存在的情况,如果将这些区域进行融合,可能会产生 artifacts,所以文章作者计算了一个 Occulusion map 作为引导:
M o c c ( x ) = min ( s ∥ W ( W ( x ; F f w d ) ; F b w d ) − x ∥ 2 , 1 ) (2) \mathbf{M}_{occ}(\mathbf{x}) = \min (s \left \| \mathbb{W}(\mathbb{W}(\mathbf{x}; F_{fwd});F_{bwd}) - \mathbf{x} \right \|_{2}, 1) \tag{2} Mocc(x)=min(s∥W(W(x;Ffwd);Fbwd)−x∥2,1)(2)
其中, W \mathbb{W} W 表示双线性 warp 操作, x \mathbf{x} x 表示原始图像的二维坐标,尺度因子 s 控制 occlusion map 的强度。上面这个式子的原理,就是如果一个点在两张图像中都有,那么经过两次 warp 之后,这个点的坐标应该是保持不变的。
- Flow uncertainty map:因为稠密的光流匹配是一个非常病态的问题,文章中将 PWC-Net 的输出做了扩展,输出了一个光流的置信度 map,这个置信度输出的是每个像素的光流向量的拉普拉斯分布,如下所示:
S ( x ) = exp ( log ( V a r x ( x ) ) ) + exp ( log ( V a r y ( x ) ) ) (3) \mathbf{S}(\mathbf{x}) = \sqrt{\exp(\log(Var_x(\mathbf{x}))) + \exp(\log(Var_y(\mathbf{x})))} \tag{3} S(x)=exp(log(Varx(x)))+exp(log(Vary(x)))(3)
M f l o w ( x ) = min ( S ( x ) , s m a x ) / s m a x (4) \mathbf{M}_{flow}(\mathbf{x}) = \min(\mathbf{S(\mathbf{x}), s_{max}}) / s_{max} \tag{4} Mflow(x)=min(S(x),smax)/smax(4)
- Alignment rejection map:对于配准异常区域的引导信息,文章作者也构建了一个 map,简单来说,就是将配准后的两张图的分成若干个 local patch,对每个 local patch,分别计算均值,然后对每个 local patch 里的像素,减去对应 patch 的均值之后,比较两个像素之间的差异: P δ = ( P s r c − μ s r c ) − ( P ~ r e f − μ r e f ) P_{\delta} = (P_{src} - \mu_{src}) - (\tilde{P}_{ref} - \mu_{ref}) Pδ=(Psrc−μsrc)−(P~ref−μref)
M r e j e c t ( x ) = 1 − exp ( − ∥ P δ ( x ) ∥ 2 2 / ( σ s r c 2 ( x ) + ϵ 0 ) ) (5) \mathbf{M}_{reject}(\mathbf{x}) = 1 - \exp \left( -\left \| P_{\delta }(\mathbf{x}) \right \|_{2}^{2} / (\sigma_{src}^{2}(\mathbf{x}) + \epsilon_{0}) \right) \tag{5} Mreject(x)=1−exp(−∥Pδ(x)∥22/(σsrc2(x)+ϵ0))(5)
其中, σ s r c 2 ( x ) \sigma_{src}^{2}(\mathbf{x}) σsrc2(x) 表示 P s r c P_{src} Psrc 的方差, ϵ 0 \epsilon_{0} ϵ0 用来控制容许的误差。
最后的融合 map 由如下的式子求得:
M b l e n d = max ( 1 − M o c c − M d e f o c u s − M f l o w − M r e j e c t , 0 ) (6) \mathbf{M}_{blend} = \max(1 - \mathbf{M}_{occ} - \mathbf{M}_{defocus} - \mathbf{M}_{flow} - \mathbf{M}_{reject}, 0) \tag{6} Mblend=max(1−Mocc−Mdefocus−Mflow−Mreject,0)(6)
I f i n a l = u n c r o p ( M b l e n d ⊙ I f u s i o n + ( 1 − M b l e n d ) ⊙ I f u s i o n ) (7) I_{final} = uncrop(\mathbf{M}_{blend} \odot I_{fusion} + (1 - \mathbf{M}_{blend}) \odot I_{fusion}) \tag{7} Ifinal=uncrop(Mblend⊙Ifusion+(1−Mblend)⊙Ifusion)(7)
LEARNING FROM DUAL CAMERA RIG CAPTURES
最后,介绍一下文章的训练数据是怎么构建的,对于 low-lelve 的 CV 任务来说,训练数据的构建一直是个问题,如果用仿真退化的方式构造数据,可能存在域差异的问题。所以文章作者设计了一个采集数据的方式,用实际采集的数据作为训练数据。具体装置如下图所示:
文章中,将两部手机平行放置,这样可以同时采集到两部手机的主摄和长焦图像,这两部手机,一部可以称为主机,一部称为副机,训练的时候,主机的主摄和副机的长焦图像作为输入,而主机的长焦图像作为GT,这样既模拟了实际的两路图像,又有了实采的 GT 图像,而在实际推理的时候,可以直接将其中一部手机的主摄和长焦作为输入即可。