查看原文
其他

【源头活水】代码层面解读3D点云目标检测算法TANet

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

来源:知乎—硅仙人

地址:https://zhuanlan.zhihu.com/p/375415518

TANet从严格意义上来说并不能算是一种新的3D点云目标检测算法,只能算是一种增强方法,思路有点类似于SENet  。好处是可以很快地“嵌入”到当前已有3D目标检测算法中而不需要对原有代码进行大的修改。
文章解读可以参考月明星稀风萧萧:TANet: 3D点云目标检测框架  、AAAI 2020 | 华科Oral提出TANet:提升点云3D目标检测的稳健性   等。
本文从代码层面解读TANet的思路和方法。我们基于PointPillar的网络结构并且参照happinesslz/TANet  代码来进行代码剖析。PointPillar的代码解读可以参照硅仙人:代码层面解读3D点云物体检测模型:PointPillars  。
TANet主要从两个方面对原始网络结构进行了改进,一是Stacked Triple Attention,翻译过来为堆叠三元注意力,在channel wise、point wise和voxel wise三个层面对点云进行attention,作用是增强判别点,并抑制不稳定的点;二是Coarse-to-Fine Regression,作用是在不过度消耗计算成本的情况下提升定位准确率,下面进行详细地解读。

01

Stacked Triple Attention
通过PillarFeature_TANet实现,是对原代码中的PillarFeatureNet进行替换,PillarFeatureNet-->PillarFeature_TANet,主要是增加了VoxelFeature_TA模块,作用是对points进行attention修正。
1. VoxelFeature_TA

VoxelFeature_TA module

可以看出VoxelFeature_TA模块包含PACALayer (Point-wise Attention and Channel-wise Attention Layer)和VALayer (Voxel Attention Layer),而PACALayer又包含PALayer和CALayer从名字可以看出这些模块分别对应着point-wise attention、channel-wise attention和voxel attention,加起来正好一共是3个attention。
1.1 PACALayer
PACALayer包含PALayer和CALayer,输入x经过PALayer和CALayermodule后得到pa_weight和ca_weight,然后通过torch.mul将pa_weight和ca_weight做外积结合在一起,再通过sigmoid激活函数得到paca_normal_weight,最后将x和paca_normal_weight做点积(即attention机制)。
1.1.1 PALayer

PALayer module

PALayer用了一个很简单的方法,先对输入x的第2维进行max操作,输入x的shape为(K, N, C),K是voxel数目,N是每个voxel中的points数目,C是每个point的channel数目,那么经过第2维的max操作后得到shape为(K, N)的y,然后经过2层FC layer得到结果out1也就是PACALayer中的pa_weight。
1.1.2 CALayer

CALayer module

CALayer module和PALayer module十分类似,唯一的不同之处是在CALayer module中对输入x进行第1维上的max操作。
1.2 VALayer
VALayer的输入是voxel_center和paca_feat,voxel_center是points在x, y, z三个维度上进行的加权取均值操作,其维度是(K, 1, 3);paca_feat是PACALayer的输出,维度是(K, N, C)。在forward方法中首先将voxel_center在第1维上进行repeat成voxel_center_repeat,从而扩充到(K, N, 3),然后将paca_feat和 voxel_center_repeat在第1维上进行concat,接着经过1层fc得到feat_2 (K, N, 1),然后transpose得到(K, 1, N), 再经过1层fc得到voxel_feat_concat (K, 1, 1),最后通过sigmoid激活得到voxel_attention_weight (K, 1, 1)。
接着我们回过头再来考察VoxelFeature_TA的forward方法:
图中代码2个红框部分几乎一样,都是输入x和voxel_center经过PALayer、CALayer和VALayer后再通过1层fc,唯一不同之处是第1个红框内的out1是concat得来,而第2个红框内的out2是element wise add得来。那么经过VoxelFeature_TA后的feature就是经过attention后的feature

,从而做到了增强判别点,并抑制不稳定的点的作用。


02

Coarse-to-Fine Regression
通过PSA module进行实现,是对原代码中的RPN进行替换,RPN-->PSA,主要是增加了refine模块。
1. RPN Network
原始的RPN网络即3层并列的conv/deconv的组合经过concat,最后经过3个conv head返回box_preds、cls_preds和dir_cls_preds,结构如下

2. PSA Network

PSA Network

从上图可以看出,PSA Network中的Coarse Regression就是上述的RPN Network,没有做任何改动。PSA中增加的是Fine Regression,下面将详细讲述。
首先Coarse Regression最后concat得到的结果需要经过1层conv得到blottle_conv,留着在之后Fine Regression中upsample后的element wise add中用。
接着将RPN中三个block的输出分别引出,图中显示的是经过一个叫Pyramid Sampling的模块,实际上Pyramid Sampling就是max pooling和deconv模块的组合,如下图代码所示
Pyramid Sampling中既有downsample (max pooling)又有upsample (deconv),目的是将RPN中3个block的输出调整到统一大小,从而又可以形成3个新的block,可以分别进行concat,然后经过conv、upsample (deconv),得到大小(w, h)一致的特征图,接着用blottle_conv与这三个特征图做element wise add,之后将它们concat。
最后经过3个conv head返回box_preds、cls_preds和dir_cls_preds。那么就达到了不过度消耗计算成本的情况下提升定位准确率的作用。


03

结论
类似于SENet,TANet只是一种增强算法,在增加模型参数和复杂度的条件下提升了检测精度,个人认为创新点有限。好在可以在当前网络中进行小的调整,对原有网络不进行大的修改,可以对各种网络都试一试。

链接:

1. https://zhuanlan.zhihu.com/p/80123284

2. https://zhuanlan.zhihu.com/p/102996208

3. https://tech.sina.com.cn/roll/2019-12-28/doc-iihnzhfz8884996.shtml

4. https://github.com/happinesslz/TANet

5. https://zhuanlan.zhihu.com/p/357713061

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存