深度估計
深度估計這件事,是要弄清楚一個畫面裡每一個點離攝影機有多遠——把一張本身完全沒有距離感的平面影像,變成對「遠近」的認識。它的輸出通常是一張深度圖:圖裡每個像素存的不是顏色,而是一段距離,用亮度來表示每個點有多近(或者按約定表示有多遠)。一個知道深度的機器人,就能判斷門口在前方兩公尺、椅子在它左側半公尺處——而這正是它移動和伸手卻不撞到東西所必需的。
獲取深度沒有唯一的辦法,而是有一整套各有取捨的方法。立體攝影機從並排兩個視角之間的視差裡推出深度。結構光會把一組已知的點陣或條紋圖案投到場景上,再讀取這圖案在物體表面上是怎樣錯位和彎曲變形的,據此算出距離——許多室內深度攝影機就是這麼工作的。飛行時間感測器和雷射雷達則發射光線,測量它彈回來要花多長時間。還有基於學習的方法:用一個研習過數百萬張影像的神經網路,單憑一張普通照片就去猜測深度,靠的是人也會用的那些線索,比如東西離得越遠看起來越小、紋理在遠處會變得越細。
每一種方法都有它的甜蜜點和短板。立體視覺和單圖學習在空白、沒有紋理的表面上都很吃力;結構光和飛行時間在強烈陽光下可能被沖刷得失效;雷射雷達精確、測程遠,卻價格昂貴,而且給出的是稀疏的點而不是一張稠密的圖。因此,真實的機器人常常把好幾種來源結合起來——把它們融合在一起,讓一種方法的長處去補上另一種方法的盲區——以構建出一幅可靠到足以據此行動的深度圖景。
一台室內機器人的深度攝影機,把一組看不見的紅外點陣投滿整個房間;這些點在遠處的牆上散得很開,在近旁的沙發上則擠得很密,攝影機據此構建出一張深度圖,顯示沙發近、牆遠。
結構光透過一組已知圖案在物體表面上被拉伸的方式來讀取距離。
立體視覺只是估計深度的一種具體辦法;深度估計是更寬泛的目標,也可以靠結構光、雷射雷達或一個學出來的單圖模型來實現。