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. CVPR2020论文解析:视觉算法加速

    CVPR2020论文解析:视觉算法加速 GPU-Accelerated Mobile Multi-view Style Transfer 论文链接:https://arxiv.org/pdf/2003 ...

  2. 3D视觉基础(基本原理及3D传感器基本参数)

    本人所在行业属于3D视觉方向,因此最近也是学习了很多3D视觉的知识,这次专门总结一下. 传统工业机器视觉中,2D指的是X方向加Y方向,那么3D视觉自然就是加了一个Z方向.目前我接触到的公司产品是3D激 ...

  3. 3D重建算法原理

    3D重建算法原理 三维重建(3D Reconstruction)技术一直是计算机图形学和计算机视觉领域的一个热点课题.早期的三维重建技术通常以二维图像作为输入,重建出场景中的三维模型.但是,受限于输入 ...

  4. 3D视觉 之 线激光3D相机

    1  3D 视觉 常见的三维视觉技术,包含双目.ToF.激光三角.结构光等,如下图:     1)毫米级 双目.ToF.结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,VR/AR,刷脸 ...

  5. 无锁算法CAS 概述

    无锁算法CAS 概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大 ...

  6. 奥比中光3D视觉传感器--OpenNI 2配置

    PrimeSense是Kinect一代的芯片供应商,位于以色列,也是开源体感开发包OpenNI 的维护者.自从被 Apple 收购后,销声匿迹,OpenNI 也停止更新.现在可以从网站http://s ...

  7. LDPC译码算法代码概述

    程序说明 V0.0 2015/1/24 LDPC译码算法代码概述   概述   本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum ...

  8. MugLife静态照片变3D动画算法研究

    原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...

  9. OSG 3D场景渲染编程概述

    OSG是Open Scene Graphic的缩写,是基于C++平台的使用OpenGL技术的开源3D场景开发. vs环境安装或者是在Ubuntu中环境的安装网上教程很多,都是大同小异的,认真操作容易成 ...

  10. 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示

    Orbbec Astra Pro传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示 这款摄像头使用uvc输入彩色信息,需要libuvc和libuvc_ros这样才能在R ...

随机推荐

  1. esp-idf 移植 lvgl8.3.3

    一.准备材料 开发板:esp32s3 idf版本:4.4.2 lvgl:8.3.3 注意:lvgl不要选择master分支,编译失败时不好确定问题. 二.创建idf项目 方式一 通过 VSCode 创 ...

  2. 云原生时代的DevOps平台设计之道

    开发人员与运维人员是 IT 领域很重要的两大人群,他们都会参与到各种业务系统的建设过程中去.DevOps 是近年间火爆起来的一种新理念,这种理念被很多人错误的解读为"由开发人员(Dev)学习 ...

  3. 【linux】 第1回 linux运维基础

    目录 1. 运维的本质 2. 电脑与服务器 2.1 电脑的种类 2.2 服务器种类 2.3 服务器品牌 2.4 服务器尺寸 2.5 服务器内部组成 3. 磁盘阵列 4. 系统简介 5. 虚拟化 6. ...

  4. super关键字的使用

    1.super理解为:父类的 2.super可以用来调用:属性.方法.构造器 3.super的使用:调用属性和方法 3.1 我们可以在子类的方法或构造器中.通过使用"super.属性&quo ...

  5. 齐博x1万能数据统计之fun函数

    使用 fun("count@info",'数据表名','用户uid') 可以统计指定任何数据表的记录条数 fun("count@info",'cms_conte ...

  6. LabVIEW开放神经网络交互工具包【ONNX】,大幅降低人工智能开发门槛,实现飞速推理

    前言 前面给大家介绍了自己开发的LabVIEW AI视觉工具包,后来发现有一些onnx模型无法使用opencv dnn加载,且速度也偏慢,所以就有了今天的onnx工具包,如果你想要加载更多模型,追求更 ...

  7. Eureka Server 实现在线扩容

    Eureka Server 实现在线扩容 作者:Grey 原文地址: 博客园:Eureka Server 实现在线扩容 CSDN:Eureka Server 实现在线扩容 需求 Eureka 是 Sp ...

  8. 两个行内元素在一起,会出现一定的间距,即使将border、padding、margin都设置为零也无济于事,那么怎么才能去除这些间距呢?

    首先这里的div设置为了行内块元素,span本身为行内元素,并且设置了* {padding: 0; margin: 0;},那怎么清除元素之间的空白缝隙呢?? (1)给元素加浮动 <!DOCTY ...

  9. Vue 实现小小记事本

    1.实现效果 用户输入后按回车,输入的内容自动保存,下方会显示记录的条数,鼠标移动到文字所在div上,会显示删除按钮,点击按钮,相应记录会被删除,下方的记录条数会相应变化,点击clear,所有记录会被 ...

  10. Codeforces Round #811 (Div. 3)D. Color with Occurrences

    题目大意:给出一个文章t和n个字符串s1,s2...sn: 问能否用这n个字符串将整个文章覆盖: 思路:贪心(最小区间覆盖) 记录每个字符串能够覆盖的所有位置(起点,终点,编号) 排序后贪心的求出是否 ...