歡迎關注“創事記”的微信訂閱號:sinachuangshiji 

來源:量子位(ID:QbitAI)

文/蕭簫 發自 凹非寺

景色很好看,可是手機相機分辨率太低,照不出清晰的照片?

沒關係,試試這個超分辨率算法,讓AI“自動”幫你調整分辨率。

經過算法調整後,照片幾乎立刻就清晰了數倍,連角落裏模糊的文字都看得清:

這是來自谷歌的一個手機超分辨率算法,此前登上過SIGGRAPH 2019頂會,闡述的是自家手機Pixel 3中使用的超分技術。

現在,這個算法確實被複現了出來,然而,方法卻與論文不全一致(復現的作者Michael Kunz認爲,論文有些地方寫錯了)。

來看看這是怎麼回事。

多幀合一幀,效果更清晰

論文中,這個用手機實現超分辨率的原理,是這樣的:

在用手機拍照的過程中,手部會出現輕微的震顫。

這導致在連續拍攝同一景象的過程中,每張照片都會有一個微小的偏移量,這些小偏移量,恰好能提供超分辨率所需要的亞像素信息。

然後,將這些彼此之間略有差異的圖像幀,進行對齊、融合,就可以得到一張每個像素位置都有紅、綠、藍三通道值的圖像。

具體算法是這樣的:

首先,獲取多幀RAW圖像;然後,選擇其中一幀作爲基準幀,其餘圖像進行局部對齊,並通過核迴歸,估計每一幀對結果的局部貢獻度;最後,分成RGB三種顏色通道,將貢獻進行疊加。

在訓練過程中,圖像的局部特徵會對核形狀進行調整,並對採樣值進行加權。

最後,對每個顏色通道進行歸一化,獲得最後的RGB圖像。

整體來說,就是用多幀融合算法,代替了去馬賽克的傳統超分辨率算法。

然而,聽起來非常完美的算法,有人在復現的過程中,卻發現了一些問題。

實際復現並不容易

項目的作者表示,在復現這篇論文的過程中,發現了一些bug,但目前論文原作者、發行方都還沒回應他。

再來看看這個算法:

首先,在圖像幀的獲取上,如果採用谷歌相機的單反模式進行拍攝,由於時間間隔較長,手部產生的“震顫”可能比想象得大,需要再通過全局的預對齊來彌補缺陷。

然後,主要的問題出在b、c兩個步驟上。

第一個不準確的問題,是具體採用的幀數。論文表明“通過分析每個幀的局部梯度結構張量,來計算核的協方差矩陣”,然而作者發現,對每一幀都這樣操作其實毫無意義。

作者放棄了像論文所述那樣進行採樣,選擇了5×5而非3×3的核,並對梯度進行了高斯平滑,在全分辨率下計算每個像素的結構張量。

此外,則是步驟d的情況,經過長時間曝光的圖像,包含許多低頻噪聲,使得精確跟蹤無法實現。因此,作者在跟蹤步驟前面還加入了一個高通濾波器。

然而,論文卻完全沒有提到“高通濾波器”這種東西。

到了步驟e和f,谷歌論文的作者用了一個專業術語“Wiener shrinkage” ,但這個術語在引用論文中完全沒有出現,無法得知具體含義。

因此,復現的作者,只能根據自己的猜測,結合引用的論文來複現。

其他還有一些細節上的錯誤,例如把公式搞錯了的情況也有發生:

好在,最後他還是將這篇論文復現了出來:

而且做成了一個完整的項目,來看看具體效果。

具體效果

先來看看論文中所展示的效果,看上去還是非常不錯的:

不僅噪點去除了不少,邊緣也很平滑,沒有放大後物體輪廓凸顯的棱角。

而且,看起來也比其他的論文算法要更好:

那麼,實際上覆現出來的效果如何呢?

整體好像不太看得出效果,放大一點試試:

單棟大樓的窗子確實清晰了不少,原本是模糊一片,現在幾乎能數得出數量了。

不過,相比於論文中的效果,復現出來的實際結果,似乎並沒有那麼“完美”。

但用來拍攝風景,效果還挺好:

拍照如果手抖的話,可以將它裝到手機裏試一試了~

項目地址:

https://github.com/kunzmi/ImageStackAlignator

論文地址:

https://dl.acm.org/doi/10.1145/3306346.3323024

相關文章