论文基础知识
作者:互联网
Associate-3Ddet: Perceptual-to-Conceptual Association for 3D Point CloudObject Detection
一. 可变形卷积
CNNs对大型,未知形状变换的建模存在固有的缺陷,这种缺陷来源于CNNs模块固有的几何结构:卷积单元对输入特征图的固定位置进行采样;池化层以固定的比例进行池化;即使是ROI pooling也是将ROI分割到固定的bin中去。这些特性是有影响的,例如,在同一层Conv中,所有的激活单元的感受野是一样的,但由于不同位置可能对应着不同尺度或变形的物体,因此对尺度或者感受野大小进行自适应是进行精确定位所需要的。
为了解决或者减轻这个问题, 提出了两种新的模块,可变形卷积(deformable conv)和可变形感兴趣区域池化(deformable ROI Pooling),来提高对形变的建模能力。这两个模块都是基于一个平行网络学习offset(偏移),使得卷积核在input feature map的采样点发生偏移,集中于我们感兴趣的区域或者目标。通过研究发现,标准卷积中的规则格点采样是导致网络难以适应几何形变的“罪魁祸首”,为了削弱这个限制,对卷积核中每个采样点的位置都增加了一个偏移变量,可以实现在当前位置附近随意采样而不局限于之前的规则格点。如下图所示,是常见的采样点和可变形卷积采样的对比
展示了卷积核大小为 3x3 的正常卷积和可变形卷积的采样方式,(a) 所示的正常卷积规律的采样 9 个点(绿点),(b)©(d) 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头),其中©(d) 作为 (b) 的特殊情况,展示了可变形卷积可以作为尺度变换,比例变换和旋转变换的特殊情况
事实上,可变形卷积单元中增加的偏移量是网络结构的一部分,通过另外一个平行的标准卷积单元计算得到,进而也可以通过梯度反向传播进行端到端的学习。加上该偏移量的学习之后,可变形卷积核的大小和位置可以根据当前需要识别的图像内容进行动态调整,其直观效果就是不同位置的卷积核采样点位置会根据图像内容发生自适应的变化,从而适应不同物体的形状、大小等几何形变。然而,这样的操作引入了一个问题,即需要对不连续的位置变量求导。作者在这里借鉴了之前Spatial Transformer Network和若干Optical Flow中warp操作的想法,使用了bilinear插值将任何一个位置的输出,转换成对于feature map的插值操作。同理,类似的想法可以直接用于 (ROI) Pooling中改进。
- 变形卷积框架:首先通过一个小卷积层(绿色)的输出得到可变形卷积所需要的位移量,然后将其作用在卷积核(蓝色)上,达到可变形卷积的效果。
- 展示了可变形兴趣区域池化框架。首先通过标准的兴趣区域池化(绿色)获得兴趣区域对应的特征,该特征通过一个全连接层得到兴趣区域每个部位的位移量。用该位移作用在可变形兴趣区域池化(蓝色)上,以获得不局限于兴趣区域固定网格的特征
二 . 稀疏卷积
稀疏卷积要解决的是对稀疏数据进行更有效的特征提取问题。
稀疏卷积的做法有两种,区别是使用GEMM算法进行卷积还是Winograd算法进行卷积。
GEMM:指最后使用im2col的方式进行卷积。
Sparse 3D convolutional neural networks
论文提出了稀疏卷积的具体做法:卷积的输入为一个矩阵M和一个哈希表H。矩阵M为输入feature map上不为空的部分的特征,大小为 a i n . n i n a_{in} . n_{in} ain.nin , a代表不为空的位置个数,n代表特征维度C。哈希表H, key代表输入中不为空的位置的坐标,value代表这个坐标对应的特征是M中的哪一行特征。
计算流程:
1.(CPU上)对H中的key进行遍历,确定卷积输出feature map上不为空的位置的坐标与个数,组成 H o u t H_{out} Hout。同时确定rule book, rule book的每一行对应计算卷积输出feature map上不为空的某个位置所需要输入feature map上的位置,通过这个位置得到输入哈希表中该位置对应的key,填充到rule book中.
- (GPU上)。对rule book的每一行进行并行计算,得到每个不为空的输出位置的输出。
Submanifold Sparse Convolutional Networks
在稀疏卷积的基础上提出了submanifold sparse convolution. submanifold指稀疏卷积指输出feature map上不为空的位置与输入feature map上不为空的位置相同。稀疏卷积会使得数据的稀疏性指数下降,而submanifold会保持一样的稀疏性,但是如果只用submanifold稀疏卷积,卷积核的感受野会限制在一定范围内,所以要和maxpooling或stride=2的卷积一起使用,在保持稀疏性的同时增大感受野。
具体的实现流程类似,直接把 H i n H_{in} Hin复制到 H o u t H_{out} Hout,其他一致。
SECOND: Sparsely Embedded Convolutional Detection
对上面的两个卷积进行加速。所有操作都在gpu上。
1.计算 H o u t H_{out} Hout的时候,使用GPU, 核函数里面使用原子操作确保输出的每个位置唯一。
2.在GPU上建立两遍哈希,首先把输入特征的三维坐标转化为一维,然后在一维位置上的value为这个特征在特征矩阵的第几行。然后对于每个输出位置,填充计算他所需要的输入位置的特征在特征矩阵的第几行。根据第二个哈希填充im2col的特征矩阵,使用cublasSgemm函数进行卷积。
三 . VoxelNet
网络架构:
网络架构分为三层:
-
特征提取层:将点云划分为voxel形式,使用层级的VFE层提取特征,得到稀疏的voxel-wise特征张量。
-
中间卷积层:使用3D卷积,得到全局特征张量。
-
RPN层:特征整合,anchor提取,输出预测结果:概率预测图,回归图。
1.Feature Learning Network
-
体素分区:对于输入点云所在的空间,我们采用 D , H , W D,H,W D,H,W表示;定义每一个小的voxel的大小为 V D , V H , V W V_D,V_H,V_W VD,VH,VW通过除法就能得到网格的size。这里作者假设了 D , H , W D,H,W D,H,W是体素网格的整数倍。(这会不会导致roi align和ROI pooling的问题)。这里可以加入先验知识进行分区吗,就比如说一些normal的一致性。
-
grouping:根据点所在的voxel进行分组。由于数据的不均匀性,导致分组出来的组别的个数不尽一致。比如图上的一样,有的有三个,有的一个也没有。(这一步具体作用是什么作者没有表达清楚)
-
随机采样:一是为了减小计算负担,而是为了消除因为密度不一致带来的判别问题。采样方案只针对那些voxel数量比T个多的voxel,这种策略两点好处:省计算资源和(降低voxel之间的不平衡性,这可以降低采样偏差,在训练时增加更多的变化性。)
-
Stacked Voxel Feature Encoding:
这是比较重要的一点,作者表示最大的创新就在于VFE层级结构,具体用下面这个图来表达:
对每一个voxel来说,对里边的所有点而言均是如下操作,这里只描述对点 p i ( x i , y i , z i , r i ) p_i(x_i,y_i,z_i,r_i) pi(xi,yi,zi,ri),第四维的 r i r_i ri表达的是反射率(1)计算所有点的均值,记做 ( v x , v y , v z ) (v_x,v_y,v_z) (vx,vy,vz) (2)对于点 p i p_i pi我们采用对中心的偏移量来增大表示其坐标 p i ^ = [ x i , y i , z i , r i , x i − v x , y i − v y , z i − v z ] \widehat{p_i}=[x_i,y_i,z_i,r_i,x_i-v_x,y_i-v_y,z_i-v_z] pi =[xi,yi,zi,ri,xi−vx,yi−vy,zi−vz] ,(这样表达有什么好处,实则并没有信息增加,但是却把全局特征 x i , y i , z i x_i,y_i,z_i xi,yi,zii和局部残差结合到了一起) (3)对每一个的 p i ^ \widehat{p_i} pi 通过FCN转化到特征空间,特征空间表示可以将点特征整合来描述voxel所表达的表面特性。FCN层由一个线性层,一个BN,一个RELU层组成。这样就得到了point-wise-feature。得到的特征记做 f i f_i fi (4)再通过element-wise maxpooling层,结合周围的所有的点得到locally-aggregated feature: f ~ \widetilde{f} f 。(5)最后一步是将 f ~ \widetilde{f} f 和 f i f_i fi结合为 f o u t f_{out} fout。那么对于一个含有t个点的voxel,最终的特征我们采用集合表达方式为: V o u t = { f i o u t } i … t \mathbf{V}_{\mathrm{out}}=\left\{\mathbf{f}_{i}^{o u t}\right\}_{i \ldots t} Vout={fiout}i…t
这一结构比较大的作用在于(1)既保留点的特征又结合了局部结构特征,使得其可以学习shape特征。(2)不同voxel之间结合可以得到voxel-wise特征。类比于point-wise特征。
稀疏张量表示:这是第一部分(特征提取)的最后一个层次结构。上面的结构通过作用于每一个非空体素,每一个都唯一关联于一个体素。得到的voxel-wise-feature可以用大小为 C × D ′ × H ′ × W ′ C\times D' \times H' \times W' C×D′×H′×W′表示,可以看最上面整体结构图。尽管可能会有100k个点,但是可能90%都是空的;将非空体素特征表示为稀疏张量大大降低了反向传播期间的内存使用和计算成本,并且是我们有效实现中的关键步骤。(能否使用voxel坐标表示其对应的一维而不是提取出来的那一种)
2.Convolutional Middle Layers
采用3D卷积的方式,采用 C o n v M D ( C i n , C o u t , k , s , p ) ConvMD(C_{in},C_{out},k,s,p) ConvMD(Cin,Cout,k,s,p)的结构来表达,含义分别是 c h a n n e l − i n , c h a n n e l − o u t , k e i s i z e ( k ∗ k ∗ k ) , s t r i d e − s i z e , p a d d i n g channel-in,channel-out,keisize(k*k*k),stride-size,padding channel−in,channel−out,keisize(k∗k∗k),stride−size,padding 。基础结构有3D卷积,BN和Relu。
3. RPN
对RPN网络做一些关键性的修改。网络的整体结构如下。网路做如下描述:
-
网路的输入是通过 Convolutional Middle Layers出来的特征图
-
存在3个全卷积的block
如图,每一个block都存在两个cov2D层,通过第一个层的stride=2来使得feature map的 w , l 和 h w,l和h w,l和h变成 { w / 2 , l / 2 , h / 2 } {w/2,l/2,h/2} {w/2,l/2,h/2};在每一个CON2D后面也都会有对应的BN和RELU层。
-
concate
讲每一层的输出都上采样到一个统一的size(第一个block不用上采样)
-
映射为两个学习的目标:1. probability score map。2.regression map
Efficient Implementation
VFE可以并行的处理voxel
具体的方法图下图所示:
值得理解的是上面的图的储存示意图,Input buffer的正对面应该是
T
×
K
T \times K
T×K,经过VFE提取后,加大了特征维数,然后再采用一种稀疏的表达方式。
(1)第一步是初始化一个tensor,储存为
K
×
T
×
7
K\times{T}\times{7}
K×T×7的feature buffer。K表示一个有存在的非空的体素的最大值,T表示的每个voxel中点的最大值。7就是每一个点编码的特征维度。
(2)第二步是对于点云中的任意一个点去查找它所在的voxel是否初始化,如果已经初始化了那么就检查是否大于T个点,没有的话就插入进去,否则不要这个点。假如这个voxel没有被初始化,那么久需要初始化并把这个点加入进去。
(3)建立了input buffer之后呢,采用GPU的并行计算对点级别和voxel级别的VFE计算,作者提到,在VFE中的concate之后,把没有点的特征再次设置为0。最后,使用存储的坐标缓冲区,我们将计算的稀疏体素结构重新组织到密集体素网格
标签:采样,voxel,卷积,论文,feature,基础知识,特征,稀疏 来源: https://blog.csdn.net/weixin_44330777/article/details/110259315