论文阅读:Submanifold Sparse Convolutional Networks

子流形稀疏卷积网络

出版时间:2019

作者:Benjamin Graham, Laurens van der Maaten。 Facebook AI Research

代码地址

看到最近很多关于点云的网络都用到这个方法,就来读一下。

摘要

卷积处理的数据(比如图片)一般都是很dense的,但是有些数据是sparse的(比如点云数据,在纸上形成的笔画)。在这些稀疏数据上直接用dense的卷积网络是非常没有效率的。本文引入了一种稀疏卷积运算,该运算针对处理稀疏数据而定制,与之前的稀疏卷积网络的工作不同,它严格地在子流形上运行,而不是将观测扩展到网络的每一层。

总之就是一个很适合处理稀疏数据的卷积


为什么不能用一般的卷积操作处理稀疏数据?

“submanifold” dilation 问题

左: 原始输入,是一个手画的圆形, 是嵌入在二维网格(grid)上的一维曲线(curve)。

中:一次3x3卷积之后的结果

右:两次3x3卷积之后的结果

上图的输入是一个手写数字识别的例子,作者把上图表示出来的问题叫做“submanifold” dilation 问题 ,可以看到原始数据是非常sparse的,但是用了传统卷积之后,稀疏性很快就消失了。


如果不是对所有的pixel进行卷积,只对白色的有curve的pixel进行卷积操作会怎么样?

结果就是,会丢失很多信息,没法分类。

注:作者把白色的这些有意义的pixel叫做active site


什么是(submanifold)子流形?

We use the term 'submanifold' to refer to input data that is sparse because it has a lower effective dimension than the space in which it lives, for example a one-dimensional curve in 2+ dimensional space, or a two-dimensional surface in 3+ dimensional space.

我们使用术语“子流形”来表示输入数据是稀疏的,因为它的有效维数低于它所在的空间,例如二维空间中的一维曲线,或三维空间中的二维曲面。



稀疏卷积SC和VSC

作者提出两种卷积操作:SC 和 VSC。

(1)SC卷积操作

稀疏卷积操作sparse convolution,可以表示为SC(m, n, f, s), 其中m是input feature planes,我感觉应该就是输入特征channel数;n是输出特征channel数; f是filter size; s是stride。

其中f可以是non-square filter。传统的filter size一般是3x3, 5x5 ...这里可以是1x7...

  • SC的input-output变化:当input大小是 l 的时候,输出就是(l − f + s)/s 。看起来没有涉及padding操作。

而传统dense卷积的input-output变化为:当input大小是 l 的时候,输出就是 (l-f+2p)/s+1 。其中 p 是padding像素数。


我感觉最关键的部分就是:

An SC convolution computes the set of active sites in the same way as a regular convolution: it looks for the presence of any active sites in its receptive field of size f^d . An SC convolution differs from a regular convolution in that it discards the ground state for non-active sites by assuming that the input from those sites is exactly zero.


  • 计算active site:对第一层来说就是真正有数据的pixel或者point,site应该可以理解为image中的pixel和point cloud中的point。对之后的层来说,如果这一个site的感受野中存在active site,则这个site为active site。这种计算方式跟传统卷积操作计算active site的方式是一样的。


  • 计算non-active site把这些site的ground state(第一层的input值)直接设置为0,那么,在input和kernel weight相乘的时候,输出还是0。这样,non-active site相当于被丢弃了。所以,在每一层sc的input中是non-active的site,在这一层的output中仍然是non-active site。这里就跟传统的卷积操作不一样了。


(2)VSC卷积操作

main contribution of this paper.

有效的稀疏卷积(valid sparse convolution),可以表示为 VSC(m, n, f, 1),是之前提到的SC(m, n, f, 1) 的变体。

  • input-output变化VSC的输入输出大小相同,因为使用了padding,每一边的padding像素数为 (f − 1)/2


  • 计算active site:当计算一个output site时,如果这个output site的感受野最中间的site是active site,则这个output site就是active site。而上面SC的activate site计算中,只要这个site的感受野中存在activate site,就会把这个site看作active site,不管是central site还是side site。


  • 计算non-active site: 应该和SC是一样的。


如果只有active site的计算这点不一样,我觉得valid sparse convolution直接叫做central sparse convolution就好了吧。

(3)激活函数和pooling函数

使用SC/VSC来构建网络的时候,还会用到激活函数,bn,pooling。

  • 激活函数和bn:只对active site 使用激活函数和bn。
  • avg pooling:取active输入向量的和除以感受野的大小f^d ,不考虑non-active site。
  • max pooling:取感受野内的最大值。


(4)计算和内存开销


下图展示了active site和non-active site在传统卷积C,SC, VSC的计算和内存开销。

Context:filter size为3,对一个d维的single location进行卷积。

传统卷积C,SC, VSC的计算和内存开销

其中, a是active sites number, m是input channel number, m是output channel number。

用提出的卷积构建常用网络

Modules used for building sub-manifold sparse convolutional networks

作者用提出的VSC和SC构建了很流行的几种网络模块:VGG, ResNet, DenseNet模块。

(a) VGG block是2个VSC个一个max pooling组成

(b) 保持输入输出分辨率不变的ResNet block是把两个VSC的输出加在input上

(c) 减小分辨率的ResNet block

(d) 保持输入输出分辨率不变的DenseNet block

(e) 减小分辨率的DenseNet block

其中,VSCSC的四个参数分别是:输入channel数 n_i ,输出channel数 n_o ,kernel大小,步长。


实现过程

(1)涉及到几个关键的部分:

  1. input matrix:每一行存放一个input active site的特征值。如果输入大小是 a\times m , 则表示有a个active sites,每个site有m个特征值。则在input matrix有a行m列。

2. input hash table:对所有的active site都保存一个(location, row)。location是整数坐标的元组,如果是image则是(x, y), 如果是point cloud则是(x, y, z)。row表示input matrix中对应的行。

3. rule book:每个filter i 都自己有一个rule book,记作 Ri,里面每一行都存放的是 (input index, output index ) 的对应关系矩阵。通过rule book就能找到input active site对应的output active site。比如,某一行是(5,6),则表示input matrix的5-th行对应output matrix的6-th行。


4. output matrix:每一行存放一个active site的输出特征值。

5. output hash table:类似input hash table。


(2)SC的实现过程:

input matrix和input hash table是已经有的。

  1. 建立output hash table和rule book。如果一个output site是active site,且第一次被访问到,则在output hash table中建立一个新的entry,然后在rule book中写上 (input index, output index ) 的对应关系(也可以表达为,对每一个在output y感受域中的active input x, 在rule book Ri中增加一行(input- hash(x), output-hash(y)) 。)。如果有i个filter,则有i个rule book。

2. 建立output matrix。先把所有的output matrix值都置为0。从rule book中找到一对active pairs:(input index, output index ) 。从input matrix 中得到输入,由于每一行对应一个site,每个site大小都是 1\times m , 跟大小为 m\times n 的filter weight相乘,得到大小为 1\times n 的output value,把这个output value写入output matrix对应的行中去。

由于只有active site被访问过,所以non active site的值还是0。

(3)VSC的实现过程

和SC不同的只是rule book的构建。


实验

在ModelNet-40数据集上的结果。



可以看到VSC的精确度不比传统卷积C的精确度差多少,但是速度内存都有极大的提升。


最后

结果可视化里面如果有个类似下面这样的图,更能表示使用SC/VSC不会降低数据稀疏性。

然而没有,试着自己可视化看看吧。

这篇文章没有发表,而是作为《3D Semantic Segmentation with Submanifold Sparse Convolutional Networks》的一部分后来发表的。

如果看不懂这篇文章的一些细节,没关系,去读写的更清楚详细的《3D Semantic Segmentation with Submanifold Sparse Convolutional Networks》。我有点吐血,写完这个才读了《3D Semantic Segmentation with Submanifold Sparse Convolutional Networks》,很多我猜出来的细节,在文章中就写明了,去读吧,清晰很多。

这篇文章有时间再修改这个笔记吧。

编辑于 2019-12-19

文章被以下专栏收录