這就是弄演算法層面解決演算法層面問題
關注前沿科技 量子位 今天
景色很好看,可是手機相機解析度太低,照不出清晰的**?
沒關係,試試這個超解析度演算法,讓ai「自動」幫你調整解析度。
經過演算法調整後,**幾乎立刻就清晰了數倍,連角落裡模糊的文字都看得清:
這是來自谷歌的乙個手機超解析度演算法,此前登上過siggraph 2019頂會,闡述的是自家手機pixel 3中使用的超分技術。
現在,這個演算法確實被復現了出來,然而,方法卻與**不全一致(復現的作者michael kunz認為,**有些地方寫錯了)。
來看看這是怎麼回事。
**中,這個用手機實現超解析度的原理,是這樣的:
在用手機拍照的過程中,手部會出現輕微的震顫。
△手抖示例
這導致在連續拍攝同一景象的過程中,每張**都會有乙個微小的偏移量,這些小偏移量,恰好能提供超解析度所需要的亞畫素資訊。
然後,將這些彼此之間略有差異的影象幀,進行對齊、融合,就可以得到一張每個畫素位置都有紅、綠、藍三通道值的影象。
具體演算法是這樣的:
首先,獲取多幀raw影象;然後,選擇其中一幀作為基準幀,其餘影象進行區域性對齊,並通過核回歸,估計每一幀對結果的區域性貢獻度;最後,分成rgb三種顏色通道,將貢獻進行疊加。
在訓練過程中,影象的區域性特徵會對核形狀進行調整,並對取樣值進行加權。
最後,對每個顏色通道進行歸一化,獲得最後的rgb影象。
整體來說,就是用多幀融合演算法,代替了去馬賽克的傳統超解析度演算法。
然而,聽起來非常完美的演算法,有人在復現的過程中,卻發現了一些問題。
專案的作者表示,在復現這篇**的過程中,發現了一些bug,但目前**原作者、發行方都還沒回應他。
再來看看這個演算法:
首先,在影象幀的獲取上,如果採用谷歌相機的單反模式進行拍攝,由於時間間隔較長,手部產生的「震顫」可能比想象得大,需要再通過全域性的預對齊來彌補缺陷。
然後,主要的問題出在b、c兩個步驟上。
第乙個不準確的問題,是具體採用的幀數。**表明「通過分析每個幀的區域性梯度結構張量,來計算核的協方差矩陣」,然而作者發現,對每一幀都這樣操作其實毫無意義。
作者放棄了像**所述那樣進行取樣,選擇了5×5而非3×3的核,並對梯度進行了高斯平滑,在全解析度下計算每個畫素的結構張量。
此外,則是步驟d的情況,經過長時間**的影象,包含許多低頻雜訊,使得精確跟蹤無法實現。因此,作者在跟蹤步驟前面還加入了乙個高通濾波器。
然而,**卻完全沒有提到「高通濾波器」這種東西。
到了步驟e和f,谷歌**的作者用了乙個專業術語「wiener shrinkage」 ,但這個術語在引用**中完全沒有出現,無法得知具體含義。
因此,復現的作者,只能根據自己的猜測,結合引用的**來復現。
其他還有一些細節上的錯誤,例如把公式搞錯了的情況也有發生:
好在,最後他還是將這篇**復現了出來:
而且做成了乙個完整的專案,來看看具體效果。
先來看看**中所展示的效果,看上去還是非常不錯的:
不僅噪點去除了不少,邊緣也很平滑,沒有放大後物體輪廓凸顯的稜角。
而且,看起來也比其他的**演算法要更好:
那麼,實際上覆現出來的效果如何呢?
整體好像不太看得出效果,放大一點試試:
單棟大樓的窗子確實清晰了不少,原本是模糊一片,現在幾乎能數得出數量了。
不過,相比於**中的效果,復現出來的實際結果,似乎並沒有那麼「完美」。
但用來拍攝風景,效果還挺好:
拍照如果手抖的話,可以將它裝到手機裡試一試了~
HashMap與衝突解決演算法
hash map是經常被使用的一種資料結構,而其實現方式也是多種多樣。如果要求我們使用盡可能簡單的方式實現hash map,具體該如何做呢?我們知道hash map最重要兩個概念是hash函式和衝突解決演算法。hash map鍵 值之間的對映關係,hash函式將鍵對映為記憶體位址,衝突解決演算法用於...
分治思想解決演算法問題
不多bb,o n 2 include using namespace std void solve int f 5000 int m cin m for int i 0 i m i cin a i f 0 0 for int i 1 i m i f i f i 1 sum cout f m 1 en...
約瑟夫環鏈表解決演算法
1.起源 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報...