全景照片不怕歪,Facebook 用神經網路矯正扭曲的地平線

作者 | 發布日期 2017 年 09 月 05 日 8:30 | 分類 app , Facebook , 社群 follow us in feedly

社群上的全景照片一向很紅,相信大家都欣賞了多家 IT 公司的辦公室、去了數個旅遊勝地、享受被小貓小狗自動換行的感覺了。太平洋那頭的 Facebook 也沒閒著,從去年上線類似功能以後,全世界 Facebook 用戶已上傳 7 千萬張全景照片了。



Facebook 支援多種全景照片和全景影片的拍攝方式,可讓人們把自己的全方位感受分享給好朋友。如果用戶有一台全景攝影機,比如理光 Theta S 或 Giroptic iO,還可以直接把相機照片發到 Facebook。如今,多數高階 Android 和 iOS 智慧手機內建相機也有了全景模式,可用來拍全景照片。

Facebook 過去一年開發並上線多種技術,提供更好的全景照片建立和分享體驗,包括全景拍照、全景影片防抖,以及重新設計如何儲存高解析度媒體。最近,Facebook 還用了深度神經網路來自動矯正全景照片的方向,讓手機拍攝的照片有更真實的包圍感。以下文章為讀者編譯 Facebook 如何做到的說明。

建立高解析度全景照片

最近 Facebook 剛剛在 Facebook App 上線一個新功能,用戶可在一個新的、能無限滑動的介面拍攝完整的 360 度全景照片。

由於全景照片會比一般照片大很多,Facebook 首先要解決的難題就是保證資訊流裡出現一張全景照片時,讓用戶流暢地在介面中拖拉滑動;當用戶停止滑動,移動或轉動手機看這張全景照時,也能立即把全解析度照片跑出來。在螢幕立即呈現全解析度的照片會使用很多記憶體,當用戶繼續滑動頁面往下看時,又會加載新內容造成延遲。

面對這些挑戰,Facebook 的工程師重新設計了 Facebook 的底層照片處理機制,便於儲存資訊流中「拼貼」照片及呈現照片內容。

每張全景照片都會轉為一張立方對映圖,Facebook 之前也有類似的方法用在全景影片。然後這些立方對映圖會以多種不同的解析度儲存,每個解析度版本都會分割為許多張小的 512×512 解析度影像。

當用戶在資訊流裡刷到一張全景照片時,程式就會計算目前視窗渲染時需要哪種解析度、用哪些小影像拼貼成大圖。如果目前需要的解析度不可用,程式就會暫時渲染一個低解析度的樣子,同時等待網路把高解析度的內容傳過來。當用戶進入全景照片行動手機和在螢幕上縮放觀看時,程式會不停做這樣的全套計算。這樣原來的用戶體驗不會有什麼可感知的變化,卻實現了千萬甚至上億畫素的高解析度全景影像顯示。

用於全景照片的深度神經網路

用戶公開上傳到 Facebook 的上千萬張全景照片形成一個強有力的新資料集,Facebook 研發人員就可以利用這個資料集改善產品。這些資料可和機器學習聯合,帶來更好的使用體驗。

讓人覺得全景照片不夠真實的最常見原因之一就是拍照時相機沒有持平,最終照片也沒有修復傾斜。比如下面就是照片傾斜的例子,拍照的時候相機拿歪了。照片裡的地平線是斜的,完全破壞了真實感。

對傳統照片,用編輯軟體修正這種傾斜是一件簡單直接的事,但是能用於全景照片的這類工具並不多,且修正球面上的傾斜旋轉相當不直覺。在拍攝全景照片的過程中,相機的旋轉可用 x 軸旋轉(tilt)和 z 軸旋轉(roll)兩個參數來說明,如下方示意圖所示。第三個方向的旋轉,y 軸旋轉(yaw),影響的是全景照片的起始點,但是這個方向的旋轉不會造成照片內容傾斜。Facebook 研發人員想開發出一種能自動修正相機旋轉所帶來照片傾斜旋轉問題的方法。

Facebook 研究人員使用了著名的深度神經網路架構 AlexNet,並對它做了一些修改。用於網路訓練的資料就是前文那樣的照片,包含了360×180度的完整球面環境,然後用等距離長方圓柱(equirectangular)投影轉換為一張矩形照片。Facebook 研究人員首先假設這個問題的幾何本質不需要色彩資訊參與,這樣訓練資料就可以簡化為 256×128 解析度的黑白照片。AlexNet 本來的設計是為了解決超過 1 千個類別的影像分類問題,所以最終的全連線層就有 4,096 個匯入和 1,000 個匯出。在 Facebook 這個問題,他們要解決的是回歸,所以他們修改後的網路,全連線層變成 4,096 個匯入和 x 軸旋轉、z 軸旋轉兩個值的連續值匯出。

Facebook 研究人員用帶有 x 軸和 z 軸旋轉標籤的影像訓練這個網路模型。訓練資料集包含 50 萬張投影轉換過的矩形照片,這些照片是研究人員挑出來,總體沒有旋轉、傾斜的;換句話說,這些照片的 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 也對研究前景充滿期待。他們相信類似這樣的技術,可讓用戶以新方式感受不同的地點和事件。

(本文由 雷鋒網 授權轉載;首圖來源:pixabay

延伸閱讀: