VoxelNet 学习笔记

VoxelNet论文理解

  • 预处理(preprocess)(KITTI)
    • 投影对称(相机、点云坐标不同)
      • 计算投影矩阵
      • 点云投影到图像?
    • 裁剪(Crop)
    • 数据分割(split)
  • Feature Learning Network
    • Voxel Partition
    • Grouping
    • Random Sampling
    • Stacked Voxel Feature Encoding(VFE)
      • 中心点
      • 增强每个点的特征
      • FNC
      • element-wise MaxPooling
      • point-wise concatnate
      • Finally
    • Sparse 4D Tensor
  • Convolutional Middle Layers (CML)
  • Region Proposal Network(RPN)
      • 第一块
      • 第二块
      • 第三块
  • Loss Function
  • Efficient Implementation
  • Training Details
    • NetWork Details
      • Car Detection
        • 数据范围
        • voxel尺寸
        • VFE
        • CML
        • anchor size

*[https://blog.csdn.net/weixin_40805392/article/details/99549300]

预处理(preprocess)(KITTI)

投影对称(相机、点云坐标不同)

TODO——没看懂。。。
计算点云到图像的投影矩阵需要三个参数,分别是P_rect(相机内参矩阵)和R_rect(参考相机0到相机xx图像平面的旋转矩阵)以及Tr_velo_to_cam(点云到相机的[R T]外参矩阵)。

计算投影矩阵

点云投影到图像?

TODO

裁剪(Crop)

数据分割(split)

用于后面训练使用——文件目录格式

VoxelNet 学习笔记_第1张图片

Feature Learning Network

VoxelNet 学习笔记_第2张图片

Voxel Partition

预处理后的点云数据为 D ( Z 轴 ) × H ( Y 轴 ) × W ( X 轴 ) D(Z轴)\times H(Y轴)\times W(X轴) D(Z)×H(Y)×W(X)
体素(voxel)定义为 v D × v H × v W v_{D}\times v_{H} \times v_{W} vD×vH×vW
总空间被划分为 D ′ × H ′ × W ′ D^{\prime} \times H^{\prime} \times W^{\prime} D×H×W个体素

Grouping

将点云中的点包括到体素(voxel)中去,

Random Sampling

固定一个 T 为一个体素(voxel)中所能包含的最多的点。
即超过 T 个点的体素被随机降采样到 T 个点。

  • 可以降低计算效率
  • 空间中高密度的点(highly variable point density throughout the space)可能会让检测产生误差。
    • 减少体素间点的不平衡,可以减小采样偏差,增加训练的可变性?(adds more variation
      to training)。

Stacked Voxel Feature Encoding(VFE)

共n次叠加这个网络 VFE Layer -1 ~ VFE Layer-n,结构除输入输出外都一样。
VoxelNet 学习笔记_第3张图片
VFE Layer -1 为例
V = { p i = [ x i , y i , z i , r i ] T ∈ R 4 } i = 1... t ( t ≤ T ) V = \left \{ p_{i}= [x_{i}, y_{i}, z_{i}, r_{i}]^{T} \in R^{4}\right \}_{i=1...t}\left ( t \le T\right ) V={pi=[xi,yi,zi,ri]TR4}i=1...t(tT)
(x,y,z)—点在空间坐标 , r 点的反射率 , V是一个体素中所有点的集合

中心点

计算当前体素内的中心点(质心) ( v x , v y , v z ) (v_{x},v_{y},v_{z}) (vx,vy,vz)

增强每个点的特征

在每个点的特征中加入与中心点的相对偏移量(4维—7维)
V i n = { p ^ i = [ x i , y i , z i , r i , x i − v x , y i − v y , z i − v z ] T ∈ R 7 } i = 1... t V_{in}= \left \{ \hat p_{i}=[x_{i}, y_{i}, z_{i}, r_{i}, x_{i}−v_{x}, y_{i}−v_{y}, z_{i}−v_{z}]^{T} \in R^{7}\right \} _ {i=1...t} Vin={p^i=[xi,yi,zi,ri,xivx,yivy,zivz]TR7}i=1...t

FNC

FNC包含一个线性层(linear layer),一个归一化层(BN),一个ReLU层
将增强过的向量通过全连接网络(FCN)输入到特征空间,得到聚合后的信息 f i ∈ R m f_{i}\in R^{m} fiRm可以表示(编码???)被体素包含的表面形状(to encode the shape of the surface contained within the voxel)

element-wise MaxPooling

将 { f i } i = 1... t 池 化 到 f ^ ∈ R m — 灰 色 条 子 将\left \{ f_{i}\right \}_{i=1...t} 池化到 \hat f \in R^{m} — 灰色条子 {fi}i=1...tf^Rm

point-wise concatnate

将 f ^ 拼 接 到 所 有 f i 后 面 得 到 P o i n t − w i s e C o n c a t e n a t e d F e a t u r e 将\hat f 拼接到所有f_{i}后面得到 Point-wise Concatenated Feature f^fiPointwiseConcatenatedFeature
VoxelNet 学习笔记_第4张图片

Finally

输出一个Point-wise(Feature-n)通过FCN 和 element-wise Maxpool ,最后产生C维的voxel-wise feature

Sparse 4D Tensor

将所有非空特征的体素聚合在一起形成一个稀疏的4D张量大小为 C × D ′ × H ′ × W ′ C \times D^{\prime} \times H^{\prime} \times W^{\prime} C×D×H×W
VoxelNet 学习笔记_第5张图片

Convolutional Middle Layers (CML)

C o n v M D ( c i n , c o u t , k , s , p ) ConvMD(c_{in}, c_{out},{\Large k },s,p) ConvMD(cin,cout,k,s,p)
k = ( k , k , k ) {\Large k}=(k,k,k) k=(k,k,k)
M维卷积。k为卷积核大小,s—stride size 步长,p—padding size 可加边框。
每个CML由3D卷积核、BN层、ReLU层依次排序组成。

The convolutional middle layers aggregate voxel-wise features within a progressively expanding receptive field, adding more context to the shape description.(卷积的中间层将体素方面的特征聚集在一个逐渐扩展的接受域内,为形状描述添加了更多的上下文)

详细介绍在后面实践部分

Region Proposal Network(RPN)

VoxelNet 学习笔记_第6张图片

将CML提取出的特征输入RPN中,网络有3块全卷积层(fully convolutional layers)

第一块

通过33的步长为2的卷积核将特征图降采样一半,接上一些33步长为1的卷积核(这里是三层)每层后面都跟着BN层和ReLU层。

第二块

同第一块

第三块

同上

将所有特征上采样到第一块的尺寸拼接在一起,分别接上概率得分映射(probability score map)和回归映射(regression map)

Loss Function


positive anchors
在这里插入图片描述
negative anchors

3D ground truth box 定义为 ( x c g ( 中 心 点 x 坐 标 ) , y c g , z c g , l g ( 长 ) , w g ( 宽 ) , h g ( 高 ) , θ g ( Z 轴 旋 转 角 ) ) (x^{g}_{c}(中心点x坐标), y^{g}_{c},z^{g}_{c}, l^{g}(长), w^{g}(宽), h^{g}(高), \theta ^{g}(Z轴旋转角)) (xcg(x),ycg,zcg,lg(),wg,hg(),θg(Z))
实际检测anchor定义为 ( x c a ( 中 心 点 x 坐 标 ) , y c a , z c a , l a ( 长 ) , w a ( 宽 ) , h a ( 高 ) , θ a ( Z 轴 旋 转 角 ) ) (x^{a}_{c}(中心点x坐标), y^{a}_{c},z^{a}_{c}, l^{a}(长), w^{a}(宽), h^{a}(高), \theta ^{a}(Z轴旋转角)) (xca(x),yca,zca,la(),wa,ha(),θa(Z))

定义损失函数

VoxelNet 学习笔记_第7张图片

在这里插入图片描述
VoxelNet 学习笔记_第8张图片
p i p o s 和 p i n e g 代 表 s o f t m a x 后 的 a i p o s 和 a i n e g p^{pos}_{i}和p^{neg}_{i}代表softmax后的a^{pos}_{i}和a^{neg}_{i} pipospinegsoftmaxaiposaineg
u i 和 u i ∗ ∈ R 7 为 a i p o s 对 应 的 回 归 的 b b o x 和 a i p o s 对 应 的 g r o u n d T r u t h u_{i} 和u^{*}_{i} \in R^{7}为a^{pos}_{i}对应的回归的bbox和a^{pos}_{i}对应的groundTruth uiuiR7aiposbboxaiposgroundTruth
L c l s 表 示 二 元 交 叉 熵 损 失 和 L_{cls}表示二元交叉熵损失和 Lclsbinary cross entropy loss
L r e g 表 示 回 归 损 失 L_{reg}表示回归损失 Lregregression loss

Efficient Implementation

VoxelNet 学习笔记_第9张图片

  1. 第一步是初始化一个tensor,储存为 K × T × 7 K × T × 7 K×T×7的feature buffer。K表示一个有存在的非空的体素的最大值,T表示的每个voxel中点的最大值。7就是每一个点编码的特征维度。

  2. 第二步是对于点云中的任意一个点去查找它所在的voxel是否初始化(这个操作通过hash map实现 时间复杂度O(1) ,voxel坐标作为hash key),如果已经初始化了那么就检查是否大于T个点,没有的话就插入进去,否则不要这个点。假如这个voxel没有被初始化,那么久需要初始化并把这个点加入进去(遍历点列表实现时间复杂度O(n))。

  3. 想要进一步增加效率可以忽略只含有少量点的体素。

  4. 建立了input buffer之后呢,采用GPU的并行计算对点级别和voxel级别的VFE计算,作者提到,在VFE中的concate之后,把没有点的特征再次设置为0(本来算出来不就是0吗。。。???),空点的就不会影响计算出来的体素特征。

  5. 最后,使用存储的坐标缓冲区,我们将计算的稀疏体素结构重新组织到密集体素网格

Training Details

NetWork Details

Car Detection

数据范围

X : [ − 3 , 1 ] × Y : [ − 40 , 40 ] × Z : [ 0.70.4 ] X:[-3,1]\times Y:[-40,40] \times Z:[0.70.4] X:[3,1]×Y:[40,40]×Z:[0.70.4]
其他不要

voxel尺寸

v D = 0.4 , v H = 0.2 , v W = 0.2 , D ′ = 10 , H ′ = 400 , W ′ = 352 , T = 35 v_{D} = 0.4 ,v_{H}=0.2,v_{W}=0.2,D^{\prime}=10 ,H^{\prime } = 400, W^{\prime } = 352 ,T =35 vD=0.4,vH=0.2,vW=0.2,D=10,H=400,W=352,T=35

VFE

V F E − 1 ( 7 , 32 ) , V F E − 2 ( 32 , 128 ) VFE-1(7,32),VFE-2(32,128) VFE1(7,32),VFE2(32,128)
feature learning net 产生了 128 × 10 × 400 × 352的数据

CML

Conv3D(128, 64, 3,(2,1,1), (1,1,1)),
Conv3D(64, 64, 3, (1,1,1), (0,1,1)),
Conv3D(64, 64, 3, (2,1,1), (1,1,1))
产生4D张量64 × 2 × 400 × 352
reshape后 输出3D张量:128 × 400 × 352

anchor size

l a = 3.9 , w a = 1.6 , h a = 1.56 , z a = − 1.0 , 角 度 只 有 0 度 和 90 度 l^{a} = 3.9 ,w^{a} = 1.6 , h^{a}=1.56 , z^{a} = -1.0,角度只有0度和90度 la=3.9,wa=1.6,ha=1.56,za=1.0090
p o s i t i v e : I O U ≥ 0.6 positive : IOU \ge 0.6 positive:IOU0.6
n e g a t i v e : I O U ≤ 0.45 negative : IOU \le 0.45 negative:IOU0.45
忽略其他anchor
α = 1.5 , β = 1 \alpha=1.5 ,\beta = 1 α=1.5,β=1

你可能感兴趣的:(计算机视觉)