立体视觉则属于一种被动光学测距方案,其最直接的体现,在消费电子产品中应该就是手机后置的双摄或者多摄了(可能是相对深度)。似乎鲜有媒体和机构分析当前主流的双摄方案,是如何实现3D成像的。采用双摄做3D成像,其实不是近些年才有的事,兴起在2011年的HTC EVO 3D(HTC G17),那个年代就开始相继有手机采用双摄来实现3D视觉了。
说是3D成像,实际其近代的应用更体现在“摄影辅助”方面,或者说computational photography(计算摄影)。最典型的应用,是手机利用双摄这种立体视觉方案,来模拟原本只有单反才能拍出来的背景虚化效果(或浅景深效果)。在移动成像领域,computational photography做的最为大张旗鼓的应该就是谷歌了。
单反可达成的背景虚化效果
而且谷歌也愿意分享在手机拍照方面的一些研究细节和成果,这些成果也反映在了其自家的Google Pixel系列手机上。华为和一众Android厂商如今喜欢鼓吹的手机拍照,很大程度上也都受惠于谷歌的computational photography研究。
我们期望通过这篇文章,以谷歌的背景虚化模拟应用为例,来管中窥豹地谈一谈,立体视觉这种方案究竟是怎么实现3D成像的,以及如今3D成像在手机摄影上面,已经发展成什么样了——尤其现在还很流行配合AI,又是怎么回事。作为对3D感知的某种补充,也能更好地理解,立体视觉,相比结构光、ToF这些主动光学测距方案,又有着怎样的优势和劣势。
照片的背景虚化是怎么模拟出来的?
有关背景虚化(或者浅景深)的基础光学知识,这里不再赘述。总之背景虚化是一种光学特性,一张照片如果要有足够“模糊”的背景,抛开焦距、物距不谈,则要求成像设备的光圈足够大,或者图像传感器足够大。这对手机这种小身材的设备来说是不现实的,从单纯的光学层面来说,手机很难拍出单反那样背景那么虚的照片。
而背景“虚化”程度很多时候是一张照片有没有质感、冲击力的关键。数字技术发展这么多年了,如今还有AI加持,靠物理不成,能不能靠算力来模拟单反的这种虚化效果呢?这其实就是如今手机摄影模拟背景虚化的基础。
如果手机有能力自己感知照片中不同对象的深度…来源:诺基亚
如果我们用手机拍一张照片,然后用Photoshop把照片中的主体部分给抠出来,并针对除主体外的背景做一个虚化效果,是不是就可以模拟出单反的这种光学特性了?简单理解的确是这样。但问题是,抠图是个费时费力的事情,而且固然人类可以用Photoshop抠图,但机器有这个能力吗?怎样让机器去自动抠图,这实质上就成为模拟背景虚化的最大难点。
这个时候有很多现成的方案可以考虑,典型的比如AI——现在的机器学习可以做到视觉对象的“语义分割”,即理解画面中拍的是什么:这是个人,那是座山,是不是就能抠图了呢?这是个好主意,但如今AI所能做的“切割”还没有那么准确,它顶多就是个辅助方案。那么结构光和ToF呢?它们都属于距离检测技术,甚至能够对整个场景做3D建模,根据拍摄场景中,不同物体的深度(depth)不就能知道画面里哪个物体在前,哪个物体在后,并应用虚化效果了吗?
结构光构建的深度数据,来源:苹果
这些的确也是可行的方案,而且现有的部分系统也的确是这么做的。典型的比如iPhone上的TrueDepth系统(可以理解为 Face ID,一种结构光系统),我们用近两代的iPhone前置摄像头来拍照,在拍完以后可以应用各种后期光效,其实现依靠的就是结构光能够检测人脸不同位置的深度,构建起人脸的3D模型,并应用不同的光效和后期。
但不难发现,用iPhone的结构光来“抠图”,自拍时头部边缘似乎破绽还挺大的,并不靠谱。这主要是因为结构光的深度检测距离十分有限,将这种方案应用到后置摄像头的人像模式,那几乎就是不可用的状态。
这时,ToF是不是更靠谱呢?当代ToF的确有辅助“抠图”的价值,但其分辨率精度堪忧;而且手机上的ToF模组虽然深度检测范围要远大于同样应用于手机的结构光,但就摄影来看也远远不够。这个时候立体视觉就成为一个明显更有优势的方案可被应用到手机拍照的背景虚化效果上——而且其应用也比较早,至少远比iPhone 7 Plus应用双摄来做背景虚化模拟更早。
那么双摄是怎么实现3D视觉,或者“抠图”的呢?这里不再详细解释其原理,但就直觉来看也十分直观:即人眼就有左右之分,两只眼睛的位置有差异,左右眼观察到的世界是有区别的,包括场景中物体的遮挡、前后关系等。两眼一起发挥作用,我们才能观察到立体的世界,并且判断场景中物体的前后关系。
来源:Improve a 3D distance measurement accuracy in stereo vision systems using optimization methods’ approach[2]
用一张图来概括立体视觉如何实现光学测距,或者3D感知,其方法如上,这就是典型的Triangulation(三角测量法)。
如果以更符合直觉的方式来描述这种方法,像人眼那样,则两颗摄像头看到场景中的对象前后关系有差异,亦可实现这种“抠图”,并针对画面中的不同位置、不同对象应用不同的模糊算法,达成以假乱真的、用手机就拍出单反背景虚化的效果。如下图所示:
iPhone 7 Plus人像模式模拟的背景虚化,与单反光学系统的背景虚化,来源:DxOMark[3]
立体视觉不一定是双摄
模拟背景虚化,是这种立体视觉方案针对摄影效果强化的一个典型应用。某些手机不依赖双摄也能实现这种人像模式的背景虚化,其中有一部分依靠的是AI,或者深度学习——这部分我们后面再谈。还有一类,比如谷歌Pixel 2/3这样并没有双摄的手机,人像模式的实现就相对比较奇葩。
Dual Pixel CMOS 图像传感器,来源:佳能
实际上谷歌Pixel 2这样的单摄手机,依靠的也是立体视觉,只不过并不是双摄,而是一种叫“dual pixel(双像素)”的技术。我们在早前的文章中曾经提到过[4][5], 现在的图像传感器,很多像素与其上微透镜的关系并不是一一对应的,这原本是为了实现PDAF相位对焦所做的一种设定。即相邻的两个像素(或者可能是同一个像素的两个子像素),利用它们“看到”的场景中同一个对象的视角小差异,这种很小的“相位差”其实也可以用来判断场景中不同对象的前后位置关系(或距离)。
看起来其原理和“双摄”非常类似,或者说它很像是把一个摄像头一分为二,每一半像素观察到的世界和另一半像素观察到的有微小差异[6]。只不过像素尺寸何其之小,如今单像素尺寸下探到了0.7μm,相邻像素能够“观察”到的“相位差”,相比双摄的视差小得多;尤其在拍摄一些距离手机摄像头比较远的对象时,双像素的视角差异会非常小(如下图1图右)。所以这种方法实现的“抠图”准确性,在很多情况下都远弱于双摄。
图1,谷歌Pixel的双像素带来的视角差异,来源:Google AI Blog
图2,双像素与双摄的视角差异对比,来源:Google AI Blog
在相同距离下,双摄观察到的视角差异就会显著很多,如图2。谷歌在去年推出的Pixel 4手机上已经开始应用双摄。目前谷歌人像模式的背景虚化模拟,已经开始结合双摄和双像素两种技术。
双像素(dual pixel)和双摄(dual camera)的结合实际上也有助于规避一些原有的问题,而且双方可以取长补短。比如说在图2展示的状况中,如果单纯采用双摄方案,紧贴着人物右侧的像素,实际上在两个摄像头之间,是很难找到对应关系的(因为两者有不同的遮挡关系),在算法上会有难度(对象边缘虚化失误的原因之一)。
一般来说,这里的baseline越远,则在某个摄像头中可见的更多像素,在另一个摄像头中就无法找到对应的像素。如此一来,仅通过双摄来计算这部分像素的深度,就会有相当大的难度。但因为同时有双像素和双摄方案在,对于这部分区域的像素深度,双像素方案就能提供分析参考。
另外单独应用以上的某一种技术,还面临一个叫做aperture problem的问题(应该可以翻译成遮罩问题,而非光圈问题)。如前所述,两颗摄像头(或两个像素)观察到的两个世界,在画面每一个点上需要有对应的像素关系,这样才有计算深度的依据,但在某些情况下,这种对应关系会非常难找。
来源:Google AI Blog
如果我们通过一个小光阑来观察场景,一旦立体视觉系统的基线(即两颗摄像头或双像素相连构成的直线),与画面中某个拍摄对象的线条平行,则无法再找到这一区域的像素对应关系[7]。比如说上图中人物背后的横条纹,通过双像素观察到的“视差”在这一区域几乎是不存在的——因为在此例中双像素也是横置的,与画面中的横向条纹平行。
Pixel 4实际上能够天然地解决这个问题,因为它结合了双摄和双像素两者。其中双摄的基线是横向的(两颗摄像头的摆位是左右关系,而非上下关系),而双像素的基线则是竖向的。那么针对场景中某一个方向的平行线条,就可规避这个所谓的aperture problem。
在Pixel 2时代,摄像头模拟背景虚化的aperture problem问题是比较大的,因为Pixel 2只是个单摄,在模拟背景虚化时只能采用双像素方案,遭遇这个问题也不足为奇。但到了Pixel 3时代,谷歌却已经很大程度能够规避这个问题了,可Pixel 3也没有双摄。所以这个问题是怎么解决的?
背景虚化的AI加强
针对这个问题的辅助解决方案还有不少,比如说分析画面,越远离焦平面的点就越虚;另外根据画面中对象所占像素的多少,也能够了对象离摄像头多远——这还是需要AI做语义理解的。
前文已经提到,AI是能够帮助实现视觉影像的语义分割的。或者说它能够识别出手机正在拍人,并且将人的轮廓大致地描摹出来。不过单纯的对象识别并没有PS抠图那样的准确性。所以谷歌对此专门训练了一个卷积神经网络,当然是用TensorFlow写的。这个网络就用于预测深度。Pixel 3的人像模式即开始利用这种AI技术。
具体到训练这个网络,所需的是大量的PDAF图像(所谓的PDAF图像,即是指图1那样的双像素获得的不同视角的两张照片),及对应的“高质量”深度图(depth map)。谷歌是亲自上阵拍了一大堆PDAF照片,以及生成的深度图,如下图所示:
来源:Google AI Blog
谷歌当时手动打造了一台“五摄”装备(上图左),实际上就是把五台Pixel 3按照摄像头上下左右中(可规避aperture problem),以及相隔一定距离(baseline)的方式固定在一起。与此同时开发一个基于WiFi的同步系统,让五台手机能够几乎同时按下快门拍照。这样一来就能生成比较准确的深度图了(上图最右)。
那么在拍摄很多场景的情况下,就有足够的训练数据了。获得的并非绝对深度,而是场景对象的相对深度,起码在应对人像模式时是有价值的。这种方案部分解决了单摄的aperture problem。
不过从谷歌的AI Blog来看,Pixel 4在人像模式的机器学习技术上又与过去不大一样。因为这次又多了双摄这个资源。所以谷歌又利用Tensorflow训练了一个卷积神经网络。这次的网络首先分别单独处理双像素(dual pixel)和双摄(dual camera)的输入数据。分别有两个不同的编码器——编码器本身就是一种神经网络,将输入信息编码为IR(intermediate representation);然后再经过一个解码器,完成最终的深度计算。
来源:Google AI Blog
如此,我们就大致说清楚了当代手机实现背景虚化的基本方案:当然不同OEM厂商在实施方案上还是会有差别,但谷歌应该是在手机的computational photography技术上走得相对激进的一个。至于具体的效果怎么样,那就是另外一个问题了。
除此之外,在更具体的背景虚化模拟上,仍有一些细节可以谈。比如在最新的Pixel 4之上,谷歌开始进一步考虑背景中弥散圆的真实性问题:因为以前的背景模糊流程是放在tone mapping之后的(tone mapping就是照片不同亮度区间的像素,应用相应的曲线,包括让暗部更亮、压缩动态范围之类的操作),这会导致场景中明亮对象信息损失,也就很难出现漂亮的高对比度弥散圆。谷歌的解决方案是,先对HDR+融合的原始图像做模糊处理,然后再应用tone mapping,这样背景虚化看起来会更自然,如下图。
将模糊放到tone mapping步骤之前,能够营造看起来更真实的浅景深效果,来源:Google AI Blog
这篇文章我们只谈到了手机拍照中背景虚化的一个点,实际上计算摄影方案还体现在手机拍照的方方面面,比如自动白平衡,谷歌也应用了机器学习技术;视频拍摄的防抖补偿方案也有类似的实现。谷歌与华为这类厂商的明确差别即在于,后者更倾向于利用光学、成像相关硬件来提升手机拍照能力,而前者则主要倚仗数据处理能力出众——这也是符合谷歌自身定位的发展方向。
谷歌在Pixel 2中已经加入了一个名为Visual Core的专用芯片。这颗芯片是专门用于手机拍照的影像处理的。它本质上是一系列SiP图像处理器,全可编程的图像、视觉、AI多核专用架构(在Pixel 4之上已经升级为Pixel Neural Core)。
谷歌似乎有这种针对一个具体的应用,做专用硬件的传统(典型如TPU)。谷歌宣称Pixel Visual Core在保证完整可编程性的同时,能效又远高于同期的高通骁龙835(7-16倍)。
来源:Wikipedia
这种硬件的核心是IPU(image processing unit),另外还有个Arm核用于调度。每一个IPU核心都包含一个STP(stencil processor)、LBP(line buffer pool)和NoC(Network on a Chip)。STP处理器主要是2D SIMD处理单元PE阵列(具体应该是256个PE,16x16的2D阵列),执行定制的VLIW ISA;每个PE都有2个16位ALU,1个MAC乘法累加单元。看起来其实和脉动阵列(systolic array,TPU的实现)很像,只不过STP另外还有软件控制数据流。[8]
这部分实际上是题外话了,Pixel 3a作为一款定位中端的机型就不带Visual Core,但仍然支持谷歌在影像处理上的几乎所有功能。这表明Visual Core单纯就是硬件加速,不存在什么独有技术。不过看起来,谷歌在computational photography方面,还是有相当发展意图的,或者对其AI技术来说,本身就是重要积累。而谷歌在这方面的着力,其实也并不难发现,Pixel手机的拍照发展方向,并不同于华为、苹果这些手机拍照重在用户体验,而更着眼于技术实验。
Pixel 4的uDepth系统包含了两颗红外摄像头,不同于一般的3D感知系统,来源:Google AI Blog
到此,我们基本也可以说,相比ToF、结构光这些3D感知技术,立体视觉的算力要求明显更高,而且毕竟仍然是建立在常规成像技术之上的,它受限于拍摄场景,比如对于纹理不多的场景或者暗光场景,就会显得无能为力。
最后值得一提的是,Pixel 4在3D感知方面,另外还应用了所谓的uDepth深度感知系统以及Soli雷达。uDepth这个系统与传统的结构光并不一样(但又似乎有结构光的一些特性,谷歌官方文档中提到“采用主动立体设定,将红外图案投射到场景中,并被立体红外摄像头捕捉到”),它是个主动测距技术,所以包含了红外点阵投射器,但又有两颗红外摄像头(传统的ToF和结构光都不是这样)。
Pixel 4前置光学组件实现的3D照片,是前置RGB摄像头、uDepth系统与机器学习共同实现的效果,来源:Google AI Blog
谷歌在博客中提到,这是dense local stereo匹配技术家族中的一员,计算每个像素的视差[9]。这种技术估测其中一颗摄像头拍到的每个像素周围的区域,然后去找第二颗摄像头拍下的对应相似区域。后续似乎有一套比较独特的技术手法,来做红外双摄的匹配工作。这套方案在谷歌的应用中,有与前置摄像头配合实现真正的3D照片、模拟虚化功能,其中当然也有应用机器学习相关技术——这应该算是深度数据与RGB数据做配合的一个真正实例。
而Pixel 4的Soli短距离雷达传感器则利用微波做动作检测,已经脱离了光学测距范畴[10]。上面这两种技术已经超出本文探讨的范畴,未来我们或许会有机会再行深挖——尤其是uDepth,可能是谷歌着力的一个重点。但很显然,在一台设备上搭载多种3D感知技术也并不是什么新鲜事。
参考来源:
[1] 手机的3D感知能力——消费电子ToF技术与市场分析报告 - EE Times China
https://www.eet-china.com/news/2005012.html
[2] Improve a 3D distance measurement accuracy in stereo vision systems using optimization methods’ approach - Volume 25, Issue 1, May 2017, Pages 24-32, Opto-Electronics Review
https://doi.org/10.1016/j.opelre.2017.03.001
[3]Shoot-out: Apple iPhone 7 versus the Apple iPhone 7 Plus using our new test protocol - DxOMark
https://www.dxomark.com/shoot-apple-iphone-7-versus-apple-iphone-7-plus-using-new-test-protocols
[4] 小米1亿像素拍照手机是噱头吗?高像素技术探秘 - EE Times China
https://www.eet-china.com/news/201908150930.html
[5] 索尼为什么还不出1亿像素CIS?华为该着急了! - EE Times China
https://www.eet-china.com/news/202003131007.html
[6] Improvements to Portrait Mode on the Google Pixel 4 and Pixel 4 XL - Google AI Blog
https://ai.googleblog.com/2019/12/improvements-to-portrait-mode-on-google.html
[7] Learning to Predict Depth on the Pixel 3 Phones
https://ai.googleblog.com/2018/11/learning-to-predict-depth-on-pixel-3.html
[8] Pixel Visual Core - Wikipedia
https://en.wikipedia.org/wiki/Pixel_Visual_Core
[9] uDepth: Real-time 3D Depth Sensing on the Pixel 4
https://ai.googleblog.com/2020/04/udepth-real-time-3d-depth-sensing-on.html
[10] Soli Radar-Based Perception and Interaction in Pixel 4 - Google AI Blog
https://ai.googleblog.com/2020/03/soli-radar-based-perception-and.html
- 虚化的需求有这么大吗?浪费好多电。
- 特地注册了账号给你评论。