原標題:技術剖析谷歌ARCore:比蘋果ARKit還厲害?

編者按:本文來自微信公眾號「青亭網」(ID:qingtinwang),作者周凡,36氪經授權發布。

昨日,谷歌突然重磅發布了屬於安卓系統的AR SDK——ARCore,並號稱將要安裝到一億台安卓設備上,目前三星S8和谷歌自家的手機Pixel已經都獲得了支持。這一步,被普遍解讀為對蘋果六月份發布的ARKit的正面回應。

蘋果在移動端AR上來勢洶洶,ARKit一發布就刷了科技圈的屏,湧現出無數的開發者demo。相比之下,谷歌此前推出的需要TOF深度感測器使用的Tango平台,一下子似乎被拍死在了沙灘上,乏人問津。但如今,谷歌的ARCore不需要再仰仗TOF,而是和ARKit類似,直接使用手機的單目RGB攝像頭,加上內部的IMU就能實現AR。這讓不少人安卓開發者為之興奮。

可以想象,兩大移動網際網路領域的超巨頭在不遠的未來,基於手機端AR必有一戰。那麼,ARCore底層技術的實現原理為何?是否有谷歌說得那麼神?相比ARKit又有何異同和優劣勢?

技術剖析谷歌ARCore:比蘋果ARKit還厲害?

青亭網第一時間聯繫了專註於AR領域的源視感科技CEO周凡,他連夜閱讀了ARCore的代碼,並對谷歌放出的demo進行了逐幀分析。下面請看他帶來的第一手報告:

1

Apple的ARKit發布之後, 市場一片歡騰。經過一段時間的低潮后,對於AR的熱情再一次被點燃。就在蘋果沾沾自喜(我猜的)、安卓開發者表示強烈不滿時(也是我猜的),谷歌昨天發布了Tango之後的單目+IMU增強現實方案——ARCore。

目的很明確,連名字都很霸氣的相似——就是要懟ARKit去的。作為AR技術的先驅, 谷歌果然出手不凡,一次性在Github上放出三個SDK,涵蓋安卓原生、Unity3D和Unreal平台。雖然沒有像上次的SLAM方案Cartographer那樣直接開源,但是對應用開發者,無論是手機端,還是嵌入式設備都算非常的友好了,貌似要一統開發者天下。

2 解密三大核心功能

連夜讀了有限的代碼,可以看出ARCore的核心功能有三個:相機姿態估計, 環境感知及光源感知(Light Estimation)。由於資料有限,只能做一個大概的估計與分析。

技術剖析谷歌ARCore:比蘋果ARKit還厲害?

前兩個功能,研究SFM、SLAM的同學應該不陌生了—— 前者通過單目相機讀取圖像,通過特徵的匹配估計相機的運動軌跡。但是ARCore極有可能用的不是常見的特徵匹配法。這裡先賣個關子,下文再詳細分析運動軌跡的估計方法。

至於環境感知功能,名字起的很高大上,但具體實現的功能其實就是檢測平面。這樣做的好處就是在現實環境中放置虛擬物體的時候位置相對合理,不會出現類似物體懸空,或者在斜面上仍然處於水平的姿態。

第三個光源感知功能,按照谷歌官方的說法是,ARCore能感知現實世界的光源位置,使虛擬物體能夠形成相應方位的影子,從而增加虛擬物體在現實世界里的真實度。這個功能堪稱驚艷!從谷歌發布的Demo視頻里看, 虛擬物體的影子確實是根據光源形成了相對應方向的影子。

技術剖析谷歌ARCore:比蘋果ARKit還厲害?

但是分幀仔細分析視頻后, 發現該功能在強光源的狀態下效果才不錯,在散漫光源的情況下就一般般了。

個人估計:是因為使用的匹配演演算法的原因。這樣,我們就要回到剛才賣關子的ARCore第一個核心功能——姿態估計上,進行具體分析:

傳統的特徵匹配方法只計算關鍵點和描述,幾十萬像素的圖像只用了幾百個特徵點,屏蔽了大部分可能有用的信息,更別說對灰度的估計了。所以,ARCore很有可能是使用了直接法來做相機位姿估計(對直接法感興趣的同學可以去看看LSD, SVO, DSO等解決方案)。

簡單來說,直接法直接使用的是整張圖片的像素信息,通過像素亮度來進行運動軌跡的估計。這樣的好處是速度很快,直接跳過計算關鍵點與描述子的步驟。同時在有些缺失特徵點的環境下,只要環境中有明暗變化,也能工作,如此大大的避免了跟丟的情況。

技術剖析谷歌ARCore:比蘋果ARKit還厲害?

直接法的數學推導就不詳述了,但是該方案是基於灰度不變的強假設。換句話說, 就是同一空間的像素灰度值,在每張圖像上都是不變的。這樣就對光源的強弱及位置變化要求比較高,同時相機的自動曝光功能也需要關閉,使得圖像不會整體變亮或者變暗。(這一點在外媒TheVerge的上手測試中有體現)

ARCore的所謂光源感知功能估計就是基於像素灰度變化的計算。這也就是為什麼不同的光源強度下,形成的影子的方向效果有好有差。谷歌果然聰明,在位姿估計的同時順水推舟地發布一個光源感知功能,一石二鳥!形象一下子就蓋過了ARKit。

由於直接法完全依靠像素梯度優化來估計相機位姿,作為Ceres(谷歌推出的SLAM閉環檢測演演算法)的東家,這點對於谷歌來說並不是什麼難處。另外一個ARCore使用直接法的例證就是點雲。

3 和ARKit相比如何?

ARCore的SDK里是有點雲功能的——由於Unity3D的Demo存在Bug,無法看到具體形成的點雲是半稠密還是稠密的。但無論是半稠密還是稠密點雲的構建,這都是特徵法無法實現的。個人估計是半稠密的點雲。如果ARCore在沒有GPU CUDA加速的情況下真構建了稠密點雲,只能膜拜Google大法了。

技術剖析谷歌ARCore:比蘋果ARKit還厲害?

相比之下,ARCore能夠實現的光源感知和點雲功能,ARkit實現不了——如果ARKit是Metaio(蘋果之前收購的德國公司)做的話,採用特徵法的可能性大,這樣就無法實現光源感知,點雲理論上是能構建,但只能是稀疏的,基本上就是一堆點,看不出什麼。

至於ARCore整體的工程是SLAM還是VIO,個人的偏向還是VIO更有可能。就如ARKit一樣,使用的場景更偏向於手機端,在場景不大的情況下,VIO作為定位方案已經綽綽有餘,而且更加節省計算資源。

無論如何,ARCore推出,補全了安卓市場在AR上的空白。基於安卓系統的市場佔有率,蘋果還敢說自己是最大的AR平台嗎?