肖像深度 API:使用 TensorFlow.js 将单张图像转换为 3D 照片
2022 年 5 月 10 日

发布者:Ruofei DuYinda ZhangAhmed SabieJason Mayes,Google。

深度图 本质上是一张图像(或图像通道),其中包含有关场景中物体表面相对于给定视角(在本例中为相机本身)的距离信息,对应图像中的每个像素。深度图是各种计算机图形和计算机视觉应用的基本组成部分,例如 增强现实人像模式,以及 3D 重建。尽管最近在 ARCore 深度 API 等深度传感功能方面取得了进展,但网络上大多数照片仍然缺少相关的深度图。再加上网络社区用户表达了对在 JavaScript 中使用深度功能以增强现有 Web 应用程序的兴趣,例如让图像栩栩如生,将实时 AR 效果应用于人脸和身体,甚至重建可用于 VR 环境的物体,这些都帮助塑造了今天您所看到的路径。

今天,我们推出了 深度 API,这是 TensorFlow.js 中第一个深度估计 API。借助这个新 API,我们还推出了第一个肖像深度模型 ARPortraitDepth,它可以估计单张肖像图像的深度图。为了演示深度信息的众多可能用例之一,我们还提供了一个计算摄影应用程序,3D 照片,它利用预测的深度并在给定的肖像图像上实现 3D 视差效果。尝试下面的实时演示,每个人都可以轻松地将他们的社交媒体个人资料照片制作成 3D 照片,如下所示。

亲自尝试 3D 肖像演示!

ARPortraitDepth:单张图像深度估计

肖像深度 API 的核心是一个名为 ARPortraitDepth 的深度学习模型,它以单张彩色肖像图像作为输入并生成深度图。为了提高计算效率,我们采用了轻量级 U-Net 架构。如下所示,编码器通过将图像或特征图分辨率逐渐缩减一半来降低分辨率,而解码器则将特征分辨率提高到与输入相同的分辨率。来自编码器的深度学习特征被连接到解码器中具有相同空间分辨率的对应层,以提供用于深度估计的高分辨率信号。在训练期间,我们强制解码器在每一层产生分辨率不断提高的深度预测,并为每个深度预测及其真实值添加损失。这在经验上有助于解码器通过逐步添加细节来预测准确的深度。

丰富多样化的训练数据对于机器学习模型实现整体良好性能至关重要,例如准确性和鲁棒性。我们通过各种相机配置(例如焦距、相机姿态)从使用 高质量动作捕捉系统 捕获的 3D 数字人合成渲染颜色和深度图像对,并运行 重新照明增强,使用高动态范围环境照明图来提高彩色图像的真实性和多样性,例如面部的阴影。我们还使用配备前置深度传感器的手机(例如 Google Pixel 4)收集真实数据,其中深度质量(作为训练的真实值)并不像合成数据那样准确和完整,但彩色图像在对野生图像运行模型时有效地提高了模型的性能。

单张图像深度估计流程。

为了增强对背景变化的鲁棒性,在实践中,我们会在将图像发送到深度估计的神经网络之前,使用 MediaPipe 和 TensorFlow.js 运行现成的 人体分割模型

肖像深度模型可以支持围绕人体的一系列创意应用,这些应用可以推动下一代 Web 应用程序的发展。我们建议读者参考 ARCore 深度实验室 以获得更多灵感。

对于 3D 照片应用程序,我们创建了一个高性能渲染流程。它首先使用 TensorFlow.js 中现有的 人体分割 API 生成一个分割蒙版。接下来,我们将蒙版肖像传递到肖像深度 API 中,并在 GPU 上获得深度图。最后,我们在 three.js 中生成一个深度网格,其中顶点按规则网格排列,并通过重新投影对应深度值进行位移(见下图以生成深度网格)。最后,我们将纹理投影到深度网格上,并在 z 轴周围绕圆圈旋转相机。用户可以以 GIF 或 WebM 格式下载动画。

从深度图生成深度网格,用于 3D 照片应用程序。

肖像深度 API 安装

肖像深度 API 目前作为新深度 API 的一种变体提供。

要安装 API 和运行时库,您可以使用 html 文件中的