一個來自工業界的模型.https://arxiv.org/abs/1812.05784python
3D目標檢測一般作法git
處理思路依然是3d轉2d,先把3維的點雲轉成2d的僞圖像.
github
把點雲數據處理成相似圖像的數據.ide
pillar即柱子.點雲的特性決定了每一個柱子內的點是很稀少的.lua
一堆點,咱們將其視爲一個個柱子(即pillar),每一個pillar內有不少points.全部的pillar內的point即組成了點雲.設計
首先在x-y平面上投影出來一個h x w的網格.即劃出h x w個pillar出來.3d
原始的點雲數據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。code
這樣點雲數據就表達成了一個(D,P,N)的Tensor.blog
而後卷積,獲得一個(C,P,N)的Tensor.在N這個維度上作max operation.獲得(C,P)的tensor.變形獲得(C,H,W)tensor.ip
至此,咱們就用一個(C,H,W)的tensor完成了點雲數據的表達.
backbone完成特徵提取.
分爲2部分
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)
用的ssd.高度z是單獨迴歸的.
點雲轉圖像部分的C=64.backbone部分,車/人/自行車的S不同.
3d box由(x,y,z,w,l,h,theta)肯定. 相似於2d box由(x,y,w,h)肯定,3d box多了一個z方向的數據,以及一個角度,用以預計3d box的朝向(繞z軸的角度).
loss由3部分組成
定位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