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

news2024/11/17 15:50:17

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

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


文章目录

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


前言

LLFF格式是NeRF网络模型训练使用的数据集格式之一,本文基于COLMAP软件展示从LLFF格式数据集的制作到开始模型训练的完整流程。NeRF(神经辐射场)通过输入同一场景不同视角下的二维图片和相机位姿,对场景进行三维隐式建模,并通过体素渲染方程实现了合成任意新视角下的场景图片。


下载安装colmap软件

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

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

软件安装成功。


下载llff源码

# 可能血药科学上网从Github上直接git下载,博主下载到nerf-pytorch下
git clone https://github.com/Fyusion/LLFF.git
# 激活虚拟环境
conda activate XXX
# eg: conda activate nerf_mvs
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: conda activate nerf_mvs
# 安装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 = 0
    while 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 += 1
        else:
            break
    cap.release()

if __name__ == '__main__':
    video_path = 'C:/Users/ruler9702/Desktop/test_video/test.mp4'  # 视频文件路径
    output_folder = 'C:/Users/ruler9702/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’。

在运行imgs2poses.py代码

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

假如不增加default=‘’,并修改参数’scenedir’修改为是’–scenedir’,

# 在运行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文件,格式转换步骤完毕。


迁移工作文件夹并设置配置文件

将工作文件夹完整迁移至nerf代码的/nerf-pytorch/data/nerf_llff_data/目录下。

注意:保存图片的文件夹要重命名为images,否则会报错

复制/nerf-pytorch/configs目录下的fern.txt文件(因为fern同为LLFF格式的数据集),并重命名为自己测试数据的名称,修改如下内容:

所有准备工作都已完成。


总结

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

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

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

相关文章

python复习第一章

什么是 Python? Python 是一门流行的编程语言。它由 Guido van Rossum 创建,于 1991 年发布。 它用于: Web 开发(服务器端)软件开发数学系统脚本 Python 可以做什么? 可以在服务器上使用 Python 来创建…

图解路由器处理报文全过程,值得一看!

你们好啊,我的网工朋友 只要有网络的地方,你很难不看到路由器的身影,各种低、中、高端的,种类繁多,所具备的功能和内部实现不完全一样。 要知道,路由器不断的在吞吐通信数据,就像鱼吐泡泡一样…

【有奖征文 】AI编程:华为云CodeArts Snap入门体验

了不起的开发者们,当你听到“编程”一词时,可能想到的是一行行复杂的代码和漫长的坐姿。但是,随着人工智能的飞速发展,AI编程正在成为一种全新的编程方式,使得编程变得更加简单和直观。现在,是时候跟大家分…

如何在ALPS系统上模拟MODBUS协议

Modbus协议介绍 请想象一下你有一个工厂,里面有许多机器和设备,比如传感器、电机、控制器等,这些设备需要相互通信以便共享数据和执行任务。Modbus协议就像是这些设备之间的一种语言或规则,确保机器和设备能够互相理解和交流。 在…

python数据可视化Mito安装配置

目录 遇见 Mito如何启动 Mito数据透视表Mito 令人印象深刻的功能可视化数据自动代码生成Mito 安装 JupyterLab 是 Jupyter 主打的最新数据科学生产工具,某种意义上,它的出现是为了取代Jupyter Notebook。 它作为一种基于 web 的集成开发环境&#xff…

SpringMvc学习——在idea中新建springWeb项目 浏览器请求 和 服务器响应 SpringMvc文件相关

目录 引出基础知识:三层架构和MVC1. 三层架构2.MVC模型 springWeb项目IDEA搭建1.新建一个普通的maven项目2.导入包,pom.xml文件3.写主启动类Main.java文件SpringBootApplication4.写application.yml文件spring的配置文件5.启动,运行main.java…

【分享】PowerPoint可以设置哪些密码保护?

想要给PPT设置密码保护?那我们来看看PowerPoint自带哪些密码功能。 PowerPoint可以设置两种密码保护,分别是“打开密码”和“限制密码”。 【打开密码】 PowerPoint设置“打开密码”后,就无法随意打开文件,需要输入正确密码才可…

4.地址转换,实现101012分页

实现内存检测,理解Linux内存管理,实现101012分页 参考: 检测内存容量 趣谈 Linux 操作系统 内存管理 《操作系统真相还原》 1.内存检测 BIOS 中断 0x15 的子功能够获取0xE820 能够获取系统的内存布局,由于系统内存各部分的类型属…

什么是版本控制系统?怎么学习? - 易智编译EaseEditing

版本控制系统(Version Control System,简称VCS)是一种用于管理和跟踪文件版本的工具或系统。它可以追踪文件的变更历史,记录每个版本的修改内容,以及支持多人协作开发。 学习版本控制系统可以帮助你更好地管理和控制你…

HTTPS加密:保障网站安全的重要手段

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言什么是HTTPS加密&a…

由于找不到d3dx9_42.dll,无法继续执行代码怎么修复,这三个修复方法可以解决

是不是遇到过在打开软件或者游戏的时候,电脑提示“由于找不到d3dx9_42.dll,无法继续执行代码”,无法正常启动游戏程序,d3dx9_42.dll是一个DirectX相关的动态链接库文件,它是DirectX 9中的一个组件。DirectX是微软公司开发的一个多…

TC8:SOMEIP_ETS_001-003

SOMEIP_ETS_001: Array_Length_longer_as_message_length_allows_it 目的 当Tester发送的SOME/IP消息中,payload数据是序列化的数组时,数组的Length字段值比SOME/IP Length字段允许的要大时,DUT回复SOME/IP Error消息 如果DUT忽略SOME/IP Request消息,这条测试也是Pass的,…

Sentieon | 每周文献-Genetic Disease-第二期

遗传病系列文章-1 标题(英文):Answer ALS, a large-scale resource for sporadic and familial ALS combining clinical and multi-omics data from induced pluripotent cell lines标题(中文):Answer ALS&…

业务数据又多又杂,该如何高效开展数据治理?

某集团目前有近百套系统,数据分散在各个系统内,且业务范围广泛,数据来源复杂,随着集团业务系统的建设和推广应用,数据质量不高、数据标准不一、数据难以互通共享融合、系统之间存在数据壁垒等问题逐渐显现,…

Selenium教程__单选框和复选框的选中状态判定以及元素是否可用和可见判定(10)

简单写个单选框和复选框界面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>test</title></head><body bgcolor"burlywood"><form><input type"radio" name"sex&…

Vulnhub项目:Aragog

1、靶机地址&#xff1a; HarryPotter: Aragog (1.0.2) ~ VulnHub 死亡圣器三部曲之第一部&#xff0c;Aragog是海格养的蜘蛛的名字&#xff0c; 并且又牵扯到了密室 2、渗透过程 确定靶机ip&#xff0c;攻击机ip&#xff0c;扫描靶机开放端口 只有22&#xff0c;80端口&a…

盖雅工场荣膺第二届山东人力资源服务创新大赛信息科技创新赛道一等奖

6月20日&#xff0c;第二届山东人力资源服务创新大赛决赛落下帷幕。经过激烈角逐&#xff0c;盖雅工场脱颖而出&#xff0c;荣膺信息科技创新赛道一等奖。 关于第二届山东人力资源服务创新大赛 第二届山东人力资源服务创新大赛是由山东省人力资源和社会保障厅、威海市人民政府…

SpringCloud Alibaba入门之创建多模块工程

一、创建父项目 创建一个父Maven项目&#xff0c;项目命名为myshop,用于管理子模块。 创建项目后&#xff0c;删除src和增加pom设置 二、创建子module 右键父项目&#xff0c;新建module 此我们的子module就创建完成了。接下来如法炮制&#xff0c;创建另外几个子module&…

快速定位jar冲突插件-maven-dependency-helper

于jar冲突&#xff0c;例如在某一项目A中引入了其他项目B的jar&#xff0c;而2个项目用的mybati版本不一致&#xff0c;则导致jar冲突 例如:B项目用mybatis 3.3.2 this.count() 返回值为integer 而 A项目用版本3.5.1中返回值为Long A项目引入B后&#xff0c;部分代码报错:返回值…

使用哪些频率是不需要取得许可的呢?

无线电频率的使用&#xff0c;你知道哪些不需要许可吗&#xff1f;近日&#xff0c;有关无线电频率的知识又成为了网络热议的话题。你是否也对此感到好奇呢&#xff1f; 首先&#xff0c;我们需要了解一些基础知识。无线电频率是电磁频谱的一部分&#xff0c;大多数人都熟悉AM…