今天聊聊cvpr19年裡面的一篇單目的3D檢測的文章,作者是大家非常熟悉的商湯系和港中文,悉尼大學的老師以及學生。包含了歐陽老師,王曉剛老師,以及曾星宇博士等。

論文連結:GS3D: An Efficient 3D Object Detection Framework for Autonomous Driving

1. introduction

作者首先比較了單目3D檢測的經典文章Mono3d,由於Mono3d需要在3D空間做大量的proposal的搜尋,因此並不是特別的efficient。透過實驗,作者發現,3D的大致的位置其實是可以從2D檢測以及一些先驗知識中進行恢復的,(這些先驗知識包含了3D-2D的投影矩陣),因此作者設計了有效的演算法,透過2D的檢測去獲取一個基本的長方體,而這個長方體可以引導我們去確定3D物體的尺寸,這些cue在文章中稱為Guidance。

第二個發現是,基本的3D資訊可以被利用透過使用3Dbbox投影之後在2D影象上的surface等細節。基於上述的觀察,作者認為更進一步的分類以及迴歸的網路對bbox進行refinement對於減少FP以及迴歸的精度是非常必要的。但是,僅僅只是利用2Dbbox的特徵會導致特徵表達上的模糊性以及歧義性。如圖Figure 2。 所示,同樣的2D檢測框,如果不引入3D的資訊,其實3D框的區別非常大,因為視角或者size的歧義性所導致的。因此,作者引入了3D上可見的表面的特徵進行了特徵的增強。

GS3D(monocular 3D detection)

GS3D(monocular 3D detection)

簡單解釋一下圖一以及演算法的流程,作者首先提取了2D的bbox,然後利用前面寫到的guidance,得到長方體相對應的長寬高,然後透過視角的判斷,或者可見的表面的特徵。

2.network structure

GS3D(monocular 3D detection)

整個網路可以拆分為以下的幾個部分

1)。 2D檢測的部分,作者使用了faster-rcnn作為2D檢測的framework,額外添加了一個分支作為角度的預測,這個角度其實就是viewpoint的角度,而不是直接的全域性的朝向,相關的內容可以參考我在另一篇文章Stereo 3D Object Detection的解釋

2)。 Guidance的獲取。在自動駕駛中,物體尺寸的分佈還是比較單一的,因此作者,對於尺寸直接使用了統計出來的平均尺寸根據2D檢測得到的類別。接下來作者估計3D位置,透過自動駕駛上的場景分析,作者認為3Dbbox的top center的點在2D影象的投影通常非常靠近,2D框上面的中心點,而bottom center的投影點則非常靠近2D影象底部的中心點。

這個也非常好理解,因為大多數物體的頂部的其實在2D影象的投影其實非常靠近滅線,而我們資料收集的車一般也跟其他車的高度差不多高。假設2D檢測得到的bbox是(

x^{2d}, y^{2d}, l^{2d}, w^{2d}

),以top midpoint為例,

M_{t}^{2d}

={

M_t^{2d} = \{x^{2d}, y^{2d} - h^{2d} / 2\}

},轉換為齊次座標

C_{t}^{2d} = \{x^{2d}, y^{2d} - h^{2d} / 2, 1\}

,對於底部的中心點,我們可以透過下面的公式獲得,

C_{b}^{2d} = \{M_{b}^{2d}, 1\} - \{0, \lambda h^{2d}, 0\}

,即在2D框的位置加入一個微小的抖動得到,這裡的λ可以透過統計整個資料集得到。

接著,利用camera的內參的矩陣,得到點在相機座標系中的位置

\widetilde{C_b} = K^{-1}C_{b}^{2d}

,這裡得到的點的座標都是歸一化的,缺少了一個深度,而深度也是是我們最關心的。

C_b = d * \widetilde{C_b}

這裡代表的就是深度資訊。

不過由於我們已經得到了尺寸的先驗資訊,因此我們可以得到如下的公式,

h_g = \overline{h} = d * (\widetilde{y_t} - \widetilde{y_b})

,注意到

\widetilde{C_b} = \{\widetilde{x_b}, \widetilde{y_b}, 1\}

,因此我們就可以直接求解到一個深度值了。其實在我看來,用另外一個公式

h/H = z / f

這樣的近似其實也可以得到一個粗略的深度值,然後用深度學習的方式去學習帶角度時候的殘差,這樣的方式得到的效果其實也很不錯的。或者在利用強先驗的情況下,直接強解R,T矩陣也可以。

接著,全域性的rotation就可以利用公式

\theta = \alpha + arctan(x/z)

得到了

3)。 surface特徵的獲取,透過前面guidance的獲取,我們可以得到一個粗略的3Dbbox,接著我們投影到2D的feature map中或者相對應的可見的表面,這裡作者透過對viewpoint角度的一個判斷得到相對應的可見的表面,然後獲取相應的feature map,最後進行concat不同表面的特徵,然後作者也透過2D的bbox提取了相應特徵,做了特徵上的融合,最後進行分類以及迴歸的refinement。在這裡,作者把迴歸問題也轉化成一個離散的分類問題,這個思路在PointRCNN中也得到了使用,這是因為在一個很大範圍內的迴歸難度其實比離散的分類問題高。

GS3D(monocular 3D detection)

4)。 loss的設計上,作者考慮到了AP是需要進行score上的排序的,因此把0,1的label轉化為一個與IoU有關的值

GS3D(monocular 3D detection)

loss上的計算還是使用cross entropy

3.experiment

實驗上達到了state of art的效果,這裡就不多說了,感興趣的可以看相關的部分,總體來說,實驗的setting還是挺好的。

4.insight

作者的思路也比OFTnet乾淨一點,我個人感覺單目3D檢測裡面OFTNET是最直接暴力的方式,但是存在很大的最佳化空間,在oftnet的基礎上加上強guidance是不是會更好呢?同時作者在計算位置的guidance的過程中,其實本身是一個近似的過程,那麼能不能用更加直接的方式,就像我上面的思路呢?

謝謝!~