【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在GeoTransformer/experiments/geotransformer.kitti.stage5.gse.k3.max.oacl.stage2.sinkhorn/下面的model.py. 这里再次结合个人理解以及model.py中类GeoTransformer的forward函数, 大概梳理了一下前向传播的WorkFlow, 大家可以参考理解. 每个步骤以单独的颜色表示, 箭头代表输入输出.
在这里插入图片描述

1.coarse_matching

1.1 概要

类GeoTransformer中的coarse_matching实际上是一个SuperPointMatching类的实例(参见下文摘出的代码), 它的超参主要是cfg中的coarse_matching.num_correspondences和coarse_matching.dual_normalization.
这个类中是没有可学习的网络参数的.

        self.coarse_matching = SuperPointMatching(
            cfg.coarse_matching.num_correspondences, cfg.coarse_matching.dual_normalization
        )

在论文中提到, dual_normalization操作, 是特意设计来抑制掉一些不准确匹配,以提高配准性能的, 因此默认是True.
在这里插入图片描述

1.2 功能

对transformer模块提取的ref 特征和 src特征,首先应用mask、移除掉一些空的patch, 然后对计算pair_wise距离, 将该距离转化为matching_scores得分, 输出topk——即前num_correspondences个对应的src点和ref点的索引。

1.3 超参

num_correspondences

1.4 input

        ref_feats:  参考点云中superpoints的特征.
        src_feats:  待配准点云中superpoints的特征.
        ref_masks:  参考点云中superpoints的mask.
        src_masks:  待配准点云中superpoints的mask.

1.5 output

        ref_node_corr_indices:  参考点云中,被选中为corresponding superpoints的 indices.
        src_node_corr_indices:  待配准点云中,被选中为corresponding superpoints的 indices.
        node_corr_scores: corresponding superpoints的score . 对应点的匹配得分
    def forward(self, ref_feats, src_feats, ref_masks=None, src_masks=None):
        r"""Extract superpoint correspondences.

        Args:
            ref_feats (Tensor): features of the superpoints in reference point cloud.
            src_feats (Tensor): features of the superpoints in source point cloud.
            ref_masks (BoolTensor=None): masks of the superpoints in reference point cloud (False if empty).
            src_masks (BoolTensor=None): masks of the superpoints in source point cloud (False if empty).

        Returns:
            ref_corr_indices (LongTensor): indices of the corresponding superpoints in reference point cloud.
            src_corr_indices (LongTensor): indices of the corresponding superpoints in source po
激光雷达点云是将来自不同视角或时间的激光雷达扫描数据(即三维点云)对齐到统一坐标系下的关键步骤,广泛应用于自动驾驶、机器人导航、三维建模和SLAM系统中。近年来,随着传感器技术和计算能力的发展,点云算法经历了从传统几何方法向基于优化与深度学习融合方法的演进。 ### 1. 传统点云方法 早期主流方法以迭代最近点(ICP, Iterative Closest Point)为代表,通过交替进行点对应搜索和刚体变换估计来最小化点间距离。虽然ICP实现简单且收敛性良好,但其严重依赖初始位姿对齐,容易陷入局部最优。 为克服ICP的局限,研究者提出了多种改进: - **Go-ICP**:引入分支定界策略,在全局范围内搜索最优变换。 - **Generalized ICP (GICP)** 和 **Normal ICP (NICP)**:利用点云法向量和平滑性信息提升匹精度。 - **NDT(Normal Distributions Transform)**:将空间划分为网格并用概率分布表示点云,适合大场景。 ### 2. 基于特征的方法 该类方法首先提取点云中的稳定特征(如SIFT-like、FPFH、SHOT等),再通过特征匹与RANSAC估计变换矩阵。 - **FPFH(Fast Point Feature Histograms)** 结合点邻域几何特性构建描述子,常用于。 - **3D SIFT / USIP**:借鉴图像处理思想,在三维空间检测关键点并生成描述符。 这类方法可有效减少数据量,提高鲁棒性,但在无纹理或重复结构区域表现受限。 ### 3. 优化方法点云中的应用 现代框架普遍结合非线性优化技术提升精度与稳定性: - 使用 **Levenberg-Marquardt** 或 **Gauss-Newton** 算法优化目标函数。 - 构建图优化模型(如g2o、Ceres Solver),整合多帧观测与回环检测,用于SLAM系统中的后端优化。 - 引入鲁棒核函数(如Huber、Cauchy)抑制误匹的影响。 ### 4. 深度学习驱动的点云 近年来,深度学习显著推动了点云的发展,尤其在端到端学习和特征表达方面取得突破: - **PointNetLK**:结合PointNet提取全局特征,模拟LK迭代优化流程。 - **PCRNet**:使用PointNet作为编码器,通过回归网络预测变换参数。 - **DeepICP**:自动学习对应关系,并集成可微ICP层实现端到端训练。 - **IDAM-net / RPM-Net**:引入注意力机制与Sinkhorn算法,处理部分重叠与噪声问题。 - **CorrNet3D / Predator**:显式学习点对之间的对应关系,结合几何约束提升匹质量。 此外,自监督与无监督学习成为趋势,避免对真实变换标签的依赖,更适用于实际部署。 ### 5. 当前挑战与未来方向 - **初始化敏感性**:仍需良好的初值才能保证收敛。 - **实时性要求**:深度学习模型推理速度有待提升。 - **泛化能力**:跨场景、跨设备的数据适应性不足。 - **部分重叠与动态环境**:复杂城市环境中行人、车辆干扰影响效果。 未来可能的发展方向包括: - 融合语义信息进行分割辅助; - 多模态融合(如LiDAR+Camera+IMU)提升鲁棒性; - 构建轻量化、可解释性强的神经网络架构; - 发展统一基测试平台与大规模标注数据集。 ```python # 示例:简化版ICP算法伪代码 import numpy as np from sklearn.neighbors import NearestNeighbors def icp(A, B, max_iterations=20, tolerance=1e-6): src = np.ones((4, A.shape[0])) dst = np.ones((4, B.shape[0])) src[:3, :] = A.T dst[:3, :] = B.T prev_error = 0 for i in range(max_iterations): # 找最近点 neigh = NearestNeighbors(n_neighbors=1, algorithm='kd_tree').fit(dst[:3, :].T) distances, indices = neigh.kneighbors(src[:3, :].T) matched_dst = dst[:3, indices.ravel()] # 计算最优旋转和平移(SVD分解) centroid_src = np.mean(src[:3, :], axis=1) centroid_dst = np.mean(matched_dst, axis=1) H = (matched_dst - centroid_dst.reshape(-1, 1)) @ (src[:3, :] - centroid_src.reshape(-1, 1)).T U, S, Vt = np.linalg.svd(H) R = U @ Vt t = centroid_dst - R @ centroid_src # 更新源点云 src[:3, :] = R @ src[:3, :] + t.reshape(-1, 1) mean_error = np.mean(distances) if abs(prev_error - mean_error) < tolerance: break prev_error = mean_error return R, t, src[:3, :] ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steptoward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值