VoxelNet:
空间上 ( z , y , x ) (z, y, x) (z,y,x)的范围为 [ − 3 , 1 ] × [ − 40 , 40 ] × [ 0 , 70.4 ] [-3,1]\times[-40,40]\times[0,70.4] [−3,1]×[−40,40]×[0,70.4],分辨率为 ( 0.4 , 0.2 , 0.2 ) (0.4, 0.2, 0.2) (0.4,0.2,0.2)。所以, 分成 ( D , H , W ) = ( 10 , 400 , 352 ) (D, H, W) = (10,400,352) (D,H,W)=(10,400,352)个小voxel。
某种意义上,可以认为,现在体素就是一个个新的“点云”。
每一个体素中点云数目为T个,T<=35。
1. VFE层
VFE层 要做的事情就是聚集单个体素中的点云特征。
对于任一个体素中的点云 P i P_i Pi,其原始向量表示为: { x i , y i , z i , r i } \{x_i, y_i, z_i, r_i\} {xi,yi,zi,ri}。为了体现出与体素的联系,新的向量表示为 { x i , y i , z i , r i , x i − v x , y i − v x , z i − v z } \{x_i, y_i, z_i, r_i, x_i - v_x, y_i-v_x, z_i-v_z \} {xi,yi,zi,ri,xi−vx,yi−vx,zi−vz} 。其中 { v x , v y , v z } \{v_x, v_y, v_z\} {vx,vy,vz} 是体素的中心点坐标。
这样每一个体素可以用 ( T , 7 ) (T,7) (T,7) 表示,T是点云个数,7是单个点云的维度。
VFE层就是FCN + MaxPooling + Concat。
具体操作是:
-
( T , 7 ) (T,7) (T,7) ----经过 [ 7 , 16 ] [7,16] [7,16]的FCN----> ( T , 16 ) (T,16) (T,16) -----BN RELU-------> ( T , 16 ) (T,16) (T,16)
-
( T , 16 ) (T,16) (T,16) ----->在T这个维度上进行MaxPooling------> ( 1 , 16 ) (1,16) (1,16),得到体现该体素全局的向量
-
( 1 , 16 ) (1,16) (1,16) 与经过FCN的 ( T , 16 ) (T,16) (T,16) 进行拼接操作,即每一个单独点云向量都拼接该体素的全局向量,得到 ( T , 32 ) (T,32) (T,32)
VFE重复两次,第二次是
-
( T , 32 ) (T,32) (T,32) -----经过 [ 32 , 64 ] [32,64] [32,64]的FCN----> ( T , 64 ) (T,64) (T,64) -----BN RELU-------> ( T , 64 ) (T,64) (T,64)
-
( T , 64 ) (T,64) (T,64) ----->在T这个维度上进行MaxPooling------> ( 1 , 64 ) (1,64) (1,64),得到体现该体素全局的向量
-
( 1 , 64 ) (1,64) (1,64) 与经过FCN的 ( T , 64 ) (T,64) (T,64) 进行拼接操作,即每一个单独点云向量都拼接该体素的全局向量,得到 ( T , 128 ) (T,128) (T,128)
最后再使用一次MaxPooling,使得
(
T
,
128
)
(T,128)
(T,128) ---->
(
1
,
128
)
(1,128)
(1,128),得到用来表示单个体素的特征向量
(
1
,
128
)
(1,128)
(1,128)。
最后整张体素图的特征为
(
C
,
D
,
H
,
W
)
=
(
128
,
10
,
400
,
352
)
(C,D,H,W) = (128, 10,400,352)
(C,D,H,W)=(128,10,400,352)。
2. 3D卷积与RPN
经过VFE处理,已经是规整的体素图了,就可以简单的看作2D图像的扩展,使用3D卷积提取特征,RPN 进行检测了。
(
128
,
10
,
400
,
352
)
(128, 10, 400, 352)
(128,10,400,352) ----3D---->
(
64
,
2
,
400
,
352
)
(64,2,400,352)
(64,2,400,352)------>
(
128
,
400
,
352
)
(128,400,352)
(128,400,352) -->RPN
缺点:
- 显而易见,体素分割维度比较死板。
SECOND
- 使用稀疏卷积来计算3D convolution
- 好像否定了VFE,只是简单的使用了平均值,需要用代码好好看一下(11.5)
- 数据增强手段好像很值得关注,阅读代码看一下()
- 加了一个loss
Pointpillars
- ( D , P , N ) (D,P,N) (D,P,N) = (单个点云维度、pillars个数、pillars中点云个数)
- 本文设置:P = 12000, N = 100, D = 9
- 单个点云 P i = { x i , y i , z i } P_i = \{x_i,y_i,z_i\} Pi={xi,yi,zi},在pillars化时会将其处理为 P i ^ = { x i , y i , z i , x c , y c , z c , x i − x c , y i − y c } \hat{P_i}=\{x_i,y_i,z_i,x_c,y_c,z_c,x_i-x_c,y_i-y_c\} Pi^={xi,yi,zi,xc,yc,zc,xi−xc,yi−yc}。 x c , y c , z c x_c,y_c,z_c xc,yc,zc 为pillars中心。
- ( D , P , N ) (D,P,N) (D,P,N) --linear layer ,BN,RELU–> ( C , P , N ) (C,P,N) (C,P,N)
- ( C , P , N ) (C,P,N) (C,P,N) --max pooling—> ( C , P ) (C,P) (C,P) —变形–> ( C , H , W ) (C, H, W) (C,H,W)
完成点云数据的表达之后,
conv进行特征提取。
SSD检测
loss部分使用的时SECOND的loss。