【传知代码】用二维图像渲染3D场景视频-论文复现

news2024/12/30 3:19:22

文章目录

  • 概述
  • 原理介绍
  • 模型介绍
  • 环境配置/部署方式
    • 安装环境
    • 准备数据
    • 训练(train)
    • 评估(eval)
    • 渲染(render)
  • 小结

论文地址

本文涉及的源码可从用二维图像渲染3D场景视频该文章下方附件获取

概述

**NeRF(Neural Radiance Fields)**是一种基于神经网络的3D场景表示技术。NeRF代表神经辐射场,它通过神经网络隐式地学习一个三维场景,从而能够根据观察者的位置和视角渲染出任意视角下的清晰照片。该技术最早在2020年ECCV会议的最佳论文中提出,自此迅速发展并应用于多个技术方向,如新视点合成和三维重建。然而,在不同分辨率的训练或测试图像观察场景内容时,NeRF的渲染过程可能会产生过度模糊或伪影的图像。对于传统NeRF来说,使用多条光线对每个像素进行超采样的渲染方案是不实际的,因为渲染每条光线需要对MLP进行数百次查询。

本文提出的mip-NeRF模型,将NeRF扩展到连续值尺度上。通过向像素点投射一个锥形区域(而非光线)进行采样,mip-NeRF减少了伪影的产生,显著提高了NeRF对细节的表示能力,同时比NeRF快7%,仅为NeRF的一半大小。与NeRF相比,mip-NeRF在NeRF呈现的数据集上的平均误差率降低了17%,在多尺度变体数据集上降低了60%。此外,mip-NeRF还拥有与超采样NeRF相当的准确性,而速度快22倍。

原理介绍

  • NeRF(Neural Radiance Fields) 技术原理

    • NeRF使用一个多层感知机(MLP)神经网络去隐式地学习一个静态3D场景。这个网络接收一个5D向量(空间位置x, y, z,观察方向θ, φ)作为输入,并输出该空间点的颜色和密度。

    • 通过体积渲染技术,将这些颜色和密度信息积累起来,从而生成任意视角下的图像。

      NeRF使用一个连续的5D函数来表示场景,并使用少量的输入视图来优化这个函数以生成复杂场景的新视角。NeRF使用基于MLP的全连接神经网络来表示场景,输入为一个连续的5D坐标,包括空间位置(x,y,z)**和**观察视角(θ, φ),输出为该空间位置的体密度σ和与视角相关的RGB颜色。通过沿着相机射线查询MLP并使用经典的体渲染技术将输出颜色和密度投影到图像中来生成新视图。

在这里插入图片描述

mip-NeRF模型技术原理

  • 多尺度表示:mip-NeRF采用多尺度表示方法,能够实时表示连续尺度空间的预过滤辐射场。这种表示方法使得模型能够更好地处理不同分辨率和尺度的场景。
  • 圆锥体采样:与NeRF使用单一光线进行采样不同,mip-NeRF使用圆锥体进行采样。这种方法有效地减少了混叠伪影,并显著提高了表现精细细节的能力。具体来说,mip-NeRF的输入是一个三维高斯,代表辐射场应被整合的区域,通过查询沿圆锥体的间隔来渲染一个预过滤的像素。
  • 综合位置编码:为了对一个三维位置及其周围的高斯区域进行编码,mip-NeRF提出了一个新的特征表示:综合位置编码(IPE)。这是对NeRF的位置编码(PE)的概括,允许空间的一个区域被紧凑地特征化。

mip-NeRF的改进

  1. 使用圆锥追踪代替光线追踪,从而显著改善了抗锯齿(伪影)效果。
  2. 使用集成位置编码IPE)特征代替传统的位置编码(PE)特征,实现了更高效的采样和尺度编码。
  3. 通过单一的多尺度模型(而不是NeRF中的每个尺度单独的模型),使得mip-NeRF的准确性、效率和简单性都得到了提高。

在这里插入图片描述

模型介绍

Mip-NeRF是一种用于解决神经辐射场(NeRF)中降采样和抗锯齿问题的改进模型,模型的处理过程如下:

  1. 对于场景中的每个像素,从相机的中心沿着像素中心的方向投射一个圆锥。
  2. 计算每个采样间隔的集成位置编码(IPE)特征,作为多层感知机(MLP)的输入。
  3. MLP输出密度和颜色,用于渲染场景。

环境配置/部署方式

安装环境

  1. 克隆项目源码

    # 使用git克隆源码(笔者发现该源码由于作者更新过以后出现了些bug,
    # 笔者已经fork到自己的仓库,并修复了bug,推荐大家直接clone笔者的仓库)
    # git clone https://github.com/hjxwhy/mipnerf_pl.git #原作者仓库
    git clone https://github.com/Ryan2ky/mipnerf_pl.git
    # 进入项目目录
    cd mipnerf_pl
    
  2. 用conda创建虚拟环境

    # 创建虚拟环境(推荐python版本为3.9.12)
    conda create --name mipnerf python=3.9.12
    # 激活环境
    conda activate mipnerf
    # 安装最新版的pip工具
    conda install pip
    pip install --upgrade pip
    # 使用pip安装依赖库
    pip install -r requirements.txt
    

    注意:如果使用的linux环境不支持桌面GUI,请将requirements.txt中的opencv-python==4.5.4.58依赖改为无头版本的opencv-python-headless==4.5.4.58

  3. 安装pytorch依赖

    可以前往Start Locally | PyTorch根据自己的操作系统环境选择合适的pytorch版本:

    在这里插入图片描述

    注意:pytorch的cuda工具包版本应根据显卡所支持的cuda版本选择(可使用nvidia-smi命令查看)

    (一般应满足:[pytorch+cuda]版本 <= [Cuda]版本)

    在这里插入图片描述

    1. 执行安装命令:

      pip3 install torch torchvision torchaudio
      

准备数据

  • 在项目根目录中创建一个data目录用来存放训练数据

  • 我们使用谷歌官方的NeRF数据集(下载链接见附件README.md中的Dataset小节)进行实验,将nerf_synthetic.zip 下载并解压到data目录下

  • nerf_synthetic数据集转换成多尺寸mipmap数据集

    python datasets/convert_blender_data.py --blender_dir ./data/nerf_synthetic --out_dir ./data/multiscale
    

至此,我们拥有了2个数据集,结构如下:

  • data
    • nerf_synthetic(单一尺寸Blender数据集)
    • multiscale(多尺寸Blender数据集)

训练(train)

我们以lego这一数据集为例,进行单尺寸和多尺寸的训练:

  1. 配置

    我们可以在configs文件夹下配置训练的参数,默认使用的是configs/default.yaml,其中已经配置好了lego场景的参数,我们可以复制一份到lego-multiscale.yaml,并修改exp_namelego_multiscale加以区分。读者还可以根据需求配置一些其他的参数,例如:

    • check_interval:验证并保存模型的频率,该参数表示每经过一定步数,即进行一次验证,并保存模型到ckpt文件夹下。
    • resume_path:从ckpt恢复模型以继续训练,首次训练时应当设为None表示无需从ckpt恢复。
  2. 训练

    # 训练单一尺寸数据集
    python train.py --out_dir ./out --data_path ./data/nerf_synthetic/lego --dataset_name blender
    # 训练多尺寸数据集
    python train.py --out_dir ./out --data_path ./data/multiscale/lego --dataset_name multi_blender --config ./config/lego-multiscale.yaml
    
  3. 中断与恢复

    默认配置下,训练会不断进行(不超过max_steps),当认为差不多时,可以手动ctrl+c终止训练。训练模型保存在./out/{exp_name}/ckpt中。

    如果因为异常导致终止,我们也可以从之前保存的ckpt中恢复,只需在配置文件中指定resume_path为具体的ckpt文件即可。

评估(eval)

#单尺寸模型评估
python eval.py --ckpt ./out/lego/ckpt/last.ckpt --data ./data/nerf_synthetic/lego --out_dir ./out --scale 1 --save_image
#多尺寸模型评估
python eval.py --ckpt ./out/lego_multiscale/ckpt/last.ckpt --data ./data/multiscale/lego --out_dir ./out --scale 4 --save_image

评估结果存放在./out/{exp_name}/test下。

渲染(render)

# 单尺寸模型渲染
python render_video.py --ckpt ./out/lego/ckpt/last.ckpt --out_dir ./out --scale 1
# 多尺寸模型渲染
python render_video.py --ckpt ./out/lego_multiscale/ckpt/last.ckpt --out_dir ./out --scale 4

渲染结果保存在./out/{exp_name}/render_spheric下。

小结

mip-NeRF在3D渲染、虚拟现实、增强现实等领域具有广泛的应用前景。其能够合成逼真场景和模型的能力使得它在游戏制作、影视特效以及仿真培训等方面具有巨大的潜力。随着技术的不断发展,mip-NeRF有望在未来发挥更大的作用。

在这里插入图片描述

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

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

相关文章

第十九届全国环境友好科技竞赛(绿色创业类)正式启动

近日&#xff0c;第十九届全国环境友好科技竞赛&#xff08;绿色创业类&#xff09;正式拉开帷幕。本次竞赛由清华大学、同济大学、西安建筑科技大学及中国环境科学学会共同主办&#xff0c;旨在通过学科竞赛的方式鼓励全国高校学生积极参与到资源节约型和环境友好型的和谐社会…

【linux-IMX6ULL-LED字符驱动框架完善】

目录 1.简介&#xff12;.前置知识2.1 重要函数及结构体2.2 程序框架流程 3. 代码详解&#xff1a; 1.简介 在上节&#xff0c;我对linux-IMX6ULL-字符设备驱动简单框架实验进行了说明和构建&#xff0c;但是也存在几个问题&#xff1b; 需要手动指定设备号&#xff0c;不能自…

Android Studio添加依赖 新版 和 旧版 的添加方式(Gradle添加依赖)(Java)

旧版的&#xff08;在线添加&#xff09; 1找 文件 在项目的build.gradle文件中添加依赖(在下面的节点中添加库 格式 ’ 组 &#xff1a;名字 &#xff1a; 版本号 ‘ ) dependencies {implementation com.example:library:1.0.0 }implementation 组:名字:版本…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代&#xff0c;人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天&#xff0c;AI写作软件的出现&#xff0c;让很多自媒体创作者都会想到在手机上面进内容创作&#xff0c;这样不仅能提高工作效率&#xff0c;而且工作的自由度会更高…

Centos7静态路由和动态路由

路由&#xff0c;即路由选择&#xff08;Routing&#xff09;&#xff0c;是指在计算机网络中选择数据传输路径的过程。路由器&#xff08;Router&#xff09;是执行路由选择功能的网络设备。路由的主要目的是在复杂的网络结构中&#xff0c;选择最佳路径将数据包从源节点传递到…

等保三级 腾讯云控制台检查项设置

1、地址限制 2、角色里加三权用户&#xff08;查看日志权限&#xff09; 3、登录失败处理和超时退出 4、密码复杂度和口令有效期 5、双因素验证 6、操作审计

Vue3实战笔记(43)—Vue3组合式API下封装可复用ECharts图表组件

文章目录 前言一、封装echart图标钩子二、使用步骤总结 前言 接上文&#xff0c;已经安装好了ECharts&#xff0c;开始封装组件方便使用。 一、封装echart图标钩子 首先应用我们之前学习的钩子方式&#xff0c;在hooks目录下创建一个名为 useECharts.js 的文件&#xff0c;用…

边框渐变样式

实现样式&#xff1a; 对应代码&#xff1a; div {min-height: 40vh;border: 10px solid transparent;background-image: linear-gradient(#222, #222), var(--gradient);background-origin: border-box;background-clip: padding-box, border-box;border-radius: 10px;positi…

【深度学习】yolov8 seg实例分割训练,交通灯

文章目录 一、类别定义二、标注后再清洗数据三、训练yolov8 seg四、部署五、代码资料 一、类别定义 类别0&#xff1a; 类别1&#xff1a; 类别2&#xff1a; 类别3&#xff1a; 类别4&#xff1a; 类别5&#xff1a; 类别6&#xff1a; 类别7&#xff1a; 二、标注后再清洗…

kubernetes之prometheus kube-controller-manager。 scheduler报错问题

项目场景&#xff1a; prometheus scheduler及kube-controller-manager监控报错 问题描述 kubeadm搭建完kube-prometheus 会有这个报错 原因分析&#xff1a; rootmaster2:~# kubectl describe servicemonitor -n kube-system kube-controller-manager通过以上图片我们发现 k…

数据结构_链式二叉树(Chained binary tree)基础

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 二叉树的遍历 前序、中序以及后序遍历 学习二叉树结构&#xff0c;最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则&#xff0c;依次对二叉树中的结点进行相应的操作&#xff…

自己手写一个栈【C风格】

#include <iostream> //栈 #define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int Status;//状态类型 typedef int ElemType;//元素类型typedef struct SqStack {ElemType data[MAX_SIZE];int top; };//初始化&#xff0c;方法1 …

安装 Ubuntu桌面版,详细步骤(附引导 U盘制作工具)

下载镜像 安装Ubuntu首先要下载镜像包&#xff0c;访问下面网址下载镜像包 https://releases.ubuntu.com/ 选择你要安装的Ubuntu版本 将 .iso 文件保存到所需位置&#xff0c;下面会使用此文件创建可引导 U盘。 制作 Ubuntu 引导 U 盘 首先要找到一个大于4G的U盘&#xff…

用Python Pygame做的一些好玩的小游戏

有些游戏的代码比较长就不公布了 1.简简单单 1.疯狂的鸡哥 你要准备的图片&#xff1a; 命名为&#xff1a;ji.png 代码&#xff1a; import pygame import random as r pygame.init() pygame.display.set_caption(aaa) pm pygame.display.set_mode((800,600))class Ls(py…

三前奏:获取/ 读取/ 评估数据【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …

Excel提取某一列的唯一值

点击【筛选】&#xff08;【高级筛选】&#xff09;&#xff0c;参数里&#xff1a; 列表区域&#xff1a;为需要选择唯一值的那一列复制到&#xff1a;生成唯一值的目标区域 据说新版本的excel有了unique()函数&#xff0c;可以很快捷的选择某一列的唯一值&#xff0c;但是博…

深度学习500问——Chapter09:图像分割(3)

文章目录 9.8 PSPNet 9.9 DeepLab系列 9.9.1 DeepLabv1 9.9.2 DeepLabv2 9.9.3 DeeoLabv3 9.9.4 DeepLabv3 9.8 PSPNet 场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的。本文使用文中的 pyramid pooling module 实现基于不同区域的上下文集成&#xff0c;提出了PS…

Java进阶学习笔记14——模板方法设计模式

面试和看源码。 谈到设计模式&#xff1a; 1、解决了什么问题&#xff1f; 2、怎么写&#xff1f; 模板方法设计模式解决了什么问题&#xff1f; 解决方法中存在重复代码的问题。 写法&#xff1a; 1&#xff09;定义一个抽象类&#xff1a; 2&#xff09;在里面定义两个方…

阅读笔记——《ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing》

【参考文献】Natella R, Pham V T. Profuzzbench: A benchmark for stateful protocol fuzzing[C]//Proceedings of the 30th ACM SIGSOFT international symposium on software testing and analysis. 2021: 662-665.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&…

Java反射角度简单理解spring IOC容器

概述 Java反射&#xff08;Reflection&#xff09;是Java编程语言的一个特性&#xff0c;它允许在运行时对类、接口、字段和方法进行动态查询和操作。反射提供了一种在运行时查看和修改程序行为的能力&#xff0c;这通常用于实现一些高级功能&#xff0c;如框架(Spring)、ORM&…