体素相关的快速计算
“体素”通常是指在三维空间中具有固定尺寸和位置的小立方体单元。
体素的优点包括:
- 易于处理和计算:在计算机图形学和三维建模中,体素的结构相对简单,计算和操作较为方便。
- 能精确表示物体的内部结构:对于一些需要了解物体内部信息的应用,如医学成像、地质建模等,体素可以提供更详细和准确的内部描述。
- 适合并行计算:因为体素之间相对独立,便于在多核或分布式计算环境中进行并行处理,提高计算效率。
- 数据结构简单:存储和管理体素数据的结构相对简单,降低了数据处理的复杂性。
本文主要介绍在使用体素过程中的一些快速计算的方法
1. 求重心
一般情况下并不需要求体素的重心,可以用中心或随机采样来代替,但是在一些特殊的应用场景,还是需要重心的,而这个重心却很难计算,此处介绍一种快速方法。
通过cumsum函数高效计算voxel中所有Point的X,Y,Z坐标之和/平均值,为了方便理解,下面对该trick的计算过程进行简单演示
# 假设我们有一组Point,以及该组Point中每个点对应的voxel的index
points = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]]) # 5x3
indexes = np.array([0, 1, 2, 2, 3])
# 现在我们希望计算属于同一个voxel中的所有点的x,y,z坐标的平均值,暴力方法是通过for循环来实现
# 下面给出如何利用cumsum函数来非常简单的实现上述功能# step1: 对点云的第0维进行累加求和
points_cumsum = points.cumsum(0)
# point_cumsum = [[1, 1, 1], [3, 3, 3], [6, 6, 6], [10, 10, 10], [15, 15, 15]]# step2: 计算每个点与其前一个点是否落在同一个voxel中
kept = np.ones(points.shape[0], dtype=bool)
kept[:-1] = (indexes[1:] != indexes[:-1])
# kept: [True, True, False, True, True]# step3: 计算并输出同一个voxel中所有Point的xyz坐标之和
points_voxel = points_cumsum[kept]
points_voxel = np.concatenate((points_voxel[:1], points_voxel[1:] - points_voxel[:-1]))
# points_voxel: [[1, 1, 1], [2, 2, 2], [7, 7, 7], [5, 5, 5]]
2. 语义投票
对体素中每个点的语义求均值是错误的方法。随机采样并不鲁棒,投票是比较好的方法,但投票的开销很大。此处介绍一个快速计算方法。
2.1. 开销大的方法
当体素较多时,该方法速度极慢
min_values = np.min(points, axis=0)
points_voxel_coordinates = np.round((points - min_values) / voxel_size).astype(int)
sample_voxel_coordinates, sampled_indices = np.unique(points_voxel_coordinates, axis=0, return_inverse=True)
sampled_points = sample_voxel_coordinates * voxel_size + voxel_size * 0.5sampled_semantics = []
for i in range(len(sample_voxel_coordinates)):print(f"Processing voxel {i}/{len(sample_voxel_coordinates)}")voxel_point_indices = np.where(sampled_indices == i)[0]voxel_semantics = semantics[voxel_point_indices]voxel_semantic = scipy.stats.mode(voxel_semantics)[0][0]sampled_semantics.append(voxel_semantic)sampled_semantics = np.array(sampled_semantics)
2.2. 内存大的方法
该方法速度快,但当语义的类别较多时,其占用的内存较大。
num_points = points.shape[0]min_values = np.min(points, axis=0)
points_voxel_coordinates = np.round((points - min_values) / voxel_size).astype(int)
_, sampled_indices, counts = np.unique(points_voxel_coordinates, axis=0, return_inverse=True, return_counts=True)arg_indices = np.argsort(sampled_indices)
sampled_indices = sampled_indices[arg_indices]
points = points[arg_indices, :]
points = points.cumsum(0)kept = np.ones(num_points, dtype=bool)
kept[:-1] = (sampled_indices[1:] != sampled_indices[:-1])
counts_3d = np.tile(counts, (3, 1)).Tpoints = points[kept]
points = np.concatenate((points[:1], points[1:] - points[:-1]))
points = (points / counts_3d).astype(np.float32)semantics = pointcloud.point.semantic.numpy().flatten()
semantic_matrix = np.zeros((num_points, num_semantics), dtype=bool)
semantic_matrix[np.arange(num_points), semantics] = 1semantic_matrix = semantic_matrix[arg_indices, :]
semantic_cols = []for i in range(num_semantics):semantic_col = np.cumsum(semantic_matrix[:, i].astype(np.uint32))semantic_col = semantic_col[kept]semantic_col = np.concatenate((semantic_col[:1], semantic_col[1:] - semantic_col[:-1])).astype(np.uint8)semantic_cols.append(semantic_col)semantic_cols = np.stack(semantic_cols, axis=1)
semantic_matrix = np.argmax(semantic_cols, axis=1).astype(np.uint8)
2.3. 两者兼顾的方法
该方法虽然速度上比上一方法略慢,但解决了内存问题
num_points = points.shape[0]min_values = np.min(points, axis=0)
points_voxel_coordinates = np.round((points - min_values) / voxel_size).astype(int)
_, sampled_indices, counts = np.unique(points_voxel_coordinates, axis=0, return_inverse=True, return_counts=True)arg_indices = np.argsort(sampled_indices)
sampled_indices = sampled_indices[arg_indices]
points = points[arg_indices, :]
points = points.cumsum(0)kept = np.ones(num_points, dtype=bool)
kept[:-1] = (sampled_indices[1:] != sampled_indices[:-1])
counts_3d = np.tile(counts, (3, 1)).Tpoints = points[kept]
points = np.concatenate((points[:1], points[1:] - points[:-1]))
points = (points / counts_3d).astype(np.float32)semantics = pointcloud.point.semantic.numpy().flatten().astype(np.uint8)
semantics = semantics[arg_indices]num_kept = np.sum(kept)
max_values = np.zeros(num_kept, dtype=np.uint64)
max_indices = np.zeros(num_kept, dtype=np.uint8)for i in range(num_semantics):semantic_col = np.where(semantics == i, 1, 0).astype(np.uint64)semantic_col = np.cumsum(semantic_col)semantic_col = semantic_col[kept]semantic_col = np.concatenate((semantic_col[:1], semantic_col[1:] - semantic_col[:-1])).astype(np.uint8)sign = semantic_col > max_valuesmax_values[sign] = semantic_col[sign]max_indices[sign] = i相关文章:
体素相关的快速计算
“体素”通常是指在三维空间中具有固定尺寸和位置的小立方体单元。 体素的优点包括: 易于处理和计算:在计算机图形学和三维建模中,体素的结构相对简单,计算和操作较为方便。能精确表示物体的内部结构:对于一些需要了…...
Python 爬虫项目实战(二):爬取微博热搜榜
前言 网络爬虫(Web Crawler),也称为网页蜘蛛(Web Spider)或网页机器人(Web Bot),是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…...
文件解析漏洞复现
一、IIS 6.X 1.在网站目录创建文件夹名为xxx.asp/xxx.asa 文件夹,里面的任意文件都会被当作asp文件执行 创建1.asp 访问 2.ooo.asp.jpg会被当做asp文件执行 创建一个ooo.asp;.jpg 访问 二、IIS 7.X 上传1.jpg文件在网址后/.php可以成功执行 写一个1.jpg文件内容…...
git push报错 pre-receive hook declined
今天使用git提交的代码的时候,不然报错 pre-receive hook declined提交不上去,昨天还好好的。 经过检查发现,原来对应的分支被leader设置成受保护分支了,导致代码提交不上去。 然后在git管理平台取消分支保护,或者将我…...
打造个性化代码审查工具:在Perl中实现自定义审查的艺术
打造个性化代码审查工具:在Perl中实现自定义审查的艺术 代码审查是软件开发过程中的关键环节,它有助于提高代码质量和发现潜在缺陷。Perl作为一种灵活的编程语言,提供了丰富的特性,使得在Perl中实现自定义的代码审查工具成为可能…...
RabbitMq架构原理剖析及应用
文章目录 RabbitMQ 架构组件1. **Broker** (Broker Server)2. **Exchange**3. **Queue**4. **Producer** (消息生产者)5. **Consumer** (消息消费者)6. **Virtual Hosts** (虚拟主机) 工作流程内部原理1. **队列管理**2. **集群**3. **持久化与内存**4. **性能优化** 高级特性1…...
c# 对接第三方接口实现签名
官网文档要求如下: Sign算法说明 举例:假设请求参数键值对如下 appkey : test2-xx page_no : 0 end_time : 2016-08-01 13:00:00 start_time : 2016-08-01 12:00:00 page_size : 40 sid : test2 timestamp : 1470042310 第一步 对数所有请求参数按照…...
数学建模评价类模型—层次分析法(无数据情况下)
目录 前言 一、评价类问题概述 二、AHP建模流程 1、过程描述 2、层次分析法—Matlab代码 三、权重计算 1、算术平均法 2、几何平均法 3、特征值法 目录 文章目录 前言 一、评价类问题概述 二、AHP建模流程 1、过程描述 2、层次分析法—Matlab代码 三、权重计算 算术平均法 前言…...
模拟实现strcat(字符串追加)
1.我们要知道stcat的作用是什么,字符串追加。 2.我们进行模仿,我们先将arr1不断,直到“\0”,我们加在后面。 //模拟实现strcat(字符串追加) char* my_strcat(char* arr1, const char* arr2) {assert(arr1 && arr2);char ret arr1;…...
HTTP简单概述
一. HTTP HTTP(HyperText Transfer Protocol)是用于在客户端和服务器之间传输超文本数据(如HTML)的应用层协议。它是万维网的基础协议,定义了浏览器和服务器之间如何请求和传输文档。HTTP有多个版本,每个版…...
掌握PyCharm代码片段管理器:提升编码效率的秘诀
掌握PyCharm代码片段管理器:提升编码效率的秘诀 PyCharm作为业界领先的集成开发环境(IDE),提供了许多便利的功能来提升开发者的编码效率,其中之一就是代码片段管理器。代码片段管理器允许开发者保存、管理和重用代码模…...
MyBatis动态代理和映射器
目录 1、映射器简介 (1)什么是mapper动态代理? (2)动态代理的规范 (3)如何使用动态代理 (4)为什么学映射器 (5)映射器与接口 (…...
ShardingSphere中的ShardingJDBC常见分片算法的实现
文章目录 ShardingJDBC快速入门修改雪花算法和分表策略核心概念分片算法简单INLINE分片算法STANDARD标准分片算法COMPLEX_INLINE复杂分片算法CLASS_BASED自定义分片算法HINT_INLINE强制分片算法 注意事项 ShardingJDBC Git地址 快速入门 现在我存在两个数据库,并…...
SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志
SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志 一、前言二、技术介绍(Flink CDC)1、Flink CDC2、Postgres CDC 三、准备工作四、代码示例五、总结 一、前言 在工作中经常会遇到要实时获取数据库(postgresql、m…...
ThinkPHP事件的使用
技术说明 1.ThinkPHP版本:支持6.0、8.0 2.使用场景:用户登陆后日志记录、通知消息发送等主流程、次流程分离等场景 3.说明:网上很多帖子说的不明不白的,建议大家自己手动尝试总结一下 4.事件手动绑定的时候,一定要…...
【Nuxt】服务端渲染 SSR
SSR 概述 服务器端渲染全称是:Server Side Render,在服务器端渲染页面,并将渲染好HTML返回给浏览器呈现。 SSR应用的页面是在服务端渲染的,用户每请求一个SSR页面都会先在服务端进行渲染,然后将渲染好的页面…...
Spring Boot整合WebSocket
说明:本文介绍如何在Spirng Boot中整合WebSocket,WebSocket介绍,参考下面这篇文章: WebSocket 原始方式 原始方式,指的是使用Spring Boot自己整合的方式,导入的是下面这个依赖 <dependency><g…...
《LeetCode热题100》---<5.③普通数组篇五道>
本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第五道:缺失的第一个正数(困难) 第五道:缺失的第一个正数(困难) 方法一:将数组视为哈希表 class Solution {public int firstMissingPosi…...
Cocos Creator文档学习记录
Cocos Creator文档学习记录 一、什么是Cocos Creator 官方文档链接:Hello World | Cocos Creator 百度百科:Cocos Creator_百度百科 Cocos Creator包括开发和调试、商业化 SDK 的集成、多平台发布、测试、上线这一整套工作流程,可多次的迭…...
插入数据优化 ---大批量数据插入建议使用load
一.insert优化 1.批量插入 2.手动提交事务 3.主键顺序插入 二.大批量插入数据 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下 1.客户端连接服务端时,加入参数 --local-infine mysql --local-infine…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
