【环境搭建】instant-ngp的环境搭建和demo

这篇具有很好参考价值的文章主要介绍了【环境搭建】instant-ngp的环境搭建和demo。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

NeRF近年火遍大江南北,但是训练时间长(五六小时起步)的问题一直是美中不足的地方。于是,各种魔改版本你方唱罢我登场,层出不穷。但是,instant-ngp一出,把大家给整破防了,居然特喵的能这么快?训练一个场景几分钟甚至几秒就能出结果,还能实时渲染新视角?还有可视化工具?逆天了呀!哪怕没了解过NeRF的人拿着GUI都能玩一玩!这篇文章给大家梳理一下环境搭建和一些README当中没有说明的隐藏使用,以及一些小demo。

环境搭建

代码地址:https://github.com/NVlabs/instant-ngp
其实NVlabs的README已经很详尽了,一般情况下跟着递归克隆仓库、创建conda虚拟环境、安装requirements和build一下就好了,我至今在多台不同配置(显卡、操作系统、python版本)的电脑上安装过,都是全流程无bug。如果很不幸遇到了的话,他们也已经总结得很详细了,应该不会有太大问题。样例数据集也很轻松就可以跑起来,相信大家一定没有问题!接下来直接上干货了。

用自己的数据集怎么跑?

这一块其实他们也有文档,点这里。和其他NeRF基本一个套路,拿到图片,跑colmap先做稀疏重建,拿到相机信息和一些图片的位姿信息,得到一个transform.json文件,这就是对这个场景的训练集了。值得注意的是,colmap本身是不够完善的,只凭借视觉,会有一些找不到共视关系的图被丢掉,或者分成不同的component,有可能100张图片最后json文件里只有30张。要解决这个问题有两个办法,一个就是重新拍,尽可能拍得密集切角度不要骤然转换得太厉害,一个办法就是引入GPS信息之类的,不通过colmap,咱直接有pose,那自己再写个脚本存成对应格式就可以了。

重建的话,有以下3种情况:

  1. 如果只有图片,则需先跑colmap,再进行重建
  2. 如果拥有图片和colmap组织形式的SFM数据(txt),只需要转一个transform.json文件
  3. 如果有视频,也可以通过视频重建,先跑colmap,这里先不讨论

GUI用起来虽然爽,但是也有局限,输命令能做到的事会更多一点,接下来讲一下命令行使用instant-ngp。

文件结构如下:
|
——instant-ngp
      |
      ——data
                |
                ———场景scene,比如fox
                             |
                             | ——— colmap
                             | ——— images

情况1:

进入到scene文件夹,调用colmap

python <path-to-instant-ngp>/scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16

然后,到instant-ngp目录下:

./build/testbed --mode nerf --scene data/nerf/fox/

情况2:

情况2:
进入到scene所在的文件夹:

python <path-to-instant-ngp>/scripts/sfm2nerf.py  --aabb_scale 16

然后,到instant-ngp目录下:

./build/testbed --mode nerf --scene data/xgrids/yoda/

如果有训练好的模型想直接打开而非从头学习的话:
./build/testbed --mode nerf --scene data/nerf/fox/ --snapshot=data/nerf/fox/base.msgpack

保存结果

这一步其实是让人头疼的地方,GUI点点点很爽,看起来也很方便,可是这么美好的场景想要保存、要导出却犯了难,怎么办呢?

导出mesh

使用的是marching cube,效果比较差:

python scripts/run.py --scene data/nerf/fox/ --mode nerf --load_snapshot data/nerf/fox/base.msgpack  --save_mesh data/nerf/fox/mesh.obj

导出图片

–scene 场景的路径
–mode 模式,选nerf即可
–load_snapshot 保存的训练好的模型
–screenshot_transforms 需要渲染的角度,数据结构和nerf的json格式一样
–screenshot_frames 渲染哪一帧,如果想全部渲染就不要这个参数,会默认渲染全部
–screenshot_dir 渲染好的图片存储的位置
–width 图片宽度
–height 图片高度

样例数据Nerf fox:
python scripts/run.py --scene data/nerf/fox/ --mode nerf --load_snapshot data/nerf/fox/base.msgpack --screenshot_transforms data/nerf/fox/transforms.json --screenshot_frames 1 --screenshot_dir data/nerf/fox/screenshot --width 2048 --height 2048 --n_steps 0

自己的数据:
python scripts/run.py --scene <path-to-scene> --mode nerf --load_snapshot <path-to-snapshot> --screenshot_transforms <path-to-scene>/transforms.json --screenshot_frames 1 --screenshot_dir <path-to-screenshot-folder> --width 2048 --height 2048 --n_steps 0

导出视频

最简单的办法自然就是把前面训练集的transform.json对应的那些视角渲染的图片串起来了,但是这样有两个问题。第一,受限于拍摄的不可靠性,无法确认所有训练集图片渲染出来的也很好,人为再挑选太麻烦。第二,我们可能会想要看到沿着某个路径行走或者向四周旋转查看的效果,我们应该提供人为选择一些新视角图片然后再渲染的功能。基于此,我写了一个通过在GUI里自己选择的渲染视角来合成一个视频的脚本。
在GUI当中选择新的视角,然后在camera path窗口add,这样这个视角下的相机参数会被添加到base_cam.json当中。
运行rendervideo.py

python scripts/rendervideo.py --scene <scene_path> --n_seconds <seconds> --fps <fps> --render_name <name> --width <resolution_width> --height <resolution_height>

比如:
python scripts/rendervideo.py --scene data/nerf/fox --n_seconds 10 --fps 60 --render_name foxvideo --width 1920 --height 1080

然后mp4视频都会被保存在instant-ngp下(而非各自数据集下),所以注意命名的时候就要做好区分。
rendervideo.py的代码如下:文章来源地址https://www.toymoban.com/news/detail-530124.html

#!/usr/bin/env python3

# Copyright (c) 2020-2022, NVIDIA CORPORATION.  All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto.  Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.

import os, sys, shutil
import argparse
from tqdm import tqdm
import common
import pyngp as ngp # noqa
import numpy as np

"""Render the video based on specific camera poses.

    Render a series of images from specific views and then generate a smoothing video.

    Args:
    scene:
        The scene to load. Can be the scene's name or a full path to the training data.
    width:
        Resolution width of video
    height:
        Resolution width of video
    n_seconds:
        Number of seconds
    fps:
        FPS of the video
    render_name:
        Name of video.

    Returns:
    None. A video will be saved at scene root path
"""
def render_video(resolution, numframes, scene, name, spp, fps, exposure=0):
	testbed = ngp.Testbed(ngp.TestbedMode.Nerf)
	testbed.load_snapshot(os.path.join(scene, "base.msgpack"))
	testbed.load_camera_path(os.path.join(scene, "base_cam.json"))

	if 'temp' in os.listdir():
		shutil.rmtree('temp')
	os.makedirs('temp')	

	for i in tqdm(list(range(min(numframes,numframes+1))), unit="frames", desc=f"Rendering"):
		testbed.camera_smoothing = i > 0
		frame = testbed.render(resolution[0], resolution[1], spp, True, float(i)/numframes, float(i + 1)/numframes, fps, shutter_fraction=0.5)
		common.write_image(f"temp/{i:04d}.jpg", np.clip(frame * 2**exposure, 0.0, 1.0), quality=100)

	os.system(f"ffmpeg -i temp/%04d.jpg -vf \"fps={fps}\" -c:v libx264 -pix_fmt yuv420p {name}_test.mp4")
	shutil.rmtree('temp')


def parse_args():
	parser = argparse.ArgumentParser(description="render neural graphics primitives testbed")
	parser.add_argument("--scene", "--training_data", default="", help="The scene to load. Can be the scene's name or a full path to the training data.")

	parser.add_argument("--width", "--screenshot_w", type=int, default=1920, help="Resolution width of the render video")
	parser.add_argument("--height", "--screenshot_h", type=int, default=1080, help="Resolution height of the render video")
	parser.add_argument("--n_seconds", type=int, default=1, help="Number of seconds")
	parser.add_argument("--fps", type=int, default=60, help="number of fps")
	parser.add_argument("--render_name", type=str, default="", help="name of the result video")

	args = parser.parse_args()
	return args

if __name__ == "__main__":
	args = parse_args()	
	render_video([args.width, args.height], args.n_seconds*args.fps, args.scene, args.render_name, spp=8, fps=args.fps)

到了这里,关于【环境搭建】instant-ngp的环境搭建和demo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比

    之前博客进行了COLMAP在服务器下的测试 实验笔记之——Linux实现COLMAP-CSDN博客 文章浏览阅读794次,点赞24次,收藏6次。学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客NeRF 所做的任务是 Novel View Synthesis(新视角合成),即在若干已知视角下对场景进行一系列的观测(

    2024年01月23日
    浏览(37)
  • ARUBA-Instant AP使用手册

    一、登录 1、将IAP105连接到POE交换机或者通过POE模块连接非POE交换机,网络中如果有DHCP SERVER,AP加电后能很快获取IP地址,此时AP放出SetUpMeXXX的SSID,此时网络已经启用,连接该SSID即可使用网络 。如果没有DHCP SEVER会运行很长的时间之后,IAP也会放出SetUpMeXXX的SSID。 2、无线连接

    2024年02月13日
    浏览(39)
  • 【代码复现】5秒训练NeRF!英伟达instan-ngp在windows成功复现

    NeRF在我之前的文章中已经介绍过其牛X之处,不过它也存在如训练、推理慢等问题。近期,Nvidia提出的instant-ngp算法实现了快速的NeRF训练和推理。本文主要介绍了在Windows10系统下运行instant-ngp的方法和我在复现过程中出现的一些小问题。 instant-ngp代码链接:https://github.com/NVla

    2024年02月10日
    浏览(37)
  • java~Date和LocalDateTime及Instant的使用场景

    在 Java 中, LocalDateTime 、 Date 和 Instant 分别代表了不同的日期时间类型,它们之间有一些区别和适用场景。 Date : java.util.Date 是 Java 早期的日期时间类,它包含了日期和时间信息,但是在设计上存在一些问题,因此并不推荐在新的代码中使用。 Date 类存在线程安全性问题,同

    2024年02月21日
    浏览(50)
  • MySQL 8.0.29 instant DDL 数据腐化问题分析

    前言 Instant add or drop column的主线逻辑 表定义的列顺序与row 存储列顺序阐述 引入row版本的必要性 数据腐化问题 原因分析 Bug重现与解析 MySQL8.0.30修复方案 DDL 相对于数据库的 DML 之类的其他操作,相对来说是比较耗时、相对重型的操作; 因此对业务的影比较严重。MySQL 从5.6版本

    2024年02月08日
    浏览(46)
  • PL/SQL Developer15和Oracle Instant Client安装配置

    Oracle Instant Client Downloads | Oracle 中国 PL/SQL Developer - Allround Automations Free trial - Allround Automations 一路默认下一步。 选择输入许可信息: 产品码: 4tqw83ltw4ustkjfftny7wjl7tqv9uscs8 序列号: 182522 密码: *************  一路默认下一步,直到安装完成。 解压到自己喜欢的位置即可。 Oracl

    2024年02月12日
    浏览(44)
  • [Oracle] instant client 21 和 PLSQL Developer 14 安装与详细配置

    前言: PLSQL Developer 14 官方自带中文,这里笔者使用的客户机是win10系统,oracle数据库服务器操作系统是winserver2003,oracle数据库是10.0.2版本 安装配置需要 三个文件 : instant client 官方链接: https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html 我使用的版本: https:

    2024年02月06日
    浏览(44)
  • java8 Instant 计算方法耗时, 再见了我的System.currentTimeMillis()

    以下是一个 Java Instant 计算方法耗时的示例代码: 在上述示例代码中,我们使用 Instant.now() 方法获取当前时间,并在执行需要计算耗时的方法前后分别获取当前时间,然后使用 Duration.between() 方法计算两个时间点之间的时间差,并将结果输出到控制台。 在示例代码中,我们使

    2023年04月10日
    浏览(45)
  • 【当前全网最详细】WebUI中使用Instant_ID来控制生成对象面部的用法

    中文网络上或者B站很多UP,在讲述WebUI中使用这个controlnet来换脸的时候,要么讲的过于复杂,要么就是没有讲清楚,所以这里整理下详细的使用方法,并记录下生成的内容。  如果懒得看文字可以看同款视频哈: 【AI写真Instant_ID全网最详细教程Stable Diffusion WebUI免费生产力】

    2024年03月21日
    浏览(39)
  • 搭建SpringBoot项目——开发环境搭建开发环境搭建

    简介         SpringBoot 是 Java 社区最有影响力之一的开源的Spring后端开发框架,也是企业级应用开发的首选技术,Spring Boot 拥有良好的技术基因,它是伴随着Spring 4 而产生的技术框架,在继承了 Spirng 框架所有优点的同时也为开发者带来了巨大的便利,与普通的 Spring 项目相比

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包