DCP代码及实验记录 2020.9.5

本文详细记录了使用DCP算法进行点云配准的实验过程及结果,探讨了点云数据特性、采样数量、旋转平移参数对配准性能的影响,并分析了DCP算法在自动驾驶场景下的适用性。

实验结果和代码已上传至学校云盘: 链接:
https://rec.ustc.edu.cn/share/41947130-ef56-11ea-ae23-ebe12587560c

  • 00:

    使用modelNet40的点云数据进行配准实验。

    点云数目:2048

    modelnet的点云数据非常规整,没有噪声点,

    src,target是由同一个点云数据旋转得到的,因而两个点云之间严格一一对应

    配准效果非常好。

点云数据:kitti_odometry 序列01

  • 01:
    点云采样数量:3072

    对同一个点云进行两次不同的采样,对其中一个进行 较大幅度的 随机旋转平移:

    angle: [0.2825798589863413 0.7841613528453935 0.2713792204696284]

    trans: [-0.25484568 -0.24589611 0.31652238]

    src与target之间的旋转效果明显,绕X轴有非常显著的旋转,地平面扬起。

    配准后的点云基本重合,还差一个绕z轴的非常小的旋转量。

  • 02:
    点云采样数量:3072

    对同一个点云进行两次不同的采样,对其中一个进行 较小幅度的 随机旋转平移:

    角度:[0.04,0.04,0.04], 平移量:[0.01 0.05 0.05]

    src 和target 之间的相对位姿较小,基本没有旋转量,沿y轴有一个平移量

    配准后的结果src_pred、target_pred应当与src/target重合,但是反而误差更大了,

    预测的点云与对应的点云之间有一个绕z轴的大的旋转量。

  • 03:
    点云采样数量:3072

    对两个里程计前后帧的点云进行采样,然后进行配准:

    注意里程计数据的帧与帧之间,地面是始终在同一平面的,即没有绕x轴的旋转量

    相差2帧时:位姿差别太小,配准后的点云位姿反而相差更大,出现了绕x轴的旋转量(地平面抬起)

    相差5帧:配准后的点云位姿反而相差更大,个别出现了绕x轴的旋转量,个别出现了绕z轴的旋转

    相差7帧:时间距离和空间太大,场景内容都不一样,导致配准后的点云位姿反而相差更大

  • 04:
    点云数目:2048

    在实验01的基础上:

    针对问题5,将z轴坐标简单乘以一个倍数进行放大。

    实验发现较为合适的倍数=3

    可以将xy平面的旋转以及绕y轴的旋转配准至大概接近,但均有误差存在

    简单的进行放大是不够的,因为一些z轴坐标为负的点会被放大到非常下面

  • 05: 与01进行对比

    点云采样数量:2048

    对同一个点云进行相同的采样,对其中一个进行 较大幅度的 随机旋转平移:

    angle: [0.2825798589863413 0.7841613528453935 0.2713792204696284]

    trans: [-0.25484568 -0.24589611 0.31652238]

    配准结果与modelNet上的结果相近,非常好

  • 06: 与05进行对比

    点云采样数量:2048

    对同一个点云进行相同的采样,对其中一个进行 较大幅度的 随机旋转平移,

    对z轴坐标放大3倍

    angle: [0.2825798589863413 0.7841613528453935 0.2713792204696284]

    trans: [-0.25484568 -0.24589611 0.31652238]

    与05结果无较大差异,配准效果较好

  • 07:
    点云采样数量:2048

    对同一个点云进行相同的采样,对其中一个进行 较大幅度的 随机旋转平移:

    angle: [0.7239022641818816 0.6697969212818884 0.5282925532745861]

    trans: [-0.35980887 0.20374635 -0.39225807]

    src与target之间的旋转效果明显,绕X轴有非常显著的旋转,地平面扬起。

    配准后的点云基本重合,还差一个绕z轴的非常小的旋转量。

    配准效果较好

  • 08:
    点云采样数量:2048

    对同一个点云进行相同的采样,对其中一个进行 较小幅度的 随机旋转平移:

    角度:[0.04,0.04,0.04], 平移量:[0.01 0.05 0.05]

    src 和target 之间的相对位姿较小,基本没有旋转量,沿y轴有一个平移量

    配准后的结果src_pred、target_pred基本与src/target重合,平移量被配准了

    剩余绕z轴的小的旋转量没有配准

    配准效果较好

###实验分析:

a. 对比05,01和00,说明点云严格一一对应的关系是决定DCP配准性能的关键
此外,点云数目在大于2048时基本没有差别

b.对比05与06,05与00,说明点云的扁平分布对配准性能的影响不大,
即使是kitti里程计的数据,只要严格一一对应皆可以配准

c. 对比07,08 , 说明相对位姿的大小并不会影响配准的效果。

问题总结:

  1. DCP假设输入的两个待配准的点云是完全匹配的,而odometry数据中只有局部点云是匹配的。

  2. DCP假设输入的两个点云中的每个点是完全对应的,若将同一点云的两次不同采样作为输入,其配准结果会出现误差。

  3. 对于前后帧相差较小的两个点云输入,DCP不能捕获之间的细微位姿差异,配准后的结果位姿相差更大
    这主要是问题2导致的。由于问题2导致存在本身的配准误差,当两个点云之间的位姿差别小于配准误差时,配准结果一定不好

  4. odomentry数据集,或者说自动驾驶点云数据,其scan与scan之间绕x或y轴的旋转量是非常小的,即地平面始终是平行的。
    但是这种数据在没有严格一一对应关系的前提下,对于DCP来说是较为相似的,配准结果很差。

  5. kitti_odometry数据集在xy平面的尺度较大,在Z轴上的尺度相对较小,因而采样后的输入点云是类似于二维平面的形状,
    然而实验发现并不是这个因素导致配准结果变差的。

  6. DCP 的使用场景应当是已知两个patch点云对应关系的情况下,求解该对应关系之间的变换关系。
    直接使用DCP作为里程计,暗含了对点云前后帧完全相同且点之间严格一一对应的假设,显然这是不成立的。

### UNet_DCP_512 模型 `config.json` 文件路径定位 在使用 Hugging Face 的 diffusers 库加载预训练模型时,通常需要依赖远程仓库中的配置文件(如 `config.json`)。如果遇到类似于 `OSError: xxx does not appear to have a file named config.json.` 或者网络连接错误的问题,则可能是由于以下几个原因引起的: #### 可能的原因分析 1. **网络连接问题** 如果无法访问 Hugging Face 的在线资源库(例如 https://huggingface.co),可能会触发 `requests.exceptions.ConnectionError` 错误。这表明当前环境下的互联网连接存在问题或者被防火墙阻止[^1]。 2. **模型未提供 `config.json` 文件** 部分自定义模型可能并未上传标准的 `config.json` 文件至其对应的 Hugging Face 仓库中,从而导致加载失败。 3. **本地缓存缺失或损坏** 当尝试从本地缓存读取模型文件时,若缓存目录下缺少必要的文件(如 `config.json`),则会抛出类似的异常提示[^3]。 #### 解决方案 为了成功定位并获取 `UNet_DCP_512` 模型的 `config.json` 路径,可以采取以下方法之一: ##### 方法一:手动下载模型及其配置文件到本地 可以通过指定镜像源的方式将目标模型下载到本地存储位置,并调整代码逻辑指向该本地路径。具体操作如下: ```python from huggingface_hub import snapshot_download local_dir = "./models/UNet_DCP_512" repo_id = "your-repo-id-or-path-to-model" try: snapshot_download(repo_id=repo_id, local_dir=local_dir) except Exception as e: print(f"Download failed due to {e}") ``` 完成下载之后,确认 `local_dir` 下是否存在名为 `config.json` 的文件即可。 ##### 方法二:检查已有检查点内的实际结构 假设已经存在某些预先保存下来的权重文件夹作为检查点数据集的一部分,可以直接遍历这些子目录寻找匹配项: ```python import os checkpoint_path = "/path/to/checkpoints/" for root, dirs, files in os.walk(checkpoint_path): if 'config.json' in files: full_path = os.path.join(root, 'config.json') print(full_path) ``` 此脚本能够打印出所有符合条件的结果列表供进一步验证。 ##### 方法三:基于 U-Net 构建过程重新生成默认配置 如果没有找到现成可用的 JSON 描述文档,也可以依据官方实现指南自行创建一份基础版本用于初始化阶段测试用途。以下是简化版样例演示如何定义双卷积层参数设置等内容片段[^4]: ```python class DoubleConv(nn.Module): """(convolution => [BN] => ReLU) * 2""" def __init__(self, in_channels, out_channels): super().__init__() self.double_conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, bias=False), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, bias=False), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x) # Example usage of custom configuration generation logic here... default_config = { "model": {"type": "unet", "architecture": ["double_conv"]}, "input_shape": [1, 512, 512], } print(default_config) ``` 以上代码仅作示意作用,请根据实际情况扩展字段范围满足项目需求后再正式部署应用环境中去替代原始丢失掉的部分功能特性表现形式等方面考虑进去再做最终决定吧! --- ###
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值