PointPillars
一個來自工業界的模型.https://arxiv.org/abs/1812.05784
3D目標檢測通常做法
- 3d卷積
- 投影到前平面
- 在bird-view上操作
處理思路依然是3d轉2d,先把3維的點雲轉成2d的偽圖像.
Feature Net
把點雲數據處理成類似圖像的數據.
pillar即柱子.點雲的特性決定了每個柱子內的點是很稀少的.
一堆點,我們將其視為一個個柱子(即pillar),每個pillar內有很多points.所有的pillar內的point即組成了點雲.
首先在x-y平面上投影出來一個h x w的網格.即划出h x w個pillar出來.
原始的點雲數據point有(x,y,z,r)4個維度,r代表反射率.我們將其擴展為9個維度(x,y,z,r,x_c,y_c,z_c,x_p,y_p,帶c下標的是點相對於柱子中的點的質心的偏差,帶p下標的是對點相對於柱子物理中心的偏差。每個柱子中點多於N的進行采樣,少於N的進行填充0。於是就形成了(D,P,N)D=9, N為每個pillar的采樣點數(設定值),P為pillar總數目,H*W。
這樣點雲數據就表達成了一個(D,P,N)的Tensor.
然后卷積,得到一個(C,P,N)的Tensor.在N這個維度上做max operation.得到(C,P)的tensor.變形得到(C,H,W)tensor.
至此,我們就用一個(C,H,W)的tensor完成了點雲數據的表達.
Backbone
backbone完成特征提取.
分為2部分
- top-down network產生空間分辨率逐步降低的feature map
- second network做upsample和concatenation,精細化feature.
top-down部分可以描述為一系列的block(S,L,F) S代表相對pseudo-image(即feature net得到的tensor)的stride. 一個block有L個3x3的2D卷積層. F代表輸出的channel數目.
backbone輸出的tensor為(6C,H/2,W/2)
Detection
用的ssd.高度z是單獨回歸的.
實驗細節
點雲轉圖像部分的C=64.backbone部分,車/人/自行車的S不一樣.
loss設計
3d box由(x,y,z,w,l,h,theta)確定. 類似於2d box由(x,y,w,h)確定,3d box多了一個z方向的數據,以及一個角度,用以預計3d box的朝向(繞z軸的角度).
loss由3部分組成
- 定位loss,衡量3d box畫的准不准
- 分類loss,衡量box內的物體類別判斷准不准
- direction loss.定位loss雖說已經考慮了角度,但是不能區分flipped box.即比如一個3d box內的車,朝着正南和朝着正北走,標出來的3d box都是一樣的.
定位loss:
分類loss:
focal loss通過對不同樣本的loss賦予不同的權重,該權重是一個與當前樣本預測概率相關的值.
系數為(1-p)的變種.從而達到p越小,loss權重越大的目的. 即放大hard example的loss.從而使得模型更好地適應難以分類的樣本.
方向loss:
由softmax得到.
代碼解析
todo
代碼:https://github.com/traveller59/second.pytorch
python ./pytorch/train.py evaluate --config_path=./configs/car.fhd.config --model_dir=/path/to/model_dir --measure_time=True --batch_size=1