阮曉鋼,余鵬程,朱曉慶
(1.北京工業(yè)大學信息學部,北京 100124;2.計算智能與智能系統(tǒng)北京市重點實驗室,北京 100124)
視覺里程計[1](visual odometry,VO)解決同時定位和地圖構(gòu)建中的定位問題,主要用來求解相機在未知環(huán)境中的位姿并繪制出相機運動的軌跡.該技術(shù)被廣泛應用于無人駕駛、機器人、潛航器等系統(tǒng),是繼慣性導航、車輪里程計等定位技術(shù)之后的一種新的導航技術(shù).視覺里程計利用相機捕獲連續(xù)運動時間內(nèi)的圖片序列,然后通過算法計算出相鄰圖片間的運動關(guān)系,最終輸出相機的相對姿態(tài),其中包括旋轉(zhuǎn)和平移信息,這一過程也被稱為視覺位姿估計[2].
視覺里程計的早期研究是針對火星探索計劃進行的,2004年Nister等提出并搭建了最早的VO系統(tǒng),為后續(xù)的VO系統(tǒng)的研究提供了優(yōu)秀的范例和參考.視覺里程計可以分為單目、雙目和深度(RGB-D)相機視覺里程計.根據(jù)采用的求解方法又可以劃分為基于間接法[3-4]和直接法[5-6]的視覺里程計.間接方法在連續(xù)幀的匹配特征之間執(zhí)行幾何變換來計算相機運動的大致位姿,然后通過局部或全局的光束平差法(bundle adjustment,BA)進行位姿優(yōu)化.其中基于特征法的位姿估計充分利用了圖片的幾何信息,主要包含特征提取、特征匹配、誤匹配剔除和運動估計等步驟.而基于直接法的位姿估計使用了圖片的光度信息,直接通過計算像素值來估計相機的運動.但這些系統(tǒng)都存在一定的問題,直接法是基于相鄰圖片之間的灰度不變假設(shè),然后再求解位姿,這種假設(shè)在面對光照變化明顯的場景時難以成立,而特征點法只適用于具有明顯特征的場景,當面對紋理單一、存在動態(tài)物體的場景時,難以提取有效的特征.
深度學習(deep learning)被廣泛應用于目標檢測、目標追蹤等諸多計算機視覺領(lǐng)域[7-8].將其應用到同步定位與建圖領(lǐng)域(simultaneous location and mapping,SLAM)也是目前國內(nèi)外研究的趨勢.Roberts等[9]將每個圖片幀劃分為網(wǎng)格單元并計算每個單元的光流,然后使用K近鄰(K-nearest neighbors,KNN)算法來估計當前位姿的變化.隨后一些研究人員提出通過卷積神經(jīng)網(wǎng)絡(luò)(conventional neural network,CNN)從光流圖片序列中估計相機運動位姿[10],例如PCNN VO[11]、Flow-odometry[12]、LS-V[13]等.CNN可以自動對圖片進行不同尺度的特征提取,省去了傳統(tǒng)方法中煩瑣的特征提取過程.但是,由于VO需要考慮連續(xù)圖片序列之間的相關(guān)信息,需要處理和發(fā)現(xiàn)圖片之間更多的低層幾何變換信息,而長短時記憶(long short-term memory,LSTM)網(wǎng)絡(luò)能實現(xiàn)這種時序上的關(guān)聯(lián).綜上所述,本文放棄傳統(tǒng)復雜且基于一定條件的系統(tǒng)設(shè)計,采用深度學習構(gòu)建端到端的模型,提出了一種融合注意力、卷積和長短時記憶網(wǎng)絡(luò)的視覺里程計ALC-VO(attention LSTM CNN-visual odometry).注意力機制能提高系統(tǒng)的特征提取能力,在CNN基礎(chǔ)上增加通道注意力和空間注意力處理圖片,學習圖片中的運動特征,而不是具體的語義信息.而且視覺里程計本身是一種時序上對相機的位姿估計,通過LSTM自動學習圖片間的關(guān)聯(lián),能夠利用歷史信息完成對當前位姿的有效估計.為了充分利用已有的數(shù)據(jù),將圖片進行正序的訓練,還將圖片的逆序投入到神經(jīng)網(wǎng)絡(luò)中進行訓練.
在公開數(shù)據(jù)集KITTI上進行實驗,結(jié)果證明本文方法在位姿估計精度上優(yōu)于傳統(tǒng)的單目視覺里程計算法.論文的具體結(jié)構(gòu)如下:第1部分主要介紹本文所提出的模型.第2部分給出了模型在無人駕駛KITTI數(shù)據(jù)集下的實驗結(jié)果與分析.第3部分得出結(jié)論,并對下一階段的工作進行展望.
本文構(gòu)建的視覺里程計模型ALC-VO的詳細結(jié)構(gòu)如圖1所示,ALC-VO結(jié)合CNN層、ATTENTION層、LSTM層,以圖片序列為輸入,首先使用融合了注意力機制的CNN提取相鄰圖片間的局部特征,然后利用LSTM時序建模,最后通過全連接層輸出相機的相對位姿信息.同時采用圖2的鏡像網(wǎng)絡(luò),對模型進行正向和逆向的訓練,正向和逆向的區(qū)別在于圖片輸入的順序是否相反,在正常測試及驗證模型的時候則不需要鏡像網(wǎng)絡(luò).
圖1 基于ALC-VO的視覺里程計模型Fig.1 Visual odometry based on ALC-VO
圖2 基礎(chǔ)框架Fig.2 Basic framework
目前已經(jīng)有很多網(wǎng)絡(luò)能獲取圖片的語義信息,如VGG Net、Google Net等,然而它們主要用于分類或者目標檢測等相關(guān)任務(wù).而相機位姿估計與圖片分類任務(wù)區(qū)別很大,首先圖片分類每次只需要提取一張圖片的特征,而視覺里程計是通過2張圖片來計算出相機的位姿,更依賴圖片之間的幾何特征信息,屬于深度學習中的回歸問題.因此,采用諸如VGG Net結(jié)構(gòu)來解決視覺里程計問題并不是最優(yōu)選擇.而光流可以表示相鄰時刻圖片間的運動關(guān)系,所以本文參照了光流神經(jīng)網(wǎng)絡(luò)模型Flow-Net,通過修改Flow-Net的子網(wǎng)絡(luò)FlowNetSimple構(gòu)建了ALC-VO中的CNN部分,用于提取圖片運動特征.
網(wǎng)絡(luò)的輸入為相鄰2幀的圖片,2張圖片均為數(shù)據(jù)集中的原始RGB圖片,為了適應本文所提出的網(wǎng)絡(luò),將圖片大小修改為1 280×384,并將2張圖片進行第3維度上的串聯(lián),組成第3維度為6的數(shù)據(jù)并輸入到網(wǎng)絡(luò)中.逐層學習圖片運動特征的過程中,在每個卷積層之后添加批量歸一化(batch normalization)[14],使得卷積變換前后數(shù)據(jù)分布保持不變.完成相鄰圖片間的運動特征學習后,將最后一個卷積層輸出的特征圖輸入到后面的LSTM.CNN的各層參數(shù)如表1所示.該CNN模型總共包含8個卷積層,其中第1個卷積層的卷積核大小為7×7,第2~4層的卷積核大小減小為5×5,后面4層的卷積核大小再次縮小到3×3.
表1 CNN的各層參數(shù)Table 1 Parameters of each layer of CNN
LSTM網(wǎng)絡(luò)十分適合處理時序數(shù)據(jù)問題,可以在計算下一時刻相鄰圖片間的運動關(guān)系時,提供之前時刻保留的位姿信息.因為是圖片數(shù)據(jù),所以使用了卷積長短時記憶網(wǎng)絡(luò)ConvLSTM[15].ConvLSTM在LSTM結(jié)構(gòu)的基礎(chǔ)上進行了改進,將權(quán)重與輸入層的全連接方式改為局部連接,通過卷積運算可以更好地學習圖片的空間特征.
假設(shè)當前時刻為t,輸入為Xt和上一時刻的隱藏狀態(tài)Ht-1,則ConvLSTM輸出及狀態(tài)更新的計算式[15]為
it=σ(Wxi*Xt+Whi*Ht-1+Wci°Ct-1+bi)
ft=σ(Wxf*Xt+Whf*Ht-1+Wcf°Ct-1+bf)
Ct=ft°Ct-1+it°tanh (Wxc*Xt+Whc*Ht-1+bc)
ot=σ(Wxo*Xt+Who*Ht-1+Wco°Ct+bo)
Ht=ot°tanhCt
(1)
式中:σ為sigmoid激活函數(shù);*為卷積運算;°為2個矩陣或向量對應元素相乘,稱為Hadamard乘積;it、ft、Ct、ot、Ht均為三維張量,其中1個維度是時間,其余2個分別是圖像的長、寬.
ALC-VO中LSTM結(jié)構(gòu)由2個ConvLSTM疊加構(gòu)成,每個ConvLSTM層包含1 024個隱藏單元,卷積核大小為3×3.其中第1個ConvLSTM層連接在卷積層conv_8之后,第2個ConvLSTM層連接在第1個ConvLSTM層之后,其輸入為第1個ConvLSTM層的隱藏狀態(tài)ht.為了保持原始的數(shù)據(jù)分布,2個ConvLSTM層中使用的激活函數(shù)為ReLU.ALC-VO在第2個ConvLSTM層之后添加了2個全連接層,神經(jīng)元個數(shù)分別為128和6,其中最后1個全連接層的輸出為ALC-VO估計的相機相對位姿.
注意力模塊可嵌入到卷積神經(jīng)網(wǎng)絡(luò)中進行一種簡單而又有效的注意力機制部署.其主要包含通道注意力模塊及空間注意力模塊.通過使用注意力機制來增強網(wǎng)絡(luò)架構(gòu)的表達力,進一步表征出圖片之間的幾何關(guān)系變換,使得網(wǎng)絡(luò)能夠更加智能地學習到更重要的特征同時關(guān)注那些特征區(qū)域,并且減少學習一些不重要的特征,這也是注意力機制的本質(zhì)所在,并將基于卷積的注意力模塊集成到CNN 網(wǎng)絡(luò)架構(gòu)中進行端到端的訓練.其基本結(jié)構(gòu)如圖3所示.主要對特征進行2個操作,公式為
圖3 注意力模型Fig.3 Attention model
F′=σ(MLP(AP(F))+MLP(MP(F)))⊙F
F″=σ(f7×7[AP(F′),MP(F′)])⊙F′
(2)
可以把視覺里程計估計問題看成一個條件概率問題,給定一個序列的n+1張圖片:
X=(X1,X2,…,Xn+1)
(3)
計算得到該序列中兩兩相鄰的圖片之間的姿態(tài):
Y=(Y1,Y2,…,Yn)
(4)
VO估計問題看成一個條件概率問題,在給定圖片序列的情況下,計算位姿的概率表示為
p(Y|X)=p(Y1,Y2,…,Yn|X1,X2,…,Xn+1)
(5)
這里要解決的問題就是求解最優(yōu)的網(wǎng)絡(luò)參數(shù)w*使得式(5)中的概率最大化.式(5)表示在給定圖片序列(Y1,Y2,…,Yn)的情況下,估計相機的位置和姿態(tài)(X1,X2,…,Xn+1)是對整個視覺里程計任務(wù)的數(shù)學描述.而在公式
(6)
中增加網(wǎng)絡(luò)參數(shù)w,是用神經(jīng)網(wǎng)絡(luò)處理視覺里程計這個任務(wù)的數(shù)學描述.在給定圖片序列(Y1,Y2,…,Yn)情況下,不同網(wǎng)絡(luò)參數(shù)來估計位姿(X1,X2,…,Xn+1)會有不同的概率值.優(yōu)化算法需要尋找使其估計概率最大這一情況下的網(wǎng)絡(luò)參數(shù)值,這代表整個網(wǎng)絡(luò)達到最優(yōu)狀態(tài).
圖2中左半部分和右半部的網(wǎng)絡(luò)結(jié)構(gòu)完全對稱,圖片序列按照時間順序依次經(jīng)過CNN層、LSTM層以及FCN層,輸出相鄰兩幀之間的相對姿態(tài).右半部分和左半部分完全對稱,只是圖片序列采用逆序輸入的方式,得到的輸出也代表相鄰兩幀圖片之間的相對姿態(tài),不過是上一幀相對于當前幀的相對姿態(tài).誤差為所有輸出姿態(tài)的均方誤差,表示為
(7)
本實驗采用顯卡Nvidia GeForce 2080ti來訓練和測試模型,CPU為Intel至強E5-2673-V3.在深度學習框架Pytorch下進行相關(guān)算法的設(shè)計.使用Adam(adaptive moment estimation)優(yōu)化器進行100 個epoch 的訓練,并將學習率設(shè)置為10×10-2,同時引入 Dropout 和 Early Stopping 技術(shù)來防止模型過擬合.神經(jīng)網(wǎng)絡(luò)輸入預處理圖片的大小為1 280×384,訓練時采用2塊上述GPU進行同時訓練,訓練1個epoch需要0.1 h左右.
KITTI Visual Odometry[16]是Geiger等開源的汽車駕駛數(shù)據(jù)集.可廣泛用于評估各種VO或者SLAM算法.KITTI數(shù)據(jù)集前11個序列信息如表2所示.
KITTI VO benchmark共包含有22個場景圖片,每個場景都包含有雙目攝像機拍攝的一系列的圖片.不過本文只使用雙目數(shù)據(jù)集中的單目圖片.其中序列00—03的圖片尺寸為1 241×376,序列04—10的圖片尺寸1 226×370,為了符合網(wǎng)絡(luò)對輸入數(shù)據(jù)的要求,將所有圖片的尺寸調(diào)整為1 280×384.22個序列中只有前11個序列提供了每個圖片對應的真實姿態(tài)數(shù)據(jù),部分場景中含有動態(tài)移動的物體以及明暗的顯著變換,部分場景中汽車行駛速度高達90 km/h.總體信息如表2所示.
表2 KITTI 數(shù)據(jù)集中序列00-10信息Table 2 Information of sequences 00-10 in KITTI
考慮到訓練集和驗證集的圖片種類劃分,本文使用08以前的序列對ALC-VO模型進行訓練,并選擇一定數(shù)量的數(shù)據(jù)進行驗證,然后使用08、09、10序列對ALC-VO模型進行測試.訓練集和驗證集的所有圖片均由雙目相機中的左相機所采集.
首先,將討論影響模型的超參數(shù)學習率η,Loss曲線如圖4所示.本實驗中η被設(shè)置為[0.40,0.20,0.10,0.05,0.01],Loss曲線剛開始下降得很快,后面就是震蕩和隨機抖動;最終使用η=0.40 Loss曲線震蕩得非常明顯,這樣的參數(shù)沒辦法使得網(wǎng)絡(luò)獲得較好的性能.同樣如果η值太小(如0.01),那么收斂速度可能會太慢,需要更長的時間來得到較好的網(wǎng)絡(luò)參數(shù).
圖4 不同學習率下的Loss變化Fig.4 Loss with different learning rates
將訓練好的ALC-VO模型在測試集序列08、09、10上進行測試,并與其他先進的VO系統(tǒng)進行比較,通過 KITTI VO/SLAM官方的評價方式進行評測:路徑長度為100~800 m,而且汽車速度不相同(不同場景中汽車的速度不相同),評價指標為平移誤差和旋轉(zhuǎn)誤差的均方根誤差(RMSE).在誤差中t為平移誤差百分比,r為旋轉(zhuǎn)誤差,分別表示為
(8)
(9)
式中:st為地面真實的軌跡總長度;sp為里程計預測的軌跡總長度;Rerror為總的旋轉(zhuǎn)誤差.
不同算法在測試集上的具體表現(xiàn)如表3所示,表中各序列的位姿定量評價指標為不同路徑長度的平均平移誤差和平均旋轉(zhuǎn)誤差.實驗結(jié)果表明,本文算法要優(yōu)于PCNN-VO、VISO2-Mono[17]、SVR-VO[18]、FLOW-VO、Zhou等[19]、Deep-VO-Feat[20]、CC[21]、SC-SFM Learner[22]算法,證明了本文模型的可行性.基于光流的FLOW-VO也有良好的表現(xiàn),這表明在運動估計中,基于神經(jīng)網(wǎng)絡(luò)的光流方法可行,用光流來表征圖片的運動特征是一種較優(yōu)的選擇.
VISO2-S-VO與VISO2-M-VO均為采用傳統(tǒng)方式求解 VO的算法,兩者不同之處在于VISO2-M-VO為單目算法,VISO2-S-VO為雙目算法.為了對比傳統(tǒng)方法的實驗效果,將VISO2-S-VO與VISO2-M-VO在KITTI數(shù)據(jù)集的場景中進行測試.如圖5所示,即為本文方法所估計的VO在不同路徑長度和速度下的平移和旋轉(zhuǎn)角度的平均RMSE.可以看到本文所提出的方法比VISO2-M單目VO的效果要好,但是比VISO2-S-VO的定位精度要低.從整體來看,除了雙目的VISO2-S-VO,本文的模型都優(yōu)于其余的單目算法.但隨著相機運動速度的增加,ALC-VO的誤差有增大的趨勢,原因主要是訓練集中缺少運動速度較快的樣本,因此網(wǎng)絡(luò)在預測高速運動下平移和旋轉(zhuǎn)信息時相對來說誤差偏大.
圖5 不同算法在4種指標下的誤差Fig.5 Errors of different algorithms based on four indices
為了更好地進行定性分析,將ALC-VO、VISO2-S-VO、VISO2-M-VO、PCNN-VO、FLOW-VO 、SVR-VO在序列09、10上估計的運動軌跡進行了可視化處理,如圖6所示.圖中由真實位姿數(shù)據(jù)產(chǎn)生的軌跡作為測量標準.可以看出5種算法大致上都恢復出了真實運動軌跡的形狀,而ALC-VO模型估計的軌跡要優(yōu)于VISO2-M-VO、PCNN-VO、FLOW-VO、SVR-VO,更接近于真實軌跡.但是ALC-VO的精度要略低于VISO2-S-VO.原因一,VISO2-S-VO是雙目算法,VISO2-S-VO可以通過左目相機和右目相機拍攝的2幅圖片獲取尺度信息,從而位姿估計更加準確;原因二,ALC-VO的訓練樣本不夠多,沒有達到網(wǎng)絡(luò)最優(yōu)的狀態(tài).
圖6 不同算法在序列09、10上生成的運動軌跡Fig.6 Motion trajectories generated by different algorithms on sequence 09 and 10
另外,本文還在序列11、12上對ALC-VO模型行了測試,序列11、12沒有提供真實位姿數(shù)據(jù),且相機的速度也快于前面的序列,因此相鄰圖片間的相機運動幅度更加大,這將十分考驗算法的性能.圖7展示了不同算法估計的運動軌跡的可視化結(jié)果,因為缺少真實數(shù)據(jù),所以使用VISO2-M-VO、VISO2-S-VO的運算結(jié)果與本文算法進行對比,并將VISO2-S-VO作為參考.從圖7中可以看出相較于VISO2-M-VO方法,ALC-VO的運動軌跡更接近于VISO2-S-VO,這展現(xiàn)出了本文提出的模型有較好的泛化能力.
圖7 不同算法在序列11、12上生成的運動軌跡Fig.7 Motion trajectories generated by different algorithms on sequence 11 and 12
另外,為了驗證注意力結(jié)構(gòu)和LSTM網(wǎng)絡(luò)結(jié)構(gòu)對算法的提升效果,本文在KITTI數(shù)據(jù)集中進行了不同模塊的訓練以及測試.實驗結(jié)果如表4所示,CNN算法的平移誤差為12.32%,旋轉(zhuǎn)誤差為0.046 0°/m,將注意力結(jié)構(gòu)單獨嵌入到CNN中,平移誤差降低至8.25%,旋轉(zhuǎn)誤差降低至0.035 0°/m,驗證了LSTM結(jié)構(gòu)的有效性.將LSTM結(jié)構(gòu)單獨嵌入到CNN算法中,平移誤差降低至8.83%,旋轉(zhuǎn)誤差降低至0.037 0°/m,驗證了本文提出算法整體結(jié)構(gòu)的有效性.將2個結(jié)構(gòu)同時嵌入到CNN算法中,平移誤差降低至7.63%,旋轉(zhuǎn)誤差降低至0.028 1°/m,驗證了本文算法的有效性.
表4 不同網(wǎng)絡(luò)結(jié)構(gòu)的誤差結(jié)果Table 4 Error results of different network structures
最后,檢測算法所消耗的時間,本文對不同算法進行了對比,具體內(nèi)容如表5所示.從整體上看本文算法所消耗的時間低于SVR-VO和PCNN-VO,但是高于FLOW-VO.在特征提取的環(huán)節(jié)本文參考了FLOW-VO的網(wǎng)絡(luò)結(jié)構(gòu),同時本文模型增加注意力模塊及長短時記憶網(wǎng)絡(luò),從而增加了算法的計算量,導致計算時間的增加.通過定量分析,ALC-VO較FLOW-VO在精度上提高了33.2%,同時時間上增加了25.7%.
表5 不同方法的時間對比結(jié)果Table 5 Time comparison results of different methods
1)本文提出了一種基于注意力和LSTM時序建模的單目視覺里程計算法,通過融合CNN、注意力、LSTM構(gòu)建整體的網(wǎng)絡(luò),并利用一個對稱的鏡像網(wǎng)絡(luò),使其能夠?qū)W習圖片之間的深層的幾何運動信息.
2)所提出的算法相較于傳統(tǒng)的視覺里程計算法,具有更好的準確性,同時摒棄了相機標定特征提取特征匹配等復雜過程,在不同場景下更易于實現(xiàn),具有較高的穩(wěn)定性.
3)與其他算法相比,本文算法不僅對視角和光線變化更魯棒,而且在位姿估計誤差的精度方面有顯著的提升.不足之處是,所提出的網(wǎng)絡(luò)模型有較多參數(shù),時間復雜度并非最優(yōu).因此,未來的工作將通過知識蒸餾的方式減少網(wǎng)絡(luò)參數(shù),對本文算法的運行速度進行優(yōu)化.