Py学习  »  机器学习算法

用机器学习改进 Pixel 4 的人像模式

TensorFlow • 4 年前 • 500 次点击  

文 / Neal Wadhwa,软件工程师和 Yinda Zhang,研究员,

Google Research

人像模式是 Pixel 系列手机中相机的一个功能,任何人均能通过此功能拍摄出专业的浅景深图像。人像模式最初发布于 Pixel 2,并在 Pixel 3 上得以改进,改进方法是使用机器学习来估算相机全像素双核自动对焦 (dual-pixel auto-focus) 系统的深度。该模式通过模糊背景来突出照片中被聚焦的主体。在此过程中,至关重要的一个环节是了解被拍摄物体距摄像头的距离(即深度),并以此分辨需要保持清晰和模糊处理的物体。


在 Pixel 4 上,我们对人像功能进行了两项重大改进,并充分利用 Pixel 4 的双摄像头和全像素双核(Dual-Pixel, DP)自动对焦系统来改进深度估算,使用户无论远近都能拍出非常漂亮的人像模式照片。同时,我们还改进了背景虚化功能,使其更接近专业单反 (Single-lens reflex) 相机。

Pixel 4 的人像模式可以让用户无论远近都能进行人像拍摄,并获得类似单反的背景虚化效果(照片来源:Alain Saal-Dalma 和 Mike Milne)



简要回顾

Pixel 2 和 Pixel 3 使用相机的 DP 自动对焦系统来估算景深。DP 的工作原理是将每个像素一分为二,这样一来每半个像素都能获得不同的半个主镜头光圈。通过分别读取每半个像素的图像,您可以获得两个略有不同的场景画面。这些画面虽然来自一个单镜头摄像头,但其成像效果和同时在主镜头光圈两侧放置一对虚拟摄像头的效果相当。在这两个画面间切换时,您会发现被摄主体保持在同一位置,而背景似乎在垂直移动。

由于灯泡距摄像头更近,所以灯泡的 DP 视差效果比人物更明显


这种视觉上的移动名为视差,其大小取决于景深。通过找到在不同画面间相对应的像素,我们可以估算出视差,并能以此估算出景深。由于视差会随着物体间距离的缩短而缩小,所以我们能轻松估算出距摄像头较近的物体(例如灯泡)的景深。


此外,视差还取决于立体基线的长度,即两个摄像头(或 DP 系统中两个虚拟摄像头)之间的距离。由于 DP 系统位于单摄像头的镜头内,所以其视点基线长度小于 1 毫米,因此 DP 系统很难估算远距离场景的景深,这也是两个画面中的人物看上去几乎一样的原因。



双摄像头是对 DP 的补充

Pixel 4 的广角镜头和长焦镜头相距 13 毫米,远远大于 DP 的基线长度,由此带来的更大视差使得远距离物体的景深更易于估算。如下图所示,DP 画面间的视差几不可见,而双摄像头画面间的视差就十分明显。

左图:DP 画面,右图:双摄像头画面,DP 画面在背景中只有微小的垂直视差,而双摄像头画面则有更明显的水平视差。虽然明显的水平方向视差更容易估算出背景中的景深,但人物右侧的部分像素仅在主摄像头画面中清晰可见,因此很难估算这片区域的景深


即使使用双摄像头,DP 收集到的信息也很有用。在不借助另一个画面中对应像素的情况下,基线长度越长,单个画面中清晰可见的像素就越多。例如,主摄像头图像中紧靠人物右侧的背景像素在副摄像头图像中没有对应像素。因此,如果仅使用双摄像头,则无法通过测量像素的视差来估算景深。然而,这些像素在 DP 画面中仍然可见,由此可以更好地估算这些区域的深度。


另一个同时使用这两种输入的原因是光圈问题,此问题在之前的文章已有介绍,即如果立体基线也指向垂直方向(或者都指向水平方向),则很难估算垂直线条的景深。在 Pixel 4 上, DP 和双摄像头的基线彼此垂直,因此我们可以估算出任意方向线条的景深。


凭借此补充信息,我们可以估算出此远距离物体的景深,并能降低所有场景的深度误差。



双摄像头和 DP 的景深

去年,我们展示了如何使用机器学习估算 DP 的景深。在 Pixel 4 的人像模式中,我们使用 TensorFlow 训练卷积神经网络,从而将此方法拓展到估算 DP 和双摄像头的景深。卷积神经网络首先使用两个不同的编码器(神经网络的一种,可以将输入数据编码成中间表征)单独处理 DP 和双摄像头输入。然后,一个单独的解码器使用二者的中间表征计算景深。

预测 DP 和双摄像头景深的网络。此网络使用两个编码器(一个用于输入)及一个拥有Skip ConnectionsResidual Blocks 的共享解码器。


为了强制模型使用两个输入,我们采用了一种归零 (Drop-out) 技术,在训练过程中将其中一个输入随机设定为零,教会模型在在其中一个输入不可用时仍然可以正常运行,这种情况有可能发生,例如被摄主体距副长焦镜头太近而导致无法对焦。

我们的网络在只有一个输入可用或两个输入都可用的情况下生成的景深图。上图:两个输入提供不同方向线条的深度信息。下图:DP 在只有一个摄像头可见的区域具有更好的深度,用方框标出。双摄像头在背景和地面中具有更好的深度(照片来源:Mike Milne)


上图的提灯图像展示了如何利用两种信号解决光圈问题。拥有一个输入只能准确预测单一方向线条的景深(就像水平之于 DP ,垂直之于双摄像头)。而拥有两种信号,我们就可以在所有方向上再现线条的景深。


在人物图像中,DP 在手臂和躯干之间的遮挡区域提供了更好的景深信息;而对于背景和地面,基线距离更大的双摄像头则能发挥更好的作用。这种区别在 DP 景深画面的左上角和右下角中体现得尤为明显。您可以在此处找到更多示例。



媲美单反的背景虚化

浅景深图像的模糊背景或背景虚化让很多摄影师为之痴迷。在优质的单反背景虚化画面中,最引人注意的一点便是,散焦状态下,背景中面积较小的高光区域会出现明亮的光斑,这是由于散焦会将光线从高光区域发散开来。然而,原有的高光区域太亮,以至于光线发散成光斑后,亮度也仍在单反色调范围的明亮区域内。

左图单反产生的高对比度虚化光斑。中图很难在旧版人像模式的模糊背景中获得清晰的光斑。右图新版人像模式的背景虚化效果与单反相近


为了重现这种背景虚化效果,我们将原图中的像素逐一替换成大小会随景深变化而变化的半透明光斑。在过去,这种模糊处理通常会在色调映射(即将原始传感器数据转换为可在手机屏幕上查看的图像)之后进行。色调映射会压缩数据的动态范围,使阴影区域相较于高光区域变得更加明亮。不幸的是,这种处理也会导致场景中物体实际亮度信息的丢失,从而使我们很难获得高对比度的背景虚化光斑,结果造成背景虚化的光斑和背景混杂在一起,没有单反那么自然。


此问题的解决方案是先对由 HDR+ 生成的、合并后的原始图像作模糊处理,然后再进行色调映射。这样一来,背景虚化的光斑更加明亮,效果也更加明显,同时前景和背景的画面饱和度也能保持一致。这里有一份展示更好模糊效果的相册,此功能现已支持 Pixel 4 和 Pixel 3 及 3a 的后置摄像头(需要将 Google Camera 应用升级到 7.2 版本)。

在色调映射前作模糊处理可以提高背景的饱和度,还能提升光斑的对比度,从而使背景更加美观



亲自体验

我们通过提高景深质量,进而减少最终图像的误差,以及优化背景模糊的观感,让 Pixel 4 有了更好的人像模式。不过仅当摄像头与被摄主体的距离(副长焦摄像头的最小对焦距离)大于或等于 20 厘米时,才能获得出色双摄像头和 DP 景深效果。因此为了获得更好的人像拍摄效果,请让手机与被摄主体之间的距离大于或等于 20 厘米。



致谢

此项研究的顺利完成离不开 Rahul Garg、Sergio Orts Escolano、Sean Fanello、Christian Haene、Shahram Izadi、David Jacobs、Alexander Schiffhauer、 Yael Pritch Knaan 和 Marc Levoy 的帮助。此外,我们还要感谢 Google Camera 团队帮忙将这些算法集成到 Pixel 4 中。特别感谢我们的摄影师 Mike Milne、Andy Radin、Alain Saal-Dalma 和 Alvin Li,他们拍摄了大量测试照片。



如果您想详细了解 TensorFlow 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:

  • 人像模式
    https://ai.googleblog.com/2017/10/portrait-mode-on-pixel-2-and-pixel-2-xl.html

  • 机器学习估算 / 文章介绍 去年
    https://ai.googleblog.com/2018/11/learning-to-predict-depth-on-pixel-3.html

  • TensorFlow
    https://tensorflow.google.cn

  • Skip Connections
    https://arxiv.org/abs/1505.04597

  • Residual Blocks
    https://arxiv.org/abs/1512.03385

  • 此处
    https://photos.app.goo.gl/JM7HLRx8LpwHvXnh6

  • HDR+
    https://ai.googleblog.com/2018/02/introducing-hdr-burst-photography.html

  • 相册
    https://photos.app.goo.gl/cwaKemRDusTK5W6SA



更多 AI 相关阅读:



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53226
 
500 次点击