3D Gaussian Splatting的使用

3D Gaussian Splatting的使用

  • 1 下载与安装
  • 2 准备场景样本
    • 2.1 准备场景照片
      • 2.1.1 采集图片
      • 2.1.2 生成相机位姿
  • 3 训练
  • 4 展示

1 下载与安装

今年SIGGRAPH最佳论文,学习了一下,果然厉害,具体论文原理就不说了,一搜都有,主要是看看怎么用,自己能不能把身边的场景快速建个模。

赶紧记录下,好像这几天在这个基础上又有很多花样出来了…

我的系统是Ubuntu22.04。

开源作者已经都弄的很详细了,也有教程。
首先拉项目

git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive

然后,要建conda环境,而项目已经提供了配置文件包含了需要的各版本信息,文件就是:enviornment.ymal,所以这么调用就建好环境,并激活:

conda env create --file environment.yml
#文件里给环境的名字固定叫 gaussian_splatting
conda activate gaussian_splatting

此时呢,虽然建好了,但是呢也报错了,仔细分析了error,是因为安装项目里的submodules里的两个项目报错了,类似这样的报错:

/usr/include/c++/11/bits/std_function.h:435:145: error: parameter packs not expanded with ‘…’:
435 | function(_Functor&& __f) | ^ /usr/include/c++/11/bits/std_function.h:435:145: note: ‘_ArgTypes’ /usr/include/c++/11/bits/std_function.h:530:146: error: parameter packs not expanded with ‘…’: 530 | operator=(_Functor&& __f) | ^ /usr/include/c++/11/bits/std_function.h:530:146: note: ‘_ArgTypes’

查了半天以为是g++版本不对,有的说要将到版本10,还有说要改c++文件源码。我没敢改,再找了下,发现我的cuda版本是11.5,而该项目要求的是11.8,于是我就升级了一下,具体怎么升级,见我之前写的一篇 升级和切换CUDA版本 。

升级完CUDA,就手动再安装这两个子模块:

pip install submodules/diff-gaussian-rasterization
pip install submodules/simple-knn

都没问题,成功安装~

2 准备场景样本

准备拿会议室整个屋子做一次尝试,看看能不能建出个模来。

2.1 准备场景照片

2.1.1 采集图片

根据原理吧,就需要这个场景中所有位置所有角度的图像,所以这个准备过程多仔细就能决定最终模型的效果。
我试了很多次,觉得拍视频最好,完了再抽帧。

因为训练的照片要分辨率统一,相机参数、光照等看着都比较统一才好。
另外,建议分辨率推荐1080p,至少720p。再退一步,至少保证宽或高有一个能到720 ,不然训练出来的效果不好,这是我的个人经验。

拍视频的时候,一定不要在一个位置转的拍,要缓慢走动,边走边转,上下左右,然后再走回来,这个路线根据场景要设计好,目的就是在任何位置上都有任何角度的照片。这只能尝试体会了。。。

然后,有了视频,就能通过抽帧拿到图片了,想要效果可以,我建议500张起,多的话我只试到2000张,再多我也没尝试。
怎么抽帧呢,就用ffmpeg

比如,先建一个data目录,data目录里一定要建个input文件夹,名字必须是这个。

ffmpeg -i room.mp4 -r 3 -f image2 input/%06d.jpg

-i就是输入视频,
-r就是帧率,控制抽的图片数量
后面input/%60d.jpg ,图片名字最终是 000001.jpg, 000002.jpg这样的格式。

最终在data/input下就有了一堆图片

2.1.2 生成相机位姿

首先呢,系统里要先安装colmap,使用源码装,具体怎么装,见我之前的文章:
Colmap在Linux下的安装

装好了呢,就在gaussian splatting 项目目录下,运行convert.py

python convert.py -s data

这里 -s 要传入数据目录,一定写data这个目录级别(input在这个目录下)

这时用的是CPU跑的,多等会儿,最终就在data目录下生成一堆目录和文件,包括相机位姿。

3 训练

前面都OK了,就开始训练了。

注意:如果训练图片比较多,比如超过1000张了,那要先给系统设置一下同时打开的文件数上限,因为默认的数太小了,会报错:
OSError: [Errno 24] Too many open files:
所以先临时调大一下上限:
ulimit -n 10000
1w一般就够了,这个设置重启电脑后就失效了。想要永久有效,搜一下就知道了。

然后运行:

python train.py -s data -m data/output

-s还是一样,要写到data这个目录级别
-m 是输出文件夹,就写data下的output,output目录会自动创建的

整个训练是30000步,在7000步的时候会自动保存一个中间模型。

运行时间的话我举个我的测试例子:

分辨率 1920x1080,939张照片,convert.py的时间是二十几分钟,train.py的时间一共是15分钟。
GPU显存占用22GB,训练得到的ply文件 156MB。

4 展示

该项目也提供了展示的软件,在SIBR_viewers目录里:
进去要编译安装一下这个软件。

编译过程因为有东西下不下来,会出错,得想办法,之后有空单独简单记录一下。

这个软件也要用GPU跑,我就在Ubuntu上跑的,最终安装的目录在SIBR_viewers/install/bin里,所以就进目录里运行:

install/bin/SIBR_gaussianViewer_app -m /home/xxxx/data/output

-m 就是给上面训练后的output目录就行了。

有用的模型就一个,就是30000步里的那个Ply文件。

我这会议室效果展示,就不录屏了,来几个角度的照片吧:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我其实弄的也没那么仔细,但是效果还挺厉害,如果不动的话,就和照片一样。

这个模型出来,和传统模型其实不一样,不好弄成obj fbx啥的,就是它这算法直接渲染的。至于怎么在产品或者其他场景里用,后面有空再说,我已经尝试了一个在web里打开的demo了,只是没那么流畅而已。

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

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

相关文章

2023年12月5日历史上的今天大事件早读

1377年12月05日明朝第二位皇帝明惠帝朱允炆出生 1408年12月05日金帐汗国军队在亦敌忽率领下进抵莫斯科城下 1492年12月05日欧洲航海家哥伦布第一次踏上伊斯帕尼奥拉岛 1791年12月05日音乐神童莫扎特逝世 1847年12月05日广州黄竹岐人民抗英 1870年12月05日法国著名作家大仲…

第N个泰波那锲数

1.题目解析 动态规划算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 为了填写当前状态的时候,所需要的状态已经计算过了!!! 5.返回值 题目要求 状态表示 ------------------------------------------------------…

Cannot read properties of null (reading ‘setAttribute‘)

做项目时候,总是报这个错,参考如下链接解决问题,在此记录下,防止忘记。 报错 Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘)_三水木雨的博客-CSDN博客

【C/PTA —— 14.结构体1(课外实践)】

C/PTA —— 14.结构体1(课外实践) 一.函数题6-1 选队长6-2 按等级统计学生成绩6-3 学生成绩比高低6-4 综合成绩6-5 利用“选择排序算法“对结构体数组进行排序6-6 结构体的最值6-7 复数相乘运算 二.编程题7-5 一帮一7-6 考试座位号 一.函数题 6-1 选队长…

51综合程序04-ADC0808与DAC0808的应用

文章目录 一、ADC0808调温报警器1. 简单介绍2. 电路连接图3. 源代码4. 实验效果 二、DAC0808直流电机调速器1. 简单介绍2. 电路连接图3. 源代码4. 实验效果 一、ADC0808调温报警器 1. 简单介绍 ADC0808 是一款 8 位模数转换器(Analog-to-Digital Converter&#x…

【教3妹学编程-算法题】到达首都的最少油耗

3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包” 2哥 :3妹,什么事呀这么开发。 3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。 2哥&#x…

MybatisPlus中的使用Wrapper自定义SQL

一、条件构造器 条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法,用于构建各种类型的查询条件,包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接SQL语句的麻烦,提高代码的可读性…

解决 Xshell 无法使用 root 账户远程登录 Linux 的问题

文章目录 问题描述问题原因解决办法 笔者出问题时的运行环境: Red Hat Enterprise Linux 9.2 x86_64 Xshell 7 问题描述 笔者在新安装的 Red Hat Enterprise Linux 中发现一个问题。在 RHEL 安装完之后,无法在 Xshell 中使用 root 账户远程登录此 Lin…

Spark---Spark on Hive

1、Spark On Hive的配置 1&#xff09;、在Spark客户端配置Hive On Spark 在Spark客户端安装包下spark-2.3.1/conf中创建文件hive-site.xml&#xff1a; 配置hive的metastore路径 <configuration><property><name>hive.metastore.uris</name><v…

分享70个节日PPT,总有一款适合您

分享70个节日PPT&#xff0c;总有一款适合您 70个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1IRIKuFoGjQJ14OVkeW_mDQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Django回顾【四】之模型层

目录 一、基本使用 1、ORM框架 2、创建表 二、常用和非常用字段 三、常用和非常用字段参数 四、settings配置 五、基本操作 5.1 增加表记录 5.2 删除表纪录 5.3 更新表纪录 5.4 查询表纪录 六、 多表操作-创建关系 七、基于对象的跨表查询 八、基于链表的跨表…

服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?

服务器故障&#xff1a; 由于工作人员的误操作&#xff0c;将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上&#xff0c;导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4文件系统每隔几百兆就会写入文件系统的原始信息&#xff0c;原Ocfs2文件系统数据会遭受一定程度…

TCP/IP的体系结构

目录 一、TCP/IP的体系结构 二、TCP/IP四层协议的表示方法举例 三、现在因特网使用的TCP/IP体系结构 四、互联网应用层的客户——服务器方式 一、TCP/IP的体系结构 二、TCP/IP四层协议的表示方法举例 三、现在因特网使用的TCP/IP体系结构 四、互联网应用层的客户——服务器…

项目中枚举的进阶用法(携带Java原理分析)

目录 1 枚举的普通用法1.1 无参1.2 单个参数1.3 两个参数 2 枚举的进阶用法&#xff08;核心&#xff09;2.1 优化2.1.1 需要改造的代码2.1.2 直接使用泛型2.1.3 使用反射---Class2.1.4 反射泛型 2.2 最终效果2.3 思考&#xff1a;类型擦除 遇到项目中这样一种写法&#xff0c;…

NowCoder | KY11 二叉树遍历

NowCoder | KY11 二叉树遍历 OJ链接 简单来说就是构建这个二叉树定义结构体通过递归方式根据输入的字符串构建二叉树。对于输入字符串中的每个字符&#xff0c;如果是 ‘#’ 表示空节点&#xff0c;否则创建一个新节点&#xff0c;并递归地构建左右子树。 #include <limit…

24V转12V

24V转12V电源芯片是一种高效率、高稳定性的电源转换解决方案。它能够将输入电压范围为直流3.2V至36V的电能转换为输出电压范围为直流1.25V至35V的电能&#xff0c;且具有大92%的转换效率和3A的大输出电流。132*476I*OOO1 24V转12V电源芯片3A电流输出 可调输出 V*UIC9527 该电源…

微服务--一篇入门kubernets

Kubernetes 1. Kubernetes介绍1.1 应用部署方式演变1.2 kubernetes简介1.3 kubernetes组件1.4 kubernetes概念 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 系统初始化2.6.1 设置系统主机名以及 Host 文件的相互…

okhttp导致的内存溢出(OOM)sun.security.ssl.SSLSocketImpl

使用分析工具&#xff1a;MAT(Memory Analyzer Tool)、JvisualVM占用内存&#xff1a;sun.security.ssl.SSLSocketImpl 一、 项目场景&#xff1a; 功能&#xff1a;一个定时任务(xxl-job)采用线程池的方式多线程请求第三方拉取数据&#xff0c;网络框架使用okhttp3。 问题&am…

爬虫概念、基本使用及一个类型和六个方法(一)

目录 一、爬虫简介 1.什么是爬虫 2.爬虫的核心 3.爬虫的用途 4.爬虫的分类 5.反爬手段 二、Urllib基本使用 1.导入我们需要的包 2.定义一个url 3.模拟浏览器向服务器发送请求 4.获取响应中的页面的源码 5.打印数据 三、一个类型和六个方法 1.定义url&#xff0c;并…

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…