邊策 十三 發自 凹非寺
量子位 報導 | 公眾號 QbitAI
你在看電影,牆上的影子也在動。如果只讓你看到這樣一段視頻,你能猜出來屏幕上播放的是什麼嗎?
最近MIT人工智慧實驗室(CSAIL)開發出的算法可以做到:
而真實的視頻是這樣的:
算法還原的結果只是模糊了些,但已經能猜出視頻的大致內容了。
有了這套算法,就可以通過觀察視頻中陰影和幾何圖形之間的相互作用,預測出光在場景中的傳播方式,然後從觀察到的陰影中估計隱藏的視頻,甚至看出人的輪廓。
這種圖像重建算法會有許多用途:自動駕駛汽車可以了解拐角處正在發生的事情,監控攝像頭也可以發現在視線外的人。該論文已經被最近召開的NeurIPS 2019大會所收錄。
根據影子,還原看不見的死角
在下面這個場景中,人擺弄玩具的鏡頭被隱藏,在人們正常視野範圍內是無法看見的。
我們唯一能夠捕捉到的就是打在牆上的影子。
MIT的這項研究就是僅僅利用這些影子,重新還原隱藏視頻的原貌。
算法對場景中的光線傳輸做了預測。
下圖左側是通過算法估計出來的陰影,而右側則是實際場景中的陰影。
根據光線傳輸的預測和估計,就可以重建隱藏物體的運動情況。
例如在下圖中,隱藏在攝像頭視野之外的人,雙手不停的在做著運動。
而我們能夠觀察到的只是圖中左側單個物體中光影的變化。
就是利用這樣簡單的光影變化,便可以重構出如圖中右側的視頻。
與隱藏視頻相比,重構的視頻已經可以大致再現雙手運動的輪廓。
根據房間雜物亂七八糟的影子,同樣也可以還原下圖隱藏視頻中人物走動的大致輪廓。
當然還有這樣的。
以及這樣的。
總體來說,MIT的這次研究,能夠根據隱藏視頻中的內容將光線傳輸分離出來,從而對它做一個大致的估計。
原理
圖像的影子具有線性疊加的特性。如果依次點亮隱藏的屏幕上的兩個像素,並牆上的影子圖像求和,結果應該和一次同時點亮兩個像素時得到的圖像相同。
從數學上來看,無論是牆上的影子,還是屏幕上的畫面,都是矩陣。而符合線性疊加的特性,等於是在這兩個矩陣之間做線性變換。
我們不妨把這二者別看做兩個矩陣Z和L,經過空間傳輸,畫面L變成了影子Z,這就相當於做了一次矩陣乘法,T是空間傳輸矩陣。
Z=TL
問題是我們只看到了影子Z,對於T和L,我們一無所知。
這篇論文的第一作者Miika Aittala說:「這就像是我告訴你,我正在考慮兩個秘密數字,它們的乘積為80。你能猜出它們是什麼嗎?也許是40和2,或是371.8和0.2152。」
對於這個問題也是類似,而且我們在每個像素上都會有一樣的困擾。如何求出傳輸矩陣T成了問題的關鍵。
如果我們知道了光傳輸矩陣,那麼求原圖像L的操作就變成了最小化||Z-TL||2的最小二乘法問題。
作者通過DCT和PCA方法測量了T,然後通過求逆的方法恢復了原始圖像。
因此知道了T,接下來恢復圖像就好辦了。
但是這篇文章要挑戰更高的難度:如何在不知道T的情況下恢復圖像。他們使用了去年一篇Deep Image Prior論文中的新的矩陣分解方法。
這篇文章曾經被CVPR 2018收錄,在inpainting問題上收到了不錯的效果。
過去也有一些矩陣分解方法,但是分解得到的矩陣一般都是低秩的,與圖像差別很大,而且對初始值和優化的動力學都高度敏感,只能針對特定問題量身定製。
而作者使用的矩陣分解方法裡,CNN隨機初始化並「過擬合」,將兩個噪聲矢量映射到兩個矩陣T和L,使它們的乘積與輸入矩陣Z匹配。此過程將因式分解正則化為更接近於圖像的結構。
結合上面的思想
Deep Image Prior
作者首先描述了一種基線方法,在知道Z和L的情況下求T,其實就是求||Z-TL||2最小值的最小二乘法問題。
使用了Deep Image Prior的方法,作者提出了一種在無法測得的光傳輸矩陣時,逆向求原圖像的方法。逆向光傳輸矩陣的體系架構和數據流動如下圖所示:
其中左下角是存儲在U中的左奇異矢量的一個樣本。L和Q是兩個卷積神經網絡,其餘塊是多維張量或矩陣,其尺寸顯示在邊緣。
L和Q生成各自矩陣的卷積神經網絡中張量,然後在隨後的網絡操作中將結果重整為堆疊的矩陣表示形式,以便評估矩陣乘積。
傳輸矩陣T的分量可以表示為從輸入視頻的奇異值分解(SVD)獲得的基本圖像的線性組合。這樣做計算效率高,又通過限制迭代和位於有效分解子空間中的解來指導優化。
通過輸入Z預先計算的截斷奇異值分解UΣVT帶入到上面的網絡中,計算出T,再將計算的TL與Z對比求得損失。
因此問題的核心就變成了用CNN得出Q,使得(UQ)L≈Z。
代碼已開源
這麼好玩的技術,代碼當然開源啦~
GitHub連結如下:
https://github.com/prafull7/compmirrors
這份文檔中列出了「矩陣分解」和「光線傳輸分解」的實現方法。
安裝
gitclonehttps://github.com/prafull7/compmirrorscdcompmirrors
配置要求:Python 3.7,以及還需要torch=1.0.1.post2、matplotlib、scipy、visdom等包。
矩陣分解
這步的實現代碼在factorization_1d.py文件。可用如下代碼運行:
pythonfactorization_1d.py-T./data/inputs_1d/lightfield.png-L./data/inputs_1d/tracks_bg.png-o./outdir_1d
光線傳輸分解
一次性訓練實現代碼在factorization_light_transport.py文件。可用如下代碼運行:
exportFACTORIZE_DATA_DIR=/path/to/where/data/folders/exportFACTORIZE_OUT_DIR=/path/to/output/directorypythonfactorization_light_transport.py-d./data/light_transport/-fFOLDER_NAME-dsDATASET_NAME-sSEQUENCE_NAME-devDEVICE_NUMBER
依舊是「雞生蛋,還是蛋生雞」問題
雖然這項技術能夠重建被隱藏的內容,但是用戶還是需要提前知道被隱藏的東西是存在的。
用數學的角度來打個比方。
A和B相乘得80,讓你來猜A和B分別是哪兩個數字。
可能是40和2,也可能是371.8和0.2152。
在重建工作中,每個像素都會遇到這樣的問題——有多種選擇。
要讓計算機來做選擇,那它就會做最簡單的事情,得到的結果就是隨機的圖像。
因此需要規定的算法來做訓練。
在此之前,量子位也曾報導過,通過牆壁漫反射的光影,來重建原始畫面。
牆上的漫反射如下圖所示:
算法還原的圖像則是:
這個圖像還原實驗是,在房間中間隨手放置了一個不明位置的遮擋物體,可以是一塊不發光的板子,也可以是隨手拽過來的一把椅子,阻擋一部分光線到達牆壁。
而這次是完全根據牆上的影子來做圖像還原工作。
通過影子的變化可以大致了解房間裡隱蔽區域發生了哪些運動。
研究人員同時也對接下來的工作做了展望:
未來,希望能夠提高系統的總體解析度,並最終在不受控制的環境中測試該技術。
傳送門
博客:
https://news.mit.edu/2019/using-computers-view-unseen-computational-mirrors-mit-csail-1206
論文:
https://arxiv.org/pdf/1912.02314.pdf
代碼:
https://github.com/prafull7/compmirrors
數據:
http://compmirrors.csail.mit.edu/data/dots-sequence.tar