使用Python将3D网格渲染成图像

6
我正在使用tensorflow开发一个神经网络,通过单张图片进行面部重建。现在我需要找到一种方法,在Python中将这个网络的输出(即3D网格)渲染成图像。大部分库都可以实时进行3D渲染,但是我仅仅需要渲染单帧图像。而且,由于这有可能成为实时网络预处理的一部分(对实时视频应用网络),所以需要快速的解决方案。该网格非常简单,仅包含约30K个顶点和50K个三角形。
3个回答

9
我刚遇到了类似的问题,并使用pyrender及其离屏渲染器解决了它。
请查看此处的最小示例 PyrenderOSMesaSample.ipynb。构建自己的网格并获得场景的渲染RGB非常简单。
更新:这是我的MWE。
import os
# switch to "osmesa" or "egl" before loading pyrender
os.environ["PYOPENGL_PLATFORM"] = "osmesa"

import numpy as np
import pyrender
import trimesh
import matplotlib.pyplot as plt

# generate mesh
sphere = trimesh.creation.icosphere(subdivisions=4, radius=0.8)
sphere.vertices+=1e-2*np.random.randn(*sphere.vertices.shape)
mesh = pyrender.Mesh.from_trimesh(sphere, smooth=False)

# compose scene
scene = pyrender.Scene(ambient_light=[.1, .1, .3], bg_color=[0, 0, 0])
camera = pyrender.PerspectiveCamera( yfov=np.pi / 3.0)
light = pyrender.DirectionalLight(color=[1,1,1], intensity=2e3)

scene.add(mesh, pose=  np.eye(4))
scene.add(light, pose=  np.eye(4))

c = 2**-0.5
scene.add(camera, pose=[[ 1,  0,  0,  0],
                        [ 0,  c, -c, -2],
                        [ 0,  c,  c,  2],
                        [ 0,  0,  0,  1]])

# render scene
r = pyrender.OffscreenRenderer(512, 512)
color, _ = r.render(scene)

plt.figure(figsize=(8,8)), plt.imshow(color);

0

根据您的预期结果,有几个开源和商业选项可供选择。我从您的问题中推断出您已经在利用GPU,并打算利用其性能加速来生成单帧结果。基于这些假设,以下是我的两个首选建议:

1)如果您正在构建概念验证,我建议使用Blender(特别是Lux渲染器)。

  1. 首先使用LuxBlend 2.5导出场景
  2. 将TensorFlow生成的网格几何注入到场景文件中
  3. 调用Lux为每个帧渲染这些动态文件

2)如果您计划开发商业产品,我建议使用nVidia的iRay渲染器。您可以获得SDK访问权限,并利用支持团队的知识来帮助您优化渲染的细节。

如果有任何反馈(或您的GitHub项目),我很乐意修改此答案。

如果我的假设完全错误,这个答案可能会有所帮助:Python的3D场景渲染器 ;-)


0

nVidia的iRay非常出色,但是对于任何渲染引擎来说,50000个三角形以上都是一个严峻的任务。

如果您正在寻找逼真的质量,那么每个渲染需要几分钟,而且只有简单的光源和50000个三角形。

您的照明变得越复杂,过程就会变得越慢。基于简单纹理的阴影渲染速度更快,可以实时完成,结果仅限于UV映射纹理的质量。

您是从单个图像中捕获表面材料,还是将预映射的UV表面材料应用于标准的50000个三角形模型网格?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接