这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。
Abstract
长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或背景模糊效果。前景模糊图像通常是用安装在三脚架上的相机拍摄的,描绘的是移动的前景元素(如丝般的流水或光轨)呈现出模糊效果,而背景景观则非常清晰。背景模糊图像(也称为平移摄影)是在相机追踪移动主体时拍摄的,从而得到主体清晰而背景因相对运动而模糊的图像。这两种技术都极具挑战性,并且需要额外的设备和高超的技巧。
本文介绍了一种计算式连拍摄影系统,它运行在手拿式智能手机的相机应用程序中,只需按下快门按钮就能全自动地实现这些效果。我们的方法首先检测并分割出显著主体。我们对多帧画面中的场景运动进行追踪并对齐图像,以保持所需的清晰度并产生具有美感的运动拖影。我们拍摄一组曝光不足的连拍照片,并选择输入帧的子集,无论场景或相机的运动速度如何,这些子集都能产生长度可控的模糊拖影。我们预测帧间运动并合成运动模糊来填补输入帧之间的时间间隙。最后,我们将模糊图像与正常曝光的清晰图像合成,以保证面部或场景中几乎没有移动的区域的清晰度,并生成最终的高分辨率和高动态范围(HDR)照片。我们的系统使原本只有专业人士才能掌握的能力得以普及,让大多数普通摄影爱好者也能使用这种创意风格。
- 图 1
按下快门按钮时,我们的智能手机相机系统在几秒钟内捕获、处理并输出常规照片和长曝光对应的照片,如上图所示。手持拍摄的前景模糊示例如(a)所示,在没有精确跟踪的情况下拍摄的背景模糊示例如(b)所示。我们的计算长曝光摄影管线完全自动地处理这两种用例。
Introduction
手机摄影在消费者的日常生活中无处不在,并且正在逐渐取代传统摄影。通过使用连拍和后期处理技术,现代手机的成像流程能够产生非常高质量的结果,提供高动态范围色调映射、出色的低光拍摄性能并模拟景深虚化(散景)效果,而这些在以前只有使用更大、更重的相机和镜头才能实现。
尽管有这些显著的改进,但长曝光移动摄影仍然没有得到很好的处理。现有的解决方案无法帮助用户拍出移动场景元素模糊而静态场景元素清晰的效果。这种清晰与模糊的对比是一张引人入胜的照片的关键特性,而仅仅通过延长手持相机传感器的曝光时间是无法实现这种效果的。
传统的长曝光摄影通常根据场景和情况以以下两种方式之一进行。一种方法是在清晰的背景上产生前景模糊效果(例如如丝般的瀑布、光轨等),这需要使用很长的曝光时间,可能长达几秒。这就需要使用三脚架,因为即使是轻微的相机抖动也会导致不希望出现的背景清晰度损失。此外,必须在镜头上添加一个中性密度(ND)滤镜,以避免传感器曝光过度。
第二种方法称为平移摄影,它呈现出的效果是移动主体清晰,而背景由于相对于主体的运动而模糊。实现这种效果的方法是用相机追踪移动主体,同时保持快门打开,适度增加曝光时间(例如半秒),并稍微缩小光圈以避免图像曝光过度。摄影师必须尽可能精确地追踪主体的运动,以避免不希望出现的主体清晰度损失,同时还要在正确的时刻按下快门按钮。
这两种方法都需要高超的技巧、大量的练习,并且要考虑到场景的移动速度来手动选择相机快门速度才能达到理想的效果。
本文的主要贡献是一个计算式长曝光移动摄影系统,该系统有两种变体,使上述两种应用场景得以普及。它在谷歌 Pixel 6 和 7 智能手机上以一种名为 “运动模式” 的新相机模式实现,用户无需使用三脚架或镜头滤镜,也无需精确追踪或完全追踪移动主体就能轻松拍摄出这些效果。我们的方法在每种变体中都是全自动的端到端流程:用户选择希望生成前景模糊还是背景模糊效果后,只需用户按下快门按钮就能生成 1200 万像素的长曝光照片,同时补偿相机和/或主体的运动,从而保留所需的背景和主体的清晰度。整个系统的主要组成部分如下:
- 拍摄和选帧策略,产生与场景或相机速度无关的标准化模糊拖影长度;
- 结合注视显著性与人和宠物面部区域预测的主体检测,以及对其运动的追踪;
- 输入图像的对齐,以消除相机抖动,在存在移动的前景元素时稳定背景,或者在产生令人满意的背景运动模糊拖影的同时消除主体运动。
- 密集运动预测和模糊合成,跨越多个高分辨率输入帧,并生成保留高光的平滑弧形运动模糊轨迹。
此外,文章的系统架构包含多个神经网络,在计算和内存预算受限的移动设备上能够高效运行,实现了高动态范围(HDR)成像流程,仅需几秒就能生成相关的常规照片和长曝光照片。
System Overview
- 图 2
我们的系统逐步处理原始的突发图像,在这个图表上从左到右,首先在低分辨率(8 倍下采样)下进行初始主体预测、特征跟踪、运动分析和运动预测。图像也在半分辨率(2 倍下采样)下进行处理以合成运动模糊,然后再上采样回全 1200 万像素分辨率以进行合成和色调映射得到最终结果。
文章整体的系统示意图如图 2 所示。所捕获的原始图像流通过四个阶段以两种不同分辨率逐步处理,每个阶段对应于图 2 中的一行:初始主体检测、运动分析、运动预测和渲染。
初始显著性和面部预测阶段计算用于主体检测的主要信号,生成归一化权重图。运动分析阶段负责对与检测到的主体或背景相对应的一组特征点进行追踪和对齐,并基于运动统计数据选择帧。运动预测阶段预测密集的线性核和权重图,这些图在渲染阶段用于生成跨越给定输入帧对的平滑运动模糊。最后的合成阶段对最终结果进行分层处理,同时保留最终图像中重要区域的清晰度。
前三个阶段将经过色调映射并转换为 sRGB 的图像作为输入,这些图像被下采样 8 倍至 504×376 的低分辨率。选择这种分辨率是为了在处理帧时实现低延迟,运算耗时主要由密集运动预测神经网络决定。这也确保了感受野能够覆盖输入全分辨率图像中大多数实际的运动差异。然而,最后一个阶段使用特意曝光不足的连拍原始图像,并将其转换为 16 位线性 RGB。高比特深度对于在渲染过程中保留场景的高动态范围是必要的,即避免高光过饱和和阴影中的条纹伪影。图像被下采样 2 倍,这是一种折中的做法,既能在最终结果中保留足够的细节,又能在减少内存占用的情况下运行。
增量处理循环在每次迭代时对一个额外的连拍帧进行转换和下采样,将其输入到我们流程的最后三个阶段,从而得到一个累积平均的运动模糊图像。当达到帧选择标准(通过对运动模糊拖影长度进行估计)时,循环停止。然后我们合成最终结果,同时将图像上采样回全分辨率。在流程末尾,图像会被转换为低动态范围的 8 位表示形式,通过色调映射来保留场景的高动态范围视觉外观。
Implementation
Busrt Capture
我们的相机系统以每秒 30 帧的速率拍摄画面,采用全自动光圈、快门速度和对焦设置。这些设置可能会根据画面中的场景变化进行动态调整,而且除了场景突然变化的情况外,我们的系统都能很好地运行。
在背景模糊的情况下,我们以有快速移动的近处主体的场景为目标。当按下快门按钮时,最近拍摄的帧被用作基础帧来生成常规曝光图像,因为它描绘了用户所选择的动作的顶点。然后,我们的算法可能会选择过去多达 8 个额外的帧来产生背景模糊效果。
在生成前景模糊效果时,我们以场景运动速度范围大得多的场景为目标,包括慢速和远距离移动的内容。为了产生引人注目的效果,这需要根据场景运动将拍摄时长延长至几秒。当按下快门按钮时,我们利用通过相机取景器看到的最后 5 帧快速分析场景运动统计数据,并自动确定后续拍摄时长,目的是满足我们的帧选择标准。我们使用接下来几节中描述的运动追踪和图像对齐的轻量级变体(其运行时间在 50 毫秒以内)来计算场景速度的估计值。根据这个估计值,在恒定速度假设下,我们很容易推导出能产生所需模糊拖影长度的拍摄时长。考虑到最长可达 7 秒的延长拍摄时长,我们还得出了一个帧处理速率,以便选择多达 12 个拍摄帧的均匀分布子集进行处理,在计算预算和合适的时间采样率之间取得平衡。被选中用于处理的拍摄帧被排队,以便由后续阶段立即进行并行处理,从而隐藏拍摄过程中的部分处理延迟。
Automatic Subject Detection
在背景模糊的情况下,我们希望主体固定,而其背后的世界其余部分呈现模糊效果。因此,我们会自动检测和追踪主要主体,并对输入帧进行对齐以抵消主体的运动。主体被表示为一个权重图,并用于求解反向主体运动对齐。
首先通过注意力显著性这一代理任务来预测主要主体。对于此任务,我们使用一个对移动端友好的、带有跳跃连接的 3 层 U - Net,其编码器由 15 个具有 10 个基础通道的 BlazeBlock 组成,相应的解码器由可分离卷积和双线性上采样层构成。它是从在 SALICON 数据集 上训练的一个更大的模型中提炼出来的。为了聚焦于我们信号中的显著性峰值,我们将预测值重新归一化到区间 [0, 1],并将低于阈值(我们根据经验选择 0.43)的值置零。
显著性信号往往在主体中心达到峰值,所以我们用面部信号对其进行补充,这有助于保持主体面部的清晰,这对于具有复杂关节运动的主体尤为重要。我们通过首先预测人、猫和狗的面部区域来计算面部信号,然后使用平滑阶跃衰减(smootherstep falloff)对所得区域进行羽化处理,最后用一个全主体分割对其进行掩蔽。
我们如下组合显著性和面部信号,以生成每个像素权重为𝑤 = 𝑠(1 + 𝑓) 的主体权重图,其中𝑠∈[0, 1] 是显著性信号值,𝑓∈[0, 1] 是面部信号值,随后将其重新归一化到区间 [0, 1]。
Motion Tracking
我们使用一个基于 [Grundmann 等人,2011] 的特征跟踪库来提取用于后续图像对齐的运动轨迹。运动轨迹统计数据也用于选择帧,以确定场景中何时已经捕获到足够的运动。
背景模糊中的主体跟踪需要在主体上有高浓度的轨迹,以实现稳定、高质量的对齐。作为一种延迟优化措施,我们对图像网格(每个网格单元为 5×5 像素)进行 rejection sampling,以生成密度与主体权重图成比例的特征轨迹。我们只尝试在这样的网格单元中提取特征轨迹:其中采样得到的均匀随机变量 𝑣∈[0, 1] 小于该网格位置对应的平均轨迹权重。
Image Alignment
根据特征轨迹对应关系,我们首先估计全局变换,以便将所有帧与参考帧对齐。这消除了整体相机运动,包括用于跟踪对象的手持抖动和扫动。剩余的图像对齐阶段则取决于所需的运动模糊效果:前景模糊或背景模糊。为了便于说明,我们选取一个示例场景,它可以呈现为如下两种情况之一:如图 3 所示,一辆出租车驶过繁忙的城市十字路口。
- 图 3
城市场景。上图:交通在繁忙的城市十字路口移动,前景运动向量(红色)和背景运动向量(绿色)。下图:我们的前景模糊(左)和背景模糊(右)结果。
- 前景模糊
为了使背景尽可能清晰,我们必须考虑诸如视差、滚动快门和镜头畸变等空间效应。在应用全局变换之后,我们计算一个残差向量,它是变换后的跟踪特征与其在基准帧中对应位置之间的位置差。然后,我们利用这些残差来估计图像上顶点网格的局部细化变换。由此产生的空间变化扭曲消除了背景中的运动,同时保留了前景中的运动,从而产生如图 3(左下角)所示的清晰背景。
我们放置网格和估计局部变换的方法是类似的,但我们对各点进行均匀加权,并在局部相似性变换估计过程中对纳入的点采用硬性截止,以获得更好的性能。这种估计由每个顶点的支撑半径控制(在图 4 中显示为品红色圆圈),即特征点到顶点的最大距离,超过这个距离的特征点将不被纳入局部细化估计。我们发现,将这个半径设置为网格单元尺寸的 1.5 倍,并采用 8×6 个单元的网格尺寸,足以使局部细化变换在整个视场内平滑变化,同时又足够小,使得来自场景不同部分的不同场景对象不会相互影响。将估计出的变换应用于每个顶点,进而生成一个空间变化的网格,使任意帧的背景与参考帧的背景对齐。为了优化延迟,通过向 GPU 传递局部二维位移矢量纹理,将该网格的应用合并到下游渲染阶段。
-
图 4
空间变化的扭曲。左上图:在一个网格顶点(橙色)的支持区域(品红色)内的背景流向量(绿色)对其局部位移(黄色)有贡献。右上图:得到的网格和空间变化的扭曲,将背景与参考帧的背景对齐。仅使用单个全局单应性变换的前景模糊结果(左下图)和使用我们的空间变化网格扭曲的前景模糊结果(右下图)。插图以 5 倍放大显示。 -
背景模糊
在这种情况下,如图 3(右下角)所示,我们希望前景尽可能清晰。我们使用主体遮罩来选择与前景主体相对应的特征轨迹子集。以此为起点,我们进一步使用谱聚类来选择最显著的运动簇,以帮助辨别要跟踪的正确运动片段并去除异常值 [Porikli 2004]。这对于有关节运动的主体(例如跑步者,其四肢的运动与躯干不同)特别有用。
我们目标函数的目的是平衡两个目标:(1) 主体清晰度:使显著点对应关系的整体重投影误差最小化;(2) 时间平滑性:使变换后的背景运动矢量尽可能与前一时间步的运动矢量平行。
给定一对具有点对应关系 x i x_i xi 和 x j x_j xj的帧 i i i 和 j j j,我们定义一个相似变换,它将二维点从帧 i i i 到帧 j j j 进行均匀缩放( s j , i ∈ R 1 s_{j,i} \in \mathbb{R}^{1} sj,i∈R1)、旋转( R j , i ∈ S O ( 2 ) \mathbf{R}_{j,i} \in SO(2) Rj,i∈SO(2))和平移( t j , i ∈ R 2 t_{j,i} \in \mathbb{R}^{2} tj,i∈R2),如下所示:
x ^ j = s j , i R j , i x i + t j , i (1) \hat{x}_{j} = s_{j,i}\mathbf{R}_{j,i}x_i + t_{j,i} \tag{1} x^j=sj,iRj,ixi+tj,i(1)
为了简化,省略下标,目标函数可以定义为如下:
min s , R , t λ f E f ( s , R , t ) + λ b E b ( s , R , t ) (2) \min_{s, R, t} \lambda_f E_f(s, R, t) + \lambda_b E_b(s, R, t) \tag{2} s,R,tminλfEf(s,R,t)+λbEb(s,R,t)(2)
λ f , λ b \lambda_f, \lambda_b λf,λb 是相对的权重系数, E f E_f Ef 是主体清晰度,针对前景点 x ∈ X f x \in X_f x∈Xf 定义的,它是变换后点对应关系(使用公式 1)重投影误差的 L2 范数:
E f ( s , R , t ) = ∑ x ∈ X f ∥ x j − s R x i − t ∥ 2 (3) E_f(s, R, t) = \sum_{x \in X_f} \left \| x_{j} - sRx_i - t \right \|_2 \tag{3} Ef(s,R,t)=x∈Xf∑∥xj−sRxi−t∥2(3)
背景项 E b E_b Eb 被用作一种时间平滑先验,用于对与前一帧对中相应向量不平行的背景流向量进行惩罚。给定三个不同的帧索引 i,j 和 k 它利用向量点积作为平行性度量来定义,如下所示:
E b ( s i , k , R i , k , t i , k ) = ∑ x ∈ X b smooth L 1 ( ∣ v i , j ⋅ v j , k ∣ ∥ v i , j ∥ ∥ v j , k ∥ ) (4) E_b(s_{i,k}, R_{i,k}, t_{i,k}) = \sum_{x \in X_b} \text{smooth}_{L_1} (\frac{\left | v_{i,j} \cdot v_{j, k} \right|}{\left \| v_{i,j} \right \| \left \| v_{j,k} \right \| }) \tag{4} Eb(si,k,Ri,k,ti,k)=x∈Xb∑smoothL1(∥vi,j∥∥vj,k∥∣vi,j⋅vj,k∣)(4)
其中 v p , q = x ^ q − x q v_{p,q} = \hat{x}_q - x_q vp,q=x^q−xq 是参考帧 q 中的一个点与其来自帧 p 的变换后点对应关系之间的方向位移向量。采用 [Huber 1964] 中的平滑-L1 损失函数来防止优化过程中梯度消失。
smooth L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r w i s e (6) \text{smooth}_{L1}(x) = \left\{\begin{matrix} 0.5x^2 & if \left | x \right | < 1 \\ \left | x \right| - 0.5 & otherwise \end{matrix}\right. \tag{6} smoothL1(x)={0.5x2∣x∣−0.5if∣x∣<1otherwise(6)
不失一般性,我们选择 i =0 作为固定的参考帧索引,并在公式 4 中设置 k=j+1,以便在对帧序列进行单次正向遍历中,对每一对新的帧(j,j+1)增量式地估计变换。我们使用 Ceres 库 [Agarwal 等人,2022] 来解决这个非线性优化问题。我们分别为 λ f \lambda_f λf 和 λ b \lambda_b λb 使用值 1 和 10,以平衡这两个误差项的影响。
未完待续:
Computational Long Exposure Mobile Photography (二)