3D成像与深度学习技术解析

内容分享2小时前发布
1 0 0

1、基于相关性的方法和基于特征的方法在寻找对应关系上有什么区别?

密集对应关系与稀疏对应关系的对比

基于相关性的方法

对应关系类型 :密集对应关系 匹配元素 :以某个像素为中心的图像窗口 相似度度量 :窗口之间的相关性

基于特征的方法

对应关系类型 :稀疏对应关系 匹配元素 :图像特征 相似度度量 :图像特征描述符之间的距离

2、密集立体匹配的局部方法和全局方法有哪些区别?

图像匹配方法分类

全局方法会对整个图像进行优化,常被表述为能量最小化问题,能利用全图像信息生成高质量视差图,但计算量大、内存消耗高,如动态规划、图割、最大流、置信传播等方法;

局部方法计算量相对小,但生成的视差图质量不如全局方法。

全局块匹配方法与局部方法对比

全局块匹配方法
通过优化全局能量函数确定一幅图像到另一幅图像的最佳变换,优化问题常为NP完全问题,常见近似解法有图割和置信传播。

局部方法
通常仅考虑局部区域像素的匹配代价。

3、立体视觉和运动恢复结构之间有什么区别?

定义对比

立体视觉 :指固定相对视角并同步捕获图像。 运动恢复结构(SfM) :指单个移动相机的场景,在一段时间内顺序捕获图像序列,视角可变。

4、影响立体视觉系统精度的因素有哪些?

影响立体视觉系统精度的因素

视差精度 :视差精度不足会导致3D重建不准确,可通过插值提高亚像素视差精度。 深度不确定性 :深度不确定性随深度二次增加,物体越远深度估计越不确定。 基线长度 :增加基线长度可减少深度误差,但会带来匹配困难等问题。 焦距 :增加焦距可减少深度误差,但会导致景深减小。 图像分辨率 :提高图像分辨率有助于减少深度误差,但会增加处理时间和数据带宽需求。 物体距离 :物体越远,深度估计的不确定性越大。 图像特征和纹理 :图像特征和纹理不足会影响图像对应关系的确定,导致无法保证密集的距离估计。 相机参数校准 :相机参数校准不准确会产生系统误差,影响深度重复性。

5、将深度学习应用于3D成像的两个用例是什么?

将深度学习应用于3D成像的两个用例为 3D分析 3D合成

3D分析

包括以下任务:
– 对对象进行语义分类
– 对对象或场景进行语义解析
– 寻找不同形状之间的对应关系

3D合成

指深度学习模型从条件输入或嵌入向量中生成3D数据,例如:
– 从部分扫描中完成形状
– 从非结构化输入(如图像和点云)生成对象的网格或参数化模型

6、手动对应点计算基础矩阵。对图像对运行角点检测器。使用点选式图形用户界面手动标记约20个分布良好的对应点。计算基础矩阵,并在图像上为每个对应点绘制共轭对的对极线。使用八点算法,以最少八个对应点为基础,试验不同数量和组合的对应点。观察并评论对极线相对于所选对应点集的敏感性。

该实验需要完成以下步骤:

对图像对运行角点检测器; 用点选式GUI手动标记约20个分布良好的对应点; 计算基础矩阵; 为每个对应点在图像上绘制共轭对的对极线; 用八点算法,以最少八个对应点为基础,试验不同数量和组合的对应点; 观察并评论对极线相对于所选对应点集的敏感性。

7、简述立体相机校准的步骤。

校准步骤

先打印棋盘图案并粘贴到平板木材制作校准目标; 用点选式 GUI 半自动化校准目标与校准图像的角点对应; 为立体相机对实施校准程序确定内参和外参; 若时间有限,可使用网络校准库。

8、从以顶点 – 面列表形式存储的三角网格中提取边列表的算法,其复杂度应与三角形数量呈线性关系。请给出该算法并分析复杂度,同时提供 Python 实现代码。

以下是从以顶点-面列表形式存储的三角网格中提取边列表的算法:

初始化一个空的边列表
edge_list
。 遍历顶点-面列表中的每个面。对于每个面,它由三个顶点
v1
,
v2
,
v3
组成。 对于每个面,生成三条边
(v1, v2)

(v2, v3)

(v3, v1)
。 对于每条生成的边,检查它是否已经在
edge_list
中。如果不在,则将其添加到
edge_list
中。

由于每个面有三条边,并且我们只遍历每个面一次,因此该算法的时间复杂度是线性的,与三角形的数量成正比。

以下是用 Python 实现的代码示例:


def extract_edges(vertex_face_list):
    edge_list = []
    for face in vertex_face_list:
        v1, v2, v3 = face
        edges = [(v1, v2), (v2, v3), (v3, v1)]
        for edge in edges:
            if edge not in edge_list and (edge[1], edge[0]) not in edge_list:
                edge_list.append(edge)
    return edge_list

这个函数接受一个顶点-面列表作为输入,并返回一个包含所有边的列表。

9、使用合适的数据结构,展示如何为三角网格计算顶点法线。

可以选择面积加权法计算顶点法线。步骤如下:

对于三角网格中的一个顶点,获取其以逆时针顺序排列的入射边序列 ⟨e₁, …, eₙ⟩,并将第一条边重复放在序列末尾,即 e₁ = eₙ。 计算每个由边 eᵢ 和 eᵢ₊₁ 定义的面的面积加权法线,公式为 eᵢ × eᵢ₊₁。 计算该顶点的面积加权顶点法线,公式为
$$
mathbf{n} { ext{Area}}^{v} = sum {i=1}^{n-1} mathbf{e} i imes mathbf{e} {i+1}
$$ 将计算得到的顶点法线归一化到单位长度。

优点 :叉积计算自然包含了面积权重,无需三角函数计算。
缺点 :在某些情况下可能导致法线不准确,结果依赖于网格三角剖分。

10、使用你选择的网格表示法,说明如何评估顶点处的二次误差度量。

每个顶点是一组在该顶点相交的三角形(平面)的解,顶点相对于这组平面的误差可定义为到每个三角形的平方距离之和。

给定由方程 $ ax + by + cz + d = 0 $ 定义的三角形平面 $ p $,其中 $ mathbf{n} = [a, b, c] $ 是平面法线,$ d $ 是标量常数,可定义一个基本二次曲面 $ Q = (mathbf{n}mathbf{n}^T, dmathbf{n}, d^2) = (A, mathbf{b}, c) $,其中 $ A $ 是 $ 3 imes 3 $ 矩阵,$ mathbf{b} $ 是三维向量,$ c $ 是标量。

二次曲面 $ Q $ 通过二阶方程

Q(v)=vTAv+2bTv+cQ(v)=vTAv+2bTv+c
为空间中的每个点 $ mathbf{v} $ 赋值。

顶点 $ v_i $ 处的二次误差完全由

EQi(vi)=∑pQp(vi)=Qi(vi)EQi(vi)=∑pQp(vi)=Qi(vi)
确定,其中 $ Q_i = sum_p Q_p $ 是所有与顶点 $ v_i $ 相关的平面的基本二次曲面之和。

11、指出3DSC和USC描述符的主要区别。

局部参考框架:
– 3DSC仅依赖参考轴,不是完整的3D参考框架。描述符在绕北极旋转时具有不变性。
– 为考虑方位方向的自由度,需随机选择特征点处法向量切平面上的向量,并将网格支撑绕北极旋转到多个位置。每个旋转定义一个局部参考框架,为每个特征点计算和存储多个描述符。
– USC利用可重复且明确的局部参考框架。先使用特定方法估计局部参考框架,再像3DSC一样构建描述符。

效率:
– USC在性能和内存占用方面比3DSC更高效。

描述符数量:
– 3DSC为每个特征点计算多个描述符;
– USC因采用唯一且可重复的局部参考框架,避免了为每个特征点计算多个描述符。

描述符大小:
– 二者最终描述符大小相同。

12、通过强调两种方法的主要优缺点,解释手工制作描述符和学习型描述符之间的主要区别。

描述符类型对比

手工制作描述符

定义 :基于不同的手工方式来编码和利用给定表面的几何属性。 实现 :通常有公开代码,例如在PCL中有公开实现。 性能 :相对较低。

学习型描述符

定义 :受处理图像的深度神经网络成功的推动,以数据驱动的方式从3D数据中学习描述性特征。 优势 :能使用稳定且丰富的表示来学习描述符,从而获得更高的性能。 实现 :很多实现未公开。

13、解释在点云上使用深度学习算法的主要问题,以及当前最先进的解决方案如何尝试克服这些问题。

主要问题与解决方案

主要问题

点云数据格式不规则,典型卷积深度网络需要规则输入数据格式才能进行权重共享和其他内核优化。将点云数据转换为规则格式会使数据量过大,并引入量化伪影,掩盖数据的自然不变性。 模型需考虑点云是点的集合,对其成员的排列具有不变性;还需考虑对刚性变换的不变性。

解决方案

以PointNet为例,它被构建为一个由神经网络组成的对称函数,保证其对输入点顺序的不变性;并且添加一个依赖数据的空间变换网络,在PointNet处理数据之前尝试将数据规范化,以进一步提高结果。

14、在相关领域中提到了局部描述符。为什么它们通常比全局描述符更受青睐?局部描述符最适合哪些应用场景?

局部描述符通常比全局描述符更受青睐的原因是其对表面的部分遮挡和杂波的存在具有更高的鲁棒性。局部描述符最适合的应用场景包括:

3D对象重建 3D对象检索 SLAM(同步定位与地图构建)

15、解释形状检索和形状识别之间的区别,并分别给出一个应用示例。

形状识别与形状检索

形状识别 是在一组可能的选项中识别给定的3D对象,其结果通常是对象所属的类别或识别系统所存储的已识别对象。它适用于查询对象为部分或被遮挡部分(如距离扫描)的情况,例如人类耳朵的3D识别。

形状检索 是定义一种度量来量化形状之间的相似性,其典型结果是根据相关度量排序的对象列表,例如3D博物馆文物检索。

16、描述用于形状检索的“特征袋”方法。

“特征袋”方法

“特征袋”方法用于管理局部描述符,具体过程为:

首先对整个集合中的所有局部描述符进行聚类,并计算每个聚类的质心; 然后将每个形状表示为一个直方图,其箱数等于聚类数,每个描述符会在最接近质心对应的箱中加1。

相关研究

Toldo等人 提出对给定网格进行分割并为每个片段构建描述符,随后用“特征袋”方法组合网格中的所有描述符; Bronstein等人 提出基于热核签名的密集描述符的“特征袋”方法的软版本,并提出空间敏感的“特征袋”技术,在形状检索中取得了良好效果。

17、若无法获取3D数据集来开始学习3DMM,可以构建一个平面上的三角形合成数据集,这些三角形具有随机的位置、形状、大小和旋转角度。由于该数据集是合成的,点的对应关系是已知的。使用广义普罗克拉斯提斯分析(GPA)和主成分分析(PCA)来构建一个统计模型,然后使用该模型生成形状变化主模式的动画。

使用合成数据集构建3DMM统计模型并生成形状变化动画的实践指导

具体步骤如下:

构建合成数据集
在平面上生成具有随机位置、形状、大小和旋转角度的三角形数据集。由于是合成数据集,点之间的对应关系已知。

构建统计模型
使用GPA(广义普罗crustes分析)和PCA(主成分分析)对生成的数据集进行处理,构建统计模型。

生成形状变化动画
利用构建好的统计模型,生成形状变化主模式的动画。

18、给定一个CAD模型,将其以不同分辨率(使用空心模型)体素化为二进制占用网格,例如,分别为10 × 10 × 10、30 × 30 × 30和60 × 60 × 60。观察随着分辨率的提高,占用率(占用体素数量与所有体素数量之比)是如何降低的。

可按照以下步骤完成操作:

对CAD模型进行体素化,使用空心模型将其转换为不同分辨率(10 × 10 × 10、30 × 30 × 30 和 60 × 60 × 60)的二进制占用网格。 计算每个分辨率下的占用率,即占用体素数量与所有体素数量之比。 观察并记录随着分辨率提高,占用率的降低情况。

19、规则网格上的外在卷积和曲面上的内在卷积有什么区别?

规则网格与曲面卷积的对比

规则网格上的外在卷积(如体积CNN)在3D欧几里得空间中定义卷积核和变换,这种操作对变形不具有不变性,例如:

从直圆柱激活的滤波器在管子弯曲时不会响应

而曲面上的内在卷积:

感受野定义在曲面本身 对变形具有不变性

对于人体等可变形对象,这种对变形不变性的特性对于在寻找对应关系等任务中取得良好性能至关重要。

20、列举3D数据深度学习的三个未来研究方向。

开发更尊重旋转不变性甚至实现旋转等变性的架构; 联合学习几何和颜色数据; 利用3D深度学习模型解决更广泛科学领域的问题,如从分子结构推断函数、处理和理解医学图像。

21、对FRGC v2数据中的一小部分扫描数据实施裁剪、去除尖峰和填充孔洞的预处理步骤,并检查它们是否按预期运行。

操作步骤

可按如下步骤操作:

裁剪
依据3D信息裁剪人脸,可采用不同方法。若系统计算能力允许,可将裁剪步骤后置,采用基于面部特征定位的更复杂方法。

去除尖峰
若3D数据为距离图像或深度图形式,可采用标准2D图像滤波领域的方法,如用高斯滤波器卷积,也可采用像双边网格去噪这类适用于3D网格的方法。

填充孔洞
可使用常见的图像修复算法,如基于邻域信息的插值法。

将上述步骤应用于FRGC v2数据中的部分扫描数据,通过对比处理前后的数据,检查裁剪是否准确、尖峰是否去除、孔洞是否填充,以验证步骤是否按预期运行。

22、实现一个基于迭代最近点(ICP)算法的人脸验证系统,并使用预处理后的扫描数据作为输入。

基于 ICP 的人脸验证系统实现步骤

实现基于 ICP 的人脸验证系统,典型步骤如下:

1. 图库人脸预处理

假设探测和图库人脸接近正脸,允许有一些小的姿态变化。对每个图库扫描进行如下处理:

确定距离相机最近的顶点 :通常接近鼻尖; 裁剪球形区域 :以该点为中心,裁剪出半径 100 mm 的球形区域; 过滤尖峰并插值孔洞 :对数据进行去噪和修补; 零均值处理 :计算点云的均值并进行零均值操作; 构建 k-d 树 :使用现成算法将每个图库扫描组织成 k-d 树。

2. 探测扫描匹配流程

对于每个要与图库匹配的探测扫描,执行以下步骤:

执行初始预处理 :按照上述图库扫描的处理步骤 1–4,实现初始粗略的平移对齐; 最近点搜索 :使用标准的现成算法,在图库扫描的 k-d 树中为探测扫描的每个点进行最近点搜索; 过滤对应关系 :根据之前四点列表中的过滤器删除临时对应关系,至少使用距离和表面法线过滤器。

此外,文献中存在该算法的许多变体。在 MATLAB 中,可以直接使用内置函数
pcregistericp
实现 ICP 算法。

23、Vascusynth6是一款用于生成合成血管(树状)结构的软件。使用该软件生成一些自定义数据,然后利用Matlab或Python中的CPD源代码进行CPD配准,并计算并报告配准结果与地面真值数据的平均均方根(RMS)误差。已知CPD的源代码在Matlab和Python中均可用。

需使用
Vascusynth6
软件生成自定义数据,利用
Matlab
( CPD源代码 ) 或
Python
( CPD源代码 ) 中的 CPD 源代码进行配准,最后计算并报告与地面真值数据的平均均方根(RMS)误差。

24、如何将成对配准扩展为多视图对齐问题,以获得单个点云?

当有视图序列 $ N_1, dots, N_p $ 的顺序时,可在连续视图(即视图 $ N_i $ 和 $ N_{i+1} $ 之间)进行成对配准。不过,即使所有对都看似配准良好,由于配准误差的积累和传播,在重建完整模型时通常会出现一些未对齐的情况。

多视图配准技术的总体思路是通过同时利用所有视图之间的相互依赖关系来同时解决全局配准问题,这会引入额外的约束条件,从而减少全局误差。

例如,在 [117] 中,一种方法先将扫描结果两两对齐,然后在多视图步骤中使用这些成对对齐作为约束条件,目的是均匀分布成对配准误差,但该方法本身仍基于成对对齐; 在 [29] 中,提出了一种在所有视图中均匀分布配准误差的方法,它在估计的成对配准矩阵空间中操作,但需要视图的顺序; [144] 提出了一种基于广义普罗克拉斯提斯分析的新方法,将数学理论无缝嵌入到 ICP 框架中; 在 [161] 中,提出了一种处理闭环的方法来进行全局一致的重建,引入局部融合模型用于场景的重叠部分,并用于初始化基于全局图的优化,以分布残差误差; 在 [53] 中,通过扩展 LM-ICP 算法使其适用于多视图来避免误差积累,其思路是定义一个有效的优化函数,在配准误差中同时考虑所有视图,并使用标准数值方法求解。

此外,Brophy 等人 [31] 提出了基于互最近邻(MNN)[49] 算法的解决方案,该算法基于 CPD,可使许多视图以最小误差对齐,是一种用于合并非刚性扫描的无漂移算法:

先顺序对齐扫描结果; 然后使用全局方法细化结果,全局方法是将每个扫描 $ X_i $ 注册到一个“平均”形状,该形状通过每个点的互最近邻(MNN)的质心构建; 重复此过程直到结果收敛。

25、带异常值去除的基础矩阵估计。在20个正确角点对应关系中添加4个错误的角点对应关系。观察其对计算得到的基础矩阵以及相关(被破坏的)对极线的影响。用随机抽样一致性(RANSAC)算法增强对基础矩阵估计的实现。在图像上使用图形覆盖来显示RANSAC已正确识别出异常值,并验证现在可以在没有异常值干扰的情况下计算基础矩阵及其相关对极线。

先在20个正确角点对应关系中添加4个错误对应关系,观察对基础矩阵和对极线的影响; 然后在基础矩阵估计的实现中加入RANSAC算法; 最后用图形覆盖显示RANSAC识别出的异常值,验证无异常值干扰时基础矩阵和对极线的计算结果。

26、计算要应用于立体图像对中每个图像的图像扭曲(单应性变换),使得共轭极线是水平的(平行于x轴)并且具有相同的y坐标。绘制一组极线以检查此校正是否正确。

图像校正方法

有校准信息的情况

假设条件 :校准的立体装置,已知内外参数 目标 :找到一个图像映射,从原始图像生成一对从直线装置获得的图像

校正旋转矩阵 $ R_{rect} $

组成:由一组相互正交的单位向量 $ r_i $ 组成 向量定义: $ r_1 $:极点方向或右相机的平移方向 $ r_2 $:通过 $ t $ 和原始左光轴的叉积并归一化得到 $ r_3 $:通过 $ r_1 $ 和 $ r_2 $ 的叉积计算

单应性变换公式

左图像点变换:
xrect=KRrectK−1xxrect=KRrectK−1x 右图像点变换:$$ x’ {rect} = K’ R R {rect} K’^{-1} x’ $$

径向畸变校正

可根据需要使用估计的参数 $ k_1 $ 和 $ k_2 $ 进行校正

无校准信息的情况

方法 :使用从原始图像数据中的对应关系计算出的基础矩阵的估计值来实现校正

校正方法

常见方法:为左右图像计算一对校正单应性,使校正后图像的基础矩阵与标准直线装置的形式相同 限制:当极点位于图像内时此方法可能失败 解决方案:可通过沿极线直接对原始图像进行重采样来解决

27、实现一个函数,使用归一化互相关(NCC)作为相似度度量,对左右校正图像进行局部密集立体匹配,从而为立体图像对生成视差图。拍摄一系列场景的立体图像,这些场景具有不同的纹理量,并且与相机的距离也不同,然后比较它们的视差图。

下面给出实现上述功能的大致步骤:

实现局部密集立体匹配函数:
– 读取左右校正图像。
– 定义 NCC 相似度度量函数。
– 对左图像的每个像素,在右图像的对应扫描线上搜索匹配像素,计算 NCC 值。
– 根据最大 NCC 值确定视差值,生成视差图。

拍摄立体图像:
– 选择具有不同纹理量和不同相机距离的场景。
– 使用立体相机拍摄这些场景的立体图像对。

比较视差图:
– 对每个场景的立体图像对应用上述匹配函数生成视差图。
– 分析和比较不同场景视差图的特征,如视差范围、视差分布等。

以下是一个简单的 Python 代码示例,使用 OpenCV 库实现 NCC 密集立体匹配:


import cv2
import numpy as np

def ncc_stereo_matching(left_image, right_image, window_size):
    height, width = left_image.shape
    disparity_map = np.zeros((height, width), dtype=np.uint8)
    half_window = window_size // 2

    for y in range(half_window, height - half_window):
        for x in range(half_window, width - half_window):
            left_window = left_image[y - half_window:y + half_window + 1, x - half_window:x + half_window + 1]
            max_ncc = -1
            best_disparity = 0

            for d in range(0, 64):  # 最大视差范围
                if x - d - half_window < 0:
                    break
                right_window = right_image[y - half_window:y + half_window + 1, x - d - half_window:x - d + half_window + 1]

                ncc = np.sum((left_window - np.mean(left_window)) * (right_window - np.mean(right_window))) / (
                    np.sqrt(np.sum((left_window - np.mean(left_window))**2)) *
                    np.sqrt(np.sum((right_window - np.mean(right_window))**2))
                )

                if ncc > max_ncc:
                    max_ncc = ncc
                    best_disparity = d

            disparity_map[y, x] = best_disparity

    return disparity_map

# 读取左右图像
left_image = cv2.imread('left_image.png', 0)
right_image = cv2.imread('right_image.png', 0)

# 进行立体匹配
window_size = 5
disparity_map = ncc_stereo_matching(left_image, right_image, window_size)

# 显示视差图
cv2.imshow('Disparity Map', disparity_map)
cv2.waitKey(0)
cv2.destroyAllWindows()

此代码仅为示例,实际应用中可能需要根据具体情况进行调整和优化。

28、三维重建。实现一个函数,根据视差图和相机校准信息进行三维重建。使用图形工具可视化重建结果。评价不同场景以及与立体相机不同距离下重建的性能。

实现该功能可按以下通用步骤进行:

从视差图和相机校准信息中提取必要数据; 利用三角测量等原理实现三维重建函数; 用如 OpenGL、Matplotlib 等图形工具可视化重建结果; 评价性能时,考虑以下因素:
– 不同场景的纹理、光照、复杂度;
– 不同距离下深度估计的不确定性、重建精度和完整性等。

29、使用你选择的编程环境,开发一个相移条纹投影扫描仪的二维模拟器,该模拟器能够重现强度伪影。假设光学引起的模糊仅出现在相机图像中,并且相机具有无限的空间分辨率。对使用格雷码的条纹投影系统重复该实验。

可按照以下思路进行操作:

先在所选编程环境中构建相移条纹投影扫描仪的二维模型; 模拟投影和成像过程以重现强度伪影; 模拟时考虑光学模糊仅在相机图像中,且相机具有无限空间分辨率; 之后修改模型以适用于格雷码条纹投影系统; 重复实验。

30、修改之前开发的原型,使其适用于条纹扫描仪。绘制一张图表,展示由于条纹宽度导致的误差变化情况。

可按照以下步骤完成任务:

修改原型 :依据条纹扫描仪的工作原理和特点,对之前开发的原型进行调整和优化,确保其能适用于条纹扫描仪。 实验测量 :在不同条纹宽度下使用修改后的原型进行测量,记录相应的误差数据。 绘制图表 :根据记录的数据,以条纹宽度为横轴、误差为纵轴绘制图表,直观呈现误差随条纹宽度的变化情况。

© 版权声明

相关文章

暂无评论

none
暂无评论...