草庐IT

3D视觉算法初学概述

armcvai 2023-03-28 原文

文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉。
本人水平有限,文章如有问题,欢迎及时指出。如果看完文章有所收获,一定要先点赞后收藏。毕竟,赠人玫瑰,手有余香。

3D 视觉算法包括很多内容,此文仅当作入门了解些概念和知识概括。

背景知识

3D图像描述有多种方法,常见的如下:

  • 点云
  • 网格(meshes)
  • 基于视图的描述
  • 深度图像(depth images)

RGB-D相机

一般普通的相机拍出来的图像,其每个像素坐标(x, y)可以获得三种颜色属性(R, G, B)。但在 RGB-D 图像中,每个(x, y)坐标将对应于四个属性(深度 D,R,G,B)

一,基于3DMM的三维人脸重建技术概述

1.1,3D 人脸重建概述

3D 人脸重建定义:从一张或多张2D图像中重建出人脸的3D模型。数学表达式:

\(M = (S,T)\)

其中 S 表示人脸 3D 坐标形状向量(shape-vector),T 表示对应点的纹理信息向量(texture-vector)。

3D 人脸重建算法分类:

1.2,初版 3DMM

1999 年论文 《A Morphable Model For The Synthesis Of 3D Faces》提出三维形变模型(3DMM),三维形变模型建立在三维人脸数据库的基础上,以人脸形状和人脸纹理统计为约束,同时考虑到了人脸的姿态和光照因素的影响,因而生成的三维人脸模型精度高。每一个人脸模型都由相应的形状向量 \(S_i\)\(T_i\)组成,其定义如下:

\(S_{newModel} = \bar{S} + \sum_{i=1}^{m-1} \alpha_{i} s_{i}\)

\(T_{newModel} = \bar{T} + \sum_{i=1}^{m-1} bata_{i} t_{i}\)

其中 \(\bar{S}\) 表示平均脸部形状模型,\(s_i\)表示 shape 的 PCA 部分(按照特征值降序排列的协方差阵的特征向量),\(\alpha_i\)表示对应形状系数;纹理模型符号定义类似。通过调整形状、纹理系数系数可生成不同的人脸 3D 模型。

二,视觉SLAM算法基础概述

SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计。为了解决SLAM问题,我们需要状 态估计理论,把定位和建图的不确定性表达出来,然后采用滤波器或非线性优化,估计状态的均值和不确定性(方差)。

SLAM 是Simultaneous Localization and Mapping的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器(单目、双目、RGB-D相机、Lidar)的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉SLAM”;如果传感器位激光,则为激光 SLAM,两者对比如下:

SLAM 主要解决定位地图构建两个问题视觉 SLAM 流程图如下:

整个视觉 SLAM 流程包括以下几个步骤:

  1. 传感器信息读取。视觉 SLAM 中主要指摄像头图像数据读取与预处理。
  2. 视觉里程计Visual Odometry, VO)。视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子。VO 又称为前端 (Front End)。
  3. 后端优化Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。
  4. **回环检测 **(Loop Closing)。回环检测判断机器人是否到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
  5. 建图Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

2.1,视觉里程计

视觉里程计 VO 目的是通过相邻帧间的图像估计相机运动,并恢复场景的空间结构。其中为了定量地估计相机运动,必须先了解相机与空间点的几何关系。同时,仅通过视觉里程计来估计轨迹,将不可避免地出现累积漂移 (Accumulating Drift),即每次估计都有误差的情况下,先前时刻的误差将会传递到下一个时刻,导致经过一段时间累积之后,估计的轨迹将不再准确,如下图所示。

2.2,后端优化

概述性的说,后端优化主要目是为了处理 SLAM 过程中噪声的问题。后端优化要考虑的问题,就是如何从这些带有噪声的数据中估计整 个系统的状态,以及这个状态估计的不确定性有多大—这称为最大后 验概率估计(Maximum-a-Posteriori,MAP)。这里的状态既包括机器 人自身的轨迹,也包含地图。

前端与后端的关系:前端给后端提供待优化的数据,以及这些数据的初始值。后端只关心数据的优化过程,不关系这些数据来源于什么传感器。因此在视觉 SLAM 中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法

2.3,回环检测

回环检测(又称闭环检测 Loop Closure Detection),主要目的是为了解决位置估计随时间漂移的问题

可以通过图像相似性来完成回环检测。在检测到回环之后,我们会把“A与B是同一个点”这样的信息告诉 后端优化算法。然后,后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样,如果我们有充分而且正确的回环检测, 就可以消除累积误差,得到全局一致的轨迹和地图。

2.4,建图

建图(Mapping)是指构建地图的过程。这里的地图是对环境的描述,但这个描述并不是固定的,需要视SLAM 的应用而定。

建图技术,根据用途的不同,可以分为稀疏重建和稠密重建,稀疏重建通常是重建一些图像特征点的三维坐标,稀疏重建主要用于定位稠密建图又称三维重建,是对整个图像或图像中绝大部分像素进行重建,在导航、避障等方面起着举足轻重的作用。

三,三维点云语义分割和实例分割综述

3.1,三维数据的表示方法

三维图像 = 普通的 RGB 三通道彩色图像 + Depth Map。

三维数据有四种表示方法,分别是 point cloud(点云),Mesh(网格),Voxel(体素)以及 Multi-View(多角度图片)。由此也衍生出了对应的三维数据语义和示例分割的算法,但主要是针对 point cloud 的算法越来越多。三维数据集有 ShapeNet、S3DIS、ModelNet40 等。

3.1.1,点云定义

点云简单来说就是一堆三维点的集合,必须包括各个点的三维坐标信息,其他信息比如各个点的法向量、颜色、分类值、强度值、时间等均是可选。

点云在组成特点上分为两种,一种是有序点云,一种是无序点云。

  • 有序点云:一般由深度图还原的点云,有序点云按照图方阵一行一行的,从左上角到右下角排列,当然其中有一些无效点因为。有序点云按顺序排列,可以很容易的找到它的相邻点信息。有序点云在某些处理的时候还是很便利的,但是很多情况下是无法获取有序点云的。
  • 无序点云:无序点云就是其中的点的集合,点排列之间没有任何顺序,点的顺序交换后没有任何影响。是比较普遍的点云形式,有序点云也可看做无序点云来处理。

3.1.2,点云的属性:

  • 空间分辨率、点位精度、表面法向量等。
  • 点云可以表达物体的空间轮廓和具体位置,我们能看到街道、房屋的形状,物体距离摄像机的距离也是可知的;其次,点云本身和视角无关,可以任意旋转,从不同角度和方向观察一个点云,而且不同的点云只要在同一个坐标系下就可以直接融合。

3.1.3,点云获取

点云一般需要通过三维成像传感器获得,比如双目相机、RGB-D相机和 LiDAR激光传感器

根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity),强度信息与目标的表面材质、粗糙度、入射角方向以及仪器的发射能量、激光波长有关。根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。结合激光测量和摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。

3.1.4,点云存储格式

点云的文件格式可以有很多种,包括 .xyz,npy,ply,obj,off 等(mesh 可以通过泊松采样等方式转化成点云)。对于单个点云,如果你使用np.loadtxt得到的实际上就是一个维度为 的张量,num_channels一般为 3,表示点云的三维坐标。

  • pts 点云文件格式是最简便的点云格式,直接按 XYZ 顺序存储点云数据, 可以是整型或者浮点型。

  • LAS 是激光雷达数据(LiDAR),存储格式比 pts 复杂,旨在提供一种开放的格式标准,允许不同的硬件和软件提供商输出可互操作的统一格式。LAS 格式点云截图,其中 C:class(所属类),F:flight(航线号),T:time(GPS 时间),I:intensity(回波强度),R:return(第几次回波),N:number of return(回波次数),A:scan angle(扫描角),RGB:red green blue(RGB 颜色值)。

  • .xyz 一种文本格式,前面 3 个数字表示点坐标,后面 3 个数字是点的法向量,数字间以空格分隔。

  • .pcap 是一种通用的数据流格式,现在流行的 Velodyne 公司出品的激光雷达默认采集数据文件格式。它是一种二进制文件

3.1.5,三维点云的多种表示方法

三维点云除了原始点云表示还要网格 (Mesh) 表示和体素表示,如下图所示:

3.2,基于点云的分类和检测

背景:相比于图像数据,点云不直接包含空间结构,因此点云的深度模型必须解决三个主要问题:

  1. 如何从稀疏的点云找到高信息密度的表示。
  2. 如何构建一个网络满足必要的限制如 size-variance 和 permutation-invariance。
  3. 如何以较低的时间和计算资源消耗处理大量数据。

对点云的分类通常称为三维形状分类。与图像分类模型相似,三维形状分类模型通常是先通过聚合编码器生成全局嵌入,然后将嵌入通过几个完全连通的层来获得最终结果。基于点云聚合方法,分类模型大致可分为两类: 基于投影的方法基于点的方法。

3.3,基于点云的语义分割

基于点云的语义分割方法大致可分为基于投影的方法和基于点的方法。

3.3.1,PointNet 网络

PointNet 是第一个可以直接处理原始三维点云的深度神经网络,简单来说 PointNet 所作的事情就是对点云做特征学习,并将学习到的特征去做不同的应用:分类(shape-wise feature)、分割(point-wise feature)等。

无论是分类还是分割,本质上都还是分类任务,只是粒度不同罢了。因此损失函数 loss 一定有有监督分类任务中常用的交叉熵 loss,另外 loss 还有之前 alignment network(用于实现网络对于仿射变换、刚体变换等变换的无关性)的约束 loss,也就是上面的 mat_diff_loss

PointNet 网络结构如下所示:

其大致的运算流程如下(来自【3D视觉】PointNet和PointNet++):

  1. 输入为一帧的全部点云数据的集合,表示为一个 nx3 的 2d tensor,其中 n 代表点云数量,3 对应 xyz 坐标。
  2. 输入数据先通过和一个 T-Net学习到的转换矩阵相乘来对齐,保证了模型的对特定空间转换的不变性。
  3. 通过多次 mlp 对各点云数据进行特征提取后,再用一个 T-Net 对特征进行对齐。
  4. 在特征的各个维度上执行 maxpooling 操作来得到最终的全局特征
  5. 对分类任务,将全局特征通过 mlp 来预测最后的分类分数。
  6. 对分割任务,将全局特征和之前学习到的各点云的局部特征进行串联,再通过 mlp 得到每个数据点的分类结果。

分割任务针对于每一个点做分类,在下面的图中,把全局的特征复制成 n 份然后与之前的 64 维特征进行拼接,然后接着做一个 mlp,最后的输出 nxm 就是每一个点的分类结果。

四,参考资料

  1. 细嚼慢咽读论文:PointNet论文及代码详细解析
  2. 3D点云基础知识
  3. 【3D视觉】PointNet和PointNet++
  4. 点云+深度学习的开山之作–Pointnet

有关3D视觉算法初学概述的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  6. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  7. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  8. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  9. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  10. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

随机推荐