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

相关文章

计算机毕业设计 大学志愿填报系统 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 是最基本的神经网络结构,它由输入层、隐藏层和输出层组成。信息从输入层流向隐藏层,最

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

[项目][CMP][直接向堆申请页为单位的大块内存]详细讲解

目录 1.系统调用 1.系统调用 Windows和Linux下如何直接向堆申请页为单位的大块内存: VirtualAllocbrk和mmap // 直接去堆上按页申请空间static inline void *SystemAlloc(size_t kpage){#ifdef _WIN32void *ptr = VirtualAlloc(0, kpage << 13,

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

车险该怎么买?行业人讲解车险

很多车主对汽车保险知识不了解,稀里糊涂的买了车辆保险,但是出险时发现很多不赔的,还有很多对自己来说没什么用的保险,花了不少钱,还没买到自己想要的,殊不知只要多了解点汽车保险知识就能轻松省下一大笔钱并且买到自己真正想要的,何乐而不为呢! 因为卖保险的或者4S店,都是按照常规情况给你推荐保险,具体用车情况,只有你自己最清楚,所以保险是个个性化定制的产品,需要什么买什么,不需要的就没必要购买了。 一般

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

https://www.cnblogs.com/sishang/p/6576665.html BeanPostProcessor接口作用:      如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。   package com.t

Java异常体系----深入讲解

JAVA异常体系 1.error 错误 程序无法处理的异常, 它是由JVM产生和抛出的,比如OutOfMemoryError.ThreadDeath等 示例: public class Test {public static void main(String[] args) {run();}public static void run(){run();}} 堆栈溢出,这是由于JV