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