【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeuS(DTU格式)数据集

【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeuS(DTU格式)数据集

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


文章目录

  • 【三维重建】【深度学习】【数据集】基于COLMAP制作自己的NeuS(DTU格式)数据集
  • 前言
  • 下载安装colmap软件
  • 下载LLFF源码
  • 采集图片,使用colmap获取相机位姿
    • 采集图像
    • 位姿计算
  • 转成LLFF数据的格式
  • 转成DTU数据的格式
  • 总结


前言

DTU格式是NeuS网络模型训练使用的数据集格式之一,本文基于COLMAP软件展示从DTU格式数据集的制作到开始模型训练的完整流程。NeuS通过输入同一场景不同视角下的二维图片和相机位姿,对场景进行三维隐式建模,使用一种新的一阶近似无偏差的公式,从而即使没有掩模监督,也能进行更精确的表面重建。


下载安装colmap软件

下载COLMAP软件【下载地址】,本文使用的是Windows下的CUDA版本:

解压后双击打开COLMAP.bat,出现如下界面:

软件安装成功。


下载LLFF源码

# 可能需要科学上网从Github上直接git下载,博主下载到neus下
git clone https://github.com/Fyusion/LLFF.git
# 激活虚拟环境
conda activate XXX
# eg: activate neus
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-image
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple imageio

采集图片,使用colmap获取相机位姿

采集图像

本文制作数据集所需要的图片是用手机拍摄视频后抽帧获取的

# 激活虚拟环境
conda activate XXX
# eg: activate neus
# 安装opencv
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

新建文件Video_to_frame.py,通过执行以下代码完成抽帧(自定义抽帧的间隔)。

import os
import cv2
def extract_images(video_path, output_folder):# 获取视频文件名video_name = os.path.splitext(os.path.basename(video_path))[0]# 新建文件夹output_path = os.path.join(output_folder, video_name)if not os.path.exists(output_path):os.makedirs(output_path)# 打开视频cap = cv2.VideoCapture(video_path)# 设置帧间隔frame_interval = int(2)# 逐帧提取并保存满足间隔要求的帧count = 0while cap.isOpened():ret, frame = cap.read()if ret:print(frame_interval)if count % frame_interval == 0:image_name = os.path.join(output_path, f"{video_name}_{count//frame_interval}.jpg")cv2.imwrite(image_name, frame)count += 1else:breakcap.release()if __name__ == '__main__':video_path = 'C:/Users/XXX/Desktop/test_video/test.mp4'  # 视频文件路径output_folder = 'C:/Users/XXX/Desktop/test_frame'  # 输出文件夹路径extract_images(video_path, output_folder)

在这里插入图片描述

位姿计算

创建⼯程: 点击File -> New project 以新建一个项目。
1.点击New,选择一个文件夹(博主与测试图片放置在同一目录),设置工程名以新建工程数据文件。

2.点击Select,选择刚才图像所在的⽂件夹,点击Save。

新建工程项目并配置完毕。

特征提取与匹配
1.图片特征提取,点击Processing -> Feature extraction,Camera model选择SIMPLE_PINHOLE,其他配置使用默认配置即可,点击Extract后,自动开始提取图片特征。

待特征提取完毕后关闭窗口。

2.图片特征匹配,点击Processing -> Feature matching,使用默认配置直接点击Run进行特征匹配。

待特征匹配完毕后关闭窗口。

在右侧Log一栏中可以查看特征提取与匹配的进度,请确保过程中没有Erro报错

稀疏重建
点击Reconstruction -> Start reconstruction进行重建,在窗口中可以看到重建过程,此过程可能会持续一段时间。

重建完毕后,得到如下图,通过右下角Images和Points可以大致判断是否重建成功。

注意:匹配的位姿和图片数目不同在后续的步骤中会导致报错,博主会在下文中详细说明解决这个问题的方法,暂时继续跟着步骤走。

保存位姿和稀疏点
点击File -> Export model 以导出模型,在保存图像的文件夹所在的目录下新建/sparse/0/文件夹,选择该文件夹将模型导入到该目录下。

在/sparse/0/目录下得到如下文件,成功保存图像位姿。


转成LLFF数据的格式

进入LLFF目录下,打开imgs2poses.py文件,新增如下内容,default=‘里面是sparse所在目录的绝对路径’,并将参数’scenedir’修改为是’- -scenedir’。

存放照片的文件夹名称必须是images,否则会出错,博主这里是test,所以需要修改成images。
在运行imgs2poses.py代码

# 注意要在imgs2poses.py所在目录执行命令
python imgs2poses.py
# 或者附带imgs2poses.py的路径
python XXXX\imgs2poses.py
# eg: python LLFF\imgs2poses.py

假如不增加default=‘’。

# 在运行imgs2poses.py代码时,即使有默认值也必须传入路径(与scenedir参数有关)
python imgs2poses.py "XXXX/XXXX/"

出现如下的问题:

这个问题是博主之前所说的匹配的位姿和图片数目不同导致的,博主在这里解决这个问题。通过在 LLFF/llff/poses/pose_utils.py 文件的32行左右添加如下代码:

    #---------输出匹配到位姿的图片名---------for i in np.argsort(names):print(names[i],end=' ')#---------输出匹配到位姿的图片名---------

添加代码位置如下图所示:

显示出所有匹配到位姿的图片。

进入图像保存的目录,删除没有匹配到位姿的图像,而后重新进行 “位姿计算” 这一步骤。

解决问题后,执行结果如下图所示:

生成有关图像位姿的npy文件,格式转换步骤完毕。


转成DTU数据的格式

博主提供了LLFF数据格式转DTU数据格式的代码。
将代码解压到合适的文件夹下,这里博主是解压到NeuS路径下。

执行指令将LLFF数据格式转DTU数据格式。

# XXX表示sparse所在的路径,不包含sparse。
python tools/preprocess_llff.py XXXX
#eg: python tools/preprocess_llff.py C:\Users\AYU\Desktop\test_frame


所有准备工作都已完成。


总结

尽可能简单、详细的介绍DTU格式数据集的制作流程以及解决了制作过程中可能存在的问题。

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

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

相关文章

BDA初级分析——用SQL筛选数据

一、用SQL对数据分组 GROUP BY Group by,按...分组 作用:根据给定字段进行字段的分组,通常和聚合函数配合使用,实现分组的分析 写法:select ...from ...group by 字段名 (也可以是多个字段) GROUP BY的逻辑 SELECT gender,COUNT(user_id) …

数据分析 | 调用Optuna库实现基于TPE的贝叶斯优化 | 以随机森林回归为例

1. Optuna库的优势 对比bayes_opt和hyperoptOptuna不仅可以衔接到PyTorch等深度学习框架上,还可以与sklearn-optimize结合使用,这也是我最喜欢的地方,Optuna因此特性可以被使用于各种各样的优化场景。 2. 导入必要的库及加载数据 用的是sklea…

恒运资本:布林线什么意思?

布林线是一种经过股票价格的标准差核算出涨跌起伏的技能剖析方法。这种剖析方法由约翰布林在1980年左右开发而来,是一种常用的股市剖析东西。本文将从前史、原理、应用等多个视点叙述布林线的含义,以及它对出资者所带来的意义。 一、前史 布林线在1983年…

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?

上文我们已经学到, 一个Topic(主题)会有多个Partition(分区)为了保证高可用,每个分区有多个Replication(副本)副本分为Leader 和 Follower 两个角色,Follower 从Leader同…

安防监控视频云存储平台EasyCVRH.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

系统架构设计师-信息安全技术(1)

目录 一、信息安全基础 1、信息安全五要素 2、网络安全漏洞 3、网络安全威胁 4、安全措施的目标 二、信息加解密技术 1、对称加密 2、非对称加密 3、加密算法对比 三、密钥管理技术 1、数字证书 2、PKI公钥体系 四、访问控制技术 1、访问控制基本模型 2、访问控制的实现技术…

【ES6】—使用 const 声明

一、不属于顶层对象window 使用const关键字 声明的变量,不会挂载到window属性上 const a 5 console.log(a) console.log(window.a) // 5 // undefined二、不允许重复声明 使用const关键字不允许重复声明相同的变量 cosnt a 5 cosnt a 6 // Uncaught SyntaxEr…

Java基础知识实际应用(学生信息管理系统、猜拳小游戏、打印日历)

一、Java学生信息管理系统 这个系统包含了添加、修改、删除、查询和显示所有学生信息等功能。您可以在此基础上进行修改和完善,以适应您的需求。 import java.util.Scanner;public class StudentManagementSystem {private static Scanner scanner new Scanner(S…

电视机看板大屏适配问题——js基础积累

直接上效果图&#xff1a; 下面直接写代码&#xff1a; 1.html部分的代码 <body><div class"container"><!-- 数据展示区域 --><div class"box"><div class"top">top</div><div class"bottom&…

云原生 envoy xDS 动态配置 java控制平面开发 支持restful grpc

envoy xDS 动态配置 java控制平面开发 支持restful grpc 大纲 基础概念Envoy 动态配置API配置方式动静结合的配置方式纯动态配置方式实战 基础概念 Envoy 的强大功能之一是支持动态配置&#xff0c;当使用动态配置时&#xff0c;我们不需要重新启动 Envoy 进程就可以生效。…

深入理解 Flutter 图片加载原理

作者&#xff1a;京东零售 徐宏伟 来源&#xff1a;京东云开发者社区 前言 随着Flutter稳定版本逐步迭代更新&#xff0c;京东APP内部的Flutter业务也日益增多&#xff0c;Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验…

【Java基础】Java对象的生命周期

【Java基础】Java对象的生命周期 一、概述 一个类通过编译器将一个Java文件编译为Class字节码文件&#xff0c;然后通过JVM中的解释器编译成不同操作系统的机器码。虽然操作系统不同&#xff0c;但是基于解释器的虚拟机是相同的。java类的生命周期就是指一个class文件加载到类…

LeetCode150道面试经典题-- 合并两个有序链表(简单)

1.题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.示例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

计算机竞赛 GRU的 电影评论情感分析 - python 深度学习 情感分类

1 前言 &#x1f525;学长分享优质竞赛项目&#xff0c;今天要分享的是 &#x1f6a9; GRU的 电影评论情感分析 - python 深度学习 情感分类 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这…

【探索Linux】—— 强大的命令行工具 P.3(Linux开发工具 vim)

阅读导航 前言vim简介概念特点 vim的相关指令vim命令模式(Normal mode)相关指令插入模式(Insert mode)相关指令末行模式(last line mode)相关指令 简单vim配置&#xff08;附配置链接&#xff09;温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&…

Go 安装配置

介绍Ubuntu20.04 安装和配置Go 1.安装Go 去这个地方下载Go https://go.dev/doc/install 如果之前安装过&#xff0c;可以参考这个&#xff08;没有可以忽略&#xff09; 下载完成后执行 sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz 然后修改环境变量 sudo ge…

GaussDB 实验篇+openGauss的4种1级分区案例

✔ 范围分区/range分区 -- 创建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

python数据分析需要学哪些,python数据分析要学多久

大家好&#xff0c;小编为大家解答python数据分析应该学什么软件的问题。很多人还不知道python数据分析需要什么基础&#xff0c;现在让我们一起来看看吧&#xff01; 根据调查结果&#xff0c;十大最常用的数据工具中有八个来自或利用Python。Python广泛应用于所有数据科学领域…

开发一个RISC-V上的操作系统(八)—— 抢占式多任务(Preemptive Multitasking)

目录 一、抢占式多任务 二、代码实现 三、上板测试 本节的代码在仓库的 06_Preemptive_Muti_Task 目录下&#xff0c;仓库链接&#xff1a;riscv_os: 一个RISC-V上的简易操作系统 本文代码的运行调试会在前面开发的RISC-V处理器上进行&#xff0c;仓库链接&#xff1a;cpu_…

时序预测 | MATLAB实现基于CNN-BiGRU卷积双向门控循环单元的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-BiGRU卷积双向门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-BiGRU卷积双向门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基于…