nvdiffrast的MeshRenderer

  1. 获取输入:
    • vertex: 顶点坐标,大小为(B, N, 3)
    • tri: 面片索引,大小为(B, M, 3) 或 (M, 3)
    • feat(可选): 顶点features,大小为(B, C)
  2. 计算NDC(标准设备坐标)投影矩阵,用于投影到图像平面。
  3. 将顶点坐标转换到同质坐标(加1维,方便后续运算)。
  4. 用NDC投影矩阵将顶点坐标转换到NDC空间。
  5. 创建渲染上下文ctx,根据usage_opengl标志选择CPU或GPU实现。
  6. 如果面片索引是list格式,先转换为连续tensor。
  7. 调用dr.rasterize,根据顶点和面片信息生成raster化的图像。
  8. 调用dr.interpolate,从raster化结果和原顶点信息中插值,计算深度图。
  9. 如果有顶点features,也调用dr.interpolate生成渲染图。
  10. 将结果转换为适合网络输入的格式(NCHW)。
  11. 返回:
    • mask: 根据有效像素生成的掩码图
    • depth: 渲染的深度图
    • image(可选): 渲染的特征图

这样通过神经网络可微分的运算,实现了不同iable的3D mesh渲染,可以将其接入网络进行端到端的训练。

  • 首先,将顶点从三维坐标转换为齐次坐标,即在顶点的最后一维添加一个1,然后将顶点的y坐标取反,这是因为顶点的y方向和图像的v方向是相反的。
  • 然后,将顶点乘以一个归一化设备坐标(NDC)的投影矩阵self.ndc_proj,这个矩阵可以将顶点从相机坐标系转换到NDC坐标系,这是一个[-1, 1]的立方体空间,用于后续的光栅化过程。
  • 接着,创建一个光栅化的上下文self.ctx,这是一个用于执行光栅化和插值的类,它可以选择使用OpenGL或CUDA的实现,根据self.use_opengl的值来决定。
  • 然后,根据三角形的形状,判断是使用范围模式还是实例模式,范围模式是指每个批次的顶点和三角形的数量都不同,实例模式是指每个批次的顶点的数量相同,但三角形的数量不同。如果是范围模式,就需要计算每个批次的三角形的起始索引和数量,并将它们存储在ranges中,然后将每个批次的顶点和三角形拼接起来,得到一个大的顶点和三角形的张量。
  • 然后,将三角形的类型转换为整数类型,并保证它们是连续的,这是为了方便后续的光栅化运算。
  • 接着,调用dr.rasterize函数,传入顶点、三角形、分辨率和范围(如果有的话),得到一个光栅化的输出rast_out,这是一个(B, H, W, 4)的张量,其中B是批次的数量,H和W是分辨率的高度和宽度,4是每个像素的属性,包括三角形的索引、重心坐标和覆盖度(是否被遮挡)。
  • 然后,调用dr.interpolate函数,传入顶点的z坐标、光栅化的输出和三角形,得到一个插值的输出depth,这是一个(B, H, W, 1)的张量,表示每个像素的深度值,然后将它的维度交换,得到一个(B, 1, H, W)的张量。
  • 接着,根据光栅化的输出的覆盖度,计算出一个遮罩mask,这是一个(B, 1, H, W)的张量,表示每个像素是否被三角形覆盖,然后将深度值乘以遮罩,得到一个只有覆盖区域有深度值的张量。
  • 然后,判断是否有特征输入(如顶点颜色),如果有的话,就再次调用dr.interpolate函数,传入特征、光栅化的输出和三角形,得到一个插值的输出image,这是一个(B, H, W, C)的张量,表示每个像素的特征值,其中C是特征的维度,然后将它的维度交换,得到一个(B, C, H, W)的张量,然后将特征值乘以遮罩,得到一个只有覆盖区域有特征值的张量。
  • 最后,返回遮罩、深度和特征(如果有的话),这些都是用于生成人脸图像的重要信息。

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

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

相关文章

C++ 模板保姆级详解——template<class T>(什么是模板?模板分哪几类?模板如何应用?)

目录 一、前言 二、 什么是C模板 💦泛型编程的思想 💦C模板的分类 三、函数模板 💦函数模板概念 💦函数模板格式 💦函数模板的原理 💦函数模板的实例化 🍎隐式实例化 🍉显式实…

21. 合并两个有序链表 --力扣 --JAVA

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 判断特殊情况,如:两个列表中其中一个为空;创建一个初始节点用于返回;通过while循环来逐个遍历链表&#xff0…

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

RT-DETR 添加注意力机制 ! 本来想多发一些自己的个人魔改,但是有些同学还是需要一些基础的注意力改进,那么大家可以先用这篇文章的代码,我同样给大家提供了很多的模板。 文章目录 RT-DETR 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码…

【STM32】TIM2的PWM:脉冲宽度调制--标准库

注意点: TIM_Period---->指要进行比较的值Compare TIM_Prescaler----> 指要进行分频的值【分频值/原始时钟值】 PWM是一种周期固定,脉宽可调整的输出波形。 https://www.cnblogs.com/brianblog/p/7117896.html 0.通用寄存器输出 1.捕获/比较通道…

面向萌新的技术博客入门指南

Python之禅 在Python的解释器中隐藏一个彩蛋,输入import this就会返回19条Python之禅,具体如下: import this The Zen of Python, by Tim Peters Python之禅 ,by Tim Peters Beautiful is better than ugly. 优美好于丑陋&…

clouldcompare工具使用

文章目录 1.界面1.1 布局1.3 视觉显示方向1.4 放大镜1.5 建立旋转中心2.快速入门2.1 剪裁2.2 多点云拼接 1.界面 1.1 布局 参考:https://blog.csdn.net/lovely_yoshino/article/details/129595201 1.3 视觉显示方向 1.4 放大镜 1.5 建立旋转中心 2.快速入门 2.1 …

开源:特殊的垄断

免责声明:本博客旨在分享我对开源策略的理解和体会,不代表任何组织或机构的立场或观点,也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏,也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

open clip论文阅读摘要

看下open clip论文 Learning Transferable Visual Models From Natural Language Supervision These results suggest that the aggregate supervision accessible to modern pre-training methods within web-scale collections of text surpasses that of high-quality crowd…

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛。 虽然很简单的一个功能,但是网…

如何使用ArcGIS Pro制作个性三维地形图

制作三维地图制作的多了,想着能不能换个“口味”,恰好看见制作六边形蜂窝图,灵光一闪,想着将二者结合,将平滑的三维地形图改成柱状图,从结果来看还可以,这里将制作方法分享给大家,希…

Leetcode2833. 距离原点最远的点

Every day a Leetcode 题目来源:2833. 距离原点最远的点 解法1:贪心 要使得到达的距离原点最远的点,就看 left 和 right 谁大,将 left 和 right 作为矢量相加,再往同方向加上 underline。 答案即为 abs(left - rig…

Windows 安装 Maven

目录 安装 JDK下载 Maven配置阿里云镜像配置环境变量 安装 JDK Windows 安装 JDK 下载 Maven 下载地址:https://maven.apache.org/download.cgi 下载 apache-maven-3.9.5-bin.zip 到本地解压到 D:\Software\apache-maven-3.9.5 配置阿里云镜像 配置阿里云远程仓…

docker更改存储目录原因及方案

为什么一定要将docker的存储目录挂载到其他目录 docker在安装时默认存储目录在/var/lib/docker,而该目录是在系统盘下的。docker安装后,会使用各种各样的镜像,动辄几个G,那么如此多的镜像文件,装着装着系统盘就撑爆了…

Halcon WPF 开发学习笔记(4):Halcon 锚点坐标打印

文章目录 专栏前言锚点二次开发添加回调函数辅助Model类 下集预告 专栏 Halcon开发 博客专栏 WPF/HALCON机器视觉合集 前言 Halcon控件C#开发是我们必须掌握的,因为只是单纯的引用脚本灵活性过低,我们要拥有Halcon辅助开发的能力 锚点开发是我们常用的…

【笔记】结合P02项目——maven继承与聚合

maven的继承关系 P02项目大概是这个样子,下图展示的是其父工程 父工程配置了parent依赖springb-boot-starter-parent,子工程配置其parant为父工程 子工程引用common子工程 maven的版本锁定 管理子工程的版本号问题 父工程添加dependencyManageMent…

P6入门:项目初始化3-项目详情之记事本Notebook

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

机器学习——实践

目录 一、数据集划分 1、交叉验证 2、不平衡数据的处理 代价敏感学习 二、评价指标 三、正则化、偏差和方差 为什么要标准化/归一化? 过拟合的处理——Dropout 过拟合的处理——Early stopping 过拟合的处理——数据增强 偏差和方差 ​编辑 一、数据集划分…

设计模式案例(二)

系列文章目录 第一章 设计模式案例 (一) 第一章 设计模式案例 (二) 文章目录 系列文章目录前言一、责任链模式case 包 二、策略模式case 包 三、工厂模式case 包 前言 上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解&#xff0…

ida81输入密码验证算法分析以及破解思路

本文分析了ida81对输入密码的验证流程,分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析,并尝试找一些可利用的破绽。很遗憾,由于水平有限,目前也只是有个思路未能完全实现&#xff0c…

【C++】单例模式【两种实现方式】

目录 一、了解单例模式前的基础题 1、设计一个类,不能被拷贝 2、设计一个类,只能在堆上创建对象 3、设计一个类,只能在栈上创建对象 4、设计一个类,不能被继承 二、单例模式 1、单例模式的概念 2、单例模式的两种实现方式 …