《Keras 3 使用 NeRF 进行 3D 体积渲染》:此文为AI自动翻译
《Keras 3 使用 NeRF 进行 3D 体积渲染》
作者: Aritra Roy Gosthipaty, Ritwik Raha
创建日期: 2021/08/09
最后修改时间: 2023/11/13
描述: 体积渲染的最小实现,如 NeRF 中所示。
在 Colab 中查看
GitHub 源
介绍
在此示例中,我们展示了 Ben Mildenhall 等人的研究论文 NeRF:将场景表示为视图合成的神经辐射场的最小实现。铝。作者提出了一个巧妙的方法 通过对 Volumetric 进行建模来合成场景的新视图 scene 函数。
为了帮助您直观地理解这一点,让我们从以下问题开始:是否可以将 network 图像中像素的位置,并询问 network 预测该位置的颜色?
| 图 1:为图像提供坐标的神经网络 |
| 作为输入,并要求预测坐标处的颜色。 |
神经网络将假设记住(过拟合)这个 图像。这意味着我们的神经网络将对整个图像进行编码 在其权重中。我们可以查询包含每个位置的神经网络, 它最终会重建整个图像。
| 图 2:经过训练的神经网络从头开始重新创建图像。 |
现在出现了一个问题,我们如何扩展这个想法来学习 3D 体积场景?实施与上述类似的过程将 需要了解每个体素 (体积像素)。事实证明,这个 是一项相当具有挑战性的任务。
论文的作者提出了一种简单而优雅的方法来学习 使用场景的一些图像的 3D 场景。他们放弃了使用 体素进行训练。网络学习对体积场景进行建模, 从而生成模型 3D 场景的新视图(图像) 在训练时未显示。
需要完全了解一些先决条件 欣赏这个过程。我们以这样的方式构建示例: 在开始之前,您将拥有所有必需的知识 实现。
设置
import osos.environ["KERAS_BACKEND"] = "tensorflow"# Setting random seed to obtain reproducible results.
import tensorflow as tftf.random.set_seed(42)import keras
from keras import layersimport os
import glob
import imageio.v2 as imageio
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt# Initialize global variables.
AUTO = tf.data.AUTOTUNE
BATCH_SIZE = 5
NUM_SAMPLES = 32
POS_ENCODE_DIMS = 16
EPOCHS = 20
下载并加载数据
数据文件包含图像、摄像机姿势和焦距。 图像是从多个摄像机角度拍摄的,如图 3 所示。npz
| 图 3:多个摄像机角度 |
| 来源:NeRF |
要了解此上下文中的摄像机姿势,我们必须首先允许 我们自己认为相机是现实世界之间的映射 和 2-D 图像。
| 图 4:通过相机进行 3D 世界到 2D 图像的映射 |
| 来源:Mathworks |
考虑以下等式:
其中 x 是 2-D 图像点,X 是 3-D 世界点,P 是相机矩阵。P 是一个 3 x 4 矩阵,它播放 将真实世界对象映射到图像平面的关键作用。
相机矩阵是一个仿射变换矩阵,它是 与 3 x 1 列连接以生成姿势矩阵。此矩阵是 尺寸为 3 x 5,其中第一个 3 x 3 块位于相机的点中 的视图。轴是 或 相机面向前方的位置 。[image height, image width, focal length][down, right, backwards][-y, x, z]-z
| 图 5:仿射变换。 |
COLMAP 帧为 或 。读 更多关于 COLMAP 的信息 这里.[right, down, forwards][x, -y, -z]
# Download the data if it does not already exist.
url = ("http://cseweb.ucsd.edu/~viscomp/projects/LF/papers/ECCV20/nerf/tiny_nerf_data.npz"
)
data = keras.utils.get_file(origin=url)data = np.load(data)
images = data["images"]
im_shape = images.shape
(num_images, H, W, _) = images.shape
(poses, focal) = (data["poses"], data["focal"])# Plot a random image from the dataset for visualization.
plt.imshow(images[np.random.randint(low=0, high=num_images)])
plt.show()

数据管道
现在您已经了解了相机矩阵的概念 以及从 3D 场景到 2D 图像的映射, 我们来谈谈逆向映射,即从 2D 图像到 3D 场景。
我们需要讨论使用光线投射和追踪进行体积渲染, 这些都是常见的计算机图形技术。 本节将帮助您快速掌握这些技术。
考虑一个带有像素的图像。我们通过每个像素发射一条光线 并对射线上的一些点进行采样。射线通常由 其中 是参数的方程式 是 origin 的 ,是单位方向向量,如图 6 所示。Nr(t) = o + tdtod
图 6:其中 t 为 3r(t) = o + td |
在图 7 中,我们考虑一条光线,并在 射线。这些采样点每个都有唯一的位置,并且光线具有 视角 。视角为 特别有趣,因为我们可以穿过单个像素发射光线 以许多不同的方式,每一种都有独特的视角。另一个 这里需要注意的一点是添加到 取样过程。我们为每个样本添加均匀的噪声,以便 样本对应于 continuous 分布。在图 7 中, 蓝点是均匀分布的样本,白点是随机放置在样本之间的。(x, y, z)(theta, phi)(t1, t2, t3)
| 图 7:从射线中采样点。 |
图 8 以 3D 形式展示了整个采样过程,其中 可以看到从白色图像中射出的光线。这意味着每个 像素将具有其相应的光线,并且每条光线将在 不同的点。
| 图 8:从 3D 图像的所有像素拍摄光线 |
这些采样点充当 NeRF 模型的输入。模型为 然后要求预测 RGB 颜色和该颜色的体积密度 点。
| 图 9:数据管道 |
| 来源:NeRF |
def encode_position(x):"""Encodes the position into its corresponding Fourier feature. Args:
x: The input coordinate. Returns:
Fourier features tensors of the position.
"""positions = [x]for i in range(POS_ENCODE_DIMS):for fn in [tf.sin, tf.cos]:positions.append(fn(2.0**i * x))return tf.concat(positions, axis=-1)def get_rays(height, width, focal, pose):"""Computes origin point and direction vector of rays. Args:
height: Height of the image.
width: Width of the image.
focal: The focal length between the images and the camera.
pose: The pose matrix of the camera. Returns:
Tuple of origin point and direction vector for rays.
"""# Build a meshgrid for the rays.i, j = tf.meshgrid(tf.range(width, dtype=tf.float32),tf.range(height, dtype=tf.float32),indexing="xy",)# Normalize the x axis coordinates.transformed_i = (i - width * 0.5) / focal# Normalize the y axis coordinates.transformed_j = (j - height * 0.5) / focal# Create the direction unit vectors.directions = tf.stack([transformed_i, -transformed_j, -tf.ones_like(i)], axis=-1)# Get the camera matrix.camera_matrix = pose[:3, :3]height_width_focal = pose[:3, -1]# Get origins and directions for the rays.transformed_dirs = directions[..., None, :]camera_dirs = transformed_dirs * camera_matrixray_directions = tf.reduce_sum(camera_dirs, axis=-1)ray_origins = tf.broadcast_to(height_width_focal, tf.shape(ray_directions))# Return the origins and directions.return (ray_origins, ray_directions)def render_flat_rays(ray_origins, ray_directions, near, far, num_samples, rand=False):"""Renders the rays and flattens it. Args:
ray_origins: The origin points for rays.
ray_directions: The direction unit vectors for the rays.
near: The near bound of the volumetric scene.
far: The far bound of the volumetric scene.
num_samples: Number of sample points in a ray.
rand: Choice for randomising the sampling strategy. Returns:
Tuple of flattened rays and sample points on each rays.
"""# Compute 3D query points.# Equation: r(t) = o+td -> Building the "t" here.t_vals =
相关文章:
《Keras 3 使用 NeRF 进行 3D 体积渲染》:此文为AI自动翻译
《Keras 3 使用 NeRF 进行 3D 体积渲染》 作者: Aritra Roy Gosthipaty, Ritwik Raha 创建日期: 2021/08/09 最后修改时间: 2023/11/13 描述: 体积渲染的最小实现,如 NeRF 中所示。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 在此示例中,我们展示了…...
Pytorch实现之浑浊水下图像增强
简介 简介:这也是一篇非常适合GAN小白们上手的架构文章!提出了一种基于GAN的水下图像增强网络。这种网络与其他架构类似,生成器是卷积+激活函数+归一化+残差结构的组成,鉴别器是卷积+激活函数+归一化以及全连接层。损失函数是常用的均方误差、感知损失和对抗损失三部分。 …...
【redis】数据类型之Bitfields
Redis的Bitfields(位域)与Bitmaps一样,在Redis中并不是一种独立的数据类型,而是一种基于字符串的数据结构,用于处理位级别的操作。允许用户将一个Redis字符串视作由一系列二进制位组成的数组,并对这些位进行…...
Python入门 — 类
面向对象编程中,编写表示现实世界中的事物和情景的类(class),并基于这些类来创建对象(object)。根据类来创建对象称为实例化,这样就可以使用类的实例(instance) 一、创建…...
R-INLA实现绿地与狐狸寄生虫数据空间建模:含BYM、SPDE模型及PC先验应用可视化...
全文链接:https://tecdat.cn/?p40720 本论文旨在为对空间建模感兴趣的研究人员客户提供使用R-INLA进行空间数据建模的基础教程。通过对区域数据和地统计(标记点)数据的分析,介绍了如何拟合简单模型、构建和运行更复杂的空间模型&…...
Linux云计算SRE-第十五周
1.总结Dockerfile的指令和Docker的网络模式 一、Dockerfile 核心指令详解 1、基础构建指令 指令 功能描述 关键特性 FROM 指定基础镜像(必须为首条指令) - 支持多阶段构建:FROM node AS builder - scratch 表示空镜像 RUN 在镜像构建…...
2014年下半年试题一:论软件需求管理
论文库链接:系统架构设计师论文 论文题目 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互关联,初始需求导出的同时就要形成需求管理规划,一旦启动了软件开发过程需求管理活动就紧密相伴。 需求管理过程中…...
podman加速器配置,harbor镜像仓库部署
Docker加速器 registries加速器 [rootlocalhost ~]# cat /etc/redhat-release CentOS Stream release 8 [rootlocalhost ~]# cd /etc/containers/ [rootlocalhost containers]# ls certs.d policy.json registries.conf.d storage.conf oci registries.conf re…...
信息学奥赛一本通 1522:网络 | OpenJudge 百练 1144:Network
【题目链接】 ybt 1522:网络 OpenJudge 百练 1144:Network 【题目考点】 1. 图论:割点 【解题思路】 每个交换机是一个顶点,如果两地点之间有电话线连接,那么两顶点之间有一条无向边,该图是无向图。 初始时任何地…...
本地部署DeepSeek的硬件配置建议
本地部署DeepSeek的硬件配置需求因模型参数规模和部署工具不同而有所差异,以下是综合多个来源的详细要求: 1. 基础配置(适用于7B参数模型) 内存:最低8GB,推荐16GB及以上;若使用Ollama工具&…...
Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
Redis 提供了两种主要的持久化机制,分别是 RDB(Redis Database)和 AOF(Append Only File),下面将详细介绍它们的原理、优缺点。 RDB(Redis Database) 原理 RDB 持久化是将 Redis 在某个时间点上的数据集快照以二进制文件的形式保存到磁盘上。可以通过手动执行 SAVE …...
C#实现本地AI聊天功能(Deepseek R1及其他模型)。
前言 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 2、此程序默认你已经安装好了Ollama。 在运行前需要线安装好Ollama,如何安装请自行搜索 Ollama下载地址: https://ollama.org.cn Ollama模型下载地址…...
Metal 学习笔记四:顶点函数
到目前为止,您已经完成了 3D 模型和图形管道。现在,是时候看看 Metal 中两个可编程阶段中的第一个阶段,即顶点阶段,更具体地说,是顶点函数。 着色器函数 定义着色器函数时,可以为其指定一个属性。您将在本…...
C# string转unicode字符
在 C# 中,将字符串转换为 Unicode 字符(即每个字符的 Unicode 码点)可以通过遍历字符串中的每个字符并获取其 Unicode 值来实现。Unicode 值是一个整数,表示字符在 Unicode 标准中的唯一编号。 以下是实现方法: 1. 获…...
HITCON2017SSRFME-学习复盘
代码审计 192.168.122.15 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);//用逗号分割多个IP$_SERVER[REMOTE_ADDR] $http_x_headers[0];}echo $_SERVER["REMOTE_ADDR"];//给第一个IP发送请…...
【Http和Https区别】
概念: 一、Http协议 HTTP(超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,主要用于Web浏览器和服务器之间的通信。http也是客户端和服务器之间请求与响应的标准协议,客户端通常…...
2025数学建模竞赛汇总,错过再等一年
01、2025第十届数维杯大学生数学建模挑战赛(小国赛) 竞赛介绍:数学建模行业内仅次于国赛和美赛的的第三赛事,被多所高校认定为国家级二类竞赛。赛题类型是国内唯一和高教社杯国赛题型风格完全一致的全国性数学建模竞赛࿰…...
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式,因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作,分别是管理员、教师和学生。教师在系统后台新增试题和试卷,学生进行在线考试,还能对考生记录、错题…...
ReentrantLock 用法与源码剖析笔记
📒 ReentrantLock 用法与源码剖析笔记 🚀 一、ReentrantLock 核心特性 🔄 可重入性:同一线程可重复获取锁(最大递归次数为 Integer.MAX_VALUE)🔧 公平性:支持公平锁(按等…...
矩阵的 正定(Positive Definite)与负定(Negative Definite):从Fisher信息矩阵看“曲率”的秘密
矩阵的正定与负定:从Fisher信息矩阵看“曲率”的秘密 在数学和统计学中,矩阵的“正定性”和“负定性”是一对重要概念,尤其在优化、统计推断和机器学习中频繁出现。比如,Fisher信息矩阵(Fisher Information Matrix, F…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
