【点云配准】【深度学习】Windows11下PCRNet代码Pytorch实现与源码讲解

【点云配准】【深度学习】Windows11下PCRNet代码Pytorch实现与源码讲解

提示:最近开始在【点云配准】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。


文章目录

  • 【点云配准】【深度学习】Windows11下PCRNet代码Pytorch实现与源码讲解
  • 前言
  • PCRNet模型运行环境搭建
  • PCRNet模型运行
    • 数据集与模型权重下载
    • PFNet训练与测试
  • 总结


前言

PCRNet是由卡内基梅隆大学的Sarode, Vinit等人在《PCRNet: Point Cloud Registration Network using PointNet Encoding【2019】》【论文地址】一文中提出的模型,使用PointNet对点云提取全局特征,不需要计算点云之间的一一对应关系,快速实现了点云的配准。
在详细解析PCRNet网络之前,首要任务是搭建PCRNet【Pytorch-demo地址】所需的运行环境,并完成模型训练和测试工作,展开后续工作才有意义。

博文使用的代码是其他作者用pytorch改写的,非原论文作者源码


PCRNet模型运行环境搭建

在win11环境下安装anaconda环境参考,方便搭建专用于PCRNet模型的虚拟环境。

  • 查看主机支持的cuda版本(最高)
    # 打开cmd,执行下面的指令查看CUDA版本号
    nvidia-smi
    
  • 安装GPU版本的torch【官网】,PyTorch的cuda版本与系统自带的cuda版本必须一致。
    其他cuda版本的torch在【以前版本】找对应的安装命令。
  • 博主安装环境参考
    # 创建虚拟环境
    conda create -n PCRNet python==3.10
    # 查看新环境是否安装成功
    conda env list
    # 激活环境
    activate PCRNet
    # githup下载MiVOS源代码到适合目录内,解压文件
    # 分别安装pytorch和torchvision
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    # 通过清华源安装PCRNet所需的第三方包(博主这里因为已经安装了torch,因此删除了requirements中的的torch==1.4.0)
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
    # 安装open3d,这里适合博主的是0.9以上
    python -m pip install open3d==0.16
    # 安装自定义的包emd loss
    cd loss/cuda/emd_torch & python setup.py install
    # 查看所有安装的包
    pip list
    conda list
    

安装自定义的包 emd loss 过程中可能出现的问题

解决方法:只安装了CUDA的运行环境,需要再安装开发环境,因此按照下图进行了安装。

正确安装成功

部分错误的解决可能需要安装ninja【参考】,但是也会引入新的错误,博主在安装 emd loss 过程中不需要安装ninja。


PCRNet模型运行

数据集与模型权重下载

名称下载地址说明
modelnet40数据集【下载地址】ModelNet40是一个常用的三维物体识别数据集,用于训练和评估三维深度学习模型。
预训练模型权重【Complete: c4z7】 【Paritial: pcno】在modelnet40数据集训练好的权重

将下载好的modelnet40数据集解压并拷贝到当前工程目录下(建议),这里博主对数据集文件夹进行了重命名。

将下载好的预训练权重(训练好的)拷贝到当前工程目录下(建议),这里博主对预训练权重文件进行了重命名。

PFNet训练与测试

  1. 训练:可以根据硬件条件修改代码中部分训练参数epochs和batch-size修改训练次数和训练的batchsize等,详细的代码内容将在后续博文中介绍。

    # 源码参考命令 root:数据集的位置 CUDA_VISIBLE_DEVICES:使用gpu 0
    CUDA_VISIBLE_DEVICES=0 python modelnet40_train.py --root your_data_path/modelnet40_ply_hdf5_2048
    # 博主执行命令 root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名
    python modelnet40_train.py --root modelnet40 
    

    windows下在custom_train.py文件开头添加os.environ[‘CUDA_VISIBLE_DEVICES’] =‘0’,不在命令行使用CUDA_VISIBLE_DEVICES=0。

    正在训练:

    训练权重保存在work_dirs\models\checkpoints目录下,分别单独保存三个指标下最理想的权重文件:

  2. 测试:分别对比了深度学习模型配准、icp配准和fgr配准方法。

    # 深度学习模型配准
    # 源码参考命令 root:数据集的位置 checkpoint:预训练权重的位置 cuda:使用cuda
    python modelnet40_evaluate.py --root your_data_path/modelnet40_ply_hdf5_2048 --checkpoint your_ckpt_path/test_min_loss.pth --cuda
    # 博主执行命令 root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名了,checkpoint同理
    python modelnet40_evaluate.py --root modelnet40 --checkpoint Complete_test_min_loss.pth --cuda
    

    # 深度学习模型配准
    # 源码参考命令,root:数据集的位置 checkpoint:预训练权重的位置 show:展示结果
    python modelnet40_evaluate.py --root your_data_path/modelnet40_ply_hdf5_2048 --checkpoint your_ckpt_path/test_min_loss.pth --show
    # 博主执行命令,root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名了,checkpoint同理
    python modelnet40_evaluate.py --root modelnet40 --checkpoint Complete_test_min_loss.pth --show
    


    其中绿色点云为源点云,红色点云为参照点云,蓝色点云为配准后的源点云,可以看到蓝色点云与红色点云完全对齐,这表明训练效果极佳。

    上述俩个指令的没有什么区别,下面命令只是可视化展现了每个点云的配准效果。

    # icp配准
    # 源码参考命令,root:数据集的位置 method:使用的方法(默认是深度学习的)
    python modelnet40_evaluate.py --root your_data_path/modelnet40_ply_hdf5_2048 --method icp
    # 博主执行命令,root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名了,checkpoint同理
    python modelnet40_evaluate.py --root modelnet40 --method icp
    

    # icp配准
    # 博主执行命令,root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名了,checkpoint同理
    python modelnet40_evaluate.py --root modelnet40 --method icp --show
    


    可以看到蓝色点云与红色点云没有完全对齐,这表明效果不是很理想。

    # fgr配准
    # 源码参考命令,root:数据集的位置 method:使用的方法(默认是深度学习的)
    python modelnet40_evaluate.py --root your_data_path/modelnet40_ply_hdf5_2048 --method fgr  --normal
    # 博主执行命令,root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名了,checkpoint同理
    python modelnet40_evaluate.py --root modelnet40 --method fgr  --normal
    

    # fgr配准
    # 博主执行命令,root的modelnet40_ply_hdf5_2048是原始文件名,博主这里是因为重命名了,checkpoint同理
    python modelnet40_evaluate.py --root modelnet40 --method fgr  --normal --show
    


    可以看到蓝色点云与红色点云完全对齐,这表明效果极佳。

可能出现的问题1: open3d版本问题。

解决方法: 将icp.py中的o3d.registration更改成o3d.pipelines.registration。
可能出现的问题2: open3d版本问题。

解决方法: 将fgr.py中的o3d.pipelines.registration.registration_fast_based_on_feature_matching更改成o3d.pipelines.registration.registration_fgr_based_on_feature_matching。

暂时没有个人数据集可以训练


总结

尽可能简单、详细的介绍了PCRNet的安装流程以及PCRNet的使用方法。后续会根据自己学到的知识结合个人理解讲解PCRNet的原理和代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring: MultipartFile和File的区别

文章目录 一、MultipartFile和File对比1、 MultipartFile:2、File: 一、MultipartFile和File对比 MultipartFile 和 File 是用于处理文件上传的两种不同类型,主要在不同的编程环墨境中使用。 1、 MultipartFile: - MultipartFi…

Linux内核解读

来自鹅厂架构师 作者:aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构,用户态运行在ring3,内核态运行在ring0,两个特权等级。 (1)内核、一些特权指令,例…

Golang 并发 Channel的用法

目录 Golang 并发 Channel的用法channel 的创建nil channel读写阻塞示例close示例 channel 的读写channel 只读只写关闭channelchannel关闭后,剩余的数据能否取到读取关闭的channel,将获取零值使用ok判断,是否关闭使用for-range退出使用close…

debug - 只要在内存中有显示相关的数据, 就会被CE找到

文章目录 debug - 只要在内存中有显示相关的实际数据, 就会被CE找到概述笔记demo实现demo运行效果用CE查找实际数据地址找到自己的调试点 - 方法1找到自己的调试点 - 方法2打补丁备注END debug - 只要在内存中有显示相关的实际数据, 就会被CE找到 概述 自己写了一个demo, 想验…

哈尔滨酒店为什么要进行神秘顾客检查

神秘顾客调研是一种非常有效市场调研方法,通过第三方人员以普通消费者的身份对特定企业或服务进行评估和反馈。这些“神秘顾客”会接受详细的培训,了解如何评估服务质量、产品特性、员工表现等方面。在访问过程中,他们会记录自己的观察和体验…

人工智能_PIP3安装使用国内镜像源_安装GIT_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_002---人工智能工作笔记0097

接着上一节来看,可以看到,这里 创建软连接以后 [root@localhost Python-3.10.8]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3 [root@localhost Python-3.10.8]# python3 -V Python 3.10.8 [root@localhost Python-3.10.8]# pwd /usr/local/Python-3.10.8 [root@…

Vue26 内置标签 v-text v-html

实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>v-text指令</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js"></script></head><…

第一件事 什么是 Java 虚拟机 (JVM)

1、什么是虚拟机&#xff1f; - 这个其实是一个挺逗的事情&#xff0c;说白了&#xff0c;就是基于某个硬件架构&#xff0c;在这个硬件部署了一个操作系统&#xff0c;再构架一层虚拟的操作系统&#xff0c;这个新构架的操作系统就是虚拟机。 不知道的兄弟姐妹们&#xff0c;…

1629: 【动态规划】【背包】完全背包(优化)

题目描述 设有N种物品&#xff0c;每种物品有一个重量及一个价值。但每种物品的数量是无限的&#xff0c;同时有一个背包&#xff0c;最大载重量为M&#xff0c;今从N种物品中选取若干件(同一种物品可以多次选取)&#xff0c;使其重量的和小于等于M&#xff0c;而价值的和为最…

重学Java 18.学生管理系统项目

臣无祖母&#xff0c;无以至今日&#xff0c;祖母无臣&#xff0c;无以终余年 母孙二人&#xff0c;更相为命&#xff0c;是以区区不能废远 —— 陈情表.李密 —— 24.2.20 一、编写JavaBean public class Student {//学号private int id;//姓名private String name;//年龄pr…

Codeforces Round 925 (Div. 3)(A,B,C,D,E,F,G)

比赛链接 这场打的很顺&#xff0c;感觉难度和 div 4 差不多&#xff0c;不是很难。D题稍微考了考同余的性质&#xff0c;E题直接模拟过程即可&#xff0c;F题也可以暴力模拟或者拓扑排序&#xff0c;G题是个数学题&#xff0c;是个简单隔板法。A到F题都可以直接模拟就有点离谱…

云计算计算资源池与存储池访问逻辑

在云计算环境中&#xff0c;计算资源池和存储池通常是分开管理和访问的。计算资源池包含了用于运行虚拟机的 CPU、内存等计算资源&#xff0c;而存储池则提供了用于存储虚拟机镜像、数据等的存储资源。 计算资源池和存储池之间通常通过网络进行访问&#xff0c;它们之间不存在直…

解析DApp的延展性:深度解析与未来展望

每天五分钟讲解一个电商模式&#xff0c;大家好我是模式策划啊浩Zeropan_HH。 随着区块链技术的不断演进&#xff0c;去中心化应用&#xff08;DApp&#xff09;已成为数字革命的前沿阵地。作为区块链技术的核心应用之一&#xff0c;DApp的延展性不仅关乎其性能和用户体验&…

「WinCC报警系统专题」简述“消息系统”

WinCC通过报警给操作员提供了有关过程故障和错误的信息。它们有助于尽早检测重要情况和避免停机时间。 一、消息系统 消息&#xff08;报警&#xff09;系统由组态和运行系统组件组成。 1、组态系统 报警记录编辑器&#xff08;如图1所示&#xff09;是报警系统的组态组件。报…

Java,SpringBoot中导出excel文件

依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml<…

docker (九)-进阶篇-docker-compos最佳实践部署zabbix

一 部署docker环境 关闭防火墙、selinux、开启docker&#xff0c;并设置开机自启动 注意点&#xff1a;docker部署的时候&#xff0c;bip要指定&#xff0c;不然会导致虚拟机ip和容器ip冲突&#xff0c;ssh连不上虚拟机 部署请参考 docker &#xff08;二&#xff09;-yum…

为什么程序员不能一次性写好,需要不停改bug?

写程序不是一次性完成的原因有很多&#xff0c;其中包括了解不充分、需求变更、复杂性、人为因素等多个方面的原因。 需求不明确&#xff1a; 在项目一开始&#xff0c;对需求可能存在歧义或不完整的理解。有时候&#xff0c;业务需求会在开发过程中发生变化&#xff0c;导致…

route命令学习总结

route命令学习总结 参考链接: 1、route指令使用详解 https://blog.csdn.net/justlpf/article/details/1290452842、route命令详解 https://www.kancloud.cn/chunyu/php_basic_knowledge/2106519 route命令用于显示和操作IP静态路由表。用于跨网段之间通信 route命令主要用于…

前端登录随机数字字母组合验证

背景&#xff1a;系统登录页面只有用户名密码一种校验方式&#xff0c;没有验证码&#xff0c;可能导致暴力破解。 实现逻辑&#xff1a; <el-form-item prop"code"><el-inputv-model"loginForm.captchaCode"auto-complete"off"placeho…

linux 测试网络速率

1. ethtool ethtool是很强大的查询网卡&#xff08;嵌入式称为phy芯片&#xff09;配置的工具&#xff0c;几乎phy芯片芯片手册寄存器能配置的选项&#xff0c;ethtool都能查询到&#xff1b;嵌入式调试phy芯片的时候经常用到该命令&#xff1b;最简单的指令如下 ethtool eth0…