目录

准备图片集

采集方式

用于训练的图片集采集有两种方式, 一种是使用相机从不同角度拍照, 另一种是拍视频后逐帧提取. 两种方式各有利弊, 拍照分辨率更高, 方便控制光圈,快门和白平衡, 但是拍照时较难控制好角度可能会造成部分交叠区域过小, 视频比较容易实现连续的画面移动, 保证交叠区域, 但是大多数手机没法手动控制视频录制过程的光圈和白平衡, 并且视频的分辨率大多数是通过插值填充的, 拍摄1080p视频时, 实际有效像素并没有1080p.

我自己的使用经验是, 用视频方式提取的帧训练结果更稳定.

图片数量

另外一方面是图片集的数量, 为了保证帧之间特征点的交叠, 一般按角度每3度一帧比较合适, 也就是从水平视角恢复一个3D对象至少需要约120张图.

图片分辨率

图片分辨率跟你的显卡显存有关. 16G的显存训练 1920x1080分辨率大概率是不够的, 在 train.py 那一步会报torch.OutOfMemoryError: CUDA out of memory.错误. 如果出现这种错误, 就把分辨率适当降一点. 实际测试训练1366x768的分辨率只需要8GB的显存, 如果用1024x576分辨率训练速度较快且细节保留还不错.

从视频提取帧序列

方式一: 使用 python 代码

from pathlib import Path
import cv2 work_path = '/home/milton/temp/input'
target_height = 720 imgpath = Path(work_path)
imgpath.mkdir(exist_ok = True) cap = cv2.VideoCapture('/home/milton/temp/557 Marksbury Road Pickering Open House Video Tour.mp4') frame_no = 0
while cap.isOpened():
ret, frame = cap.read() if ret:
# 视频是 60fps, 每秒取3帧, 因此每20帧取一帧
if frame_no % 20 == 0:
original_height, original_width = frame.shape[:2]
scaling_factor = target_height / original_height
target_width = int(original_width * scaling_factor) resized_frame = cv2.resize(
frame,
(target_width, target_height),
interpolation=cv2.INTER_AREA)
# {:0>5}是固定5位, 左边填充0
target = work_path + '/{:0>5}.jpg'.format((int)(frame_no / 20))
print(target)
cv2.imwrite(target, resized_frame)
frame_no += 1
else:
cap.release()
break print('done')

方式二: 使用 ffmpeg 提取

使用 ffmpeg 将视频帧按固定间隔抽取为图片, 下面的命令将视频帧以较小的压缩率转换为jpg文件, FRAMES_PER_SEC是每秒抽取的帧数.

ffmpeg -i <PATH_VIDEO> -qscale:v 1 -qmin 1 -vf fps=<FRAMES_PER_SEC> <PATH_OUTPUT>/%04d.jpg

如果需要缩小图片(按比例缩小), 需要加上-vf scale=720:-1参数, 这个意思是将宽度变为720,高度按比例调整, 如果按固定高度调整, 则是-vf scale=-1:357, 例如

ffmpeg -i 557VideoTour.mp4 -vf fps=2,scale=720:-1 input/%05d.png

Convert 提取特征和点云

创建一个目录, 例如 source_data, 在下面创建一个子目录 input, 这个 input 的名称是固定的, 不能改. 然后将图片序列放到这个input目录下, 执行提取命令

python ./convert.py -s ~/work/source_data/

这一步执行是通过 colmap 实现的, 依次执行 feature extraction, exhaustive feature matching, reconstruction, 如果使用cpu处理, 需要加上--no_gpu参数, 例如

python ./convert.py --no_gpu -s ~/work/source_data/

可以打开 convert.py 查看其它的选项. 在 matching 阶段会使显卡满负荷, 这一阶段如果使用CPU, 比使用支持CUDA的显卡速度上慢一个数量级, 使用 RTX2080 TI 匹配一个block 6秒, 对应的在 E5 2673 V3 上需要差不多 60秒.

这一步结束后会在input同一级目录下, 产生 distored, images, sparse, stereo 等目录

Train 训练

训练和之前快速评估时的方式是一样的, 用上一步提取的数据进行训练

python train.py -s [素材路径]
# e.g.
python train.py -s ~/work/source_data/

View 查看

poly.cam 网页工具

快速查看可以用第三方的网页工具, 例如 https://poly.cam/tools/gaussian-splatting

自采集数据效果演示

访问下面的链接会下载几十MB的文件, 如果带宽较小需要耐心等待. 有时候页面资源在墙内会被拦截, 需要梯子上网.

SIBR Viewer

网页工具比较方便, 但是预览效果不如项目自带的工具 SIBR Viewer. SIBR Viewer 需要编译安装, 编译过程需要nvcc, 如果是不支持CUDA的显卡, 这部分就不用尝试了. 代码对显卡CUDA架构版本也有要求, 要 CUDA_ARCHITECTURE >= 7.x, 所以在 RTX10xx, P104-100, P106 上不能正常运行, 需要的显卡型号最低为 GTX16xx, RTX20xx, 低于这些型号的也不用尝试了.

编译安装

先安装依赖

sudo apt install libglew-dev libassimp-dev libboost-all-dev libgtk-3-dev libopencv-dev libglfw3-dev libavdevice-dev libavcodec-dev libeigen3-dev libxxf86vm-dev libembree-dev

预编译, 这一步如果有错误, 检查上面的依赖是否已经安装

cmake -Bbuild . -DCMAKE_BUILD_TYPE=Release

编译并安装到项目路径下, -j24对应24核CPU, 设成和当前环境CPU核数一致

cmake --build build -j24 --target install

安装后, 可执行文件会安装到 SIBR_viewers/install/bin/ 目录下,

使用

通过命令行启动 SIBR Viewer 查看训练结果

./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m [训练结果目录]

例如

./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m ./output/0dbedfba-8/

界面需要双手操作, 左手 W, E, F, A, S, D 控制左右前后上下平移, 右手 U, I, O, J, K, L 控制左右上下顺时逆时旋转. 如果觉得平移速度慢, 可以在 Camera Point VIew 中, 勾选 Acceleration

splatviz

对于架构低于7.x的旧Nvidia显卡, 可以使用 splatviz 这个工具本地查看训练结果.

仓库地址 https://github.com/Florian-Barthel/splatviz

这是一个主体代码为 python 的项目, 可以唤起GUI界面在本地快速查看ply文件, 可以查看, 可以挂载到3d gaussian的训练过程, 可以设定位置距离拍摄自动306度旋转的视频, 还可以设置gaussian参数debug, 功能比较丰富.

安装

检出仓库

git clone https://github.com/Florian-Barthel/splatviz.git --recursive

仓库首页的安装提示是不能用的, 因为里面基于的是 CUDA 11.8, 和我系统的CUDA版本(12.6)不一致, 用conda创建环境会报不兼容, 所以后来转手动安装了

因为和 gaussian-splatting 一样要使用 CUDA Toolkit 和 pytorch, 都是上G的大块头, 所以直接使用了 gaussian-splatting 的 conda 环境, 在这个基础上安装其它模块.

基础环境是

NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4

python=3.10.12
torch 2.7.0
torchaudio 2.7.0
torchvision 0.22.0
opencv-contrib-python 4.11.0.86
opencv-python 4.11.0.86
cuda-toolkit 12.4

过程中安装的模块, 未指定的默认安装最新版

pip install click
pip install imgui-bundle==1.5.2 (安装默认的1.6.2会报错)
pip install imgui==2.0.0
pip install imageio
pip install pyyaml
pip install pandas
pip install imagecodecs
pip install scipy
pip install requests
pip install gputil
pip install pynvml 如果不使用 performance widget, 可以不装
pip install imageio-ffmpeg 如果不使用 ideo widget, 可以不装

安装项目内的子模块

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

    因为在 gaussian-splatting 中已经安装了 simple-knn 模块, 所以这里没再安装

使用

--data_path指定路径, 注意这里只需要给目录, 如果直接指定文件会报错

python run_main.py --data_path=../gaussian-splatting/output/7f1a841f-4/point_cloud/iteration_7000/

在 Camera Widget里面可以设置两种视角,

  • Orbit视角是位置固定的, 只能左右上下(pitch and yaw, no roll)查看,
  • WASD视角的位置可以调整, 操作按键为 A左平移, D右平移, W前进, D后退, Q上平移,E下平移, 用鼠标按住左键移动旋转视角.

3D Gaussian splatting 03: 用户数据训练和结果查看的更多相关文章

  1. 使用python抓取婚恋网用户数据并用决策树生成自己择偶观

    最近在看<机器学习实战>的时候萌生了一个想法,自己去网上爬一些数据按照书上的方法处理一下,不仅可以加深自己对书本的理解,顺便还可以在github拉拉人气.刚好在看决策树这一章,书里面的理论 ...

  2. 利用AMPScript获取Uber用户数据的访问权限

    现代项目开发和资产管理方法正在不停地快速变化.在这场创新和扩张的竞赛中,新资产被迅速部署并暴露于公共互联网,已有资产也在不断发展. 要跟上这个不断变化的攻击面是很难的,更不用说保护这些应用程序和系统了 ...

  3. 04: Form 验证用户数据 & 生成html

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  4. Web 组态运用之用户数据 ARPU 分析图

    前言 作为企业的发展,通过运营的有效管理,增加收入.降低成本,取得更好的经济效益,是核心所在,在电信企业同样如此.电信企业的利润大体上是由业务收入和成本决定的,而收入和成本又可进一步分别分解表达为不同 ...

  5. 微信小程序之用户数据解密(七)

    [未经作者本人同意,请勿以任何形式转载] 经常看到有点的小伙伴在群里问小程序用户数据解密流程,所以打算写一篇关于小程序用户敏感数据解密教程: 加密过程微信服务器完成,解密过程在小程序和自身服务器完成, ...

  6. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  7. SQL Server 2016五大优势挖掘企业用户数据价值

    SQL Server 2016五大优势挖掘企业用户数据价值 转载自:http://soft.zdnet.com.cn/software_zone/2016/0318/3074442.shtml 3月1 ...

  8. 【php爬虫】百万级别知乎用户数据爬取与分析

    代码托管地址:https://github.com/hoohack/zhihuSpider 这次抓取了110万的用户数据,数据分析结果如下: 开发前的准备 安装Linux系统(Ubuntu14.04) ...

  9. Chrome 用户数据配置文件夹保存路径在哪?(Mac OS X/Windows/Linux)

    在重装系统之前都想要对 Chrome 中的数据进行备份,以能够在重装系统后恢复这些数据.但是除了一些玩 Chrome 很长时间的用户,鲜有人知道 Chrome 的用户数据到底保存在什么地方.如果你也有 ...

  10. 关于iOS10的允许访问用户数据产生的问题

    不知道这个问题是什么时候出现的,直到我重写项目已应对IPv6的审核. 先前没有加引导页面,打开app直接进入主控制器.当弹出允许访问用户数据窗口的时候,主页面的数据是不加载的. 当用户未允许访问数据之 ...

随机推荐

  1. Note_Fem边界条件的处理和numpy实现的四种方法

    将单元刚度矩阵组装为全局刚度矩阵后,有: 此时的线性方程没有唯一解,\([K]\)是奇异矩阵,这是没有引入边界条件,消除刚体位移的原因. 边界条件分为两类:Forced and Geometric;对 ...

  2. mac环境配置本地nfs服务

    前言 在这篇文章中,讲了在Mac端开启NFS服务,并通过NFS协议让其他设备挂载到你的Mac上. 步骤一:增加配置文件 首先,我们需要编辑NFS的配置文件,以便定义哪些目录可以被远程访问. 打开终端, ...

  3. MySQL REPLACE函数:字符串替换

    语法 REPLACE ( string_expression , string_pattern , string_replacement ) 替换字符串,接受3个参数,分别是原字符串,被替代字符串,替 ...

  4. 使用Semantic Kernel框架和C#.NET 实现大模型Function Calling

    最近研究Function Call,总结了一篇文章,分享给大家 一.GPT-4中实现函数调用功能 定义函数:首先,开发一个函数.例如,一个获取天气信息的函数可能如下: def get_current_ ...

  5. Docker之一简介

    什么是Docker Docker是Google使用go语言进行开发的,对进程进行封装隔离,始于操作系统层面的虚拟化技术. 因为隔离的进程独立于宿主机和其它的隔离进程,因此成为容器 Docker在容器的 ...

  6. linux(centos)配置ipv6网卡

    1.ipv6网卡配置文件和ipv4在同一个网卡配置文件中 vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好之后重启网卡生效 2.测试

  7. Linux环境 Oracle 监听和服务 日常操作

    文章目录                    一.Oracle监听                    1.1. 查看Oracle监听运行状态                    1.2. 启动 ...

  8. 【docker】如何将服务器加入集群,成为子节点

    需求:将服务器加入集群,成为集群中的图一.png (18.95 KB, 下载次数: 0) 图一 图二.png (10.92 KB, 下载次数: 0) 图二 图三.png (26.71 KB, 下载次数 ...

  9. SpringBoot + 布隆过滤器:亿级数据下的高效防护盾与缓存穿透实战指南

    在当今高并发.海量数据的应用场景中,布隆过滤器凭借其极低的内存占用和极快的查询效率,成为解决缓存穿透.数据预判等难题的利器.本文深度解析布隆过滤器的核心原理与实战应用,手把手教你如何将这一数据守门员融 ...

  10. 面试题-Netty框架

    前言 Netty框架部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到一定的帮 ...