Sparse Convolution 讲解

2024-03-16 17:12
文章标签 讲解 convolution sparse

本文主要是介绍Sparse Convolution 讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. 标准卷积与Sparse Conv对比
      • (1)普通卷积
      • (2) 稀疏卷积
      • (3) 改进的稀疏卷积(subm)
    • 2 Sparse Conv 官方API
    • 3. Sparse Conv 计算
      • 3. 1 Sparse Conv 计算流程
      • 3. 2 案例
        • 3.2.1 普通稀疏卷积
        • 3.2.2 subm模式的稀疏卷积

3D点云数据非常稀疏,尤其体素化处理后(比如200k的点放在1440 144041个格子中),大部分空间都没有数据,此时卷积的话基本上都是在卷空气。此时直接用标准卷积去处理数据,浪费大量的计算资源,所以对3D的点云,一般采用稀疏卷积,只对有数据的部分进行计算,从而大大提高卷积的效率。

稀疏卷积的计算和标准卷积的计算结果是一样的(SubMConv3d是有差异的),只不过稀疏卷积的对输入和输出的数据表达和标准卷积是不一样的,它通过一个feats(值)和indices(索引)来表达数据,并且只表达有值的部分,这种表示方式是一种稀疏化储存的表示方式。

1. 标准卷积与Sparse Conv对比

(1)普通卷积

在这里插入图片描述

图1:普通卷积

  • 普通卷积:利用卷积核在输入数据中滑动,对输入4x4的数据,利用3x3大小的kernel_size计算,得到4x4的输出

(2) 稀疏卷积

在这里插入图片描述

图2:稀疏卷积

稀疏卷积通过一个feats(值) 和indices(索引)来表达输入矩阵中的值(图1),并且只表达有值的部分。图1中输入tensor中有值的部分为:1,2,3 feats;对应的索引分别为(0,0),(1,1),(3,3)。可以看到,稀疏卷积(Sparse Conv)和标准卷积的计算结果是一样的,只不过表达形式不一样,稀疏卷积的结果只表达有值的部分,通过feats(值)和indices(索引)存储,这种表示方式就是一种稀疏化储存的方式。

为什么我们要用稀疏卷积呢?主要它可以实现在GPU运算时,在GPU block级别跳过一些值都是0的数据,这是因为点云是非常稀疏的,特别是将它体素化表达后,比如将20万个点放在(1440144041)个网格上,整体非常稀疏,很多空间都是0, 对于全是0的计算,是一种计算资源的浪费,而稀疏卷积就可以实现只在有值的位置进行计算(subm模式),值为0的地方在卷积的时候就跳过不计算。

(3) 改进的稀疏卷积(subm)

在这里插入图片描述

图2:subm模式的稀疏卷积
  • subm模式下的稀疏卷积是一个改进版的稀疏卷积,它和标准的稀疏卷积的区别是,标准的稀疏卷积普通的卷积计算结果是一样的,只是对结果稀疏表示。但subm模式的稀疏卷积,只在有值的地方做卷积计算
  • 比如上图中输入矩阵中有1,2,33个非0的值,此时在计算卷积的时候,会将卷积核中心对准有值的位置,然后计算卷积,经过subm卷积计算,输入有值的位置会有对应的计算结果,值为0的位置输出全是0。然后将结果稀疏表示为feats和indices。

总结

  • 标准的SparseConv卷积的次数和普通的卷积是一样的,只不过对输入和输出数据进行了稀疏化表达和存储。而subm模式下的稀疏卷积,只对输入tensor中有值的位置卷积,如果3个地方有值,则卷积3次,输出3个值。

  • 普通的稀疏卷积和标准卷积一样,输出的大小是和输入和卷积核大小相关的。而subm稀疏卷积,输入有3个地方有值,输出永远是3个值,也就是它的输出个数和输入中非零个数是一样的。

2 Sparse Conv 官方API

参考:https://github.de/traveller59/spconv/blob/master/docs/USAGE.md

import spconv.pytorch as spconv
from spconv.pytorch import functional as Fsp
from torch import nn
from spconv.pytorch.utils import PointToVoxel
from spconv.pytorch.hash import HashTable

在这里插入图片描述

3. Sparse Conv 计算

  • https://github.com/traveller59/spconv/blob/master/docs/USAGE.md
    在进行spconv(Sparse Conv)时,首先需要对lidar点云体素化,比如将lidar点映射到(1440 x 1440 x 41) 的网格上,接下来就可以对体素化后的lidar点云计算稀疏卷积。

3. 1 Sparse Conv 计算流程

(1) 点云体素化PointToVoxe

voxel generator in spconv generate indices inZYXorder, the params format are XYZ.
generated indices don't include batch axis, you need to add it by yourself.
see examples/voxel_gen.py for examples.

  • 利用PointToVoxel产生的indices,坐标顺序为ZYX,我们需要调整为XYZ
  • 产生的indices,没有batch维,需要我们自己添加一个batch_id
  • 体素化生成voxels(feats)和coords,用于后续稀疏卷积使用
  • 其中 官方提供的点云体素化案例如下:来自于USAGE.md
from spconv.pytorch.utils import PointToVoxel, gather_features_by_pc_voxel_id
# this generator generate ZYX indices.
gen = PointToVoxel(vsize_xyz=[0.1, 0.1, 0.1], coors_range_xyz=[-80, -80, -2, 80, 80, 6], num_point_features=3, max_num_voxels=5000, max_num_points_per_voxel=5)
pc = np.random.uniform(-10, 10, size=[1000, 3])
pc_th = torch.from_numpy(pc)
voxels, coords, num_points_per_voxel = gen(pc_th, empty_

这篇关于Sparse Convolution 讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816163

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

ispunct函数讲解 <ctype.h>头文件函数

目录 1.头文件函数 2.ispunct函数使用  小心!VS2022不可直接接触,否则..!没有这个必要,方源一把抓住VS2022,顷刻 炼化! 1.头文件函数 以上函数都需要包括头文件<ctype.h> ,其中包括 ispunct 函数 #include<ctype.h> 2.ispunct函数使用 简述: ispunct函数一种判断字符是否为标点符号的函

深度学习速通系列:深度学习算法讲解

深度学习算法是一系列基于人工神经网络的算法,它们通过模拟人脑处理信息的方式来学习和解决复杂问题。这些算法在图像识别、语音识别、自然语言处理、游戏等领域取得了显著的成就。以下是一些流行的深度学习算法及其基本原理: 1. 前馈神经网络(Feedforward Neural Networks, FNN) 原理:FNN 是最基本的神经网络结构,它由输入层、隐藏层和输出层组成。信息从输入层流向隐藏层,最