pyrender复现pytorch3d渲染结果

2024-01-18 16:04

本文主要是介绍pyrender复现pytorch3d渲染结果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pyrender复现pytorch3d渲染结果

  • 一、写在前面
    • 1.1 pyrender渲染时间 ≈ 0.02s
    • 1.2 Pytorch3D渲染时间 ≈ 4s
  • 二、pytorch3d的渲染函数
    • 2.1 PyTorch3D 库创建了一个颜色渲染器(color_renderer)对象,并配置了相机、光照和渲染设置。
    • 2.2 PyTorch3D 库创建了一个 OpenGL 透视相机(OpenGLPerspectiveCameras)对象,并配置了相机的姿态。
  • 三、pyrender渲染函数
    • 3.1 关键代码
    • 3.2 完整代码
  • 省流:pyrender用PerspectiveCamera替换pytorch3d的OpenGLPerspectiveCameras,加上相机平移和相机垂直视角即可

一、写在前面

三维结果的可视化是很重要的一个工作,目前的三维渲染库,opendr(早期论文)、pyrender、pytorch3d。在我当前的任务上是要在本地电脑window上制作一个3D标注软件,仅有Cpu,我需要一个相对实时的效果,pytorch3d渲染256x256的图像需要3-5s,pyrender的渲染速度cpu上比pytorch3d快近100倍只需要0.01-0.03s。

1.1 pyrender渲染时间 ≈ 0.02s

在这里插入图片描述

1.2 Pytorch3D渲染时间 ≈ 4s

在这里插入图片描述

参考信息
pyrender 文档
pytorch3d 文档
Converting camera matrices from OpenCV / Pytorch3D #228
why pyrender and pytorch3d cpu render so slow #188
https://github.com/lucasjinreal/realrender
difference between rendering using PyTorch3d and Pyrender #1291

二、pytorch3d的渲染函数

2.1 PyTorch3D 库创建了一个颜色渲染器(color_renderer)对象,并配置了相机、光照和渲染设置。

首先,PointLights 类用于创建光照对象,其中 location 参数指定了光源的位置。在这个示例中,光源位于三维空间的原点 [0.0, 0.0, 3.0]。
然后,RasterizationSettings 类用于配置光栅化(rasterization)的设置,包括图像大小、模糊半径和每像素面片数等。在这个示例中,image_size 参数设置了图像的大小(越大,渲染时间越长),blur_radius 参数设置为 0.0 表示不进行模糊处理,faces_per_pixel 参数设置为 1 表示每个像素只考虑一个面片(整数,越大渲染时间越长)。
接下来,创建 MeshRenderer 对象,其中的 rasterizer 参数使用了 MeshRasterizer 类,并传递了相机和光栅化设置。这意味着渲染器将使用指定的相机和光栅化设置进行渲染。
最后,shader 参数使用了 HardPhongShader 类,并传递了相机和光照对象。这表示颜色渲染器将使用指定的相机和光照设置来应用硬质光照模型。

2.2 PyTorch3D 库创建了一个 OpenGL 透视相机(OpenGLPerspectiveCameras)对象,并配置了相机的姿态。

首先,look_at_view_transform 函数用于生成相机的旋转矩阵 R 和平移向量 T,以实现相机的视角和位置。在这个示例中,函数的参数为 2.7, 0, 0,表示相机所看的目标点在三维空间中的坐标为 (2.7, 0, 0)
然后,创建了一个 OpenGL 透视相机对象 OpenGLPerspectiveCameras,输入旋转矩阵 R 和平移向量 T。这将使用指定的姿态来配置相机。

# Data structures and functions for rendering
import torch
import torch.nn.functional as F
from scipy.io import loadmat
import numpy as npfrom pytorch3d.structures import Meshes
from pytorch3d.renderer import (OpenGLPerspectiveCameras, look_at_view_transform, look_at_rotation, RasterizationSettings, MeshRenderer, MeshRasterizer, BlendParams,PointLights, SoftPhongShader, SoftSilhouetteShader, Textures, HardPhongShader,
)
# from pytorch3d.io import load_objs_as_meshesclass Renderer(torch.nn.Module):def __init__(self, image_size):super(Renderer, self).__init__()self.image_size = image_size# RENDERERMESH_COLOR = [0, 172, 223]# self.dog_obj = load_objs_as_meshes(['data/dog_B/dog_B/dog_B_tpose.obj'])self.mesh_color = torch.FloatTensor(MESH_COLOR)[None, None, :] / 255.0'''BlendParams 类用于控制渲染结果中不同像素之间的混合方式,以产生平滑的渲染效果。在这行代码中,BlendParams 是创建混合参数对象的构造函数,通过传递 sigma 和 gamma 参数来设置混合参数的值。sigma 控制了混合过程中的平滑程度。较大的 sigma 值将产生更加平滑的混合效果,而较小的 sigma 值则会产生更锐利的混合边缘。gamma 控制了混合过程中的权重调整。较大的 gamma 值将增加前景像素的权重,使其在混合中占据更大的比例,而较小的 gamma 值则会减小前景像素的权重,使其在混合中占据较小的比例。'''blend_params = BlendParams(sigma=1e-4, gamma=1e-4)raster_settings = RasterizationSettings(image_size=self.image_size, blur_radius=np.log(1. / 1e-4 - 1.) * blend_params.sigma,faces_per_pixel=100,#细节更多,增加渲染时间# bin_size=None)R, T = look_at_view_transform(2.7, 0, 0) self.cameras = OpenGLPerspectiveCameras(device=R.device, R=R, T=T)# lights = PointLights(device=R.device, location=[[0.0, 1.0, 0.0]])self.renderer = MeshRenderer(rasterizer=MeshRasterizer(cameras=self.cameras,raster_settings=raster_settings),shader=SoftSilhouetteShader(blend_params=blend_params,))lights = PointLights(location=[[0.0, 0.0, 3.0]])raster_settings_color = RasterizationSettings(image_size=self.image_size,blur_radius=0.0,faces_per_pixel=1,)self.color_renderer = MeshRenderer(rasterizer=MeshRasterizer(cameras=self.cameras,raster_settings=raster_settings_color),shader=HardPhongShader(cameras=self.cameras,lights=lights,))def forward(self, vertices, faces, render_texture=False):tex = torch.ones_like(vertices) * self.mesh_color # (1, V, 3)textures = Textures(verts_rgb=tex)mesh = Meshes(verts=vertices, faces=faces, textures=textures)# mesh = Meshes(verts=vertices, faces=faces, textures=self.dog_obj.textures)if render_texture:images = self.color_renderer(mesh)else:images = self.renderer(mesh)return images

三、pyrender渲染函数

3.1 关键代码

调用 PyTorch3D 的look_at_view_transform函数获取相机平移T,相机的投影函数选择透视相机函数PerspectiveCamera,垂直视场角(yfov)设置为 π / 3.0,即 60 度。这意味着相机的视锥体将在垂直方向上覆盖 60 度的视角范围。

R, T = look_at_view_transform(2.7, 0, 0)
camera_translation = T.numpy()
camera_pose = np.eye(4)
camera_pose[:3, 3] = camera_translation
camera = pyrender.PerspectiveCamera(yfov=np.pi / 3.0)

3.2 完整代码

代码会根据 Trimesh 创建一个 pyrender.Mesh 对象,并将其添加到 pyrender.Scene 中。代码还为场景添加了一个透视摄像机和三个定向灯。最后,使用 OffscreenRenderer 渲染场景,并将生成的彩色图像作为 PyTorch 张量返回。

import os
#https://pyrender.readthedocs.io/en/latest/examples/offscreen.html
# fix for windows from https://github.com/mmatl/pyrender/issues/117
# edit C:\Users\bjb10042\.conda\envs\bjb_env\Lib\site-packages\pyrender
# os.environ['PYOPENGL_PLATFORM'] = 'osmesa'
import torch
from torchvision.utils import make_grid
import numpy as np
import pyrender
import trimesh
from pytorch3d.renderer import look_at_view_transformclass Renderer:"""Renderer used for visualizing the SMPL modelCode adapted from https://github.com/vchoutas/smplify-x"""def __init__(self, img_res=224):self.renderer = pyrender.OffscreenRenderer(viewport_width=img_res,viewport_height=img_res,point_size=1)self.focal_length = 5000self.camera_center = [img_res // 2, img_res // 2]def __call__(self, vertices, faces, camera_translation=None, focal_length=None):material = pyrender.MetallicRoughnessMaterial(metallicFactor=0.2,alphaMode='OPAQUE',baseColorFactor=(0.8, 0.3, 0.3, 1.0))R, T = look_at_view_transform(2.7, 0, 0)if np.all(camera_translation == None):# camera_translation = np.array([0.0, 0.0, 50.0])camera_translation = T.numpy()if np.all(focal_length != None):self.focal_length = focal_length[0]mesh = trimesh.Trimesh(vertices[0], faces[0], process=False)# rot = trimesh.transformations.rotation_matrix(#     np.radians(180), [1, 0, 0])# mesh.apply_transform(rot)mesh = pyrender.Mesh.from_trimesh(mesh, material=material)scene = pyrender.Scene(ambient_light=(0.5, 0.5, 0.5))scene.add(mesh, 'mesh')camera_pose = np.eye(4)camera_pose[:3, 3] = camera_translation# fx, fy, cx, cy = camera_matrix[0, 0], camera_matrix[1, 1], camera_matrix[0, 2], camera_matrix[1, 2]# fx = self.focal_length# fy = self.focal_length# cx = self.camera_center[0]# cy = self.camera_center[1]# camera = pyrender.IntrinsicsCamera(fx=fx, fy=fy, cx=cx, cy=cy, znear=1.0, zfar=100)camera = pyrender.PerspectiveCamera(yfov=np.pi / 3.0)scene.add(camera, pose=camera_pose)light = pyrender.DirectionalLight(color=[1.0, 1.0, 1.0], intensity=1)light_pose = np.eye(4)light_pose[:3, 3] = np.array([0, -1, 1])scene.add(light, pose=light_pose)light_pose[:3, 3] = np.array([0, 1, 1])scene.add(light, pose=light_pose)light_pose[:3, 3] = np.array([1, 1, 2])scene.add(light, pose=light_pose)color, rend_depth = self.renderer.render(scene, flags=pyrender.RenderFlags.RGBA)color = color.astype(np.float32) / 255.0return torch.from_numpy(color).float().unsqueeze(0)

省流:pyrender用PerspectiveCamera替换pytorch3d的OpenGLPerspectiveCameras,加上相机平移和相机垂直视角即可

目前看来,pyrender的PerspectiveCamera和pytorch3d的OpenGLPerspectiveCameras两个函数的默认相机配置非常类似。从pytorch3d的源码上看OpenGLPerspectiveCameras继承了FoVPerspectiveCameras函数,默认的fov设置为60。两者很容易替换。

##############################
def OpenGLPerspectiveCameras(znear: _BatchFloatType = 1.0,zfar: _BatchFloatType = 100.0,aspect_ratio: _BatchFloatType = 1.0,fov: _BatchFloatType = 60.0,##degrees: bool = True,R: torch.Tensor = _R,T: torch.Tensor = _T,device: Device = "cpu",
) -> "FoVPerspectiveCameras":

这篇关于pyrender复现pytorch3d渲染结果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619526

相关文章

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

【vulhub】thinkphp5 2-rce 5.0.23-rce 5-rce 漏洞复现

2-rec 1.启动环境  cd /.../vulhub/thinkphp/2-rce # cd进入2-rce靶场文件环境下docker-compose up -d # docker-compose启动靶场docker ps -a # 查看开启的靶场信息 2.访问192.168.146.136:8080网页 3.构造payload http

【漏洞复现】赛蓝企业管理系统 GetJSFile 任意文件读取漏洞

免责声明:         本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规或服务协议。同时,未经授权地访问系统、网络或应用程序可能导致法律责任或其他严重后果。作者不对读者基于本文内容而产生的任何行为或后果承担

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染 一、环境说明二、调用后台接口及List组件渲染三、总结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、调用后台接口及List组件渲染 后台接口及返回数据分析 JSON数据格式如下: {"code": 0,"data": {"total": 6,"pageSize"

深度学习每周学习总结N9:transformer复现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 多头注意力机制前馈传播位置编码编码层解码层Transformer模型构建使用示例 本文为TR3学习打卡,为了保证记录顺序我这里写为N9 总结: 之前有学习过文本预处理的环节,对文本处理的主要方式有以下三种: 1:词袋模型(one-hot编码) 2:TF-I

【爬虫渲染神器】selenium 和pyppeteer 的动态渲染ajax反爬虫

许多网页是动态加载的网页,其中不乏使用了ajax异步技术,那么我们有没有一种渲染工具,直接省略分析过程,模拟浏览器渲染的操作呢,获取到我们想要的内容。当然有,下面我们介绍两种渲染工具的实战使用。 目标网站: http://www.porters.vip/verify/sign/ 点击参看详情页的里面内容。 前一篇文章,我们介绍了,js逆向分析两种方法JS逆向–签名验证反爬虫】sign签名验证