当前位置: 首页 > news >正文

3D 视觉算法初学概述

文章同步发于 github 仓库和知乎。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 ) M = (S,T) 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 S_i Si T i T_i Ti组成,其定义如下:

S n e w M o d e l = S ˉ + ∑ i = 1 m − 1 α i s i S_{newModel} = \bar{S} + \sum_{i=1}^{m-1} \alpha_{i} s_{i} SnewModel=Sˉ+i=1m1αisi

T n e w M o d e l = T ˉ + ∑ i = 1 m − 1 b a t a i t i T_{newModel} = \bar{T} + \sum_{i=1}^{m-1} bata_{i} t_{i} TnewModel=Tˉ+i=1m1bataiti

其中 S ˉ \bar{S} Sˉ 表示平均脸部形状模型, s i s_i si表示 shape 的 PCA 部分(按照特征值降序排列的协方差阵的特征向量), α i \alpha_i α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. 输入为一帧的全部点云数据的集合,表示为一个 n × 3 n\times 3 n×32d tensor,其中 n n n 代表点云数量, 3 3 3 对应 x y z xyz 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

相关文章:

  • 特征点检测和特征点匹配(ORB)
  • MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析
  • 【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?
  • REACT全家桶(1)
  • 对Spring的后置处理器BeanPostProcessor的使用
  • 【day9】【洛谷算法题】-P2433小学数学N合一-刷题反思集[入门2分支结构]
  • halcon脚本-深度学习【目标检测】
  • 线上服务器内存飙升怎么排查?
  • xss-lab通关之路
  • FPGA手写一个动态方块视频,用来代替摄像头输入,私信我送代码
  • 海思3559万能平台搭建:DDR移植的一些问题
  • Baklib知识分享|制作网站FAQ需要注意哪些内容?
  • 第十四届蓝桥杯备赛模板题——蓝桥部队 (带权并查集)
  • [推荐系统] 1. 深度学习与推荐系统
  • 设计模式(合)
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android Studio:GIT提交项目到远程仓库
  • CentOS从零开始部署Nodejs项目
  • classpath对获取配置文件的影响
  • Docker容器管理
  • js继承的实现方法
  • js如何打印object对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux链接文件
  • MySQL几个简单SQL的优化
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue中实现单选
  • WePY 在小程序性能调优上做出的探究
  • 简单实现一个textarea自适应高度
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • !!Dom4j 学习笔记
  • #define与typedef区别
  • #include<初见C语言之指针(5)>
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #微信小程序(布局、渲染层基础知识)
  • (1)Nginx简介和安装教程
  • (7)STL算法之交换赋值
  • (二)windows配置JDK环境
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (转)项目管理杂谈-我所期望的新人
  • *** 2003
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET gRPC 和RESTful简单对比
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET成年了,然后呢?
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • ?php echo ?,?php echo Hello world!;?
  • @html.ActionLink的几种参数格式
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...