电影照片背后的技术
视频介绍: 电影照片背后的技术
查看过去的照片可以帮助人们重温他们最珍贵的时刻。去年 12 月,我们推出了电影照片,这是 Google 相册中的一项新功能,旨在重现拍摄照片时的沉浸感,通过推断图像中的 3D 表示来模拟相机运动和视差。在这篇博文中,我们将了解这一过程背后的技术,并展示电影照片如何将过去的单张 2D 照片转变为更具沉浸感的 3D 动画。
深度估计
与许多最近的计算摄影功能(例如人像模式和增强现实(AR))一样,电影照片需要深度图来提供有关场景 3D 结构的信息。在智能手机上计算深度的典型技术依赖于多视图立体,这是一种几何方法,通过在不同视点同时拍摄多张照片来求解场景中物体的深度,其中相机之间的距离是已知的。在 Pixel 手机中,视图来自两个摄像头或双像素传感器。
为了在非多视图立体拍摄的现有图片上启用电影照片,我们训练了一个具有编码器-解码器架构的卷积神经网络,以仅从单个 RGB 图像预测深度图。仅使用一个视图,该模型学会了使用单眼线索估计深度,例如对象的相对大小、线性透视、散焦模糊等。
因为单目深度估计数据集通常是为 AR、机器人和自动驾驶等领域设计的,所以它们倾向于强调街景或室内场景,而不是在休闲摄影中更常见的特征,如人、宠物和物体,这些特征具有不同的构图和构图。因此,我们创建了自己的数据集,用于使用在自定义 5 相机装备上捕获的照片以及在 Pixel 4 上捕获的人像照片的另一个数据集来训练单目深度模型。这两个数据集都包括来自多视图立体的地面实况深度,即训练模型的关键。
以这种方式混合多个数据集可以将模型暴露给更多种类的场景和相机硬件,从而改进其对野外照片的预测。然而,它也带来了新的挑战,因为来自不同数据集的真实深度可能因未知的缩放因子和偏移而彼此不同。幸运的是,电影照片效果只需要场景中物体的相对深度,而不是绝对深度。因此,我们可以通过在训练期间使用缩放和平移不变损失来组合数据集,然后在推理时对模型的输出进行归一化。
电影照片效果对深度图在人物边界处的准确性特别敏感。深度图中的错误可能会导致最终渲染效果中出现不和谐的伪影。为了缓解这种情况,我们应用中值滤波来改善边缘,并使用在Open Images 数据集上训练的DeepLab分割模型来推断照片中任何人的分割掩码。遮罩用于将被错误预测为在背景中的深度图的像素前移。
相机轨迹
在 3D 场景中为相机设置动画时可以有很多自由度,我们的虚拟相机设置的灵感来自于专业摄像机装备来创建电影运动。其中一部分是确定虚拟相机旋转的最佳枢轴点,以便通过将眼睛吸引到拍摄对象来产生最佳结果。
3D 场景重建的第一步是通过将 RGB 图像挤压到深度图上来创建网格。通过这样做,网格中的相邻点可能会有很大的深度差异。虽然这在“正面”视图中并不明显,但虚拟摄像机移动得越多,就越有可能看到跨越深度变化较大的多边形。在渲染的输出视频中,这看起来像是输入纹理被拉伸。为虚拟相机设置动画时最大的挑战是找到引入视差的轨迹,同时最大限度地减少这些“有弹性的”伪影。
由于用户照片及其相应的 3D 重建范围很广,因此不可能在所有动画中共享一个轨迹。相反,我们定义了一个损失函数,用于捕获在最终动画中可以看到多少伸缩性,这使我们能够为每张独特的照片优化相机参数。与计算识别为伪影的像素总数不同,损失函数在具有更多连接伪影像素的区域中更频繁地触发,这反映了观看者更容易注意到这些连接区域中的伪影的倾向。
我们利用来自人体姿势网络的填充分割掩码将图像划分为三个不同的区域:头部、身体和背景。在将最终损失计算为归一化损失的加权和之前,损失函数在每个区域内被归一化。理想情况下,生成的输出视频没有伪影,但在实践中,这种情况很少见。对区域进行不同的加权会使优化过程偏向于选择更喜欢背景区域中的伪影而不是图像主体附近的那些伪影的轨迹。
构图场景
通常,重新投影的 3D 场景不能整齐地放入纵向的矩形中,因此还需要以正确的长宽比对输出进行构图,同时仍保留输入图像的关键部分。为了实现这一点,我们使用了一个深度神经网络来预测完整图像的每像素显着性。在以 3D 方式构建虚拟摄像机时,模型会识别并捕获尽可能多的显着区域,同时确保渲染的网格完全占据每个输出视频帧。这有时需要模型缩小相机的视野。
结论
通过电影照片,我们实施了一个算法系统——对每个 ML 模型进行公平性评估——它们协同工作,让用户以新的方式重温他们的记忆,我们对未来的研究和功能改进感到兴奋。既然您知道它们是如何创建的,那么请留意自动创建的电影照片,这些照片可能会出现在 Google 相册应用程序中您最近的记忆中!