王亞群,戴華林,王 麗,李國(guó)燕
(天津城建大學(xué)計(jì)算機(jī)與信息工程學(xué)院,天津 300384)
近年來(lái),隨著計(jì)算機(jī)技術(shù)的發(fā)展,各種人工智能產(chǎn)品層出不窮,如無(wú)人駕駛汽車[1]、智能家居、智能機(jī)器人[2]、醫(yī)學(xué)成像[3]等。這些人工智能產(chǎn)品為了能夠更好地感知周圍環(huán)境,必須要對(duì)所接收的圖像進(jìn)行深度估計(jì)。
傳統(tǒng)圖像深度估計(jì)方法主要分為兩類:一類通過(guò)硬件設(shè)備測(cè)量得到圖像深度,現(xiàn)在市場(chǎng)上推出了各種用于感知3D 場(chǎng)景的傳感器,如激光雷達(dá)、Kinect硬件設(shè)備等,然而它們?cè)趹?yīng)用過(guò)程中存在成本高、受限多、捕獲的深度圖像分辨率低等問(wèn)題,導(dǎo)致無(wú)法被廣泛推廣使用;另一類是基于圖像處理的深度估計(jì)方法,該類方法根據(jù)視覺(jué)傳感器數(shù)量的多少分為單目視覺(jué)系統(tǒng)和多目視覺(jué)系統(tǒng),實(shí)際應(yīng)用中大多使用雙目或多目方法來(lái)獲取深度信息,如利用三角測(cè)量法[2]轉(zhuǎn)化2 幅圖像之間的視差關(guān)系為深度信息,但這類方法易受外界因素的影響,難以獲取高質(zhì)量的視差圖。為解決該問(wèn)題,學(xué)者們開始研究如何利用深度學(xué)習(xí)的方法從單幅圖像中估計(jì)場(chǎng)景深度信息,相比雙目或多目視覺(jué)系統(tǒng),通過(guò)單目視覺(jué)來(lái)進(jìn)行圖像深度估計(jì)具有成本低、應(yīng)用靈活方便的優(yōu)點(diǎn),且現(xiàn)實(shí)生活中提供的數(shù)據(jù)信息多為單視點(diǎn)數(shù)據(jù)[4-6]。但是,從單幅圖像估計(jì)場(chǎng)景深度具有一定的模糊性,導(dǎo)致通過(guò)單目圖像來(lái)估計(jì)深度信息難度較高。
在基于深度學(xué)習(xí)的單目圖像深度估計(jì)研究過(guò)程中,EIGEN 等[7]將深度估計(jì)、表面法線預(yù)測(cè)和語(yǔ)義標(biāo)注3 個(gè)任務(wù)統(tǒng)一在一個(gè)三級(jí)神經(jīng)網(wǎng)絡(luò)中,并將結(jié)果的分辨率降為輸入圖像的一半。LIU 等[8]將CNN 與條件隨機(jī)場(chǎng)(Conditional Random Filed,CRF)相結(jié)合,提出一個(gè)兩步框架:用深度網(wǎng)絡(luò)提取深度特征,用CRF 進(jìn)行深度信息優(yōu)化。但上述2 種方法都沒(méi)有實(shí)現(xiàn)端到端的訓(xùn)練,需要分布進(jìn)行。LAINA 等[9]采用ResNet-50 殘差網(wǎng)絡(luò)并用小卷積代替大卷積來(lái)實(shí)現(xiàn)上采樣,同時(shí)提出一種新的損失函數(shù),其能得到更好的估計(jì)結(jié)果。
TEED 等[10]針對(duì)視頻中單眼深度估計(jì)的問(wèn)題,提出一種DeepV2D 方法,其在端到端架構(gòu)中結(jié)合2 種經(jīng)典算法。DeepV2D 網(wǎng)絡(luò)包括深度估計(jì)模塊和攝像機(jī)運(yùn)動(dòng)模塊,深度估計(jì)模塊將攝像機(jī)運(yùn)動(dòng)作為輸入并返回初始深度圖,攝像機(jī)運(yùn)動(dòng)模塊獲取預(yù)測(cè)深度并輸出精確的攝像機(jī)運(yùn)動(dòng)。此外,網(wǎng)絡(luò)在這2 個(gè)模塊之間交替運(yùn)行以預(yù)測(cè)最終的深度圖。GODARD 等[11]提出一種自我監(jiān)督方法,使用完全連接的U-Net 并利用位姿網(wǎng)絡(luò)來(lái)估計(jì)圖像對(duì)之間的位姿,使用外觀匹配損失解決像素遮擋問(wèn)題,利用自動(dòng)遮蔽方法忽略在訓(xùn)練過(guò)程中沒(méi)有相對(duì)移動(dòng)的像素點(diǎn)。YIN 等[12]提出一種利用3D幾何約束來(lái)估計(jì)深度圖的監(jiān)督框架,其直接利用深度圖估計(jì)場(chǎng)景和表面法線來(lái)重建3D 結(jié)構(gòu),在重建的三維空間中隨機(jī)抽取3 個(gè)點(diǎn)確定的虛擬法向,從而顯著提高深度預(yù)測(cè)精度,該方法深度圖魯棒性強(qiáng)且具有強(qiáng)大的全局約束。LEE 等[13]在網(wǎng)絡(luò)結(jié)構(gòu)解碼階段插入局部平面指導(dǎo)層,將各層的輸出串接到最后的卷積層中,得到深度圖。TOSI 等[14]提出一種自我監(jiān)督的框架,使用端對(duì)端的單眼殘差匹配來(lái)估計(jì)深度圖,利用結(jié)構(gòu)相似性重建損失,其利用具有邊緣感知項(xiàng)的視差平滑度損失和反向Huber損失來(lái)訓(xùn)練網(wǎng)絡(luò)。GUIZILINI等[15]將有監(jiān)督和自監(jiān)督2種方法相結(jié)合,提出一個(gè)新的有監(jiān)督損失項(xiàng),利用該損失項(xiàng)來(lái)訓(xùn)練魯棒的半監(jiān)督單目深度估計(jì)模型。
目前,在單目圖像深度估計(jì)的各項(xiàng)研究過(guò)程中,隨著網(wǎng)絡(luò)層數(shù)的不斷加深,感受野越來(lái)越小,雖然能夠提高網(wǎng)絡(luò)分類的準(zhǔn)確性,但是網(wǎng)絡(luò)的訓(xùn)練越來(lái)越困難,同時(shí)所預(yù)測(cè)出的深度圖存在深度信息不準(zhǔn)確、誤差偏大等問(wèn)題。為了解決以上問(wèn)題,本文提出一種基于密集卷積網(wǎng)絡(luò)的單目圖像深度估計(jì)方法。編碼器采用密集卷積網(wǎng)絡(luò)(DenseNet)[16],每一層都與其之前的所有層進(jìn)行連接,前面所有層的輸出都作為這一層的輸入,從而實(shí)現(xiàn)特征重用,減少參數(shù),同時(shí)防止梯度消失問(wèn)題發(fā)生。解碼器采用上投影模塊和雙線性插值模塊來(lái)放大特征圖,上投影模塊引入空洞卷積[17],在不增加參數(shù)量的條件下其比標(biāo)準(zhǔn)卷積擁有更大的感受野,從而避免信息丟失,使得高層次的特征信息能夠更有效地傳播,并逐步提高特征圖的分辨率,最終適應(yīng)網(wǎng)絡(luò)的輸出。
本文提出一種密集卷積的編解碼網(wǎng)絡(luò)結(jié)構(gòu),以對(duì)單目圖像進(jìn)行深度估計(jì)。編碼層使用DenseNet 網(wǎng)絡(luò)對(duì)輸入的圖像進(jìn)行特征提取,解碼層結(jié)構(gòu)采用加入了空洞卷積的上投影模塊對(duì)編碼層提取的特征進(jìn)行上采樣,從而解決因網(wǎng)絡(luò)加深而引起的梯度消失問(wèn)題,同時(shí)提高精度,簡(jiǎn)化網(wǎng)絡(luò)結(jié)構(gòu),降低網(wǎng)絡(luò)復(fù)雜度。深度估計(jì)網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示。
圖1 深度估計(jì)網(wǎng)絡(luò)結(jié)構(gòu)Fig.1 Depth estimation network structure
目前,在針對(duì)圖像深度估計(jì)的研究中,編碼器結(jié)構(gòu)大多采用ResNet 網(wǎng)絡(luò)[18],因?yàn)槠涮S連接的結(jié)構(gòu)特點(diǎn),可以在一定程度上解決梯度消失和網(wǎng)絡(luò)退化問(wèn)題,但是,ResNet 網(wǎng)絡(luò)在運(yùn)行過(guò)程中易產(chǎn)生大量冗余且每一層學(xué)習(xí)的特征信息較少,在實(shí)際應(yīng)用場(chǎng)景中成本較高。DenseNet 網(wǎng)絡(luò)使用密集連接,能夠使每一層互相連接。傳統(tǒng)的N層卷積網(wǎng)絡(luò)在每層及其后續(xù)層之間有N個(gè)連接,而DenseNet 網(wǎng)絡(luò)有(N×(N?1)/2)個(gè)連接,這種連接方式稱為密集連接。DenseNet 網(wǎng)絡(luò)的非線性變換方程如式(1)所示:
其中:Hl代表非線性轉(zhuǎn)化函數(shù),是一個(gè)組合操作,其可能包括一系列的批標(biāo)準(zhǔn)化(Batch Normalization,BN)[19]、線性整流函數(shù)(Rectified Linear Unit,ReLU)、池化(Pooling)、卷積(Conv)操作。l層與(l-1)層之間可能包含多個(gè)卷積層。
DenseNet網(wǎng)絡(luò)包括卷積層、密集連接塊(Denseblock)、過(guò)渡層(Translayer)、全連接層。
Denseblock 是一個(gè)緊密連接的模塊,結(jié)構(gòu)如圖2所示。在這個(gè)模塊內(nèi),每一層的輸入來(lái)自于這個(gè)模塊內(nèi)這一層之前所有層的輸出,一個(gè)密集連接塊包含BN、ReLU、Conv、Dropout[20]操作,是DenseNet 的重要結(jié)構(gòu)。本文在每個(gè)密集連接塊中3×3 卷積的前面都加入一個(gè)1×1 的卷積操作,稱為瓶頸層(Bottenlayer)。原始的密集連接模塊BN+ReLU+Conv(3×3)+Dropout 如圖3(a)所示,加入1×1 卷積之后的密集連接模塊表示為BN+ReLU+Conv(1×1)+Dropout+BN+ReLU+Conv(3×3)+Dropout,如圖3(b)所示。
圖2 密集連接塊結(jié)構(gòu)Fig.2 Denseblock structure
圖3 不同的卷積層結(jié)構(gòu)Fig.3 Different convolutional layer structures
過(guò)渡層由1×1卷積層和2×2平均池化層構(gòu)成,如圖4所示,其負(fù)責(zé)連接相鄰的密集連接塊,對(duì)其輸出執(zhí)行BN、ReLU、Dropout、Pooling 等處理。過(guò)渡層中壓縮系數(shù)的參數(shù)θ∈(0,1),當(dāng)θ=1 時(shí),特征圖的數(shù)量保持不變。本文實(shí)驗(yàn)將θ參數(shù)設(shè)置為0.5,使傳遞到下一個(gè)密集連接塊的通道數(shù)減半,這樣可以在不影響準(zhǔn)確率的情況下降低網(wǎng)絡(luò)復(fù)雜度,提高計(jì)算效率,加快網(wǎng)絡(luò)模型的收斂。
圖4 過(guò)渡層結(jié)構(gòu)Fig.4 Translayer structure
本文采用的DenseNet 包含4 個(gè)密集連接塊和3 個(gè)過(guò)渡層,同時(shí)在DenseNet 原有網(wǎng)絡(luò)的基礎(chǔ)上去除了末尾的全局平均池化層和用于分類的全連接層,直接輸出圖像作為解碼器模塊的輸入,如圖1 中Encoder 模塊所示。網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)如表1 所示,其中,Conv 代表BN-ReLU-Conv。
表1 Encoder 網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)Table 1 Encoder network structure parameters
解碼器的主要作用是表達(dá)編碼器所提取到的圖像特征,得到與輸入圖像相對(duì)應(yīng)的深度圖,從而實(shí)現(xiàn)端對(duì)端訓(xùn)練。目前主要通過(guò)上采樣(Up-sampling)、上池化(Un-pooling)、反卷積(Deconvolution)3 種方法[21]來(lái)實(shí)現(xiàn)這一過(guò)程。
本文采用的解碼器結(jié)構(gòu)屬于上采樣的一種,其包括4 個(gè)帶有空洞卷積的上投影模塊(Up-projection),上投影模塊是在標(biāo)準(zhǔn)上卷積模塊的基礎(chǔ)上進(jìn)行的改進(jìn)。標(biāo)準(zhǔn)上卷積模塊如圖5 所示,首先經(jīng)過(guò)一個(gè)2×2的上池化層,進(jìn)行最大池化的反向操作,除最大值位置外其他位置補(bǔ)零,使得特征圖擴(kuò)大一倍;然后經(jīng)過(guò)卷積核為5×5 的卷積操作,并進(jìn)行ReLU 函數(shù)激活。本文采用的上投影模塊結(jié)構(gòu)如圖6 所示,包括2 個(gè)擴(kuò)張率(dilatation)為1 的5×5 空洞卷積[22]和3×3 卷積操作。在相同的計(jì)算條件下,使用空洞卷積能夠提供更大的感受野,使得每次輸出的內(nèi)容保留更多的特征,減少信息丟失。上投影模塊的連接使高級(jí)信息在網(wǎng)絡(luò)中更有效地向前傳遞,同時(shí)逐步增加了特征圖的大小。
圖5 上卷積模塊結(jié)構(gòu)Fig.5 Up-convolution module structure
圖6 上投影模塊結(jié)構(gòu)Fig.6 Up-projection module structure
本文在4 個(gè)帶有空洞卷積的上投影模塊后采用3×3 的卷積操作以實(shí)現(xiàn)降維,然后采用雙線性插值操作輸出預(yù)測(cè)深度圖。雙線性插值的計(jì)算方法為:假設(shè)已知函數(shù)f在Q11=(x1,y1)、Q12=(x1,y2)、Q21=(x2,y1)、Q22=(x2,y2) 4 個(gè)點(diǎn)的 值,首先在x方向進(jìn) 行線性插值,當(dāng)R1=(x,y1),有:
損失函數(shù)的選擇對(duì)優(yōu)化網(wǎng)絡(luò)模型具有重要意義。本文采用Berhu 損失函數(shù)對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,Berhu 損失函數(shù)如式(6)所示:
以c值作為界限,在c點(diǎn)的值是連續(xù)且一階可微的。當(dāng)x∈[ -c,c]時(shí),Berhu 損失保證預(yù)測(cè)值與真實(shí)值相近時(shí)也能保持一定的梯度下降速度,從而獲得更好的收斂性能;在x大于c時(shí)保證梯度迅速下降。設(shè)置能夠取得最好的訓(xùn)練效果。
NYU Depth V2 是常用的室內(nèi)深度預(yù)測(cè)圖數(shù)據(jù)集,其原始數(shù)據(jù)集圖像尺寸均為640 像素×480 像素,涵蓋了464 個(gè)場(chǎng)景,這些場(chǎng)景均為微軟公司采用Kinect相機(jī)采集的視頻幀序列,包含RGB 圖像及深度圖。其中,訓(xùn)練場(chǎng)景為249 個(gè),測(cè)試場(chǎng)景為215 個(gè)。因?yàn)橛?xùn)練集的數(shù)據(jù)量太少,所以需要對(duì)采樣所得的數(shù)據(jù)通過(guò)左右翻轉(zhuǎn)、顏色變換、尺度變換的方法進(jìn)行擴(kuò)充。
本文使用雙線性插值將圖像從原始大小640像素×480 像素降采樣為320 像素×240 像素,然后裁剪其中心部分以獲得304像素×228像素的圖像。為了進(jìn)行訓(xùn)練,深度圖會(huì)下采樣為152像素×114像素以適合網(wǎng)絡(luò)輸出。
實(shí)驗(yàn)硬件配置為Intel?CoreTMi7-7700CPU@3.60 GHz 處理器,模型在16 GB 內(nèi)存的NVIDIA Tesla K20M GPU 上進(jìn)行訓(xùn)練。網(wǎng)絡(luò)訓(xùn)練是基于RGB 圖像的輸入,用對(duì)應(yīng)的真實(shí)深度進(jìn)行訓(xùn)練。實(shí)驗(yàn)將批處理大?。╞atch size)設(shè)置為8,最大迭代次數(shù)(max epoch)設(shè)置為1 000,初始學(xué)習(xí)率(learing rate)設(shè)置為0.001,隨著迭代的增加,學(xué)習(xí)率會(huì)逐漸減小,直到網(wǎng)絡(luò)收斂。
在對(duì)圖像深度進(jìn)行預(yù)測(cè)時(shí),為了評(píng)估預(yù)測(cè)深度與真實(shí)深度之間的差異,通常采用以下的評(píng)價(jià)指標(biāo)進(jìn)行判斷:
本文通過(guò)3 個(gè)對(duì)比實(shí)驗(yàn),分別驗(yàn)證選擇Berhu 作為損失函數(shù)的有效性、編碼器結(jié)構(gòu)采用DenseNet 網(wǎng)絡(luò)的有效性、解碼器結(jié)構(gòu)采用帶有空洞卷積的上投影模塊的有效性。
2.4.1 損失函數(shù)的有效性
本文在網(wǎng)絡(luò)結(jié)構(gòu)相同的條件下,分別使用L1、L2、Berhu 這3 種不同的損失函數(shù)進(jìn)行對(duì)比實(shí)驗(yàn),結(jié)果如表2 所示,最優(yōu)結(jié)果加粗表示(下同)。從表2 可以看出,使用Berhu 作為損失函數(shù)預(yù)測(cè)出的圖像深度誤差更小,原因是Berhu 損失函數(shù)的權(quán)值能夠根據(jù)誤差大小而發(fā)生較明顯的幅度變化。
表2 損失函數(shù)對(duì)比Table 2 Comparison of loss functions
2.4.2 DenseNet 模塊的有效性
為了驗(yàn)證DenseNet 模塊的有效性,本文將編碼器結(jié)構(gòu)分別替換為VGG 網(wǎng)絡(luò)、ResNet 網(wǎng)絡(luò),并與本文提出的DenseNet 網(wǎng)絡(luò)進(jìn)行對(duì)比,實(shí)驗(yàn)結(jié)果如表3所示。從表3 可以看出,由于DenseNet 網(wǎng)絡(luò)自身密集連接的結(jié)構(gòu)特點(diǎn),因此其能保留更多的特征信息,加強(qiáng)特征的前向傳播,使得實(shí)驗(yàn)結(jié)果誤差更小,準(zhǔn)確率更高。
表3 不同模塊的有效性對(duì)比Table 3 Comparison of effectiveness of different modules
2.4.3 上投影模塊的有效性
本文在其他條件相同的情況下對(duì)不同的上采樣模塊進(jìn)行對(duì)比,包括3×3的反卷積(模型1)、上卷積(模型2)、沒(méi)有添加空洞卷積的標(biāo)準(zhǔn)上投影模塊(模型3)以及本文提出的帶有空洞卷積的上投影模塊(模型4),對(duì)比結(jié)果如表4 所示。從表4 可以看出,使用本文提出的帶有空洞卷積的上投影模塊作為解碼層結(jié)構(gòu)時(shí),均方根誤差RMSE 為0.553,δ<1.25 時(shí)的準(zhǔn)確率為0.840,這是因?yàn)榭斩淳矸e擴(kuò)大了感受野,提取特征的范圍更廣,在分辨率提高的同時(shí)能夠精確定位目標(biāo)。
表4 不同上采樣模塊的有效性對(duì)比Table 4 Comparison of effectiveness of different up sampling modules
2.4.4 NYU Depth V2 數(shù)據(jù)集結(jié)果
將本文方法測(cè)得的評(píng)價(jià)指標(biāo)與其他單目深度估計(jì)方法進(jìn)行對(duì)比,實(shí)驗(yàn)結(jié)果如表5 所示(表中各方法的評(píng)價(jià)指標(biāo)直接引用原文獻(xiàn)中的值,空白處表示原文獻(xiàn)未計(jì)算該評(píng)價(jià)指標(biāo))。從表5可以看出,本文方法的均方根誤差RMSE為0.482,與文獻(xiàn)[8]方法相比降低了34.2個(gè)百分點(diǎn);δ<1.25時(shí),本文方法的準(zhǔn)確率為0.851,與文獻(xiàn)[7]方法相比提高了8.2 個(gè)百分點(diǎn),與文獻(xiàn)[8]方法相比提高了23.7 個(gè)百分點(diǎn)。由此可見,本文方法預(yù)測(cè)的圖像深度誤差更小,準(zhǔn)確率更高。
表5 NYU Depth V2 數(shù)據(jù)集上的評(píng)價(jià)指標(biāo)Table 5 Evaluation indicators on NYU Depth V2 dataset
在NYU Depth V2 數(shù)據(jù)集上的測(cè)試結(jié)果如圖7 所示,將本文方法得到的深度圖與文獻(xiàn)[7]方法、文獻(xiàn)[9]方法進(jìn)行比較,可以看出,本文方法得到的深度圖與真實(shí)深度圖更為接近,且圖中物體輪廓更清晰分明。
圖7 NYU Depth V2 數(shù)據(jù)集上得到的深度圖Fig.7 Depth maps from NYU Depth V2 dataset
本文提出一種對(duì)單目圖像進(jìn)行深度估計(jì)的密集卷積網(wǎng)絡(luò)結(jié)構(gòu)。編碼層由DenseNet 組成,采用密集連接的方式加強(qiáng)特征重用和特征的前向傳播;解碼層采用上投影模塊和雙線性插值操作,逐步提高分辨率并降低通道數(shù),上投影模塊負(fù)責(zé)恢復(fù)深度信息,其中引入的空洞卷積擴(kuò)大了感受野,雙線性插值模塊輸出預(yù)測(cè)深度圖,在不需要引入其他參數(shù)的情況下能夠放大特征圖。在NYU Depth V2 室內(nèi)數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,在δ<1.25 時(shí)本文方法的準(zhǔn)確率達(dá)到了0.851,均方根誤差RMSE控制在0.482以內(nèi),且減少了網(wǎng)絡(luò)參數(shù)。但是,目前本文模型對(duì)數(shù)據(jù)樣本有較高的要求,需要在有監(jiān)督的情況下進(jìn)行訓(xùn)練,下一步將構(gòu)建適用于無(wú)監(jiān)督方式的網(wǎng)絡(luò)模型,同時(shí)改善損失函數(shù),從而加強(qiáng)邊緣信息并改善邊緣失真的情況。