Brief
最近在很多文献中都看到有稀疏卷积和流行卷积的形式,如下图的来自商汤和港科大的Part-A2 Net(19arxiv),这里的u-net实际上的绿色框表示的是submanifold卷积层,蓝色框表示的是稀疏上采样层,而黄色表示的是稀疏卷积层。

在代码中如何使用
作者首先是定义一个block:每一个的block实际上是两层的sub加上一层的sp,如下:
SubMConv3d(num_input_features, 128, 3, indice_key="subm0"),
BatchNorm1d(128),
nn.ReLU(),
SubMConv3d(128, 128, 3, indice_key="subm0"),
BatchNorm1d(128),
nn.ReLU(),
SpConv3d(128, 64, 3, 2,
padding=1), # [41,1280,1056]→[21,640,528]
BatchNorm1d(64),
nn.ReLU(),
运行过程
参考我的上一篇文章,这里就不细说的。
要怎么用
这才是真正我们关心的问题,实际上SECOND作者已经把稀疏卷积写的非常容易读了,整个过程也就是从构建哈希表,到卷积,再到构建输出哈希表,最后输出,在源码中都是很容易的。
我们只需要理解作者的这个稀疏卷积的结构体,就很清晰了。
一个sparse_tensor实际上包括了以下的几个主要的tensor。
| 包含内容 | shape | 含义 |
|---|---|---|
| features | [non_empty,channel] | 非空的特征,这是进行卷积的特征 |
| indices | [non_empty,4] | 非空向量的索引 |
| batch_size | int |
最主要的内容也就是上面的几个字段,剩下的不多做介绍
那么怎么用呢
实际上就和一般的CNN一样使用,把features嵌入到sparse tensor中,然后再送入到作者写的结构中就行了,如果自己搭建了3D稀疏网络,切记自己搭建的部分要自己写forward的话不能采用sparce seq。因为作者在报错中会把自己通过稀疏卷积搭建的架构认定为是结构错误。
本文深入探讨了稀疏卷积在3D点云处理中的应用,特别是商汤和港科大提出的Part-A2Net中的实现方式。文章详细介绍了如何在代码中实现稀疏卷积,包括构建哈希表、卷积操作和输出哈希表的过程。此外,还解释了sparse_tensor结构,以及如何将features嵌入到该结构中,以便于在网络中进行前向传播。
27万+

被折叠的 条评论
为什么被折叠?



