Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

news2024/11/20 6:32:42

Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习

    • 1. 效果图
    • 2. 原理
      • 2.0 前向成像模型
      • 2.1 世界坐标系
      • 2.2 相机坐标系
      • 2.3 坐标变换
      • 2.4 投影转换
      • 2.5 数据
    • 3. 源码
    • 参考

是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景?
有。 NeRF:将场景表示为用于视图合成的神经辐射场中(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),Mildenhall等人(2020)的论文解答了这个问题。NeRF的更简单实现赢得了 TensorFlow社区聚光灯奖 。

这篇博客将介绍计算机图像学的基础主题,包括:

  1. 前向成像模型(拍照)
  2. 世界到相机(3D到3D)转换
  3. 相机到图像(3D到2D)转换
  4. 所需的数据集,涵盖了所有先决条件。

后边的博客将研究各种基本概念:NeRF:将场景表示为视图合成的神经辐射场。我们还将学习如何使用TensorFlow和Python实现这些概念。

1. 效果图

如下图:从不同视角(顶部)给算法一些热狗盘的图片可以 top精确地生成整个3D风景( 底部 )

在这里插入图片描述
在这里插入图片描述

2. 原理

神经辐射场(Neural Radiance Fields NeRF) 将 深度学习 和 计算机图形学(Computer Graphics)结合在一起。计算机图形学一直是现代技术的奇迹之一。渲染逼真的 3D 场景(rendering realistic 3D scenes) 的应用范围从电影、太空导航到医学。

本课是关于使用 TensorFlow 和 Keras 使用 NeRF 进行计算机图形学和深度学习的 3 部分系列的第 1 部分:

  1. 使用 TensorFlow 和 Keras 的 NeRF 计算机图形学和深度学习:第 1 部分(本文)
  2. 使用 TensorFlow 和 Keras 的 NeRF 计算机图形学和深度学习:第 2 部分
  3. 使用 TensorFlow 和 Keras 的 NeRF 计算机图形学和深度学习:第 3 部分

这篇博客将介绍相机在计算机图形学世界中的工作原理及使用的数据集。

1. 世界坐标系(World Coordinate Frame): 表示物理 3D 世界
2. 相机坐标系(Camera Coordinate Frame): 代表虚拟3D相机世界
3. 坐标变换(Coordinate Transformation): 从一个坐标系映射到另一个坐标系
4. 投影变换(Projection Transformation): 在 2D 平面上形成图像(相机传感器)
5. 数据集: 了解 NeRF 的数据集

2.0 前向成像模型

想象一下你带着相机出去,发现了一朵美丽的花。你考虑你想要捕捉它的方式,定位相机,校准设置,然后拍照。
将世界场景转换为图像的整个过程被封装在一个通常称为 前向成像模型 中可视化模型 的数学模型中

在这里插入图片描述

前向成像模型从世界坐标系中的一个点开始。然后使用坐标变换将其变换为相机坐标系。然后使用投影变换将相机坐标变换到图像平面上。

2.1 世界坐标系

在现实世界中看到的所有形状和物体都存在于三维参考系中。我们把这个参照系称为世界坐标系。 使用这个坐标系可以很容易地定位三维空间中的任何点或对象。

让我们取三维空间中的点P,如下图
图4:世界坐标系。

这里, x ˆ w , y ˆ w , z ˆ w \^{x}_w,\^{y}_w,\^{z}_w xˆwyˆwzˆw表示世界坐标系中的三个轴。点P的位置通过向量 X w X_w Xw来表示:
X w = { x w y w z w } X_w= \begin{Bmatrix} x_w \\ y_w \\ z_w \end{Bmatrix} Xw= xwywzw

2.2 相机坐标系

与世界坐标系一样,有另一个参考系,称为相机坐标系
在这里插入图片描述

这个画框位于相机的中心。与世界坐标系不同,这不是一个静态的参照系可以在移动相机拍照时移动这个坐标系。
图4中的同一点P现在可以用两个参考系定位,如图世界到相机的坐标变换:
在这里插入图片描述

而在世界坐标系中,点由 X w X_{w} Xw向量定位,在相机坐标系中由 X c X_{c} Xc向量定位。如图6所示。

X c = { x c y c z c } X_c= \begin{Bmatrix} x_c \\ y_c \\ z_c \end{Bmatrix} Xc= xcyczc
注:点P的位置不变。只有观察点的方式会随着参照系的变化而变化。

2.3 坐标变换

建立了两个坐标系:世界和相机,目标是在相机坐标 X c X_c Xc 和世界坐标 X w X_w Xw 之间建立一座桥梁。
X c = R × ( X w − C w ) X_c = R \times (X_w - C_w) Xc=R×(XwCw)

R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] R= \begin{bmatrix} r11 & r12 & r13\\ r21 & r22 & r23 \\ r31 & r32& r33 \end{bmatrix} R= r11r21r31r12r22r32r13r23r33

X c = R × ( X w − C w ) ⇒ X c = R × X w − R × C w ⇒ X c = R × X w + t X_c = R \times (X_w - C_w) \\ \rArr X_c = R \times X_w - R \times C_w \\ \rArr X_c = R \times X_w + t Xc=R×(XwCw)Xc=R×XwR×CwXc=R×Xw+t

R表示相机坐标系相对于世界坐标系的方向,由矩阵表示。
其中 t 表示平移矩阵。在上面的等式中有一个矩阵乘法和一个矩阵加法。如果可以的话,将事物压缩为单个矩阵乘法总是更可取的。为此,我们将使用一个称为齐次坐标(homogeneous coordinates)的概念。
齐次坐标系允许我们在N+1维空间中用虚拟变量表示N维点。利用齐次坐标系,我们可以将 X w ( 3 D ) X_ w(3D) Xw3D变换为 X w ( 4 D ) {X}_w(4D) Xw4D
有了齐次坐标,可以把方程压缩成矩阵乘法。
在这里插入图片描述

其中 C e x C_{ex} Cex是保持相机坐标系的方向和位置的矩阵。我们可以将此矩阵称为相机外部矩阵,因为它表示旋转和平移等值,这两个值都是相机的外参(Camera Extrinsic)。**
C e x = [ r 11 r 12 r 13 t x r 21 r 22 r 23 t y r 31 r 32 r 33 t z 0 0 0 1 ] C_{ex}= \begin{bmatrix} r11 & r12 & r13 & t_x\\ r21 & r22 & r23 & t_y \\ r31 & r32& r33 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} Cex= r11r21r310r12r22r320r13r23r330txtytz1

2.4 投影转换

从一个点开始 P 及其(同质)世界坐标 X w X_w Xw 借助相机外在矩阵 C e x C_{ex} Cex X w {X}_w Xw 已转换为其(均匀)相机坐标 X c X_c Xc.

要理解投影变换,唯一需要的是类似的三角形。
实际的图像平面不是虚拟平面,而是图像传感器阵列。3D场景落在这个传感器上,导致图像的形成。因此 x_i 和 y_i x_i 在图像平面中可以用像素值替换 u,v。

最后得到:
[ u ˜ v ˜ w ˜ ] = [ f 0 o x 0 0 f o y 0 0 0 1 0 ] [ x c y c z c 1 ] \begin{bmatrix} \~u \\ \~v \\ \~w \end{bmatrix} = \begin{bmatrix} f & 0 & o_x & 0\\ 0 & f & o_y& 0\\ 0 & 0 & 1& 0 \end{bmatrix} \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} u˜v˜w˜ = f000f0oxoy1000 xcyczc1

可以简单地表示为
u ˜ = C i n × x ˜ c \~{u}=C_{in} \times \~{x}_c u˜=Cin×x˜c

其中 x ~ c \tilde{x}_c x~c 是包含点在相机坐标空间中的位置的向量集 是包含点在相机坐标空间中的位置的一组向量, u ^ \hat{u} u^ 是包含图像平面上点位置的值集。分别 C i n C_{in} Cin 表示将点从 3D 照相机空间映射到 2D 空间所需的值集。

C i n = [ f 0 o x 0 0 f o y 0 0 0 1 0 ] C_{in} = \begin{bmatrix} f & 0 & o_x & 0\\ 0 & f & o_y& 0\\ 0 & 0 & 1& 0 \end{bmatrix} Cin= f000f0oxoy1000

可以称 C i n C_{in} Cin相机固有(camera intrinsic)属性,表示焦距和图像平面中心等值 和 x 和 轴,两者都是相机内参。

2.5 数据

将讨论要使用的数据。作者已经开源了数据集,数据集的链接发布在 NeRF 的官方存储库中。数据集的结构如图 11 所示。
有两个文件夹,nerf_synthetic和nerf_lilf_data。接下来将在本系列中使用合成数据集,选择了“船舶”数据集,但请随时下载其中任何一个。
解压缩数据集后发现三个包含图像的文件夹: train、val、test 和 transforms_train.json、transforms_val.json、 transforms_test.json其中包含相机的方向和位置。

3. 源码

解析tranfomrs_train.json

# 解析转换文件
# python transform_json_read.py

# 导入包
import json
import numpy as np

# 定义json训练文件路径
jsonTrainFile = "transforms_train.json"

# 打开并读取文件内容
with open(jsonTrainFile, "r") as fp:
    jsonTrainData = json.load(fp)

# 打印json文件内容
print(f"[INFO] Focal length train: {jsonTrainData['camera_angle_x']}")
print(f"[INFO] Number of frames train: {len(jsonTrainData['frames'])}")

# json文件有俩个key: camera_angle_x(摄像机的角度) 和 frames(每个图像帧的元信息)
firstFrame = jsonTrainData["frames"][0]

# 获取转换矩阵和文件名 获取第一帧:每一帧都是一个字典,包含transform_matrix和file_path两个关键点,
# file_path是到所考虑的图像(帧)的路径,transform_matrix是该图像的相机到世界的矩阵。
tMat = np.array(firstFrame["transform_matrix"])
fName = firstFrame["file_path"]

# 打印数据
print(tMat)
print(fName)

参考

  • https://pyimagesearch.com/2021/11/10/computer-graphics-and-deep-learning-with-nerf-using-tensorflow-and-keras-part-1/

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

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

相关文章

有奖励!2023陕西省首台(套)重大技术装备产品项目申报条件、认定材料

本文整理了2023陕西省首台(套)重大技术装备产品项目申报条件,认定材料等相关内容,感兴趣的朋友快跟小编一起来看看吧! 一、重点支持方向及领域 重点支持方向及领域:高档工业母机、电力装备、大型矿山和冶金…

【MySQL】MySQL 字段为 NULL 的5大坑

数据准备 建立一张表 数据如下: 1.count 数据丢失 count(*) 会统计值为 NULL 的行,而 count(列名) 不会统计此列为 NULL 值的行。 select count(*),count(name) from person; ----------------------- count(*) | count(name)10 | 8-------…

如何使用Python自动化测试工具Selenium进行网页自动化?

引言 Selenium是一个流行的Web自动化测试框架,它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为。Selenium可以通过代码驱动浏览器自动化测试流程,包括页面导航、元素查找、数据填充、点击操作等。 与PyAuto…

关于linux的ssh(出现的问题以及ubuntu的ssh配置和ssh连接超时问题)

目录 Ubuntu进行ssh连接 关于ssh报错排错 备注:防火墙和selinux可能对ssh连接存在限制,但是我在操作的时候并没对我照成影响 查看selinux状态 ssh_config和sshd_config的区别 Ubuntu进行ssh连接 1.首先需要安装SSH服务器,在ubuntu终端输…

Java学习路线(19)——IO流(下)

一、缓冲流 1、概念: 一种自带缓冲区的字节流、可提高原始字节流、字符流读写数据的性能。 2、缓冲流高性能原理: 磁盘与内存之间有一块存储区域,当磁盘向内存传输数据时,先传输到缓冲区,当缓冲区满了之后&#xff0…

[强网杯 2019]随便注 1【SQL注入】解析过程

1.首先启动并访问靶机,有一个输入框,随便输入1 or 1 1,测试一下是否存在sql注入。 2.提交后提示error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syn…

chatgpt赋能python:Python中的_--了解这个神秘的下划线

Python中的_ – 了解这个神秘的下划线 Python是一种流行的编程语言,它具有简单易学的语法和强大的功能。一些Python的特殊语法经常会让初学者感到困惑。其中,一个神秘的下划线符号在Python中出现的频率非常高,而且它的含义和使用也非常多样化…

chatgpt赋能python:Python中符号的用法

Python中符号的用法 在Python编程中,符号是非常重要的一部分。通过合理使用符号,我们可以轻松地实现许多功能和操作。下面是Python中一些常用的符号的介绍和用法。 赋值符号 斜杠等于号()被用来赋值。例如,如果我们要…

Windows的Powershell终端增强

Ubuntu上一直用的Oh My Zsh强化终端,体验非常nice。最近在Win上做东西比较多,于是也想把Powershell这个简陋的终端加强一下。 说干就干,网上查了一圈,发现大部分人用Oh My Posh来操作,因此试了一下,发现卡…

UFS 1-UFS架构简介1

UFS 1-UFS架构简介 1 UFS是什么?1.1 UFS1.2 一般特征1.2.1 Target performance1.2.2 Target host applications1.2.3 Target device types1.2.4 Topology1.2.5 UFS Layering 1.3 Interface Features1.3.1 Three power supplies1.3.2 Signaling as defined by [MIPI-…

Linux系统下imx6ull QT编程—— C++类和对象(三)

Linux QT编程 文章目录 Linux QT编程一、类和对象 一、类和对象 C 在 C 语言的基础上增加了面向对象编程,C 支持面向对象程序设计。类是 C 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方…

C++ 函数对象 详解

目录 🤔函数对象: 🤔本质: 🤔特点: 代码示例: 运行结果: 🤔 内置函数对象: 1.算数仿函数 代码示例: 运行结果: 2.关系仿函数 …

四轴姿态解算-imu算法

理论篇 欧拉角四元数方向余弦矩阵 强调三者描述的是坐标系A,A之间的变换关系 欧拉角,四元数,方向余弦矩阵都可以描述四轴的姿态变换 注意这里强调的是变换 三者转换公式 一阶龙格库塔法 核心要点简介: 假设一阶函数随时间关系如: y a * T1b 则,在经…

chatgpt赋能python:Python中-1的用法介绍

Python中-1的用法介绍 什么是-1? 在Python中,-1是一个特殊的索引值,它表示从序列的末尾开始向前数1个元素。这在对于列表、字符串、元组等序列类型进行操作时非常有用。 如何使用-1? 假设我们有一个列表: l [1, …

达梦数据库8安装教程

第一步:双击驱动 注意:如果双击显示没有驱动,则安装WinCDEmu软件。 第二步:双击setup.exe安装包 第三步:选择时区 第四步:验证key文件 因为我们是免费试用,所以没有key文件,直接下一…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,…

【第二节】变量和简单的数据类型

本节将结束python当中的变量和一部分数据类型(字符串和数字),并且介绍一些对应的方法 变量 在上一节的最后我们打印出了hello world print(hello world!)这次我们使用下面的代码实现一样的功能 message = hello world! print(message)可以看到 打印结果一模一样,而我们…

什么是IPAM?如何使用IPAM来管理IP地址和DHCP?

在计算机网络中,IPAM(IP Address Management)是一种用于管理IP地址和DHCP(Dynamic Host Configuration Protocol)的工具或系统。IPAM旨在简化和集中管理IP地址分配、子网划分和DHCP配置等任务。本文将详细介绍IPAM的概…

MVC 接收不到参数? —— 看我如何给你安排得明明白白

文章结构 问题背景:问题处理总结 问题背景: 现有如下代码: PostMapping(value "/payment/create") ResponseBody public CommonResult create(Payment payment) {}乍眼看去是不是很好,至少没啥问题很自然&#xff0c…

关于VUE3的一些基础知识点笔记

关于VUE3的一些基础知识点笔记 VUE3 vue2与vue3的一个重要区别是vue2是选项式API(composition API)而vue3是组合式API(option API)。 组合式API就是所有逻辑都在setup函数中,使用ref、watch等函数来组织代码&#xff…