“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。
地址: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
通过PillarFeature_TANet实现,是对原代码中的PillarFeatureNet进行替换,PillarFeatureNet-->PillarFeature_TANet,主要是增加了VoxelFeature_TA模块,作用是对points进行attention修正。可以看出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。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机制)。
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。
CALayer module
CALayer module和PALayer module十分类似,唯一的不同之处是在CALayer module中对输入x进行第1维上的max操作。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模块。原始的RPN网络即3层并列的conv/deconv的组合经过concat,最后经过3个conv head返回box_preds、cls_preds和dir_cls_preds,结构如下
从上图可以看出,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
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“源头活水”历史文章
更多源头活水专栏文章,
请点击文章底部“阅读原文”查看
分享、在看,给个三连击呗!