当前位置: 首页 > news >正文

Pytorch3D多角度渲染.obj模型

3D理解在从自动驾驶汽车和自主机器人到虚拟现实和增强现实的众多应用中发挥着至关重要的作用。在过去的一年里,PyTorch3D已经成为一个越来越流行的开源框架,用于使用Python进行3D深度学习。值得庆幸的是,PyTorch3D 库背后的人员已经完成了实现几个常见的 3D 运算符、损失函数和可微渲染 API 的繁琐工作,使 PyTorch3D 更易于访问,更容易开始使用。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

一些关键的 PyTorch3D 组件包括:

  • 用于存储和操作三角形网格的数据结构
  • 三角形网格的高效操作
  • 可微分网格渲染接口

渲染是计算机图形管道中必不可少的构建块,可将 3D 表示 — 无论是网格 (.obj) 还是点云 (.ply)— 转换为 2D 图像。

在这篇文章中,我们将构建有关如何从各种角度渲染 3D .obj 文件以创建 2D 图像的背景知识,如果你需要渲染其他格式的3D模型,可以使用NSDT 3DConvert在线工具将其 转换为.obj模型;我们还将使用 Python 中的 PyTorch3D 构建一个基本的 3D 渲染管线,组件如下所示。

在这里插入图片描述

这篇文章只假设对 3D 文件表示有基本的了解,所以希望每个人都可以访问它:)但是,如果你想了解有关3D重建的更多信息,请查看这个神奇的最新资源列表或斯坦福CS231A 和CS468的课程笔记。

在本文结束时,你将了解如何:

  • 使用 .obj 和 .mtl 文件加载 3D 网格
  • 创建渲染器
  • 渲染网格
  • 可选:使用批处理属性从不同视点高效渲染网格

只是想要代码?整个代码在此 GitHub 存储库 中可用。

让我们开始吧!🎉

1、导入库并初始化参数

我们首先从 pytorch3d 库中导入先决条件库,例如 torch 或 numpy,以及各种实用程序函数和结构。

在这里插入图片描述

最后,第 43 行从 utils.py 导入类参数,从配置文件加载重要的超参数。通常,最好将所有参数写入单个文件并从此特定文件加载它们。这允许你跟踪正在测试的超参数,并查看哪些超参数导致了最佳性能。在我们的例子中,超参数存储在 params_demo.json 中:
在这里插入图片描述

如果不理解其中一些参数的意义,不要担心,我将在本教程的后面部分解释它们!

加载超参数通过以下方式完成:

params = Params(“params_demo.json”)
# Access batch size parameter
print(params.elevation)

初始化 params 对象后,你还可以使用 params.update(‘your_other_params.json’) 方法使用另一个 .json 文件更新它。

好的,现在我们导入了库并声明了参数,可以加载网格了。🎉

2、加载3D网格

有几种方法可以表示 3D 数据,例如点云、网格或体素 。在本教程中,我们将重点介绍 3D 网格,尽管 PyTorch3D 中的相同过程也适用于点云。

有关 3D 纹理网格的信息通常存储在以下文件中:

  • .obj 文件,用于存储顶点和面
  • .mtl 文件,用于存储材料属性
  • .jpg或.png纹理图像

在本教程中,我们将使用存储在 data/capsule文件夹中的 3D 胶囊对象。示例文件是从此处托管的公共存储库获得的。为了可视化我们正在使用的网格,我们可以使用 Blender:
在这里插入图片描述

PyTorch3D 包含多个用于加载 .obj 文件的函数,例如 load_obj 或 load_objs_as_meshes。我们将使用第一个,并使用以下语句加载 .obj 文件:

verts, faces, aux = load_obj(filename)

在这里, verts是顶点的 (V, 3) 张量,faces.verts_idx是每个面顶点索引的 (F, 3) 张量, aux 存储有关网格的辅助信息,例如 UV 坐标、材质颜色或纹理。然后,我们将这些 verts、 faces.verts_idx和 aux传递到 Meshes 构造函数中,该构造函数创建一个名为 capsule_mesh 的对象:
在这里插入图片描述

最后,第 33 行检查胶囊网格中的面和顶点数。这将返回:

We have 5252 vertices and 10200 faces.

这是我们通过检查 .obj 文件结构所期望的。

如果你想了解更多,可以在这里找到 Meshes对象的官方文档。

3、创建渲染器

这可能是最重要的一步。现在我们成功读取了胶囊网格,我们需要使用 MeshRenderer 类创建一个渲染器。查看 MeshRenderer 的文档 ,我们看到它由 2 个组件组成:

  • rasterizer:光栅器
  • shader:着色器

因此,让我们将此任务分解为两个步骤,最后将它们放在一起。

3.1 创建光栅器

栅格化是指采用以多边形或三角形(.obj 文件)描述的图像表示,并将其转换为以像素(.png或.jpg文件)描述的光栅图像。

我们的光栅器是使用一个名为 MeshRasterizer 的类创建的,该类还具有多个子组件,例如 cameras和 raster_setting 参数。基本上,相机负责将3D坐标从世界空间转换为屏幕空间。要初始化相机,我们需要 3 个重要参数。这些是:1) 距离,2) 方位角和 3) 仰角。如果这听起来很多,请不要担心,我将逐步介绍它们。

  • 距离( distance)是指相机与物体之间的距离。
  • 仰角( elevation angle)是指从物体到相机的矢量与水平面y=0(平面xz)之间的角度。 elevation基本上指的是我们从多高的地方看物体。
  • 方位角( azimuth angle)是指从物体到相机的矢量被投射到水平面y=0上。方位角是投影矢量与参考平面(水平面)上 (0, 0, 1) 处的参考矢量之间的角度。方位角取值范围为 0º 到 360º。它基本上告诉我们从哪一侧(例如左侧大小,右侧,前视图,后视图等)查看对象。

在我们的 params.json 文件中,我们声明距离为 3,仰角为 0,方位角为 90,因此如果我们渲染此网格,我们应该直接从 3 个单位的距离查看它。

关于栅格设置,最重要的参数是生成的 2D 图像的大小。尺寸越小,图像的像素化程度就越高。

在这里插入图片描述

3.2 创建着色器

PyTorch3D提供多种类型的着色器,包括 SoftPhongShader或 HardPhongShader。在这里,我们将使用预定义的 SoftPhongShader 并传入相机和要初始化默认参数的设备。

最后但并非最不重要的一点是,我们将光栅器和着色器结合起来:
在这里插入图片描述

4、渲染网格

这是一个非常简单的步骤,因为我们只需要在 Meshes 对象上调用渲染器方法。让我们渲染胶囊网格并绘制结果:
在这里插入图片描述
在这里插入图片描述

渲染的结果看起来与前面图中的 Blender 可视化几乎相同,这是一个好兆头!😃

5、可选:使用批处理属性

如果要从多个视点渲染网格,则使用批处理属性可能很有用。在我们深入研究代码之前,有必要了解当前的批处理实现是如何工作的。

当前实现依赖于单个参数,即批大小。然后,此批大小将仰角和方位角空间划分为 n 个相等的增量。因此,如果你的批大小为 4,那么你的仰角和方位角空间是 torch.linspace(0, 360, 4) 即张量 ([0, 120, 240, 360])。

在每个批次中,索引沿高程和方位角列表移动,并在所有元素耗尽后停止。结果,我们只得到 4 张渲染图片:a) 高度和方位角 = 0;b) 高度和方位角 = 120;c) 高度和方位角 = 240,d) 高度和方位角 = 360。

这类似于 Python的 map() 函数,其中你传递两个可迭代的参数 — 你也不会从这两个参数的所有成对组合中获得结果。因此,如果你希望获得仰角和方位角的所有成对组合,那么像列表理解这样的东西是一种方法。

好了,回到批处理属性…我们将批大小设置为 4,表示要从中渲染网格的视点数。我们使用此批量大小来扩展网格、高程矢量和方位角矢量。渲染图像后,生成的张量具有形状 [4, 256, 256, 4]。
在这里插入图片描述
在这里插入图片描述


原文链接:PyTorch3D多视角渲染 — BimAnt

相关文章:

Pytorch3D多角度渲染.obj模型

3D理解在从自动驾驶汽车和自主机器人到虚拟现实和增强现实的众多应用中发挥着至关重要的作用。在过去的一年里,PyTorch3D已经成为一个越来越流行的开源框架,用于使用Python进行3D深度学习。值得庆幸的是,PyTorch3D 库背后的人员已经完成了实现…...

MyBatisPlus 基础Mapperr接口:增删改查

MyBatisPlus 基础Mapper接口:增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(user);}日志 数…...

计算机网络与技术——概述

😊计算机网络与技术——概述 👻前言🥏信息时代下计算机网络的发展🌏互联网概述📡计算机网络基本概念📡互联网发展三阶段📡互联网的标准化 🌏互联网的组成📡互联网的边缘部…...

详解TCP/IP协议第三篇:通信数据在OSI通信模型的上下传输

文章目录 一:OSI通信模型间数据传输展示 二:应用层到会话层解析 1:应用层 2:表现层 3:会话层...

《C++ primer plus》精炼(OOP部分)——对象和类(2)

“学习是人类成长的喷泉。” - 亚里士多德 文章目录 内联函数对象的方法和属性构造函数和析构函数构造函数的种类使用构造函数析构函数列表初始化 const成员函数this指针对象数组类作用域作用域为类的常量类作用域内的枚举 内联函数 定义位于类声明中的函数自动成为内联函数。…...

一点感受

做了两天企业数字化转型的评委,涉及全国最顶级的公司、最顶级的实际落地项目案例,由企业真实的落地团队亲自当面讲解。主要是为了了解了解真实的一线、真实的客户、真实的应用现状和应用水平。 (1)现状 我评审的涉及底层技术平台&…...

VirtualBox RockyLinux9 网络连接

有几次都是隔一段时间之后启动虚拟机,用第三方ssh工具就连接不上了。 简单记录一下。 1、VirtualBox设置 2、IP设置 cd /etc/NetworkManager/system-connections/ vim enp0s3.nmconnection[connection] idenp0s3 uuid9c404b41-4636-397c-8feb-5c2ed38ef404 typeet…...

java 实现适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类的接口,使得原本不兼容的类可以协同工作。适配器模式包括两种类型:类适配器和对象适配器。下面分别介绍这两种类型的实现方式。 类…...

后端常用的Linux命令大全

后端常用的Linux命令大全 基础常用命令 Sudo Command 该命令是“superuser do”的缩写。sudo 是最常用的命令之一,可让你执行需要管理或 root 特权和权限的任务。 使用sudo命令时系统会提示用户重新使用密码进行身份验证。接下来,Linux 系统将记录一…...

C++面向对象

C面向对象知识 内存字节对齐 #pragma pack(n) 表示的是设置n字节对齐,windows默认是8字节,linux是4字节,鲲鹏是4字节 struct A{char a;int b;short c; };char占一个字节,起始偏移为零,int占四个字节,min(8,4)4&#x…...

什么是栈顶缓存技术

假设有一个基于流水线架构的处理器,它需要执行一系列指令。这些指令包括加载数据、执行计算和存储结果。在流水线中,不同阶段的指令可以并行执行。 现在考虑一个简单的情况,其中需要执行以下两个指令: 加载数据指令:…...

TDesign的input标签

目录 一、 新建页面01-todolist 二、 t-input标签、t-button标签 2.1 t-input标签 2.1.1 01-todolist.wxml页面 2.2 01-todolist.json页面 2.3 01-todolist.js页面 2.4 01-todolist.wxss页面 2.2 t-button标签 示例1:bind:change 示例2:bind:…...

从零开始学习 Java:简单易懂的入门指南之Map集合(二十三)

Map集合 1.Map集合1.1Map集合概述和特点1.2Map集合的基本功能1.3Map集合的获取功能1.4Map集合的遍历(方式1)1.5Map集合的遍历(方式2) 2.HashMap集合2.1HashMap集合概述和特点2.2HashMap集合应用案例 3.TreeMap集合3.1TreeMap集合概述和特点3.2TreeMap集合应用案例 1.Map集合 1…...

SpringBoot 拦截org.thymeleaf.exceptions.TemplateInputException异常

SpringBoot 拦截thymeleaf异常 org.thymeleaf.exceptions.TemplateInputException异常 org.thymeleaf.exceptions.TemplateProcessingE xception: Could not parse as each: "message : xxx " (template: “xxxx” - line xx, col xx) thymeleaf异常复现 你是故意的…...

Qt之随机数

介绍使用qsrand和qrand生成随机数。 生成随机数 生成随机数主要用到了函数qsrand和qrand,qsrand用来设置种子点,该种子为qrand生成随机数的起始值。如果不调用qsrand,那么qrand()就会自动调用qsrand(1),即系统默认将1作为随机数的起始值。使…...

UWB学习——day2

UWB应用 基于上文UWB学习——day1中对UWB技术的相关优势介绍,UWB技术可广泛应用于以下场景。 WPAN(无线个域网) 基于其高精度(亚厘米级)、低功耗和高穿透性等特征,在以人为基础的个域网中应用广泛&#…...

使用 multiprocessing 多进程处理批量数据

示例代码 import multiprocessingdef process_data(data):# 这里是处理单个数据的过程return data * 2# 待处理的数据 data [1, 2, 3, 4, 5]def normal_func():# 普通处理方式result []for obj in data:result.append(process_data(obj)return resultdef parallel_func():# …...

React 与 TS 结合使用时组件传参总结

在学习 React 时,我们总会遇到在 TS 和 JS 之间切换来开发多个项目,而有时会忘记 TS 的语法,所以编写一下 React 结合 TS 开发时的一些总结知识点,以便后续回顾用。 向组件传递基础参数(字符串、数字和布尔值&#xf…...

性能炸裂c++20协程+iocp/epoll,超轻量高性能异步库开发实战

前言: c20出来有一段时间了。其中一大功能就是终于支持协程了(c作为行业大哥大级别的语言,居然到C20才开始支持协程,我也是无力吐槽了,让多少人等了多少年,等了多少青春)但千呼万唤他终于还是来…...

自定义Dynamics 365实施和发布业务解决方案 - 4. 自动化业务流程

本章的主要重点是研究拟议应用程序的关键业务流程的自动化。每个组织每天都有自己独特的业务操作,这些操作是业务的关键部分。有些自动化的业务流程不需要用户交互,有些流程需要用户交互。此外,在某些业务流程中,某些用户操作完成,然后触发自动化流程来完成业务流程。 Dy…...

Lua03——开发环境搭建

1 安装开发插件 在 idea 或 vscode 中安装 lua 的开发插件 EmmyLua 2 创建工程 在 idea 中创建一个新的工程 工程的类型选择 lua 输入工程名及目标目录 在工程结构的SDK中设置lua在本地安装目录 在工程结构的modules中选择 lua 3 编写第一个lua程序 在工程下添加程序包&#…...

Redis 非关系型数据库 配置与优化

关系数据库与非关系型数据库 关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言&#x…...

docker笔记8:Docker网络

1.是什么 1.1 docker不启动,默认网络情况 ens33 lo virbr0 在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡:它还有一个固定的默认IP地址192.168.122…...

C# 共享项目的应用

概述 共享项目也可以称为共享资产项目,它允许在多个目标项目之间共享的代码。 它支持编译器指令,可以有条件地包含特定于平台的代码,以便编译为引用共享项目的项目的子集。 还有 IDE 支持,可帮助管理编译器指令并直观显示代码在每个应用程序中的外观。 什么是共享项目? …...

Linux之基于HTTPS的静态网站

目录 Linux之基于HTTPS的静态网站 定义 SSL协议 使用Apachemod_ssl组件的加密认证网站 mod_ssl模组 安装 配置文件 ssl配置文件的主要参数 案例 案例1 --- 搭建HTTPSSL的加密认证的web服务器 案例2 --- 组建多个子目录的网站www.joker.com,该网站下有2个子…...

ChatGPT在机器人护理和老年人支持中的潜在角色如何?

机器人在护理和老年人支持领域有着巨大的潜力,可以提供多种服务和支持,改善老年人的生活质量,并减轻护理工作者和家庭成员的负担。在这篇文章中,我将探讨机器人在这一领域的潜在角色,包括其应用、优势和挑战。 ## 1. …...

LeetCode:261. 以图判树 - Python

261. 以图判树 问题描述: 给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1: 输入:n 5, …...

Linux目录结构和远程使用

目录名作用根目录 ‘/’文件系统结构的起始点/root系统管理员的工作目录/home普通用户工作目录/bin存放二进制可执行文件,存放最经常使用的命令/sbin系统管理员使用的系统管理程序/boot启动linux时使用的一些核心文件/dev设备文件,包括块设备和字符设备/…...

淘宝销量展示方式变更背后的逻辑

淘宝销量展示方式发生了调整,平台于8月16日将商品详情销量展示表达由【月销**件】全部换成展示【已售**件】,将30天销量改成了近365天销量。 【已售**件】统计口径:统计近365天支付的商品件数,数据更新请关注24-48小时。其中涉及销…...

Bytebase 和 GitLab 签署 Technology Partner 技术合作伙伴协议

Bytebase 和 GitLab 签署技术合作伙伴协议,携手为开发者提供流畅的数据库协作开发和管理体验。 GitLab 是世界领先的开源 AI 驱动 DevSecOps 平台,旨在帮助开发者团队更好协作、更高效交付软件。Bytebase 是一款为 DevOps 团队准备的数据库 CI/CD 工具&a…...

西安市做网站的/十大骗子教育培训机构

前言在Blackhat2018,来自Secarma的安全研究员Sam Thomas讲述了一种攻击PHP应用的新方式,使用phar伪协议可以在不使用unserialize()函数的情况下触发PHP反序列化漏洞,极大地扩展了PHP反序列化的攻击面并且开源了新工具PHPGGC,PHPGGC可以针对十…...

一个网站的二级目录在另一台服务器上_怎么做/百度竞价推广代理商

如何在linux环境下配置pro*c程序预编译参数操作系统:红帽子Linux 2.4.21-4.EL数据库:oracle10g配置步骤:1,在$HOME下建立一个etc目录,在此目录下简历一个配置文件Make.defines文件,编辑该文件,写…...

网站建设的公司名称/谷歌网站

Series 作为cartControl的基本单位来现实图表数据 所以每一个Series代表一种需要显示的类型。 首先实例化一个Series Series _series new Series("处理次数", ViewType.Bar); _series.ArgumentScaleType ScaleType.Qualitative; _series.ArgumentDataMember "…...

免费域名申请网站大全下载/重庆排名优化整站优化

前言一 编程规约 一 命名风格二 常量定义三 代码格式四 OOP规约五 集合处理六 并发处理七 控制语句八 注释规约九 其它 二 异常日志 一 异常处理二 日志规约 三 MySQL数据库 一 建表规约二 索引规约三 SQL语句四 ORM映射 四 工程结构 一 应用分层二 二方库依赖三 服务器 五 安全…...

windows10网站建设/2345中国最好的网址站

官方说这不是错误, 开始安装LNMP时,提示error: package httpd is not installed , error: package php is not installed ,error: package mysql is not installed 这个不是错误信息,这个是检查系统环境,将原系统中的php、apache、mysql删除&…...

狮山做网站/重庆网站排名优化教程

如果你正在使用bash${f%%.mp4}将给出没有.mp4扩展名的文件名.尝试使用它像这样:for f in *.mp4; doffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/${f%%.mp4}.mp3"done…并且不要忘记给出的示例中的do关键字.说明bash手册(man bash)声明&#xf…...