*[https://blog.csdn.net/weixin_40805392/article/details/99549300]
TODO——没看懂。。。
计算点云到图像的投影矩阵需要三个参数,分别是P_rect(相机内参矩阵)和R_rect(参考相机0到相机xx图像平面的旋转矩阵)以及Tr_velo_to_cam(点云到相机的[R T]外参矩阵)。
TODO
用于后面训练使用——文件目录格式
预处理后的点云数据为 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′个体素
将点云中的点包括到体素(voxel)中去,
固定一个 T 为一个体素(voxel)中所能包含的最多的点。
即超过 T 个点的体素被随机降采样到 T 个点。
共n次叠加这个网络 VFE Layer -1 ~ VFE Layer-n,结构除输入输出外都一样。
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]T∈R4}i=1...t(t≤T)
(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,xi−vx,yi−vy,zi−vz]T∈R7}i=1...t
FNC包含一个线性层(linear layer),一个归一化层(BN),一个ReLU层
将增强过的向量通过全连接网络(FCN)输入到特征空间,得到聚合后的信息 f i ∈ R m f_{i}\in R^{m} fi∈Rm可以表示(编码???)被体素包含的表面形状(to encode the shape of the surface contained within the voxel)
将 { f i } i = 1... t 池 化 到 f ^ ∈ R m — 灰 色 条 子 将\left \{ f_{i}\right \}_{i=1...t} 池化到 \hat f \in R^{m} — 灰色条子 将{fi}i=1...t池化到f^∈Rm—灰色条子
将 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^拼接到所有fi后面得到Point−wiseConcatenatedFeature
输出一个Point-wise(Feature-n)通过FCN 和 element-wise Maxpool ,最后产生C维的voxel-wise feature
将所有非空特征的体素聚合在一起形成一个稀疏的4D张量大小为 C × D ′ × H ′ × W ′ C \times D^{\prime} \times H^{\prime} \times W^{\prime} C×D′×H′×W′
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.(卷积的中间层将体素方面的特征聚集在一个逐渐扩展的接受域内,为形状描述添加了更多的上下文)
详细介绍在后面实践部分
将CML提取出的特征输入RPN中,网络有3块全卷积层(fully convolutional layers)
通过33的步长为2的卷积核将特征图降采样一半,接上一些33步长为1的卷积核(这里是三层)每层后面都跟着BN层和ReLU层。
同第一块
同上
将所有特征上采样到第一块的尺寸拼接在一起,分别接上概率得分映射(probability score map)和回归映射(regression map)
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轴旋转角))
定义损失函数
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} pipos和pineg代表softmax后的aipos和aineg
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 ui和ui∗∈R7为aipos对应的回归的bbox和aipos对应的groundTruth
L c l s 表 示 二 元 交 叉 熵 损 失 和 L_{cls}表示二元交叉熵损失和 Lcls表示二元交叉熵损失和binary cross entropy loss
L r e g 表 示 回 归 损 失 L_{reg}表示回归损失 Lreg表示回归损失regression loss
第一步是初始化一个tensor,储存为 K × T × 7 K × T × 7 K×T×7的feature buffer。K表示一个有存在的非空的体素的最大值,T表示的每个voxel中点的最大值。7就是每一个点编码的特征维度。
第二步是对于点云中的任意一个点去查找它所在的voxel是否初始化(这个操作通过hash map实现 时间复杂度O(1) ,voxel坐标作为hash key),如果已经初始化了那么就检查是否大于T个点,没有的话就插入进去,否则不要这个点。假如这个voxel没有被初始化,那么久需要初始化并把这个点加入进去(遍历点列表实现时间复杂度O(n))。
想要进一步增加效率可以忽略只含有少量点的体素。
建立了input buffer之后呢,采用GPU的并行计算对点级别和voxel级别的VFE计算,作者提到,在VFE中的concate之后,把没有点的特征再次设置为0(本来算出来不就是0吗。。。???),空点的就不会影响计算出来的体素特征。
最后,使用存储的坐标缓冲区,我们将计算的稀疏体素结构重新组织到密集体素网格
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]
其他不要
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
V F E − 1 ( 7 , 32 ) , V F E − 2 ( 32 , 128 ) VFE-1(7,32),VFE-2(32,128) VFE−1(7,32),VFE−2(32,128)
feature learning net 产生了 128 × 10 × 400 × 352的数据
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
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.0,角度只有0度和90度
p o s i t i v e : I O U ≥ 0.6 positive : IOU \ge 0.6 positive:IOU≥0.6
n e g a t i v e : I O U ≤ 0.45 negative : IOU \le 0.45 negative:IOU≤0.45
忽略其他anchor
α = 1.5 , β = 1 \alpha=1.5 ,\beta = 1 α=1.5,β=1