点云入门知识
点云的处理任务
场景语义分割
物体的三维表达方法(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倍,时刻 …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...

二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...
Q1起重机指挥理论备考要点分析
Q1起重机指挥理论备考要点分析 一、考试重点内容概述 Q1起重机指挥理论考试主要包含三大核心模块:安全技术知识(占40%)、指挥信号规范(占30%)和法规标准(占30%)。考试采用百分制,8…...

timestamp时间戳转换工具
作为一名程序员,一款高效的 在线转换工具 (在线时间戳转换 计算器 字节单位转换 json格式化)必不可少!https://jsons.top 排查问题时非常痛的点: 经常在秒级、毫秒级、字符串格式的时间单位来回转换,于是决定手撸一个…...