我只買得起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取導得到的數值進行積分,就能獲得最終的虛化效果,總體計算複雜度大大減小。當然還可以通過降低分辨率下采樣的方式來實現加速,當然前提就是最終效果會差一點,但結合情況合理應用也是很正常的。

回到一開始提到的簡化邏輯:人像蒙版+全像素雙核景深虛化,邏輯上很簡單的東西為了儘量貼近真實,其複雜度遠遠高出大多數人的想象,但算法的優勢在於尤其是有大公司、獨立團隊的持續支持的情況下,效果會越來越好,而且這個發展速度會相當快。但同時也呈現了一個問題,個人想要通過純光學的拍攝,或針對已輸出圖像進行後期景深調整的空間都非常小,而且很容易給人不自然的感覺。

有時間再來聊聊改善虛化效果的技巧,這周依然很忙,有時間再說吧。


分享到:


相關文章: