全景照片不怕歪!Facebook 用神經網路矯正扭曲的地平線
沉浸感按:最近微博上的全景照片很火呀,相比各位都已經在自己的iPhone或者iPad上品鑒了多家IT公司的辦公室、遊玩了多個旅遊勝地、享受了被小貓小狗環繞的感覺了。太平洋那頭的Facebook也沒閑著,從去年上線類似的功能以後,全世界 Facebook 用戶們已經上傳了七千萬張全景照片了。
Facebook 支持多種全景照片和全景視頻的拍攝方式,可以讓人們把自己的全方位感受分享給好朋友們。如果用戶有一個專門的全景攝像機,比如理光Theta S或者Giroptic iO,還可以直接把相機里的照片發布到Facebook上去。如今,多數高端安卓和iOS智能手機的內置相機也都有了全景模式,可以用來拍全景照片。
Facebook 在過去的一年中開發並上線了多種技術給用戶提供更好的全景照片創建和分享體驗,包括全景拍照、全景視頻防抖,以及重新設計如何存儲高解析度媒體。最近,Facebook 還用到了深度神經網路來自動矯正全景照片的方向,可以給手機拍攝的照片直接帶來更真實的包圍感。
創建高解析度全景照片
最近 Facebook 剛剛在 Facebook app中上線了一個新功能,用戶可以在一個新的、能夠無限滑動的界面里拍攝完整的360度全景照片。
由於全景照片會比一般的照片大很多,
Facebook 首先需要解決的難題就是保證信息流里出現了一張全景照片的時候也能讓用戶流暢地在界面中拖拉滑動;同時,當用戶停止滑動,移動手機或者轉動手機看這張全景照片的時候,也能立即把全解析度的照片載入出來。
在屏幕立即上呈現全解析度的照片或佔用很多內存,所以當用戶繼續滑動頁面往下看的時候,又會給載入新的內容帶來延遲。面對著這些挑戰,
Facebook 的工程師們重新設計了 Facebook 的底層照片處理機制,便於存儲信息流中「拼貼」的照片以及呈現照片內容。
每張全景照片都會被轉換為一張立方映射圖,Facebook 之前也有類似的方法用在全景視頻中。然後這些立方映射圖會以多種不同的解析度存儲下來,而且每一個解析度的版本都會分割為許多張小的 512x512 解析度的圖像。
當用戶在信息流里刷到一張全景照片的時候,程序就會計算當前窗口渲染時需要哪種解析度、以及用哪些小圖像來拼貼成大圖。如果當前需要的解析度不可用,程序就會暫時渲染一個低解析度的樣子,同時等待網路把高解析度的內容傳過來。
當用戶進入全景照片移動手機和在屏幕上縮放觀看的時候,程序會不停地做這樣的全套計算。這樣,原來的用戶體驗上不會有什麼可感知的變化,卻實現了千萬甚至上億像素的高解析度全景圖像顯示。
用於全景照片的深度神經網路
用戶公開上傳到 Facebook 的上千萬張全景照片形成了一個強有力的新數據集,Facebook 的研發人員們也就可以利用這個數據集改善自家的產品。這些數據可以和機器學習的方法聯合起來,給用戶帶來更好的使用體驗。
讓人覺得全景照片不夠真實的最常見的原因之一就是拍照的時候相機沒有端平,然後最終的照片中也沒有修復過來這些傾斜。比如下面就是照片傾斜的例子,拍照的時候相機拿歪了。呈現在照片里的地平線是傾斜的,完全破壞了照片的真實感。
對於傳統的照片,用照片編輯軟體修正這種傾斜是一件簡單直接的事情,但是能夠用於全景照片的這類工具並不多,而且修正球面上的傾斜旋轉相當不直觀。在拍攝全景照片的過程中,相機的旋轉可以用 x 軸旋轉(tilt)和 z 軸旋轉(roll)兩個參數來描述,如下方示意圖所示。第三個方向的旋轉,y 軸旋轉(yaw),影響的是全景照片的起始點,但是這個方向上的旋轉是不會造成照片內容的傾斜的。
Facebook 的研發人員們就想開發出一種能夠自動修正這些相機的旋轉帶來的照片傾斜旋轉問題的方法。
為了解決這個問題,Facebook 的研究人員們使用了著名的深度神經網路架構 AlexNet,並對它做了一些相應的修改。用於網路訓練的數據就是像前文中那樣的照片,它包含了360x180度的完整球面環境,然後用等距離長方圓柱(equirectangular)投影轉換為了一張矩形的照片。
Facebook 的研究人員們首先假設這個問題的幾何本質不需要顏色信息的參與,這樣訓練數據就可以簡化為256x128解析度的黑白照片。AlexNet 本來的設計是為了解決超過1000個類別的圖像分類問題的,所以它最終的全連接層就有4096個輸入和1000個輸出。在 Facebook 的這個問題中,他們要解決的是一個回歸問題,所以他們修改後的網路中,全連接層變成了4096個輸入和 x 軸旋轉、z 軸旋轉兩個值的連續值輸出。
Facebook 的研究人員們用帶有 x 軸和 z 軸旋轉標籤的圖像訓練了這個網路模型。訓練數據集中包含了五十萬張投影轉換過的矩形照片,這些照片是研究人員們挑出來,總體沒有旋轉、傾斜的;換句話說,這些照片的 x 軸和 z 軸旋轉全部都是0。
在訓練過程中,研究人員們人工地用隨機生成的 x 軸和 z 軸旋轉值對訓練樣本做旋轉。如下的這個損失函數就會測量出這些隨機生成的標籤和網路模型預測結果之間的差值,並把減小這個差值作為網路的訓練目標。
為了測試訓練效果,研究人員們用一組給定的 x 軸和 z 軸旋轉值對測試集中的圖像做合成旋轉。然後他們用訓練過的網路模型分析這些旋轉過的圖像並記錄模型給出的結果。
這些已知的旋轉值和模型給出的結果之間的差別可以歸結為兩個原因,1,模型沒能完全解決這個旋轉問題;2,所用的數據集還有一些問題,影響了模型的表現。這第二個原因也是真實存在的,Facebook 的研究人員們假定了選用的數據集總體是平直的,但是單獨看其中的某個樣本都還是有一些固有的旋轉的。
所以,研究人員們用 [-4,-2,0,2,4] 度幾種 x 軸和 z 軸旋轉值中的所有組合在每一張照片都做了一遍,這就是用模型對每一張照片都過25遍。對於每一次所用的 x 軸和 z 軸旋轉值,他們都會計算對應的旋轉量。表示這種旋轉量的最好的方法就是用3D圖像中的一個常用工具:四元數(quaternion)。然後,模型會根據圖像計算出另一個四元數旋轉量。如果模型和數據中都不存在剛才提到的兩個問題,那麼這兩個四元數就應當是相等的。實際中其實並不相等,所以在每一次計算中,他們都會把兩個四元數相除,計算兩者間的差值。最後,用以下公式算出每張圖像在所有組合的下的差值的平均值。
以上公式中的計算都使用了四元數,因為它們用於計算差值和3D旋轉的均值時非常好用。但是,這樣就需要給每張圖片計算新的 x 軸和 z 軸旋轉值,因為數據集中的圖像一開始的時候並不是完全平直的。這種平均差值就是對每張訓練圖像的真實方向的很好的預測。那麼,研究人員們接下來簡單地把四元數格式的平均差值轉換為 x、y、z 軸旋轉就可以更新圖像的標籤了。
在圖像標籤更新以後,就可以對模型做新一輪訓練。模型一共經歷了四輪訓練和微調。在微調過程的最後,模型對全景照片算出的旋轉值誤差達到了0.1度的水平。
每個階段的訓練都是從一個未經初始化的模型開始的,可以從下圖明顯地看到每個階段中模型都收斂到了更小的訓練損失。在另一項對抗測試中,模型也表現出了類似的收斂和誤差值水平。模型的收斂表現足以讓研究人員們得出結論:這樣的「訓練 - 微調」循環確實讓模型學到了理想的旋轉方程。
如下是一些經過旋轉的全景照片結果,而且都是訓練集之外的照片。從幾組圖片中可以看到,模型對於不同的內容類別都有出色的表現,不論有建築這樣的人造景觀還是完全的自然風光。
結論
Facebook 的照片、視頻、直播產品中都已經可以使用全景媒體。在這個過程中,具有沉浸感的內容也會帶來一些特有的問題。這篇文章僅僅介紹了 Facebook 的研究人員們解決的問題里的幾個。隨著用戶往 Facebook 上傳這樣的具有沉浸感的內容的速度越來越快,Facebook 也對研究的前景充滿期待,他們相信類似這樣的技術可以讓用戶用新的方式感受不同的地點和事件。
via Facebook Blog
※HTC 考慮賣掉 Vive,VR真的這麼不景氣?
※大家都看好的VR+教育又迎來新玩家,大微VR發布K12VR教育產品
※專利文件曝光,等待三年的Magic Leap的AR眼鏡原來長這樣?
※照片/視頻/直播都弱爆了!Owlii要以實時全息傳送改變社交
TAG:沉浸感 |