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

文章目录

  • 概述
  • 原理介绍
  • 模型介绍
  • 环境配置/部署方式
    • 安装环境
    • 准备数据
    • 训练(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有望在未来发挥更大的作用。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习使用博客记录生活

学习使用博客记录生活 新的改变 今天新的开始&#xff0c;让我用图片开始记录吧 看这个背景图片怎么样

【OpenCV】图像通道合并与分离,ROI

介绍可以实现图像通道合并与分离的API&#xff0c;这只是一种方式&#xff0c;后续还会介绍其他的合并与分离方法&#xff0c;以及ROI区域截取的方法。相关API&#xff1a; split() merge() Mat对象() 代码&#xff1a; #include "iostream" #include "ope…

JS(ES_6)_2

1.创建对象的6种方式&#xff1a; 1. obnew Object() ob.nameah ob.age18 2. ob{name:ah,gae:18} 3.工厂模式&#xff1a; 设计一个函数&#xff0c;专门生产Person类型的对象 <script>function createPerson(name,age,family) {var o new Object();o.name name;o.…

ACL组网实验(华为)

思科设备参考&#xff1a;ACL组网实验&#xff08;思科&#xff09; 更多内容参考&#xff1a;华为ACL配置&#xff08;基本ACL高级ACL综合应用&#xff09; 技术简介 ACL&#xff08;Access Control List&#xff09;技术是一种基于包过滤的流控制技术&#xff0c;主要用于…

深入解析编程逻辑中的关键字与逻辑运算

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、认识关键字及其重要性 二、逻辑运算的关键字 1. and、or 和 not 的运用 2. 逻辑运算的…

Redis机制-Redis缓存穿透,击穿,雪崩理解等问题的理解和学习

目录 一 缓存穿透问题 二 缓存击穿问题 三 缓存雪崩问题&#xff1a; 图1 正常的Redis缓存流程 一 缓存穿透问题 我们都知道Redis是一个存储键值对的非关系型数据库&#xff0c;那么当用户进行查询的时候&#xff0c;势必会从前端发起请求&#xff0c;从而数据从Redis缓存…

测试驱动编程(3)进阶单元测试(下)

文章目录 测试驱动编程(3)进阶单元测试&#xff08;下&#xff09;示例实战接收同事的需求开始迭代需求故事迭代1故事迭代2故事迭代3故事迭代4故事迭代5故事迭代6 测试驱动编程(3)进阶单元测试&#xff08;下&#xff09; 示例实战 接收同事的需求 你的同事正在开发一个远程…

速看!!!24上软考-信息系统项目管理师真题回忆,考点已更新

整理了24上半年软考高级信息系统项目管理师的考试真题&#xff0c;软考一个批次一套题&#xff0c;现在都是机考&#xff0c;收集题目比较困难&#xff0c;希望能给个小小的赞支持一下。 注意&#xff1a;当天考试的宝子们可以对答案预估分数&#xff01;后面场次的宝子可以提…

香农信息量/自信息、信息熵、相对熵/KL散度/信息散度、交叉熵

诸神缄默不语-个人CSDN博文目录 文章目录 1. 引言2. 什么是熵&#xff1f;3. 香农信息量/自信息香农信息量的定义香农信息量的含义香农信息量计算示例香农信息量与信息熵的关系 4. 信息熵信息熵的定义信息熵的计算公式信息熵计算示例 5. 衡量两个分布间的差异&#xff1a;相对熵…

ColossalAI Open-Sora 1.1 项目技术报告 (视频生成)

项目信息 项目地址&#xff1a;https://github.com/hpcaitech/Open-Sora技术报告&#xff1a; Open-Sora 1&#xff1a;https://github.com/hpcaitech/Open-Sora/blob/main/docs/report_01.mdOpen-Sora 1.1&#xff1a;https://github.com/hpcaitech/Open-Sora/blob/main/docs…

技术前沿 |【VL-BEIT:引领未来的极简单阶段多模态预训练方案】

VL-BEIT&#xff1a;引领未来的极简单阶段多模态预训练方案 引言一、VL-BEIT的基本介绍二、VL-BEIT的原理和工作方式三、VL-BEIT的特点四、VL-BEIT的应用场景五、总结与展望 引言 在人工智能蓬勃发展的今天&#xff0c;多模态预训练模型正逐渐成为研究和应用的热点。这些模型能…

C++高效死锁检测——实现原理与应用(基于强连通分量)

背景 在项目使用多进程、多线程过程中&#xff0c;因争夺资源而造成一种资源竞态&#xff0c;所以需加锁处理。如下图所示&#xff0c;线程 A 想获取线程 B 的锁&#xff0c;线程 B 想获取线程 C 的锁&#xff0c;线程 C 想获取线程 D 的锁&#xff0c; 线程 D 想获取线程 A 的…

视频号小店的保证金是多少钱?2024最新收费标准,一篇了解!

哈喽~我是电商月月 现实社会&#xff0c;干什么都需要交钱&#xff0c;就连上班&#xff0c;路费也得掏钱 想要入驻视频号小店&#xff0c;在视频号里卖货赚钱&#xff0c;就要缴纳类目保证金 那到底要缴多少钱呢&#xff1f; 今天&#xff0c;月月就把最新的收费标准分享给…

批量化处理和矩阵(torch)

左边是权重&#xff0c;右边是变量 高维可以看成二维的堆叠 总结&#xff1a;二维是一维的堆叠&#xff0c;三维是二维的堆叠。但似乎是为了引入矩阵&#xff0c;本来应该是左上角是第一组权重和第一组变量的乘积这种表示表示来着&#xff0c;最后成了和列向量乘积&#xff…

C# GDI+ 绘制文字不同的操作系统渲染文字大小不同

一、C# GDI 绘制文字不同的操作系统渲染文字大小不同 原因&#xff1a;使用Font 字体的时候&#xff0c;没有指定字体渲染的单位。 不同系统的默认字体单位会不同。 二、解决方案&#xff1a; 在指定字体的时候&#xff0c;指定字体大小&#xff0c;同时也要设置字体的单位 …

私域流量的真谛:构建并运营属于你自己的私域生态

大家好&#xff0c;我是来自一家专注于私域电商行业的软件开发公司的产品经理&#xff0c;拥有超过七年的行业经验。今天&#xff0c;我想和大家聊聊私域流量的真正含义&#xff0c;以及为何我们应该关注并努力打造属于自己的私域生态。 什么是私域流量&#xff1f; 私域流量&…

【机器学习】【深度学习】正则化(Regularization)

概念 正则化&#xff08;Regularization&#xff09;是在机器学习模型中避免过拟合的一种技术。它通过引入一个惩罚项&#xff08;即正则项&#xff09;来限制模型的复杂度&#xff0c;以此来提防模型过度依赖训练数据&#xff0c;捕获数据中的噪音信息而导致过拟合现象。简单…

10.3.k8s的附加组件-图形化管理工具dashboard

目录 一、dashboard介绍 二、部署安装dashboard组件 1.下载dashboard本地文件 2.修改nodeport的端口范围 3.创建和查看dashboard 4.电脑浏览器访问测试 5.token登录方式登录dashboard 5.1.查看dashboard的token 5.2.继续查看用户token的secrets资源详细信息 5.3.复制…

【Apache Doris】周FAQ集锦:第 4 期

【Apache Doris】周FAQ集锦&#xff1a;第 4 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

clangd failed: Couldn‘t build compiler instance问题解决!!!

如果其他人的博客不能解决问题&#xff0c;可以试试我的解决方案&#xff1a; 修改compile_commands.json中cc为arm-linux-gnueabihf-gcc&#xff0c; 例如&#xff1a; 之后&#xff0c;clangd就能用了&#xff0c;虽然输出也会报错&#xff0c;但好歹能用了