SECOND Sparse Convolution Algorithm

稀疏卷积算法

让我们首先考虑2D密集卷积算法。我们使用 Wu,v,l,m 来表示滤波元素,使用 Du,v,l 来表示图像元素,其中u和v是空间位置索引,l表示输入通道,m表示输出通道。给定提供的输出位置,函数P(x,y)生成需要计算的输入位置。因此,Yx,y,m 的卷积输出由下式给出:
在这里插入图片描述
其中x和y是输出空间索引,而u-u0和v-v0代表内核偏移u和v坐标。 可以使用基于通用矩阵乘法(GEMM)的算法(也称为基于im2col的算法[30])来聚集构造矩阵 D̃ P(x,y),l 所需的所有数据,然后执行GEMM 本身:
在这里插入图片描述
其中W∗,l,m对应于Wu−u0,v−v0,l,m 但以GEMM形式表示。 对于稀疏数据D'i,l 和关联的输出Y'j,m,直接计算算法可以编写如下:
在这里插入图片描述
其中,P'(j) 是用于获得输入索引i和滤波器偏移量的函数。下标k是1D核偏移量,对应于方程(1)中的u−u0和v−v0,下标i对应于方程(1)中的u和v。方程式(3)基于GEMM的版本由以下公式给出:
在这里插入图片描述
所收集的稀疏数据矩阵在这里插入图片描述
仍然包含许多不需要计算的零。 为了解决这个问题,我们将公式(3)重写为以下公式,而不是将公式(3)直接转换为公式(4):
在这里插入图片描述
其中Rk,j(也称为Rule)是一个矩阵,该矩阵在给出内核偏移k和输出索引 j 的情况下指定输入索引 i 。 公式(5)中的内部和不能通过GEMM计算,因此我们需要收集必要的输入以构造矩阵,执行GEMM,然后将数据分散回去。

在实践中,我们可以使用预先构建的输入-输出索引规则矩阵直接从原始稀疏数据中聚集(gather)数据。 这样可以提高速度。 详细地,我们构造一个规则矩阵表R k,i,t = R [k,i,t],其尺寸为K×Nin×2,其中K是内核大小(表示为体积),Nin 是输入特征的数量,t是输入/输出索引。 元素R [: ,: ,0]存储用于聚集的输入索引,元素R [:, :,1]存储用于分散(scatter)的输出索引。 图2的顶部显示了我们提出的算法。
SECOND Sparse Convolution Algorithm_第1张图片
图2.上面显示了稀疏卷积算法,下面显示了GPU规则生成算法。 Nin表示输入特征的数量,Nout表示输出特征的数量。 N是聚集特征的数量。 Rule是规则矩阵,其中Rule [i,:,:]是与卷积内核中第i个内核矩阵相对应的第i个规则。 除白色外,带有颜色的框表示数据稀疏的点,白色框表示空点。

规则生成算法

当前实现面临的主要性能挑战[31]与规则生成算法相关。 通常使用使用哈希表的基于CPU的规则生成算法,但是这种算法很慢,并且需要在CPU和GPU之间进行数据传输。 规则生成的更直接方法是遍历输入点,以查找与每个输入点相关的输出,并将相应的索引存储到规则中。 在迭代过程中,需要一个表来检查每个输出位置的存在,以决定是否使用全局输出索引计数器来累积数据。 这是阻碍在算法中使用并行计算的最大挑战。

在我们的案例中,我们设计了基于GPU的规则生成算法(算法1),该算法在GPU上运行得更快。 首先,我们收集输入索引和关联的空间索引,而不是输出索引(算法1中的第一个循环)。 在此阶段获得重复的输出位置。 然后,我们对空间索引数据执行独特的并行算法,以获得输出索引及其关联的空间索引。 从先前的结果中生成与稀疏数据具有相同空间尺寸的缓冲区,以便在下一步中进行表查找(算法1中的第二循环)。 最后,我们对规则进行迭代,并使用存储的空间索引来获取每个输入索引的输出索引(算法1中的第3个循环)。 表1显示了我们的实现与现有方法之间的性能比较。
SECOND Sparse Convolution Algorithm_第2张图片
表1.各种卷积实现的执行速度的比较。SparseConvNet是子流形卷积的官方实现[27]。所有基准测试都在GTX 1080 Ti GPU上运行,其中包含来自KITTI数据集的数据。
SECOND Sparse Convolution Algorithm_第3张图片

你可能感兴趣的:(无人驾驶,算法,机器学习)