環(huán)境下的視覺SLAM與SfM:干擾源分類與處理策略)
動態(tài)環(huán)境四個字出現(xiàn)在綜述標題里聽起來像一句套話但真正跑過一版視覺SLAM的人都知道一個在走廊里來回走動的人就足以讓原本穩(wěn)定的位姿估計在十幾秒內(nèi)現(xiàn)出原形。運動恢復結構Structure from Motion也一樣街景里出現(xiàn)行人和車輛時離線重建出來的點云會長出一片“幽靈點”。Visual SLAM與SfM在靜態(tài)場景下?lián)碛谐墒斓睦碚摽蚣芄こ躺弦灿泻芏嗫蓮陀玫墓ぞ咭坏┉h(huán)境變動態(tài)問題就從“怎么解方程”切換成“怎么先知道哪些方程不能信”。這篇綜述把視覺SLAM、基于運動恢復結構的離線重建以及多視圖幾何統(tǒng)一到同一條“動態(tài)環(huán)境”主線下。上篇先交代問題定義、干擾源分類、主流處理策略和評估邏輯。對準備做動態(tài)場景實驗的算法開發(fā)者來說這一半內(nèi)容基本決定了你后面能不能看懂各種新方法的出發(fā)動機對剛接觸三維視覺的新手而言它也是一張很合適的地圖。下面是我讀上篇時整理的筆記帶著自己的理解講不負責逐句轉(zhuǎn)述原文。1. 動態(tài)環(huán)境為何是SLAM與SfM的“照妖鏡”1.1 靜態(tài)假設是兩套算法共同的地基視覺SLAM通常按時間順序處理圖像實時估計相機自身位姿同時增量維護一張地圖SfM則拿到一段圖像序列或一組照片離線恢復相機軌跡和三維稀疏點云。兩者在實現(xiàn)細節(jié)上差得很遠但共享同一套幾何前提場景主體是靜止的圖像之間觀察到的是同一個剛體世界在不同視角下的投影相機的運動是引起圖像變化的唯一主要因素。這個“靜態(tài)假設”平時不太會被察覺因為大多數(shù)公開測試序列都干干凈凈??伤鼛缀跏莾商姿惴ǖ牡鼗L卣鼽c的匹配依賴它本質(zhì)矩陣和基礎矩陣的估計依賴它光束法平差BA構建的誤差項也依賴它。一旦場景里出現(xiàn)真正的運動物體這些計算環(huán)節(jié)里就會混入“按靜物來處理”的誤匹配。綜述里反復強調(diào)一個點動態(tài)問題不是某個模塊的缺陷而是數(shù)學框架自身邊界之外的東西。你可以在特征提取階段換更魯棒的描述子也可以在位姿優(yōu)化階段加更強的核函數(shù)但只要模型假設仍然是“世界靜止”運動物體就永遠是一個需要單獨處理的例外。所以動態(tài)SLAM的研究重點從來不是把某個基礎算法改得更好而是先教會系統(tǒng)分辨哪些觀測屬于例外。1.2 動態(tài)目標在四個核心環(huán)節(jié)上“拆臺”讀綜述時我習慣把動態(tài)干擾拆到具體環(huán)節(jié)里看。上篇雖然沒有用“四個環(huán)節(jié)”這種說法但對照原文描述動態(tài)目標主要沖擊的是特征匹配、魯棒位姿估計、局部地圖維護和全局優(yōu)化。特征匹配階段運動目標自身往往紋理豐富。比如一件帶條紋的衣服一輛反光的車身它們的特征點數(shù)量可能比背景墻還要密集。前后幀里這些點在圖像坐標系下確實可以從一個位置移動到另一個位置但它們對應的三維世界點其實并不固定。于是常規(guī)最近鄰匹配會給出一個“看起來正確、實際物理錯誤”的對應關系。魯棒位姿估計階段常用RANSAC一類方法從匹配點里篩外點。動態(tài)目標通常只占畫面一部分少量外點混在內(nèi)點里RANSAC還有可能扛得住但如果運動物體占據(jù)畫面比例很高或者紋理極強外點甚至可能形成偽內(nèi)點把正確運動模型往錯誤方向拉。這是很多算法在動態(tài)環(huán)境下精度驟降的直接原因。局部地圖維護和全局優(yōu)化就更隱蔽。動態(tài)點的特征一旦被誤插入地圖后續(xù)幀就會反復往那個錯誤的三維位置投影形成持續(xù)的誤差源。BA階段為了“讓所有點都舒服”會不自覺地調(diào)整相機位姿去遷就那幾顆動態(tài)點最終表現(xiàn)為軌跡緩慢漂移、重投影誤差居高不下。這也是為什么很多純SLAM系統(tǒng)在動態(tài)走廊里跑一分鐘沒事跑十分鐘就開始飄。1.3 綜述把“動態(tài)”的范圍劃得比我預想更寬我原本以為動態(tài)環(huán)境指的就是行人和汽車結果上篇給的定義要寬得多。除了物體本身的位移它還包含物體的形態(tài)變化、遮擋造成的外觀突變以及由物體運動引起的陰影和反光變化。用一句話來概括凡是讓同一世界點的圖像投影在時間上不穩(wěn)定的因素都可以算進動態(tài)環(huán)境的考察范圍。這個邊界有一個很實際的意義。很多工程文檔里把動態(tài)物體檢測等同于“人車識別”可真正影響視覺定位的往往還包括移動的樹影、玻璃幕墻上的反射、被風吹動的衣擺以及一段墻壁上忽明忽暗的光照。這些因素不改變?nèi)S幾何位置卻改變光度信息特征是同一個特征點但描述子可能完全變了。當然綜述也畫了一條紅線相機自身的運動不被視為環(huán)境動態(tài)因為那是需要求解的量不是干擾。這個區(qū)分看似多余實際上非常必要——如果不先定義清楚后續(xù)分類就會把“場景運動”和“觀測運動”混在一起。動態(tài)估計的第一步不是識別什么在動而是明確什么不可以動。2. 干擾源分類先把“動態(tài)”拆成一張表2.1 按運動性質(zhì)劃分剛性、非剛性、微動上篇對動態(tài)干擾源的分類第一條主線是按物體的運動性質(zhì)拆成剛性、非剛性和微動。剛性運動最好處理。人體軀干、車輛、箱子它們整體做三維剛體變換依然滿足剛性幾何約束。算法只需要判斷“這個三維點簇是否經(jīng)歷了同一個剛體變換”就能大概率把動態(tài)區(qū)域篩出來。這也是早期動態(tài)SLAM大多數(shù)從幾何方法入手的原因成本低、不依賴預訓練模型。非剛性運動就麻煩得多。人的四肢、飄動的旗子、彎曲的布料它們的局部仍然剛體但整體不再滿足任何單一三維變換?;A矩陣或本質(zhì)矩陣只能約束點在極線上的位置不能約束它必須是某個剛體上的點。于是對極幾何能給出一個“弱否定”卻很難給出“強確認”。微動又是另一個極端比如樹葉在風中抖動、水面波紋、遠處草地的輕微擺動。這些運動幅度小、像素位移淺在特征點層面很難和噪聲分開。它們通常不會讓SLAM崩潰卻會讓局部地圖區(qū)域持續(xù)抖動最終表現(xiàn)為中等程度的漂移和模糊。綜述把這三類分開列出是為了提醒讀者沒有一種單一判定方法能同時覆蓋它們。2.2 按時間尺度劃分短暫遮擋、長期占用、反復經(jīng)過第二種分類角度是時間尺度這個角度在工程里特別重要。短暫遮擋指行人從鏡頭前一閃而過或者車輛快速穿越視野。它造成的最大問題是特征跟蹤中斷相機瞬間失去一小片區(qū)域的匹配點。對視覺SLAM來說短暫遮擋最危險的時候正是平移或旋轉(zhuǎn)劇烈的時候系統(tǒng)失去定位錨點容易產(chǎn)生位姿跳變。長期占用更棘手比如一輛停在路邊的車或者靠在墻邊不動的人。它們在幾何上是“靜止”的常規(guī)幾何方法會判定為靜態(tài)點并插入地圖。等到物體啟動開走地圖里就會出現(xiàn)一塊殘留的“幻影結構”不僅污染建圖結果還會在后續(xù)定位時誘導位姿估計。上篇特別強調(diào)這類物體屬于“潛在動態(tài)”而不是“當前動態(tài)”需要語義先驗來提前識別。反復經(jīng)過則體現(xiàn)為同一位置不斷出現(xiàn)、消失的動態(tài)占用比如商場出入口、地鐵閘機旁邊。它既不形成穩(wěn)定的地圖點也不制造明顯的幻影卻會不斷打斷局部區(qū)域的匹配連續(xù)性。長期跑下來系統(tǒng)在這一帶的關鍵幀質(zhì)量會明顯下降。三種時間尺度對應的問題不一樣這也為后面章節(jié)選擇“幾何先驗還是語義先驗”提供了依據(jù)。2.3 光照和反射動態(tài)環(huán)境里最常見的“隱形干擾”讀到這里我才意識到之前自己調(diào)試建圖系統(tǒng)踩過的大坑其實被這張分類表覆蓋得很清楚。某個用玻璃幕墻建筑的場景白天和下午各跑一遍重建出來的墻面點云完全不同不是幾何錯了是描述子在反射區(qū)域的匹配對不上。這類現(xiàn)象在綜述里被歸為“光度動態(tài)”并在上篇里被單獨列出來提醒。陰影是最典型的例子。一棵樹在陽光下移動陰影地面本身的幾何結構沒動但在圖像上陰影邊界處的像素灰度發(fā)生劇烈跳變。特征點提取器可能在陰影邊界附近找到大量關鍵點而前后幀這些點的描述子差異巨大。匹配失敗還是輕的更麻煩的是它可能把位姿估計往錯誤方向拽。反光和透明材質(zhì)同樣麻煩。水面波紋、汽車漆面、玻璃窗戶都會讓原本應該一致的光度模型失真。綜述指出這類“光度動態(tài)”通常不能用幾何約束來解決因為投影位置的幾何關系沒有錯只是觀測量不可信。它們需要額外的先驗比如已知類別屬性、多曝光融合、或者把特征提取器設計得對灰度變化更鈍感。2.4 一張表把干擾源收攏起來我讀綜述時做了一張最小化的匯總表方便對照后續(xù)方法分別解決哪個問題。這張表不是原文原樣的章節(jié)結構而是我把上篇內(nèi)容按自己的理解整理出來的。干擾類型典型樣例主要破壞環(huán)節(jié)幾何方法效果語義方法效果剛性運動行人、車輛、推車誤匹配、地圖幻影較好較好非剛性形變四肢擺動、布料、旗幟匹配、位姿優(yōu)化較弱中等微動樹葉、水面、草叢局部地圖抖動幾乎無效無效長期占用路邊停靠車輛、靜止人地圖幻影、定位漂移無效好光度動態(tài)陰影、反光、光照突變特征描述、匹配無效部分有效這張表直接決定了你選方法時的優(yōu)先級。以后看到某個算法聲稱“在動態(tài)場景下效果好”我會先去查它解決了表格里哪一行而不是直接去看精度曲線。3. 上篇方法主線如何給特征點打上“動態(tài)標簽”3.1 幾何路徑對極幾何和多視圖一致性上篇梳理的方法最早的一支以幾何約束為主核心思路是“用靜態(tài)框架反推誰不符合靜態(tài)框架”。輸入是對應點證據(jù)輸出是動態(tài)點的概率或硬標簽整個流程不依賴語義類別信息?;A矩陣和本質(zhì)矩陣是這套路線的核心工具。理想靜態(tài)場景下所有正確匹配都嚴格落在極線上。一旦某個點對應一個動態(tài)物體它就會明顯偏離極線約束在RANSAC循環(huán)里被當成外點。單目雙幀幾何約束就能提供不錯的初篩多視圖一致性則更穩(wěn)因為同一個動態(tài)點會在多幀之間反復呈現(xiàn)不一致置信度可以累計。幾何方法的優(yōu)點是泛化性好。你不需要知道“那個東西是人還是車”也能判斷它有問題。它的缺點同樣明顯。對微小運動不敏感對非剛性形變約束偏弱對“潛在動態(tài)”完全無能為力。一個靜止站在路邊的人幾何方法一定會把它的特征納入靜態(tài)地圖直到它起身才后知后覺地開始處理。綜述說得很直接幾何是必要手段但不是充分手段。3.2 語義路徑把“會動的東西”提前列進黑名單語義先驗是動態(tài)SLAM在深度學習流行后的大分支。目標檢測或?qū)嵗指罹W(wǎng)絡在跟蹤線程之外每幀跑一次把行人、車輛、騎車人等類別對應的像素區(qū)域找出來直接禁止這些區(qū)域的特征點進入位姿估計。有些方法更進一步把這些區(qū)域的特征點標記為“動態(tài)候選”在后續(xù)幾何校驗里再確認一遍。這種路徑最大的好處是能處理長期占用。車停在路邊不動幾何方法看不出問題語義方法卻能提前把它認出是“可運動的物體”主動從地圖構建里排除。人在門口站著不動也一樣系統(tǒng)知道它不是一個“固定的雕塑”遲早會移動于是干脆不把它計入地圖。但語義路徑也有自己的坑。分類器永遠長著一雙“它認識的眼睛”只識別訓練集里見過的類別。公園里的滑板少年、商場里的清潔機器人、工地上的吊臂凡是沒進過訓練集的新物體都會被當成靜態(tài)背景。真實動態(tài)環(huán)境永遠有新類別上線這是我在工程里對語義方法保持謹慎的根本原因。上篇也承認純語義方案的召回率上限受模型類別覆蓋度限制。3.3 時序路徑讓系統(tǒng)從“歷史的動靜里”學習時序先驗走的是另一條路通過連續(xù)多幀的變化模式來識別動態(tài)區(qū)域。最簡單的做法是看光流和背景模型是否一致。靜止背景的光流場會隨著相機運動呈現(xiàn)整體平滑的模式而動態(tài)物體上會疊加快速且獨立的光流分量。把這種“不一致”提取出來就給動態(tài)區(qū)域打了標簽。這類方法對完全未知的動態(tài)物體有效因為它不依賴類別表。只要物體在畫面里產(chǎn)生獨立于背景的運動時序模型就能捕捉。它也很適合在線SLAM場景因為跟蹤線程本來就要計算幀間特征匹配額外統(tǒng)計光流一致性成本可控。時序方法的短板是響應速度。它必須觀察到連續(xù)若干幀后才敢判定“這里有動態(tài)”在物體第一次進入畫面的短時間內(nèi)系統(tǒng)仍然會把這些點視為正常點。遇到快速穿過鏡頭的物體等標簽打上時它已經(jīng)給位姿估計貢獻了至少一兩幀的誤差。所以時序先驗適合做“確認”不太適合做“預測”。很多綜述里提到的混合做法其實就是讓語義負責預測、時序負責確認、幾何負責兜底。3.4 三種先驗怎么配合才是上篇真正想講的事把三種路徑分開看都不復雜難的是組合。動態(tài)SLAM里常見的一條流水線是先讓語義分割網(wǎng)絡給出“疑似動態(tài)區(qū)域”再用極線約束檢查這些區(qū)域的特征點在幾何上是不是真的違背了靜態(tài)模型最后用幀間時序信息做平滑防止單幀誤檢造成標簽抖動。這個順序背后有一套邏輯。語義先驗回答“它可能動”因為人、車天然具備運動能力。幾何先驗回答“它正在動”因為一旦運動確實發(fā)生它必然違反多視圖幾何一致性。時序先驗回答“它一直在動”用來過濾單幀噪聲、填補幾何方法暴露的盲區(qū)。三個答案重疊得越多動態(tài)標簽的置信度就越高。這套組合邏輯在綜述里不算新但讓我印象深刻的是它對“失敗模式”的描述。如果只用語義會把靜止的車輛排除掉地圖稀疏對定位精度不利。如果只用幾何會漏掉潛伏的動態(tài)物體。如果只用時序會產(chǎn)生檢測延遲。各自的失敗模式幾乎互補所以上篇總結出的方向不是挑選某一種而是設計一套“誰先發(fā)表意見、誰最后拍板”的流程。4. 動態(tài)場景下的評測邏輯不能只看軌跡誤差4.1 動態(tài)序列評測ATE高不代表動態(tài)處理得好看到這里有一個容易踩的坑評測SLAM在動態(tài)場景下的表現(xiàn)不能只報絕對軌跡誤差ATE。ATR衡量的是相機位姿和真值軌跡的偏差但它不區(qū)分誤差來源于動態(tài)干擾還是來源于普通累積漂移。一個系統(tǒng)可能因為沒有把動態(tài)物體剔除干凈而恰好產(chǎn)生了“抵消性誤差”ATE數(shù)值反而好看。更麻煩的是動態(tài)場景本身的真值就很有講究。真值軌跡通常由一個外部定位系統(tǒng)提供比如運動捕捉設備。但這個真值只描述相機運動不描述場景里行人的位置。于是同一個序列、同一個位姿真值有人在評測時把動態(tài)物體全部手動標注出來有人在評測時完全不管。兩套標準跑出來的指標根本沒有可比性。綜述在上篇建議評測至少應該分兩層看底層看追蹤連續(xù)性也就是有沒有明顯跳變和跟蹤丟失上層看地圖質(zhì)量包括動態(tài)區(qū)域有沒有被錯誤插入靜態(tài)地圖、靜態(tài)背景有沒有被誤刪。只報一個ATE數(shù)字等于把所有問題都壓到一條曲線里信息量太低了。4.2 SLAM與SfM對動態(tài)物體的“期望”并不一致視覺SLAM和SfM雖然共享很多幾何原理但它們的輸出目標不同導致動態(tài)處理的評價標準也不一樣。SLAM在線運行每一幀都要給出相機位姿它最關心的是動態(tài)干擾會不會造成位姿跳變和地圖污染。所以動態(tài)物體能不能被“臨時屏蔽”比它能不能被“準確重建”更重要。SfM離線運行目標是重建整個場景的三維結構。它更關心動態(tài)物體是否產(chǎn)生了錯誤的三角化點。對街景重建項目來說行人和車輛是純粹的噪聲重建系統(tǒng)希望把它們徹底濾掉甚至連痕跡都不要留。但在另外一些應用里比如影視制作的動作捕捉動態(tài)物體的結構重建本身就是目標。同一條幾何流程前者把動態(tài)當垃圾扔掉后者把動態(tài)當寶貝取出評測標準自然不能共用。這也解釋了為什么綜述上篇會反復強調(diào)“預留分類任務”。用同一套SLAM系統(tǒng)去處理動態(tài)環(huán)境你先得定義好自己的產(chǎn)品要“剔除動態(tài)”還是“重建動態(tài)”方法路線會完全不同。我見過不少項目在方案討論階段爭論用哪種檢測網(wǎng)絡實際上應該先爭論產(chǎn)品到底要哪個結果。4.3 公開數(shù)據(jù)集能說明問題但不能說明全部問題動態(tài)SLAM領域有幾種常見的數(shù)據(jù)集形態(tài)室內(nèi)運動捕捉序列包含大量行人活動的視覺慣性序列以及自動駕駛場景的影像數(shù)據(jù)集。它們各有優(yōu)勢也各有軟肋。室內(nèi)場景真值精確、動態(tài)目標可控但環(huán)境外觀單一行人數(shù)量最多也就十幾個無法覆蓋長期占用和光度動態(tài)。自動駕駛序列場景豐富但真值計算成本極高還會引入傳感器坐標系對齊誤差。最重要的這些數(shù)據(jù)集都默認有固定語義類別車輛、行人、騎行者。如果一個算法的動態(tài)處理能力完全依賴語義分割的質(zhì)量換個沒有“滑板車”類別的環(huán)境效果馬上跳水。綜述上篇提到的一個通用建議是把算法拿到?jīng)]有訓練分布的重疊的序列上做壓力測試。動態(tài)區(qū)域占比從5%逐步增加到40%看系統(tǒng)在哪個區(qū)間開始失效。這個壓力測試思路很適合工程團隊復制因為它能直接畫出一條“動態(tài)魯棒性曲線”比單個數(shù)據(jù)集上的百分之零點幾的精度差異有說服力得多。4.4 我發(fā)現(xiàn)的最關鍵“評測變量”動態(tài)比和動態(tài)速度如果讓我從評測邏輯里抽出兩個最關鍵的變量我會選動態(tài)比和動態(tài)速度。動態(tài)比是指動態(tài)區(qū)域占畫面面積的比例。比例很低的場景魯棒估計本身就能處理不需要動態(tài)模塊比例超過一定值后內(nèi)點數(shù)量不夠即使完美剔除動態(tài)也會造成退化。動態(tài)速度則是像素層面的運動速度。慢速目標容易被時序方法忽略快速目標容易形成大位移導致光流失敗。這兩種變量在真實環(huán)境里彼此獨立一輛車慢慢駛過路口可以占大面積一支筆快速揮動可以占小面積。上篇雖然沒有給出某個統(tǒng)一公式但它對評測條件的強調(diào)已經(jīng)暗示理想場景應該覆蓋“高/低比例”和“高/低速度”的笛卡爾積。5. 讀過上篇之后我更傾向記住的五條判斷5.1 靜態(tài)點越充足動態(tài)處理越要保守很多人誤以為動態(tài)處理的責任是把所有運動物體都標出來其實不是。關鍵目標是保證靜態(tài)點數(shù)量足夠且干凈位姿估計才能穩(wěn)定。如果某個疑似動態(tài)區(qū)域只占畫面很小一部分即使把它漏掉RANSAC也能用大量靜態(tài)內(nèi)點把外點壓住。這時候強行開啟動態(tài)檢測反而可能把靜態(tài)點誤刪降低內(nèi)點數(shù)量。我自己的建議是動態(tài)模塊的輸出不要做成二值標簽而是做成“信任程度”。低于閾值的位置不參與位姿估計不代表它們不能保留在地圖維護的候選區(qū)里。這樣即使標簽出了錯系統(tǒng)損失的也只是一部分信息而不是直接喪失一片區(qū)域的跟蹤能力。5.2 語義模型的“未知類別”問題比精度更致命語義路徑表現(xiàn)出的最終性能往往不取決于模型在公開數(shù)據(jù)集上的mAP而取決于它能不能對未知物體保持“不知道自己不知道”的謙遜。在工程現(xiàn)場新動態(tài)物體是常態(tài)一只飛過的鳥、一個傾倒的紙箱、一臺自動導引車都可能不屬于任何預設類別。追求更高的分割精度邊際收益有限真正有用的設計是讓語義模塊輸出“未知動態(tài)候選”的置信度交給幾何時序模塊去確認。5.3 幾何校驗永遠不要省哪怕你有最貴重的語義模型因為語義模型再強它也會遇到訓練分布之外的區(qū)域。幾何校驗是唯一不依賴類別的“物理安檢”你不需要知道物體是什么只需要確認它是否符合剛體世界的基本規(guī)則。把語義檢測框里的特征點全部跳過而不做幾何確認等于把系統(tǒng)命運完全交給訓練集的覆蓋率。做過一次真實實驗就會明白訓練集之外的動態(tài)物體往往最容易讓純語義方案現(xiàn)出原形。5.4 時序平滑模塊不是錦上添花是必須的特征點動態(tài)標簽如果單靠單幀判定一定會在連續(xù)幀間來回抖動。同一面墻這一幀被誤判為動態(tài)下一幀恢復靜態(tài)就會導致地圖點被反復插入、刪除對BA和地圖維護的影響非常大。加上時序平滑后標簽更新會考慮歷史狀態(tài)誤檢的雜波被抑制系統(tǒng)整體穩(wěn)定度顯著提升。代價只是少數(shù)幀的理解延遲在大部分場景里可以接受。5.5 面對真實項目先測量“動態(tài)場景分布”再選方案最后一個判斷偏工程。無論是做掃地機器人、園區(qū)巡檢還是AR定位第一步都不是選模型而是先測量產(chǎn)品看到的到底屬于哪種動態(tài)干擾。是人物反復穿行還是車輛長期停靠還是陽光造成的陰影遷移對照上篇那張干擾源分類表每種分布對應的最優(yōu)方法幾乎都不一樣。先花一周統(tǒng)計真實數(shù)據(jù)里的動態(tài)占比、動態(tài)速度和動態(tài)類別比試十個開源方案都管用。如果把上篇濃縮成一個動作我會把它想象成給每一幀畫面建立一張“哪些位置暫時不值得相信”的信任地圖。靜態(tài)與動態(tài)的分離從來不是把所有運動物體扔出畫面而是讓系統(tǒng)在每一個時刻都知道該把信任放在哪里。對我個人來說讀完上篇收獲最大的不是多記了幾種方法名而是學會了先看問題分類再決定用什么工具。這篇筆記的下半部分再接著整理語義幾何融合、稠密重建和實時性之間的取舍。