学习内容
1.FreeReg 代码分析
2.2d3d 总结
3.huggingface 下载项目解决
学习时间
2024.03.16 — 2024.03.22
学习笔记
2D-3D MatchNet
输入为一个三元组,分别为图像补丁,正点云体积与负点云体积。
三元组需要提前处理,处理的方式如下:
对 2D 图像与 3D 点云分别使用 SIFT 检测器与 ISS 检测器来提取一组关键点 U 与 V 。根据里面的每个点,生成以他们为中心的 2D 图像补丁与 3D 局部点云体积,产生两个新的集合 P 与 Q
这两个便是深度网络的输入,在学习中,输出两个描述符之间的距离,距离小于阈值以及远小于不匹配点之间距离的两个点,会建立匹配。
图像处理使用 VGG,点云处理使用 PointNet。
LCD
问题定义:把 2D 与 3D 映射到同一个空间维度中,目标是让他们的距离更加接近。**如果 I 和 P 表示相同的底层几何形状,则 F(dI , dP ) < m,其中 m 是预定义的距离。**同时,还将结果反向映射回去,有利于稀疏到密集深度估计。
网络结构:双编码器,分别处理图像和点云。2D 编码器:输入为 64 * 64 图像块,网络结构为卷积。获得特征后输入解码器,转置卷积来重建图像块。3D 分支使用了 PointNet,编码器与解码器都是全连接层,分别用于处理和重建点云。训练时使用了 3 个损失函数(2D 为光度损失,3D 为倒角损失, 合起来为三元组损失)。
实现细节:数据集场景来自 SceneNN 和 3D Match,将 3D patch 投影到图像上,在重投影点周围提取相应的局部 2D 补丁。
DeepI2P
分为三步:
- 估计图像与坐标之间的刚性变换。
- 估计点云坐标是否在相机截锥之内。相机截锥指的是在相机摄像头范围内能捕获的部分。
- 根据截锥之内的点,反推出最佳相机姿态
截锥分类:
- 选择一对具有相对位姿 Gp c 的图像和点云 (I, P_raw)。
- 生成 3D 随机变换 G_r ,并将其应用于得到 P = G_r P_raw 和 G = G^p_c G^−1_r。
- 根据式5得到每个点的截锥标签l^c_i的地面真值。
- 将(I, P)输入图2所示的网络中。
- 截锥预测ˆLc ={ˆlc1,···,ˆlc n},ˆlc i∈{0,1}。
- 对分类任务应用交叉熵损失来训练网络。
位姿优化:
给定点云 P,截锥预测 ˆLc ={ˆlc1,···,ˆlc N},ˆlc i∈{0,1},摄像机内参矩阵 K。位姿优化问题是求解 ˆG。
目标是执行姿态优化,以实现图像和点云的精确对齐。
优化的过程:根据 ^G 得到图像坐标,判断投影出的坐标是否位于图像的内部,并根据这个情况对 ^G 进行优化
2D3D-MATR
整体步骤为:
- 学习多尺度 2D 和 3D 特征。利用该粗特征提取块对应关系。
- 通过多尺度匹配模块来学习上下文约束与跨模态相关性。
- 得到精细特征,把块对应扩展到像素级。
- 采用 PnP-RANSAC 对齐变换。
特征解构:使用带有 FPN 的 ResNet 来生成多尺度图像特征,KPFCNN 用于学习点云特征。对于图像,得到的粗特征矩阵为 H ^ ⋅ W ^ \hat{H}\cdot\hat{W} H^⋅W^ 的矩阵,其中的每个值对应原图像中大小为 H ⋅ W H ^ ⋅ W ^ \frac{H\cdot W}{\hat{H}\cdot\hat{W}} H^⋅W^H⋅W 的图像块。对于点云,将距离粗特征中某点 P ^ \hat{P} P^ 最近的原点云的点 P P P 划分给该点。
多尺度块匹配:先使用傅里叶嵌入预处理粗特征,然后使用 transformer 细化两种模式的特征,将图像特征按金字塔提取多尺度特征,使用 top-k 选择得到匹配对。
特征细化:收集局部像素,根据 2D 和 3D 匹配对的位置生成局部密集对应关系。
损失函数:在粗略级别上,2D 与 3D的重叠率大于 0.3 为正,小于 0.2 为负。对于细化的特征,看 3D 距离与 2D 距离。然后分别使用 圆损失 优化。
VP2P-Net
输入图像和点云,提取特征。
通过交叉检测去除离群点,得到交点区域。
从交点区域采样点对(包括正负样本),用于学习跨模态空间的相似度。
使用跨模态空间的最近邻原理进行特征匹配,获得像素与点的匹配对。
使用可微 PnP 进行位姿估计。
FreeReg
获取扩散特征:
1.输入 2D 图像与 3D 点云,从点云投影到平面得到深度图
2.将图片附加噪声,输入 Stable Diffusion 得到扩散特征
3.将深度图输入 ControlNet,用于监督 Stable Diffusion 的 upsample 阶段生成扩散特征
获取几何特征:
将图像输入到 Zoe-Depth,生成深度图,然后从深度图中恢复点云
使用 FCGF 分别提取两个点云的几何特征
融合扩散特征与几何特征:
将扩散特征与几何特征融合,生成融合特征
然后对两组融合特征使用最近邻互选择建立 correspondences,其中每个匹配的深度图D中的像素对应于点云P中的3D点。
使用 PnP 或 Kabsch 进行姿态回归
切入点
特征表示和学习
寻找更好的图像与点云的特征表示是很关键的
跨模态信息融合
如何将图像和点云的信息映射到同一个模态下
demo 分析
config.yaml
存储 config 信息,使用 --cfg 调用
–type 代表使用的特征类型,c 代表扩散特征,z 代表几何特征
使用 OmegaConf.load
将 config.yaml
加载成字典
在配置文件中,zoe 代表了其相关属性值,zoe_ck
代表模型存放的位置,rgb_instrinsic
表示相机内参
zoe
demo.pipeline_zoe —> pipeline.gen_zoe.depth_generator —> tools.zoe.meta_dpt.meta_dpt \ utils.utils.dpt_3d_convertor
tools.zoe.meta_dpt.meta_dpt —> tools.zoe.meta_dpt.single_dpt —> tools.zoe.meta_dpt.img2dpt —> gen_dpt.load_model —> tools.zoe.zoedepth.models.builder.build_model
将 zoedepth 的模型实例方法返回,给到 gen_dpt.load_model 里的参数 model_zoe,然后再移动到 gpu 中,赋值给 zoe
utils.utils.dpt_3d_convertor 实际上是实例化方法,方便后续调用
extractor
demo.pipeline_feat —> pipeline.gen_feat.fcgf_extractor —> tools.fcgf.fcgf_feat._load_model —> tools.fcgf.unet.init.load_model
tools.fcgf.unet.init.load_model 返回的是 tools.fcgf.unet.resnet.ResUNetBN2C 的实体类
regor
demo.pipeline_match —> pipeline.gen_match.check / pipeline.gen_match.nn_match / pipeline.gen_match.determine_processor / pipeline.gen_match.capture
pipeline.gen_match.check 用于检测使用的是否是扩散特征或几何特征
pipeline.gen_match.nn_match
用于在两组特征之间查找最近邻(nearest neighbor)或者最近的k个邻居(k-nearest neighbors)的工具类:
__init__
: 初始化方法,用于设置最大最近邻数nn_max_n
。pdist
: 计算两组特征之间的距离矩阵,支持L2距离和平方L2距离。find_nn_gpu
: 在GPU上查找最近邻。如果特征数量过大,则分批次处理以节省内存。返回每个特征的最近邻索引,可以选择是否返回距离。find_knn_gpu
: 类似于find_nn_gpu
,但是返回每个特征的k个最近邻。find_corr
: 根据给定的特征找到对应的匹配点对。如果指定了subsample_size
,则在较大的特征集中进行子采样以减少计算量。如果mutual
参数为True
,则要求匹配是互相的。
pipeline.gen_match.determine_processor —> tools.pose.__init__.ransacor
类 ransacor 的用法:
用于执行 RANSAC(Random Sample Consensus)算法来估计两组点之间的变换的工具类
这个类中的方法执行了以下功能:
__init__
: 初始化 RANSAC 参数,包括内点距离阈值、迭代次数和是否进行后续的优化。o3d_ransac
: 使用Open3D库中的RANSAC实现来估计两组点之间的变换,例如旋转和平移。run
: 运行整个RANSAC过程,包括RANSAC估计和后续的优化。首先使用RANSAC算法估计初始的变换,然后根据指定的内点距离阈值进行优化,最终返回优化后的变换以及内点的索引。
类 refiner 的用法:
用于优化(refining)和估计场景之间变换的工具类:
center_cal
: 计算两组关键点的质心。SVDR_w
: 计算加权SVD。s_cal
: 计算尺度因子。R_cal
: 计算旋转矩阵。t_cal
: 计算平移向量。Rt_cal
: 组合旋转和平移来计算变换。sRt_cal
: 考虑尺度的旋转和平移计算。Refine_trans
: 根据给定的变换优化估计,并根据内点距离来筛选内点。
pipeline.gen_match.capture
用于控制和处理一个特定的模型,该模型用于图像生成或者图像处理任务。它包含了一系列方法,用于加载模型、预处理输入、执行模型推断、特征处理、特征融合以及可视化等任务。
主要方法解释如下:
__init__
: 初始化方法,加载模型和设置参数。prepare
: 准备方法,用于设置模型的参数,例如设备、随机种子等。load_model
: 加载模型方法,从指定路径加载预训练模型的权重。pca_feat
: 对给定的特征进行PCA降维处理,返回降维后的特征。pca_feats
: 对多个特征进行PCA降维处理,返回降维后的特征列表。fmap_resize
: 将特征图调整为指定的大小。visualize_img
: 可视化图像。visualize_chw_feat
: 可视化通道在前的特征图。visualize_diffusion_result
: 可视化扩散结果。merge_feat
: 将多个特征融合成一个特征。uv_back_to_origin
: 将uv坐标映射回原始RGB图像。
HuggingFace 模型下载
除了可以下载到本地,还可以使用镜像网站,配置一下环境变量即可,可以参考[网址](HF-Mirror - Huggingface 镜像站 )。