点云入门知识
点云的处理任务
场景语义分割
物体的三维表达方法(3D representations):
点云:是由物体表面上许多点数据来表征这个物体。最接近原始传感器数据,且具有丰富的几何信息。
Mesh:用三角形面片和正方形面片拼成一个物体。
Volumetric:一种栅格化的表征方法。
Projected View:通过图片来不同的角度来构成的一个立体的兔子。(附有RGB颜色信息和D深度信息)。
点云数据的获取方法:
(1)可以通过激光雷达扫描所得到;
(2)通过摄影的方法,获取RGB图像,再通过一些方法获取深度信息。最后通过透视即可反推出空间中的一些点云数据。
Depth Sensor(带有深度传感器的摄像头)这种相对图中其他方法更为接近原始传感器数据。过去还需要经过点云对准、去噪等处理。
比如:较为先进的,可以通过多个摄像头进行倾斜摄影来构造点云数据。
点云一般具有的基本信息:位置信息三维坐标:(x,y,z),颜色信息。
另外还可以通过别的方法来获取:强度信息(intensity)、法向量的信息等。
严格来说呢,RGB+D这种结合,只能算为2.5D。
点云数据处理的挑战:
(1)不规则:密集和稀疏的区域不规则。通常激光雷达获取的数据,近密远疏。
(2)非结构化。
(3)无序的。这就带来置换不变性:从几何上来说,这个点云的顺序是没有关系的,不同的点排不同的序还是同一个点云。
对于点云的处理:
(1)结构化表示学习:
1.1基于体素:将非结构化点云数据,转换为右边的很多小栅格所表示的表达方式来处理。
1.2基于多视角:将点云数据通过各个角度来进行投影,得到一个二维视角的一个图像。后续通过比如:CNN进行处理。
(2)深度学习直接在原始点云数据上进行处理:
PointNet–直接处理点云数据的深度学习技术的开山之作
是一个可以完成多种任务的统一框架:
分类、部件分割、场景的语义分割
2.1基于点的方法:PointNet、PointNet++
PointNet(没有考虑局部的上下文信息):就是对输入的点进行share的多层感知机MLP处理后,经过最大池化,来得到点云的特征。
PointNet++:通过Sampling采样,然后Grouping后,来获得局部信息,以提升性能。
(3)基于卷积的方法:
(4)基于图的方法
对于3D点云的一个深度学习方法的分类:
以前的一些相关工作:
PointNet原理
挑战:
(1)输入的点云是无序的点的集合;
这里有一个点云数据:N个无序的点,每个点表示为D维向量。最简单的就是x,y,z三维坐标,法向量,颜色,强度信息(总之可以表达为一个矢量)
这个点的顺序的集合表示,在改变顺序后,应该还是表示同样的集合。
也就是说对于这种置换、排列应该有同样的结果,难么,什么样的处理能够做到这种置换不变性呢?
对称函数是可以做到这一点的,(就是改变函数中x1到xn的排列顺序后,输出不受影响)
求最大值函数是不是和排列顺序无关呢?求和函数也是啊。那么我们就可以通过神经网络构造这样的对称函数了。
构造复合函数:每个点都经过h这个函数(共享函数)(可以用MLP)进行升维变换,然后经过一个g函数(对称函数)(可以用最大池化maxpooling),比如求最大值,在经过伽马函数,得到特征。这个特征就可以用来分割、分类等。
这里只要g函数是对称的,整个复合函数都是对称的。
但是这里的maxpooling是求每个维度山的最大值,会丢失一些数据点的信息;所以可以使用MLP进行升维变换(每个点单独做MLP,但是MLP的参数是共享的),高维空间里基本信息就会被保留下来。再经过maxpooling,就会得到全局特征(基本上会反映出原来点云数据的基本特征征)。
(2)对于几何变换应该有不变的特性;比如下图中的兔子有不同的视角,但是经过PoinNet后都应该分类为一个兔子。就是说这种几何变换对分类应该不会产生影响。
对于这个点,做的各种变换,最终的结果都不应有不同。设计一个变换的网络来对输入进行对准,(其实就是把点云旋转到一个角度,来更好的进行分类等。)比如,飞机旋转到一个更合适的角度,你会看的更清楚,让物体的特征更加鲜明表示出来。
其实对输入的对准是通过矩阵乘法来实现的:
那么对于MLP升维得到的特征,也可以做一个对特征空间的对准
PointNet分类网络的结构:
最终输出的K,就是对于分类中的每个类别的得分值。
而对于分割网络,有一些变化:
分割需要对每一个点都要做分类,当我们最后得到一个全局特征后(这个其实已经丢失了每个点的基本信息了),我们对每个点进行分类的话,需要每个点的特征,所以这里进行了一个拼接操作,
最终网络的输出是nXm,还是n个点,m表示每个类别的得分情况。
PointNet++原理
是借鉴了多层神经网络的思想,可以进行层次化的多级别学习。
就和CNN类似,不同感受野下的特征学习,然后进行拼接,得到多尺度特征。
PointNet要么就是MLP对所有点学习,要么就是maxpooling对一个点,就丢失了每个点的局部上下文信息(也就是每个点和周围的点的关系)
思想:对局部区域应用PointNet(多次迭代式):
多级别学习,保持旋转不变性、置换不变性。
(1)多级别学习
多个点组成了字母“A”形状,选择一个点(红色点)作为“中心点”,画一个圈,圈里面的点作为一个组,接着对这个点应用给PointNet进行特征提取。就可以学到这个局部小区域的全局特征。
这个小区域可以是多个且可以重叠:
这里的确定centroid中心点就叫:Sampling采样。
确定以后,以centroid为中心选取局部的点就叫:Grouping分组。
最后对每个小分组应用PointNet进行特征学习。就得到最终小方块组成的点了。这些方块点就具有局部上下文信息特征了。
然后还可以接着小方块再次进行centroid的确定,再Grouping,再应用PointNet。就完成了多级别的特征学习了。
Set Abstraction = Sampling + Grouping + PointNet。
Set Abstraction:
(1)Sampling :可以均匀采样;相较于随机采样,最远点采样可以更好的覆盖采样空间。
选取距离这个点集合最远的那个点。
(2)Grouping :
可以利用机器学习K-means。
也可以利用球查询。以centroid为中心,按照半径(三维空间中)来找。可以保证固定区域的尺寸,让这个局部特征在整个空间中更具通用性。
PointNet++的层次化特征学习结构:
经过两次Set Abstraction,就得到一个全局化特征了。可以用来做分类;
分割的话,用了一个插值,多级别学习,点是逐渐变得稀疏的,分割是需要对原始点云数据中的每个点做分类,这样的话特征是不够的,做一个插值让点数增加;类似于RGB分割的编码(下采样)与解码(上采样)操作。
插值方式,其实就是基于距离:
非均匀采样密度:
获取点云数据的时候,通常会出现近密远疏的现象:
会影响层次化特征学习,分组半径的选择就需要进行考量,那么对于密集点和稀疏点就不应该选取同样的半径进行分组。
点的密集程度会对网络产生性能影响:
处理方法:
(1)MSG:这是对于同一级别,选取不同的半径进行分组来提取局部特征,然后拼接不同区域得到的结果;
(2)MRG:在不同级别上,将第一次的Set Abstraction的结果作为下一级别的输入。将两次Set Abstraction的结果进行拼接。
网络结构中的一些表达方式:
除了MSG,还有SSG:
用了多个SA(Set Abstraction)(但是多个SA不做拼接),每个SA有不同的半径,整个物体的尺寸都被归一化(以中心点为原点,最远点的距离是1);
而MSG:
多个SA,每个SA有多个不同的半径,比如这里的SA(512,[0.1,0.2,0.4]),有0.1,0.2,0.4不同的半径,不同半径的局部特征要做拼接。
相关文章:

点云入门知识
点云的处理任务 场景语义分割 物体的三维表达方法(3D representations): 点云:是由物体表面上许多点数据来表征这个物体。最接近原始传感器数据,且具有丰富的几何信息。 Mesh:用三角形面片和正方形面片拼…...

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现图片轮播,共有5个页面。 二、作品…...
#### grpc比http性能高的原因 ####
grpc比http性能高的原因 二进制消息格式:gRPC使用Protobuf(一种有效的二进制消息格式)进行序列化,这种格式在服务器和客户端上的序列化速度非常快,且序列化后的消息体积小,适合带宽有限的场景。 HTTP/2协…...
微软Edge浏览器搜索引擎切换全攻略
微软Edge浏览器作为Windows 10的默认浏览器,提供了丰富的功能和良好的用户体验。其中,搜索引擎的切换功能允许用户根据个人喜好和需求,快速更换搜索引擎,从而获得更加个性化的搜索服务。本文将详细介绍如何在Edge浏览器中进行搜索…...
<Linux> 实现命名管道多进程任务派发
实现命名管道多进程任务派发 common文件 #ifndef _COMMON_H_ #define _COMMON_H_#pragma once #include <iostream> #include <unistd.h> #include <string> #include <sys/types.h> #include <sys/stat.h> #include <wait.h> #include &…...

BigInteger 和 BigDecimal(java)
文章目录 BigInteger(大整数)常用构造方法常用方法 BigDecimal(大浮点数)常用构造方法常用方法 DecimalFormat(数字格式化) BigInteger(大整数) java.math.BigInteger。 父类:Number 常用构造方法 构造方法:BigIntege…...
Linux 进程间通讯
Linux IPC 方式 在Linux系统中,进程间通信(IPC)是多个运行中的程序或进程之间交换数据和信息的关键机制。Linux提供了多种IPC机制,每种机制都有其特定的用途和优势。以下是Linux上主要的IPC通信方式: 管道(…...

数据分析三剑客-Matplotlib
数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中,三个非常重要的工具和库:Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析,NumPy专注于数值计算和数学运算,而Matplotlib则负责数据可视化。这三个库相…...
FastAPI-Body、Field
参考:模式的额外信息 - 例子 - FastAPI 在FastAPI中,Body和Field是两个常用的注解,它们用于定义请求体中的数据或路径参数、查询参数等的处理方式。这两个注解都来自于Pydantic库,用于数据验证和解析,但它们的应用场景…...

软件设计师笔记-操作系统知识(二)
线程 以下是关于线程的一些关键点: 线程是进程中的一个实体:进程是操作系统分配资源(如内存空间、文件句柄等)的基本单位,而线程是进程中的一个执行单元。多个线程可以共享同一个进程的地址空间和其他资源。线程是CP…...

鸿蒙UI开发快速入门 —— part12: 渲染控制
如果你对鸿蒙开发感兴趣,加入Harmony自习室吧~👇🏻👇🏻👇🏻👇🏻 扫描下面的二维码关注公众号。 1、前言 在声明式描述语句中开发者除了使用系统组件外,还可…...

添加用户页面(Flask+前端+MySQL整合)
首先导入Flask库和pymysql库。Flask用于创建Web应用程序,pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…...
素数筛(算法篇)
算法之素数筛 素数筛 引言: 素数(质数):除了1和自己本身之外,没有任何因子的数叫做素数(质数) 朴素筛法(优化版) 概念: 朴素筛法:是直接暴力枚举2到当前判断的数x(不包括),然后看在这范围内是否存在因…...
迁移Microsoft Edge
如何将Microsoft Edge迁移到d盘?对于Microsoft Edge想必大部分人都不陌生,它是Windows操作系统的默认浏览器,存储用户的个人数据、缓存和设置等信息。有些时候,我们需要对Microsoft Edge中的数据进行数据迁移,以释放c盘…...

Maven高级理解属性
属性 在这一章节内容中,我们将学习两个内容,分别是 属性版本管理 属性中会继续解决分模块开发项目存在的问题,版本管理主要是认识下当前主流的版本定义方式。 4.1 属性 4.1.1 问题分析 讲解内容之前,我们还是先来分析问题: …...

Trilium Notes浏览器插件保存网页内容到docker私有化部署
利用Trilium浏览器插件可以很方便的把网页内容保存到Trilium,需要先在docker部署好trilium,还没有部署的可以先看这篇文章:trilium笔记私有化部署-www.88531.cn资享网 1.下载Trilium浏览器插件:https://www.npspro.cn/33462.html…...
C++ 统计二进制串中0出现的个数
描述 一个32位有符号整数,使用二进制来表示,现在要统计一下二进制串中0的个数。 示例1 输入: 11 返回值: 29 说明: 二进制00000000000000000000000000001011中有29位0 class Solution { public:/*** 代码中的…...
note-网络是怎样连接的6 请求到达服务器,响应返回浏览器
助记提要 服务器程序的结构套接字的指代方式MAC模块的接收过程IP模块的接收过程TCP模块处理连接包TCP模块处理数据包TCP模块的断开操作URI转换为实际文件路径URI调用程序Web服务器访问控制响应内容的类型 6章 请求到达服务器,响应返回浏览器 1 服务器概览 在数据…...
存储过程与函数:封装数据库逻辑的艺术(七)
引言 在上一章《事务处理》中,我们深入探讨了事务的ACID特性以及如何通过事务控制语句和隔离级别来确保数据的一致性和完整性。本章,我们将把焦点转向存储过程与函数,这是数据库系统中用于封装复杂业务逻辑和增强代码复用性的强大工具。通过…...

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】卷积
卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发射器每个时刻 t t t产生一个信号 x t x_t xt,其信息的衰减率为 w k w_k wk,即在 k − 1 k-1 k−1个时间步长后,信息为原来的 w k w_k wk倍,时刻 …...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...