郭 爽
(哈爾濱工業(yè)大學(xué)航天學(xué)院,哈爾濱 150001)
視覺導(dǎo)航憑借其導(dǎo)航信息豐富、應(yīng)用領(lǐng)域廣泛等優(yōu)點受到了人們的廣泛關(guān)注,近年來在移動機器人及無人飛行器上的應(yīng)用越來越多。視覺里程計(Visual Odometry,VO)和即時定位與地圖構(gòu)建(Simultaneous Localization And Mapping,SLAM)是當(dāng)今視覺導(dǎo)航領(lǐng)域中的重要組成部分,也是當(dāng)下最受關(guān)注的研究熱點。
導(dǎo)航中常用的視覺傳感器有單目相機、雙目相機和RGB-D相機。其中,RGB-D相機由于其自身測量原理的限制,深度測量范圍較小,難以在室外場景中使用;雙目相機的深度測量范圍與基線長度有關(guān),在室外大尺度場景下進(jìn)行導(dǎo)航所需的相機基線長度過長,導(dǎo)致相機體積與質(zhì)量顯著增加,難以在無人機等小型移動平臺上應(yīng)用。除此之外,這兩種相機模型較復(fù)雜,在標(biāo)定、矯正過程中也會帶來一些麻煩。
相比之下,單目相機在成本、功耗、質(zhì)量、標(biāo)定復(fù)雜度等方面都具有非常明顯的優(yōu)勢,可以克服以上傳感器在無人機等移動平臺應(yīng)用方面的缺點,因此基于單目相機的VO和SLAM算法吸引了更多研究者的目光。然而在傳統(tǒng)幾何視覺理論中,很難建立較為通用的數(shù)學(xué)模型實現(xiàn)用單張圖像提取出場景的深度信息,這就導(dǎo)致了即使近年來人們的研究工作使單目VO和SLAM算法在精度和魯棒性上都有了很大的提升,但尺度不確定性的問題仍然沒有得到解決,即通過估計出的軌跡及建立的地圖只能得知運動及環(huán)境的大致形狀而實際大小無法確定,這極大的限制了單目VO與SLAM算法在無人機等移動平臺導(dǎo)航中的應(yīng)用。針對這個問題,現(xiàn)有的解決方法多采用在系統(tǒng)中引入其他傳感器進(jìn)行補充,最具代表性的是在系統(tǒng)中加入慣性傳感器,得到視覺慣性里程計(Visual Inertial Odometry,VIO),但這類方法不僅增加了系統(tǒng)復(fù)雜度,而且為傳感器標(biāo)定帶來了更多的麻煩。
近年來深度學(xué)習(xí)在計算機視覺領(lǐng)域表現(xiàn)出了強大的解析與表達(dá)能力,使從單張圖像中估計深度成為可能,單目深度估計問題也成為了近年來研究者們關(guān)注的熱點之一。將單目深度估計加入到單目VO中,作為對缺失尺度的良好補充,在系統(tǒng)不增加額外傳感器的前提下,提升系統(tǒng)的性能,在未來有望擴展單目VO的應(yīng)用范圍。本文將單目深度估計加入到半直接法單目VO中,得到了一種可以恢復(fù)運動真實尺度的單目視覺里程計算法。
Eigen D等[1-2]首次提出用卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)解決單目深度估計問題,采用帶有真實深度圖的數(shù)據(jù)集進(jìn)行有監(jiān)督訓(xùn)練,從而直接擬合出從單目圖像到其對應(yīng)深度圖的映射函數(shù),但此文中所使用的真實深度圖實際中很難獲取,即使用激光雷達(dá)在室外大尺度場景下也難以保證獲取完整的深度圖。Zhou T等[3]提出了利用一段由單目相機拍攝的圖片序列作為訓(xùn)練集,采用無監(jiān)督學(xué)習(xí)的方式進(jìn)行單目深度估計,但由于單目圖像數(shù)據(jù)集并不包含場景的真實深度信息,因此這種方法只能計算出相對深度,與真實深度仍然相差一個倍數(shù),尺度不確定性問題依然沒有得到解決。Godard C等[4]采用雙目相機的圖片序列作為數(shù)據(jù)集,利用左右圖像重建損失對網(wǎng)絡(luò)進(jìn)行無監(jiān)督訓(xùn)練,之后由神經(jīng)網(wǎng)絡(luò)輸出視差圖,再利用預(yù)測出的視差圖計算出深度圖。與Zhou T等[3]的方法不同,本文所采用的雙目相機的數(shù)據(jù)集包含了場景的三維信息,由此訓(xùn)練出的網(wǎng)絡(luò)輸出的視差圖進(jìn)而計算出的深度圖為絕對深度,可以用來恢復(fù)場景的真實尺度。
Laina I等[5]提出了一種包含殘差學(xué)習(xí)網(wǎng)絡(luò)的全卷積網(wǎng)絡(luò)結(jié)構(gòu)對單目圖像和深度圖之間的模糊映射進(jìn)行建模的方法。該方法經(jīng)作者改進(jìn)后融合到單目SLAM技術(shù)當(dāng)中[6],得到了一種將CNN預(yù)測的密集深度圖與直接法單目SLAM的深度測量相結(jié)合的方法。這種融合方法可以在傳統(tǒng)單目SLAM方法容易失效的位置(如缺少紋理特征的區(qū)域)進(jìn)行深度預(yù)測,并利用深度預(yù)測估計地圖重建的絕對尺度,克服了單目SLAM缺少尺度信息的局限性。Li R等[7]提出了UnDeepVO,一種基于無監(jiān)督深度學(xué)習(xí)的單目VO,利用雙目圖像訓(xùn)練UnDeepVO恢復(fù)絕對尺度,用連續(xù)的單目圖像進(jìn)行測試,實現(xiàn)了用深度神經(jīng)網(wǎng)絡(luò)對單目圖像同時進(jìn)行姿態(tài)估計和稠密深度圖估計,但這種基于深度學(xué)習(xí)的方法不可能完全替代基于幾何的傳統(tǒng)方法,在對未經(jīng)訓(xùn)練的陌生環(huán)境或運動的擴展能力上也會受到限制。
前文中提到,深度是視覺導(dǎo)航中必不可少的信息,在缺少深度的情況下,VO估計出的軌跡或建立的地圖都將只有形狀信息而尺度未知,針對這個問題,本文仿照Godard C等[4]的思路,采用雙目圖像作為訓(xùn)練集,通過左右圖像重建的方式學(xué)習(xí)出場景的三維信息,進(jìn)而計算出導(dǎo)航過程中必需的絕對深度。
在測試時給定一張單目圖像I,目標(biāo)是學(xué)習(xí)到一個可以預(yù)測場景中每一個像素點深度的函數(shù)在訓(xùn)練時將深度估計問題轉(zhuǎn)化為左右圖像重建問題,于是問題轉(zhuǎn)化為:給定一組矯正后的雙目圖像,如果可以通過訓(xùn)練學(xué)習(xí)從一張圖片恢復(fù)出另一張的映射函數(shù),這樣就提取到了被拍攝場景中的三維信息,其中就包含了所需的深度信息。
具體來說,在訓(xùn)練期間需要同時使用原始數(shù)據(jù)中同時拍攝的左圖Il和右圖Ir。此處需要強調(diào),本文的算法并不對深度進(jìn)行直接擬合,而是通過神經(jīng)網(wǎng)絡(luò)預(yù)測出左右圖像的視差圖dl和dr,并將其與數(shù)據(jù)集中的原始左右圖像Il和Ir相加從而重建出預(yù)測的左右圖像Il(dr)和Ir(dl)。由于雙目圖像是經(jīng)過矯正的,根據(jù)幾何原理,在已知雙目相機基線長度b和相機焦距f的情況下,就可以利用式(1)計算出深度。
在訓(xùn)練損失函數(shù)的設(shè)計上,損失函數(shù)由定義在4個輸出尺度上的子函數(shù)sC組成,他們相加得到最終的損失函數(shù):
每個輸出尺度上的子函數(shù)Cs定義為:
其中,Cap表示圖像重建損失,反映重建出的圖像 與真實圖像之間的相似程度,此項越小,重建質(zhì)量越高,則認(rèn)為估計出的視差更接近真實視差,因此通過視差計算出的深度也將更加準(zhǔn)確;Cds表示預(yù)測視差圖的平滑損失,此項越小,平滑程度越高,預(yù)測質(zhì)量越好;Clr表示左右一致性損失,即預(yù)測出的左右視差應(yīng)當(dāng)相一致,一致程度越高,預(yù)測的精度也更高。
在訓(xùn)練時,CNN僅接收雙目圖像對中的左圖像作為輸入,同時預(yù)測出左右圖像對應(yīng)的兩幅視差圖,將其分別與數(shù)據(jù)集中實際的左右圖像疊加得到重建出的左右圖像。之后分別與其對應(yīng)的實際左右圖像進(jìn)行比較計算出損失函數(shù)的各項,并疊加得到整體損失函數(shù)的值。再對損失函數(shù)求取梯度,根據(jù)梯度進(jìn)行反向傳播更新參數(shù),使損失函數(shù)逐漸降低到一定程度從而使神經(jīng)網(wǎng)絡(luò)收斂。下面以重建左圖像為例,對每個損失函數(shù)的詳細(xì)建模過程進(jìn)行介紹。
(1)圖像重建損失
在訓(xùn)練過程中,CNN學(xué)習(xí)通過空間轉(zhuǎn)換網(wǎng)絡(luò)(Spatial Transformer Network,STN)中的圖像采樣器,使用視差圖對雙目圖像中的另一張圖像采樣。STN使用雙線性采樣的方法對輸入的4個像素插值得到輸出像素,雙線性采樣是完全可微且可集成到全卷積網(wǎng)絡(luò)中,這意味著不需要對損失函數(shù)進(jìn)行任何的簡化和近似。
圖像重建損失項由L1范數(shù)和結(jié)構(gòu)相似性項(Structural Similarity Index,SSIM)組成,將輸入的實際左圖像和網(wǎng)絡(luò)預(yù)測出的左圖像進(jìn)行比較可得
以上所有損失函數(shù)項對重建出的右圖像也適用。整體損失函數(shù)的構(gòu)造過程如圖1所示。
(2)視差平滑損失
通過對視差梯度求L1范數(shù)計算局部平滑損失函數(shù),由于在圖像邊緣會出現(xiàn)深度不連續(xù)的情況, 所以用圖像梯度對邊緣感知項進(jìn)行加權(quán)。
圖1 左右圖像重建損失Fig.1 Reconstructio n loss between left and right images
(3)左右一致性損失
在實際情況中,雙目相機從左到右的視差與從右到左的視差是完全等價的,CNN僅接受左圖像作為輸入并同時預(yù)測出左右兩幅視差圖,為了保證協(xié)調(diào),在損失函數(shù)中加入對左右視差不一致的懲罰,強迫左視差圖等于投影后的右視差圖,加入這項較強先驗的監(jiān)督可以有效提高網(wǎng)絡(luò)對于視差圖的預(yù)測精度。
考慮到半直接法單目視覺里程計系統(tǒng)的需求,單目深度估計模塊的作用是為半直接法VO中的深度濾波器提供良好的深度濾波初值,并非將其輸出作為最終結(jié)果直接用于匹配,因此沒必要也不應(yīng)該盲目追求深度圖具有精細(xì)的輪廓(部分較難預(yù)測的像素點深度誤差足夠小,如邊緣處等),而應(yīng)該使整張圖像上多數(shù)像素點的深度預(yù)測誤差處于合理的范圍內(nèi),這些點所對應(yīng)特征點的深度就都可以通過濾波快速收斂到真值,即使存在個別誤差較大而不能收斂的異常點,也會在濾波階段被剔除,不會影響系統(tǒng)的整體性能。
改進(jìn)后的網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。在網(wǎng)絡(luò)的前兩層仍然保留了較大的卷積核保持足夠大的感受野,保證可以提取到足夠豐富的信息支撐后期的深度預(yù)測。隨著網(wǎng)絡(luò)層數(shù)逐漸加深,很多細(xì)節(jié)上的特征被提取出來,但其中很多細(xì)節(jié)特征對于深度預(yù)測的幫助微乎其微,并且提取它們需要大量的計算,對于系統(tǒng)的需求而言,過多地關(guān)注它 們會造成很大的計算資源浪費。相反,本文把更多的注意力放在較為宏觀的特征上,從而保證將整張深度圖像每個像素點的預(yù)測誤差控制在一定范圍內(nèi)。為此,本文對原有的卷積模塊進(jìn)行了修改,引入1×1的卷積核,主要目的是降維,其次是將不同的經(jīng)過卷積處理后得到的特征之間進(jìn)行融合以形成更加宏觀的特征。本文靈感來源于ResNet[8]的降維Inception模塊,并為改進(jìn)后的卷積模塊取名為“Inception Conv Block”,同樣,在解碼器中采取相同技巧改進(jìn)的模塊叫做“Inception Upconv Block”。改進(jìn)后的模塊被應(yīng)用在了圖中綠色和藍(lán)色所示的位置,通過這種操作實現(xiàn)了用較少的參數(shù)提取宏觀特征,降低了模型參數(shù)量,同時減輕了模型的過擬合程度。
圖2 深度估計網(wǎng)絡(luò)結(jié)構(gòu)Fig.2 Architecture of depth estimation network
在Inception Conv Block和Inception Upconv Block的具體實現(xiàn)過程中,兩次使用了11×的卷積核,目的截然不同。第一次在計算成本較高的33×卷積核之前使用了11×的卷積核實現(xiàn)降維,將中間層特征圖的數(shù)量減少到輸出層特征圖數(shù)量的1/4,同時對不同的特征圖實現(xiàn)了信息整合,在經(jīng)過降維的張量上進(jìn)行計算量較大的33×卷積操作,有效減少了33×卷積核的數(shù)量;第二次使用11×卷積核的目的是對張量進(jìn)行線性變換將維數(shù)調(diào)整至與原網(wǎng)絡(luò)相同。改進(jìn)后的網(wǎng)絡(luò)模型包含大約1600萬可訓(xùn)練參數(shù),相比原始模型[4]的3100萬減少了約一半,在占用內(nèi)存和運行速度上都有一定優(yōu)勢。
如圖3所示,本文的算法框架由兩部分組成:一部分是單目深度估計模塊,另一部分是半直接法單目VO模塊。本文的算法框架建立在開源方案半直接法VO(Semi-direct Visual Odometry,SVO)的基礎(chǔ)上,在建圖線程加入了單目深度估計模塊,故稱為CNN-P-SVO。在運 動估計線程中,分別通過最小化光度誤差,重投影誤差實時優(yōu)化相機位姿,地圖中3D點位置三個步驟來達(dá)到恢復(fù)相機運動與場景結(jié)構(gòu)的目的。在建圖線程中,通過概率貝葉斯濾波的方式估計2D特征點的深度。先對關(guān)鍵幀提取點特征,點特征通過FAST角點[9]提??;再對被選中的點特征初始化深度濾波器,其中深度初值由單目深度估計模塊提供。如果是非關(guān)鍵幀則提供對這些特征點的觀測,以貝葉斯濾波的方式更新深度分布模型,當(dāng)深度濾波器的不確定度足夠小時,視為收斂到真實的深度值,則將該點插入地圖中,立即用于后續(xù)的跟蹤線程。
運動估計共分為三個步驟:
圖3 VO算法框架Fig.3 Framework of VO algorithm
第一步,將當(dāng)前幀與相鄰的上一幀進(jìn)行基于模型的圖像稀疏對齊,首先將上一幀中的像素點根據(jù)其位姿以及深度反投影到當(dāng)前幀中,將投影點的像素值v與上一幀反投影前的像素值做比較得到像素光度誤差,如式(7)所示,這是一個典型的非線性最小二乘問題,可以通過高斯牛頓等迭代方法求得其最小化時所對應(yīng)的Tk,k-1,得到對當(dāng)前幀位姿的粗略估計,見圖4。
其中,δI(Tk,k-1,ui)為在Tk,k-1下的像素光度誤差。
圖4 第一步:基于模型的圖像稀疏對齊Fig.4 First step: sparse model-based image alignment
第二步,先利用上一步估計的位姿變換Tk,k-1將地圖中的特征點投影到當(dāng)前幀,之后利用光流跟蹤進(jìn)行特征對齊,在光度不變假設(shè)下,如式(8)所示,同樣是通過最小化光度誤差的方式優(yōu)化它們在當(dāng)前幀上投影的像素位置(見圖5)。注意此處不是對上一幀中的像素進(jìn)行操作,而是將關(guān)鍵幀中存儲的地圖點與當(dāng)前幀進(jìn)行特征對齊,可以理解為是在求取地圖中的3D點在當(dāng)前幀投影位置的觀測值,為下一步構(gòu)造重投影誤差做準(zhǔn)備。
圖5 第二步:特征對齊Fig.5 Second step: relaxation through feature alignment
前面兩步完成后,實現(xiàn)了對特征點快速準(zhǔn)確的跟蹤,且通過與前面關(guān)鍵幀的匹配關(guān)聯(lián)減小了軌跡的漂移。最后一步,將地圖中的點按照第一步估計出的位姿投影到當(dāng)前幀中,得到一個可視為預(yù)測值的像素位置,與上一步中求出的此像素位置的觀測值共同構(gòu)造點線特征的重投影誤差,如式(9)所示。此處重投影誤差的含義是指二者像素位置的差異,并非前兩步中像素值的差異,同樣通過非線性優(yōu)化的手段使其達(dá)到最小,從而優(yōu)化當(dāng)前幀位姿以及對應(yīng)的地圖中的3D點坐標(biāo),最后引入局部集束約束調(diào)整,再次對相機位姿和3D點位置進(jìn)行聯(lián)合優(yōu)化,見圖6。
圖6 第三步:相機位姿與場景結(jié)構(gòu)優(yōu)化Fig.6 Third step: pose and structure refinement
通過以上三步便可對相機位姿進(jìn)行比較可靠的估計。
在建圖線程中,首先對當(dāng)前幀的屬性進(jìn)行判斷。如果當(dāng)前幀是關(guān)鍵幀則提取新的特征點,并將其作為種子點放入隊列中,再用單目深度估計模塊提供的深度值初始化特征點的深度分布。如果當(dāng)前幀不是關(guān)鍵幀,則利用當(dāng)前幀2D特征與地圖中3D點的對應(yīng)關(guān)系更新種子點的深度分布。當(dāng)深度分布的不確定度降低到足夠小時,則認(rèn)為該種子點的深度分布已經(jīng)收斂,將其插入地圖,供跟蹤線程使用。
種子點的深度分布以“高斯分布+均勻分布”的疊加進(jìn)行建模[10],使用貝葉斯濾波更新深度。即深度濾波器。在SVO的原始算法中,濾波初值被初始化為場景的平均深度,由于該深度初值并不準(zhǔn)確,同時賦給深度濾波器一個比較大的不確定度。這會導(dǎo)致三個問題,一是濾波器收斂慢;二是搜索匹配點時耗時; 三是由于圖像的強非凸性增加誤匹配的概率。
為了解決上述問題,將當(dāng)前關(guān)鍵幀輸入單目深度估計模塊得到對應(yīng)的深度圖,為深度濾波器提供深度均值的初值,由于該初值相對準(zhǔn)確,因此本文賦予其較小的深度不確定度,顯著縮小了搜索空間。基于以上情況,加入深度預(yù)測模塊不但可以恢復(fù)運動的真實尺度,還可以大大加快濾波器的收斂速度,提高深度估計精度。
本文用不同數(shù)據(jù)集的多個場景來測試CNNP-SVO的性能,同時將本文的方法與目前最先進(jìn)的單目VO方法對比,包括SVO[11]、DSO[12]、去掉回環(huán)檢測的單目ORB-SLAM[13]。其中,SVO在這些場景中均失效,因這兩種方法的深度濾波器都是用當(dāng)前場景深度均值初始化,不適用于深度變化比較大的室外場景,故在后面的結(jié)果對比中不再展示。軌跡精度采用常見的絕對軌跡誤差(Absolute Trajectory Error,ATE)進(jìn)行度量,即計算估計位姿與真實位姿之間的歐氏距離的均方根誤差(Root Mean Square Error,RMSE)。由于參與對比評價的算法都是單目VO方法,需要先進(jìn)行相似變換對齊軌跡才能計算誤差。
整個實驗中使用的計算平臺配置如下:Intel Core i7-6820 CPU 2.70GHz;16GB RAM;NVIDIA Quadro M2000M GPU。所有視覺里程計算法均在此平臺下運行。選取數(shù)據(jù)集雙目圖像對中的左圖像作為輸入,由于所有參與比較的算法都存在一些不確定性,因此每個實驗都重復(fù)做5次并且記錄其中位數(shù)作為最終結(jié)果。
本文提出的算法首先在常用的數(shù)據(jù)集KITTI上進(jìn)行了評估,這個數(shù)據(jù)集包含了城市、鄉(xiāng)村、高速公路等多種場景。由于制作數(shù)據(jù)集時相機的幀率較低(10FPS),相機載體運動速度較快以及圖像中出現(xiàn)了較多運動的汽車與行人,使這個數(shù)據(jù)集對于單目VO來說是一個很大的挑戰(zhàn)。
表1比較了不同算法測試所得的性能,結(jié)果表明,加入單目深度估計模塊后,本文提出的CNNP-SVO算法在精度指標(biāo)上明顯優(yōu)于其他算法。表1還展示了不同算法在KITTI sequence 00和05上運行后得到的軌跡以及真實軌跡之間的對比。所有的算法在sequence 01上都運行失敗,這是由于場景中存在的大量自相似特征進(jìn)而產(chǎn)生了大量壞點。
表1 KITTI數(shù)據(jù)集上不同算法的平均絕對軌跡誤差對比Table 1 Comparison of localization accuracy on KITTI dataset
從圖7中可以看出,結(jié)合單目深度估計的CNN-P-SVO算法對真實軌跡跟蹤效果好。而去掉回環(huán)檢測的ORB-SLAM算法及DSO算法在軌跡對齊后出現(xiàn)了明顯的漂移。
本文的主要工作是解決長久以來單目VO的尺度不確定問題,之前的研究從理論的角度解釋了引入單目深度估計模塊克服尺度缺失的可行性,實驗結(jié)果證明所提出的算法可以解決此問題。本文將參與比較的每組VO的運行結(jié)果通過相似變換與真實軌跡對齊,這一過程中計算出的運行軌跡與真實軌跡間的尺度差距展示在表2中,CNN-PSVO算法尺度非常接近1,即非常接近真實軌跡,這表明它具有理想的尺度,這是由單目深度估計模塊提供的強先驗信息帶來的結(jié)果,因此本文提出的算法很好 地解決了傳統(tǒng)單目VO尺度不確定問題。
圖7 不同方法在KITTI sequence 00和05上運行得到的軌跡與真實軌跡之間的對比Fig.7 The estimated trajectories using different VO algorithms on KITTI Sequence 00,05
表2 不同方法在KITTI數(shù)據(jù)集上運行得到軌跡與真實軌跡之間尺度差異對比Table 2 Comparison of scale estimation on KITTI dataset
本文對單目深度估計以及半直接法VO進(jìn)行了研究,并將二者有機結(jié)合,提出了一種基于單目深度估計的VO算法,主要完成了以下研究工作:
(1) 使用基于圖像重建的無監(jiān)督學(xué)習(xí)算法從單張圖像中提取深度信息,將難以顯式建模的單張圖像與其深度圖之間的映射函數(shù)用神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)來近似。訓(xùn)練過程中使用雙目圖像,包含場景三維信息,因此在使用模型時,僅輸入單張圖像就可以獲取場景的絕對深度,克服了傳統(tǒng)深度傳感器在成本、質(zhì)量和功耗上的限制。之后針對本文VO系統(tǒng)的需求,對深度估計算法進(jìn)行調(diào)整,使其更好地融入到系統(tǒng)之中。
(2) 針對現(xiàn)有單目VO算法尺度不確定性的缺點,結(jié)合半直接法VO建圖線程中的深度濾波器模塊,用單目深度估計模塊輸出像素深度為深度濾波器提供濾波初值,再根據(jù)觀測更新濾波器直到收斂,從而補償深度估計的誤差,一方面解決了單目VO尺度不確定的固有缺點,另一方面加快濾波器收斂,提高了系統(tǒng)的魯棒性。
(3) 將提出的算法在公開的數(shù)據(jù)集上進(jìn)行了測試,并與目前最先進(jìn)的單目VO算法在軌跡誤差、尺度等指標(biāo)上分別進(jìn)行了對比,證明了所提出的算法對于解決尺度缺失問題是有效的,并且在精度上也遠(yuǎn)遠(yuǎn)優(yōu)于其他單目算法。