基于深度学习的三维重建网络PatchMatchNet(三):如何利用patchmatchnet完成自己场景的数据集制作与利用自己的数据完成三维重建工作

news2025/2/23 19:02:25

 目录

1.如何使用本篇博客

1.1 patchmatchnet网络环境配置

1.2 colmap环境配置

2.如何利用colmap制作自己的三维重建数据集

2.1 采集数据

2.2 使用colmap计算位姿

2.3 转换位姿到MVS读取的格式

2.4 剔除离群图片

2.5 运用patchmatchnet进行三维重建


1.如何使用本篇博客

1.1 patchmatchnet网络环境配置

        我的电脑是R9000K2022 3080ti 16G显存版,在阅读本篇博客前,请一定确保已经安装配置好了深度学习环境,我的深度学习环境的cuda版本是cuda11.3,cudnn8.2.1。

        我们可以通过nvcc -V命令来查看我们的cuda环境是否配置成功。

        这里的patchmatchnet源码是基于pytorch的,请确保成功安装了pytorch1.8.0版本及以上版本的pytorch。

    image_dir = os.path.join(args.folder, 'images')
    model_dir = os.path.join(args.folder, 'sparse')

        我们下载好patchmatchnet后,下载dtu数据集,将下载好的dtu数据集放入/home根目录文件夹中。

        然后我们修改eval.py中的程序形参:

parser.add_argument('--dataset', default='dtu_yao_eval', help='select dataset')
parser.add_argument('--testpath',default='/home/dtu/', help='testing data path')

        第一个参数改成dtu_yao.py的路径,第二个改称dtu数据集的路径。

parser.add_argument('--testlist', default='/home/xxxx/Desktop/slam/PatchmatchNet-main/lists/dtu/test.txt', help='testing scan list')

        这个文件里面的内容是对于哪一个数据集进行三维重建,本文的后面我们也会介绍如何利用自己的数据集进行三维重建。(我们对于scan118进行重建)

parser.add_argument('--loadckpt', default='./checkpoints/model_000007.ckpt', help='load a specific checkpoint')

        这个里面存储的预训练模型,这个模型我给大家,:

parser.add_argument('--outdir', default='./outputs', help='output dir')

         这里面存储的是我们的算法(patchmatchnet输出的)深度图和置信度图,以及我们三维重建的点云图像。

        我们设置完这些后,执行eval.py,我们看看执行过程。        正在进行三维重建ing:        完成后就是这个样子的:

        我们在根目录的output里面可以看到我们的点云图像和深度图以及置信度图。

         效果是十分的好:

1.2 colmap环境配置

        在乌班图下就用一行命令就可以安装了:

sudo apt install colmap

        我们直接在命令行收入colmap gui就能使用它的图形化界面了!赞鲁阿

2.如何利用colmap制作自己的三维重建数据集

2.1 采集数据

        这里用相机拍摄即可:我们拍摄了一些树木的图片。/home/liuhongwei/Desktop/102.png

2.2 使用colmap计算位姿

        也可以用slam计算。我们建立新项目:建立数据库和图像文件的路径的选择,如下图:

         然后进行特征提取:在Processing下的Feature extraction选项卡里面:我们选择针孔相机模型进行特征提取。

        提取完成后如下图:

        随后我们进行特征匹配,在Processing下的Feature matching选项卡里面:

        匹配运行完之后我们点击Reconstruction选项卡下面的Start Reconstruction进行图片位姿重建。(好像有点奇怪,不过不影响)/home/liuhongwei/Desktop/100.png

        我们导出位姿,在File选项卡下面的Export Model as text。保存在目录sparse下:

2.3 转换位姿到MVS读取的格式

        这里需要用到脚本文件,我放入了我的csdn资源里面:colmap_input.py文件icon-default.png?t=N3I4https://download.csdn.net/download/qq_41694024/87766201        我们来看这个脚本的参数:

    parser.add_argument('--folder', default='./data',type=str, help='Project dir.')
    parser.add_argument('--theta0', type=float, default=5)
    parser.add_argument('--sigma1', type=float, default=1)
    parser.add_argument('--sigma2', type=float, default=10)

        我们需要用我们的路径代替data路径。

    image_dir = os.path.join(args.folder, 'images')
    model_dir = os.path.join(args.folder, 'sparse')

        我们在这个data文件夹下需要有一个images的文件夹存储图像序列,sparse存储我们保存的位姿文件。如下图:

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Convert colmap results into input for PatchmatchNet')

    parser.add_argument('--folder', default='/home/xxxxx/Desktop/树木3D',type=str, help='Project dir.')
    parser.add_argument('--theta0', type=float, default=5)
    parser.add_argument('--sigma1', type=float, default=1)
    parser.add_argument('--sigma2', type=float, default=10)

    parser.add_argument('--test', action='store_true', default=False, help='If set, do not write to file.')
    parser.add_argument('--convert_format', action='store_true', default=False, help='If set, convert image to jpg format.')

    args = parser.parse_args()

    image_dir = os.path.join(args.folder, 'image')
    model_dir = os.path.join(args.folder, 'sparse')

        我们执行这个脚本,执行如下图即成功!

2.4 剔除离群图片

        在colmap计算位姿时,可能有些图片的位姿无法计算,这可能是你照片照的角度问题,我们需要剔除这些图片后,将图片重新命名成如下格式存储在image文件夹里面。如图:

        这里我给大家提供一个脚本可以批量处理图像文件:

        脚本1:将拍摄图片命名规则化:

import os

folder_path = '/home/liuhongwei/Desktop/new' # 替换为你的文件夹路径

i = 1

for filename in os.listdir(folder_path):
    if filename.endswith('.jpg') or filename.endswith('.png') or filename.endswith('.jpeg') or filename.endswith('.JPG'):
        basename = os.path.splitext(filename)[0] # 获取文件名(不含扩展名)
        extension = os.path.splitext(filename)[1] # 获取扩展名
        new_filename = '{:08d}{}'.format(i, extension)
        os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_filename))
        i += 1

        脚本2:将拍摄图片的JPG结尾的文件转换成patchmatchnet认出的jpg文件结尾的形式。

import os

folder_path = "/home/liuhongwei/Desktop/slam/PatchmatchNet-main/data/image" # 替换为您要更改文件扩展名的文件夹路径

# 循环遍历该文件夹下的所有文件
for filename in os.listdir(folder_path):
    # 检查文件是否是 JPG 格式
    if filename.endswith(".JPG"):
        # 构建新文件名
        new_filename = os.path.splitext(filename)[0] + ".jpg"
        # 重命名文件
        os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_filename))

        现在我们已经完成了数据集的构建。

        执行完脚本后我们得到了如下文件结构:

        pair.txt存储着图片之间的匹配关系,cams_1存储着相机的内外参数。

2.5 运用patchmatchnet进行三维重建

        执行eval_custom.py文件即可:

        模型最终存储在 /home/liuhongwei/Desktop/slam/PatchmatchNet-main/outputs_custom0/custom.ply中,我们可以用meshlab打开,可以看到点云质量还可以。

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

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

相关文章

【MySQL】简单使用

数据库:文件,管理系统 类别:关系型,非关系型(nosql) C/S模式(客户端服务器) mysql登录 用户名&密码 默认管理员:root 登录:Linux管理员身份运行客户…

为什么二极管具有单向导通性

大家都知道二极管具有单向导通性,比如一个双极性的信号通过二极管后会变成一个单极性的信号。 为了弄清这个问题先来看一下二极管的构成。 在纯净的硅晶体中掺入五价元素,比如磷,就形成了N型半导体,掺入的五价元素多余的电子很容…

汉明码简单计算方法

正算 看一张图 其中标绿底色的为汉明码校验位,可以发现,这些位置的2进制里面只有一个1,其他位上都是0。 先说结论:校验位上的1在第几个位上,就会用来保证位置的2进制里面该位上为1的位置上的1的个数为偶数。 比如&…

11_Uboot启动流程_3

目录 run_main_loop函数详解 cli_loop函数详解 cmd_process函数详解 run_main_loop函数详解 uboot启动以后会进入3秒倒计时,如果在3秒倒计时结束之前按下按下回车键,那么就,会进入uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能…

MySQ ---- 函数

函数 函数是指一段可以直接被另一段程序调用的程序或代码。MySQL 内置了很多函数,开发人员只需要调用使用即可。查询语句中已经使用过了一些聚合函数。下面还有些常用的函数需要掌握。 函数应用场景举例 函数的分类 ① 字符串函数 ② 数值函数 ③ 日期函数 ④ 流程…

chap和ppp认证配置+MGRE实验

题目要求 1.R2为ISP,其上只能配置IP地址 2.R1-R2之间为HDLC封装 3.R2-R3之间为ppp封装,pap认证,R2为主认证方 4.R2-R4之间为ppp封装,chap认证,R2为主认证方 5.R1,R2,R3构建MGRE环境,仅R1的IP地址固定 6.内…

OpenPCDet系列 | 4.KITTI数据集数据加载流程代码解析

文章目录 数据加载流程0. create_kitti_infos1. __getitem__函数2. prepare_data函数3. collate_batch函数数据加载流程 这里记录一下具体用到的那些数据形式,整个kitti数据集的处理框架图如下所示: 在数据集处理到获取一个batch数据的整个流程的入口如下: # 开始迭代每…

STL常用容器

目录 一、string容器 1、基本概念 2、构造函数 3、赋值操作 4、字符串拼接 5、查找和替换 6、字符串比较 7、字符存取 8、插入与删除 9、获取字串 二、vector容器 1、基本概念 2、构造函数 3、赋值操作 4、容量和大小 5、插入和删除 6、数据存取 7、互换容器…

hadoop shell操作HDFS文件

一.常用的 hadoop shell 文件路径需要自己有才行,示例中的文件路径是本人自己的文件路径,不是公共文件路径,如何建立自己的数仓,查看本人 大数据单机学习环境搭建 相关文章 1.1查看 创建 删除 # 列出当前hdfs所存贮的文件 hado…

模式串匹配算法(朴素模式匹配与KMP)的机算与手算。

一.朴素模式匹配 1.机算 其实就是暴力匹配。 使用双指针 i (指向主串) j (指向模式串) 从主串 S 第一字符起,与模式串 T, 第一个字符比较,   ①若相同,则 i 与 j 统一向后移   ②若遇到 i 与 j 指向字符不同,回溯 i j 指针。继续如此&a…

经验分享|如何搭建产品帮助文档

作为一款优秀的产品,除了功能强大、易于使用等特点外,相应的使用说明和帮助文档也是至关重要的,这些说明和文档可以帮助用户更好地使用这款产品,并解决在使用过程中的问题。本篇文章将为大家详细介绍如何搭建一份优秀的产品帮助文…

12-Vue技术栈之Vuex的使用

目录 1、理解 vue1.1 vuex 是什么1.2 什么时候使用 Vue1.3 图解两种方式实现数据共享 2、搭建vuex环境2.1 下载vuex2.2 配置文件 3、基本使用3.1 求和案例纯vue写法3.2 求和案例vuex写法 4、getters的使用5、四个map方法的使用5.1 求和案例 6、 模块化命名空间6.1求和案例改造 …

C++“static“成员使用

1.static 成员概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。 1.2 static特性 静态成员为所有类对…

JVM学习(十):方法区

目录 一、栈、堆和方法区的交互关系 二、对方法区的理解 2.1 方法区在哪里 2.2 方法区的基本概念 2.3 Hotspot中方法区的演进 三、方法区的大小 3.1 设置参数 3.1.1 jdk7及以前 3.1.2 jdk8以后: 3.2 配置参数演示OOM 四、方法区的内部结构 4.1 方法区里…

【Java虚拟机】JVM调优和分析案例综合实战

1.什么是JVM性能优化 jvm性能优化涉及到两个很重要的概念:吞吐量和响应时间。jvm调优主要是针对他们进行调整优化,达到一个理想的目标,根据业务确定目标是吞吐量优先还是响应时间优先。 吞吐量:用户代码执行时间/(用户代码执行时…

C语言学习分享(第六次)------数组

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 数组详解 1. 前言🔶2. …

使用 spring 的 IoC 的实现账户的CRUD(2)双层实现

spring实现service和dao的数据的查找 dao层设置接口实现dao层的接口service设置接口通过注入dao层,来实现接口 //dao层的接口,定义了根据id查询的方法 public interface Accountdao {Account findByid(int id); }实现接口:实现了查询的方法 …

【模板】拓扑排序

import java.util.Scanner; import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int point in.nextInt();int side in.nextInt();int[][] arr new i…

MacOS下安装和配置Nginx

一、安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"按回车后,根据提示操作:输入镜像序号 --> 输入Y,回车等待brew安装完成即可。 在终端输入brew -v后,会提示…

【牛客刷题专栏】0x25:JZ24 反转链表(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…