我只买得起iPhone XR:浅说单摄虚化的实现原理

新iPhone发布了,价格让一众安卓小弟松了一口气,苹果这是放高利润空间上限,鼓励并刺激智能手机市场勇攀价格高峰的意思啊……从产品端来说,高利润确实是高素质产品的研发源动力之一,但毕竟我很穷,看了半天我似乎也只能升级iPhone XR,再次与多摄失之交臂。不过苹果一贯是最能刮起波浪的品牌,XR的单摄也支持算法虚化并模拟多级光圈,那么,它的算法是怎么实现的呢?

我只买得起iPhone XR:浅说单摄虚化的实现原理

我们知道单摄虚化的开端是谷歌Pixel,苹果的实现方法其实也是大同小异,从结论来看就是抠图算法来提取主体蒙版,再加上全像素双核传感器获取深度信息以便于进行自然的分层式离散计算,听起来容易做起来难,前几天有朋友邀请我回答“如何才能模拟虚化”,手机端的单摄方案或许就是一个很好的高阶案例。

第一步是抠图,因为单摄虚化的核心卖点是人像,得益于卷积网络算法的日益发达,可以通过对大量人像照片(包括单人、多人,各种造型、各种角度)神经网络学习的方式来实现自动化的人像抠图算法。基本方案是3级U-NET,这是一个很适合做图像学习的网络,浅层解决像素定位,深层解决像素分类,进而得到一个比较粗犷的人像主体蒙版。

为什么是粗犷的?因为神经网络学习需要耗费大量算力且对硬件资源要求较高,所以都是在降低输入分辨率的情况下进行学习的,比如4通道256 X 256,因此它能给出的是一个比较大致的范围,还需要进一步进行边缘滤波。在这里我们设Mc(x)为卷积网络给出的粗犷的主体蒙版,C(x)为置信图,有:

我只买得起iPhone XR:浅说单摄虚化的实现原理

KxK为图像增大比例,⊝为灰度形态腐蚀运算,再结合此图的RGB图像I(x),使用双边求解,就有过滤后的高精度人像蒙版图像Mf(x),为:

我只买得起iPhone XR:浅说单摄虚化的实现原理

I(x)减去1/2的原因在于全输出会导致高频区域出现斑块,降低输出并结合高斯模糊(BS)可以解决这个问题。这个算法的形状匹配IoU精确度很高,可以达到97.7%,所以实用性是很强的。

我只买得起iPhone XR:浅说单摄虚化的实现原理

但有了好的抠图效果只成功了一半(当然对前置摄像头来说就成功了很大一半了),因为我们知道景深是一个曲线,并不是一旦离开焦内,点光源就迅速扩散。它是有一个梯度的,而且还需要判断前景背景,焦平面位置等信息,才能更好地模拟虚化效果,因此需要引入深度信息,而单摄深度信息就来自全像素双核。

之前聊光场相机的时候提到过全像素双核能记录一定幅度的光场,在手机端它的基线仅仅只有1mm左右,而且它单个像素只有2个视角,因此无法提供完整的光场信息,但比起多摄方案来说,它是在间距极短的距离下提供了不同视野,而且曝光参数完全一致,也不会出现某一边被遮挡的问题,视差离散度也比较低(只有几个像素),但难点在于精确的视差离散计算需要到次像素级,会产生额外的噪声,需要额外的方法来补偿。

首先是利用高速连拍来多帧降噪,然后根据左右像素各自提供的图像来计算一致性,再使用空间线性函数调整视差值,进而校正镜头像差,接着就是把前面得到的人像蒙版套入并平滑此部分的视差,最后再用双向空间求值计算出比较精确的边缘信息,这个值就可以用来进行景深渲染了。其中有几个难点可以挑出来聊聊,首先是多帧。

多帧用于降噪我应该展开说过好几次了,这次就不复述了,多帧对于单摄虚化算法来说还有一个重要意义:高信噪比基础下更有利于计算视差,如下图:

我只买得起iPhone XR:浅说单摄虚化的实现原理

原图中单帧背景信噪比太低,无法复原视差信息,但通过多帧堆栈后,信噪比提升,有利于视差识别和后续的景深渲染。

第二个点是像差校正,即便是算法虚化,也是建立在光学基础之上,对于全像素双核而言,视差与虚化的原理及关系图 如下:

我只买得起iPhone XR:浅说单摄虚化的实现原理

如果是教科书式的薄透镜近轴区域,d与b之间就有一个换算因子α,也即d=αb,如果把对焦距离z,焦距f和景深D都纳入进来,就可以变换一下:

我只买得起iPhone XR:浅说单摄虚化的实现原理

但之所以强调是近轴光学,这是因为镜头像差的存在会导致d值在不同区域有不同变化,比如场曲和暗角:

我只买得起iPhone XR:浅说单摄虚化的实现原理

很明显,因为像差的存在,原始信息就无法提供正确的内容,因此需要进行提前校正,采用实验性的方法:固定对焦距离,移动测试标靶距离,取不同物距画面中心、一侧边缘和四角边缘的视差值并绘图,取其斜率Sz(x)与截距Iz(x),并设它们在图像中心点值为Sz(0)和Iz(0),有:

我只买得起iPhone XR:浅说单摄虚化的实现原理

在20个对焦距离进行测试,得到最终数据。

有了光学上的校正结果,第三就是算法虚化的具体设置,数字计算的好处就是幅度和程度可控,比如可以做到模拟超大光圈的同时,主体细节依然在景深之内,我们可以设这个视差值为d ϕ,而景深内的区域就是在焦点处视差值dfocus:[dfocus-d ϕ,dfocus+d ϕ]这个范围内,不像大光圈相机镜头那样不容易掌控,但限制它的就是算力,因此做好这方面的平衡很重要,有算式:

我只买得起iPhone XR:浅说单摄虚化的实现原理

k(z)就是控制虚化强度的函数,当对焦距离越远、视差值越小时,就增大k(z)值进行补偿,不过考虑到算力的因素,r(x)有最大值限制,一般是r(max)=30像素。

上面得出的是虚化模糊值,还需要把它赋值到图像上,大多数手机方案都会选择最简单的圆形虚化,这就涉及到了像素级的计算,逐个像素进行点扩散计算的开销非常大,因此还是需要简化设计。方案一是简化离散性,我们知道光学焦外光斑都是以光圈形态为准的一个点扩散连续分布,而算法虚化为了节省开销,就必须简化分布形式,将其变为非连续形式,并对y求导:

我只买得起iPhone XR:浅说单摄虚化的实现原理

这样一来,单像素点扩散计算就只需要求导后的正负值即可,比如w×h像素,点扩散就只需要在:

我只买得起iPhone XR:浅说单摄虚化的实现原理

之间取值,然后再与对y取导得到的数值进行积分,就能获得最终的虚化效果,总体计算复杂度大大减小。当然还可以通过降低分辨率下采样的方式来实现加速,当然前提就是最终效果会差一点,但结合情况合理应用也是很正常的。

回到一开始提到的简化逻辑:人像蒙版+全像素双核景深虚化,逻辑上很简单的东西为了尽量贴近真实,其复杂度远远高出大多数人的想象,但算法的优势在于尤其是有大公司、独立团队的持续支持的情况下,效果会越来越好,而且这个发展速度会相当快。但同时也呈现了一个问题,个人想要通过纯光学的拍摄,或针对已输出图像进行后期景深调整的空间都非常小,而且很容易给人不自然的感觉。

有时间再来聊聊改善虚化效果的技巧,这周依然很忙,有时间再说吧。


分享到:


相關文章: