照例,論文題目《Deep Ordinal Regression Network for Monocular Depth Estimation》,來自18年CVPR。深度估計問題原本是回歸問題,需要預測的深度值是連續的。本文提出將連續的深度值離散化,轉化為分類問題。(之前也有工作是轉化為回歸問題)但這個分類問題又不同於普通的分類問題,深度值的分類是有規律的,根據遠近關係,所有的類別可以按照從小到大的次序排列。這就是所謂的「有序回歸」(ordinal regression)。此外,作者還針對低維特徵圖到高維深度圖這個過程對網路做了優化,降低時間和空間的損耗。

將回歸問題轉化為分類問題,要做的就是對連續的深度值採樣。考慮到隨著真實深度值的增大,在預測中的不確定度也會提高,這提示我們或許可以在預測較大深度值的時候允許相對大一點的誤差。據此,文中提出空間增加離散方法(spacing-increasing discretization, SID)進行採樣,避免訓練過程中過度強調大深度值的影響。得到採樣後的離散深度值以後,就可以用於有序回歸網路訓練。

之前所有用深度神經網路做深度估計的方法都是把深度網路當作一個特徵提取器,得到一個低維的特徵圖,再通過解卷積網路、多尺度網路、跳躍連接等方式得到高解析度的深度圖。這樣的方式不僅需要額外的計算和內存,還使網路結構變得複雜導致訓練和預測的過程變慢。借鑒最近在場景解析(scene parsing)方面的工作,作者採取了膨脹卷積(dilated convolution)代替池化層獲取更大的感受野,不同膨脹率就含有了不同尺度的信息。還使用了一個全圖編碼器提取全局信息。

網路結構如下:輸入圖像經過一個卷積網路,這個網路與其他提取特徵的網路的區別在於去掉了一些池化層,所以這邊說特徵提取器是緻密的,也即特徵圖的尺寸比較大。隨後特徵圖經過了五個通道,包括一個全圖編碼器、一個卷積運算、3個尺度的膨脹卷積,這五個通道的結果串聯起來構成了場景理解模塊。再經過一個1*1的卷積(用來整合五個通道的信息)送給有序回歸部分得到深度圖的輸出。

膨脹卷積(空洞卷積)所做的就是卷積核填一些零。這樣得到的結果仍是尺寸較低的,或者說感受野提高了。相比於降採樣,直接丟棄了細節的信息,而膨脹卷積則是把這些信息整合了起來,並沒有丟棄,保證了模型能夠認知到細節信息。此外,網路中的全圖編碼器也做了一些修改,減少了參數的數目。

接下來說下空間增加離散(前面提到的,後面全用SID代替了,實在翻譯不好...)和有序回歸,相當於是本篇最主要的工作和創新點。作者談到,當深度值增大時,能用來估計深度的信息時越來越少的。所以採用了一個SID的方法採樣深度值。當深度值分布範圍為[α, β]時,均勻採樣(uniform discretization, UD)和SID如下圖。

假設要分割成K個間隔,則採樣的閾值可以寫為

t_i=e^{log(alpha)+frac{log(eta/alpha)*i}{K}}

不太明白作者這裡為啥要寫成指數的表達式,這個式子化簡不就是相乘嗎...作者還談到,在工作中給α加了一個小偏移量 xi 。或許是為了便於計算?

現在有了離散的深度值。每個像素點的標籤就是小於這點深度值的最大深度值分類。如某像素點對應的真實世界中的深度d落在[t3, t4]這個段,那麼該像素點的分類標籤就是3。經典的分類問題多數是網路輸出接一個softmax層歸一化轉化為概率,然後用交叉熵損失函數訓練。但是在這裡我們的類別是有一個次序關係的,要利用好這一點。來看看損失函數。

整體的有序損失是所有像素點有序損失的平均值,即

L(X,Theta)=-frac{1}{N}sum_{w=0}^{W-1}sum_{h=0}^{H-1}Psi(w,h,X,Theta)

其中,X是輸入圖像I的緻密特徵圖。每個像素點的有序損失為(作者在論文中好像出了點小錯誤0.0)

Psi(w,h,X,Theta)=sum_{k=0}^{l_{(w,h)}-1}log(P_{(w,h)}^k)+sum_{k=l_{(w,h)}}^{K-1}log(1-P_{(w,h)}^k)

其中 P_{(w,h)}^k=P(hat{l}_{(w,h)}>k|X,Theta) 代表了預測的該像素點的深度值大於第k個閾值的概率。上面這個損失函數長得和二分類問題的交叉熵損失函數有點像,這裡面對於某點的深度值,要麼大於第k類,要麼小於第k類,也是一個「二分類」的問題。這裡的「二」是深度值與某類的標籤的關係。而一共有K類,且是有序的,所以前面的求和是預測的深度大於哪些類,後面的求和是預測的深度小於哪些類。同樣地,為了得到一個歸一化的概率值,我們要將網路的輸出接一個softmax層。先給出 P_{(w,h)}^k 的表達式:

P_{(w,h)}^k=frac{e^{y_{(w,h,2k+1)}}}{e^{y_{(w,h,2k)}}+e^{y_{(w,h,2k+1)}}}

這裡可以看出,儘管最終輸出的概率是有k個類別(針對某一像素點,即w, h固定),但是softmax層的輸入y是2k維度的。每兩個一組,每組可以計算出預測的該像素點的深度大於第k個閾值的深度的概率。接下來作者講了一下這幾項怎麼對參數求導,也就是如何反向傳播訓練網路。在預測階段,估計某點的深度值為

hat{d}_{(w,h)}=frac{t_{hat{l}_{(w,h)}}+t_{hat{l}_{(w,h)+1}}}{2}-xi

即預測出該點的深度標籤落在哪一段後,對這段取平均,然後減掉之前的偏移量。

在實驗部分,作者談到,測試階段採用了這樣一種策略:將圖片分割成很多子窗(大概根據他們的表徵,像語義分割那樣),這些子窗是互相有重疊的。預測的深度是重疊子窗預測深度的平均值。這樣又保證了儘管深度被離散化,但還是豐富了最終的深度值的取值。感覺有一點耍流氓...明明方法里沒談到這個,但測試又這樣做,最終的結果肯定要比直接用好呀=。=


推薦閱讀:
相关文章