使用 ZYNC 自动进行图像渲染

本教程为您介绍如何使用 ZYNC 自动化 3D 渲染,ZYNC 是一种用于在 Google Cloud Platform (GCP) 上部署 3D 渲染的服务。本教程是自动化物联网机器学习的配套教程,其中一些步骤不适用于其他工作流。

工程师、建筑师、视觉效果艺术家和研究人员处理的大量几何图形数据,通常以 OBJ、FBX 和 Alembic 等格式存储。虽然这些数据集具有可视化、模拟或机器学习 (ML) 的巨大潜力,但为这些资源创建可视化库的过程可能既复杂又耗时。在给定数百或数千个单独模型时,确保图 1 所示的一致样式非常具有挑战性。

一致渲染的 3D 资源合集。
图 1:由 Andrew Averkin 提供的一致渲染 3D 资源的集合。

想象一下,如果您可以使用简单、可重复的模板获取每个资源并进行渲染?或者您可以自动化该过程,只需更改文本文件即可渲染新资源?

通过针对多个资源完成自动化渲染过程,您可以维护稳定的动画和照明环境、按照惯例命名,并采用一致的方式填充元数据。数据生成后即会很好地组织整理,这样即可满足自动化机器学习训练或其他应用需要添加了标签的结构化资源的要求。

在本教程中,您将学习如何 1) 使用文件模板按照流程构建 3D 场景,以及 2) 使用 ZYNC Python API 对其进行渲染。ZYNC 渲染农场支持热门的 Digital Content Creation (DCC) 软件包,也可以通过 Python API 访问。

渲染术语

“渲染”是视觉效果制作流水线中的通用工作单元。 “进行渲染”是指计算场景文件以生成图像。“运行渲染”是指将场景文件发送到渲染农场,该农场中有许多机器,每个渲染一帧,即计算此帧的数据并渲染此帧。

目标

  • 按照流程根据几何图形库中的数据生成图像。
  • 向 ZYNC 提交大量作业以在 GCP 上进行渲染。
  • 构建一个简单的 YAML 脚本来执行重复性任务。

费用

本教程使用 ZYNC Render,并且根据所用的软件、渲染程序和机器类型按分钟结算费用。同步资源和渲染存储在 Cloud Storage 中。如需了解详情,请参阅 ZYNC 价格页面

您可使用 ZYNC 价格计算器,根据您的预计使用情况来估算费用。本教程使用的默认配置使用 Maya/Arnold 在类型为 zync-16vcpu-32gb 的抢占式实例上进行渲染。GCP 新用户可能有资格申请免费试用

使用本教程的默认配置、渲染分辨率和软件选择,每个部分的渲染费用约为 $4.00。使用 ZYNC 渲染时,这三个部分的费用约为 $12.00,以下为费用明细:

费用明细

准备工作

本教程需要从可运行 ZYNC 客户端应用并具有图形显示的计算机进行 shell 访问。您可以使用 Mac OS 上的终端,Windows 上的 PowerShell 或 Compute Engine Windows Server 实例上的远程桌面协议从本地工作站运行。

Windows 注意事项:本教程需要 Linux 或类似 Linux 的环境和命令行界面。在 Windows 上,请使用 Cygwin 或 PowerShell 等工具。

设置

  1. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  2. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

  3. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  4. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %}设置 GCP Console 项目。

    设置项目

    点击即可执行以下操作:

    • 创建或选择项目。
    • 为该项目启用{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}所需的{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}。
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • 创建服务帐号。
    • 下载 JSON 格式的私钥。
    • {% dynamic endif %}

    您可以随时在 GCP Console 中查看和管理这些资源。

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %}启用{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}所需的{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}。 {% dynamic endif %}

    启用{% dynamic if "," in setvar.api_list %} API{% dynamic else %} API{% dynamic endif %}

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  5. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}
  6. 安装并初始化 Cloud SDK
  7. 克隆包含项目脚本的本教程的 git 代码库:
    git clone https://github.com/GoogleCloudPlatform/automating-zync-renders

    生成的目录 automating-zync-renders 即为您的工作目录。

  8. 在继续下一步之前导航到您的工作目录:
    cd automating-zync-renders
  9. 要在安装之前隔离您的环境,请运行 virtualenv
    virtualenv --python=python2.7 env
    source env/bin/activate

    详细了解 virtualenv

  10. 确保在您的环境中安装了所有必需的 Python 软件包:
    pip install -r requirements.txt
  11. 注册您的免费 ZYNC 帐号并预留 ZYNC 网址。
    1. Google 项目 ID 字段填写第一步中创建的项目 ID。如果您忘记了此 ID,可以查找 ID
    2. 根据您的姓名、公司名称或其他一些唯一标识符确定唯一的 ZYNC 网址。为您分配的网址格式为 [NAME].zync.io
    3. 注册后,您的网址需要几分钟后才能使用。
  12. 将 ZYNC Python API 下载到您的工作目录。记下目录路径,因为稍后在更新配置文件时将用到它。为确保本教程的兼容性,此处包含特定的提交版本。将 [NAME] 替换为您在注册 ZYNC 帐号时选择的唯一网址:
    git clone https://github.com/zync/zync-python
    cd zync-python
    git checkout 927ea857782a0e3245cff3470f749892e572c55c
    echo 'ZYNC_URL = "https://[NAME].zync.io"' > config.py
  13. 在本地工作站上下载、安装和启动 ZYNC 客户端应用

如果您导航到 ZYNC 注册过程中预留的 https://[NAME].zync.io 网址,则可以在我的帐号 > 使用情况下的按作业细分面板中跟踪 ZYNC 使用情况。

如需详细了解如何配置和设置 ZYNC 项目,请参阅 ZYNC 的文档页面

分解制作流水线

您无需访问 3D 软件即可完成本教程,但如果您没有访问权限,则无法修改资源或环境。本教程的存储区包含最初在 Autodesk Maya 中创建的文件,可以在 rigs 目录中找到。

如果要修改渲染环境或具有其他软件要求,则必须修改流水线以适应应用之间的差异。

图 2 展示了渲染流程的概览。

渲染制作流水线
图 2:渲染制作流水线。

了解组件

每个资源都在相同的环境中渲染。此环境包含许多模板或绑定的组合。每个模板文件都位于 rigs 目录下的工作目录中,并且采用 mayaAscii 格式,即 Maya 的原生人类可读文件格式。环境包括以下绑定。

模板或绑定 文件名 说明
基本模板 base_scene_template.ma 一个空的 Maya ASCII,用于执行字符串替换以引用摄像机绑定、灯光绑定和每个单独的资源。
摄像机绑定 cam_rig.ma 包含动画摄像机的 Maya ASCII 文件。
灯光绑定 light_rig.ma 包含无缝环境背景和三种灯光的 Maya ASCII 文件。此文件还包含配置为执行 Arnold 渲染的渲染设置。

准备模型

在此示例中,您将使用基于随机机械零件合集(即 kitbash)的 3D 几何图形资源库(“零件”)。每个模型的 3D(方向、缩放比例和位置)世界空间放置必须保持一致,以使灯光和摄像机绑定以相同的方式处理每个零件。请参阅图 3,查看三个资源的一致渲染示例,以及它们在世界空间中的位置。

渲染制作流水线
图 3:三个准备渲染的资源。顶行:线框视图。底行:最终渲染图像。每个资源都以原点为中心,具有一致的灯光和缩放比例。

要准备模型以进行渲染,必须确保每个零件满足以下要求:

  • 保存在各自的文件中。
  • 遵循一致的命名惯例。
  • 以原点为中心。
  • 尺寸比例与其他零件一致。

本教程中包含的所有文件都满足这些要求。

在 GCP 上进行身份验证

创建服务帐号密钥,使本地工作站上的 ZYNC 能够与 GCP 通信。

  1. Console 中,转到 API 和服务 > 凭据下的凭据页面。
  2. 选择创建凭据 > 服务帐号密钥

    创建凭据

  3. 输入以下值。填写服务帐号名称时,系统会自动填充服务帐号 ID,但您可以将其修改为您选择的其他值。

    • 服务帐号New service account
    • 服务帐号名称zync-api
    • 角色Storage Admin

      要设置角色,请点击选择角色,向下滚动列表到存储,然后选择存储管理员

    • 服务帐号 IDzync-api

    • 密钥类型JSON

    凭据值

  4. 点击创建。JSON 文件将下载到本地工作站。将 JSON 文件移动到工作目录的根目录。

更新配置文件

您的流水线运行 Python 脚本,该脚本读取位于工作目录中的 YAML 配置文件。配置文件包含所有文件的路径,包括身份验证文件和其他 ZYNC 以及项目特定设置。

  1. 在工作目录中,找到 projectData.config-template 模板配置文件。

  2. 为工作目录中的配置文件创建副本,并将其重命名为 projectData.config

    cp projectData.config-template projectData.config
    

了解配置文件

示例配置文件中的某些默认值需要使用您的用户数据、本地路径和文件名来填充。要运行本教程,您必须修改以下设置的默认值:gcp_projectbase_pathauth_filezync_lib_path

以下列表按照变量在 projectData.config-template 配置文件中显示的顺序显示变量:

gcp_project
您在本教程中使用的 Cloud 项目 ID。
base_path
工作目录的绝对路径。
auth_file
在 GCP 上进行身份验证时生成的授权文件的相对或绝对路径。
zync_lib_path
设置期间安装的 ZYNC Python API 的绝对路径。
scene_template
base_scene_template.ma 的相对路径。
camera_rig
cam_rig.ma 的相对路径。
light_rig
light_rig.ma 的相对路径。
scene_dir
写入合并场景文件的目录的相对路径。生成这些文件后,它们将上传到 ZYNC 进行渲染。
image_dir
写入最终渲染图像的目录的相对路径。
parts_dir
包含单个几何图形文件的目录的相对路径。
parts
要遍历的单个几何图形文件名(仅名称,无路径)列表。

运行渲染

正确填充配置文件后,使用 render.py 脚本启动第一项 ZYNC 渲染。从命令行导航到项目目录并启动渲染:

cd automating-zync-renders
./render.py --config projectData.config

首次运行脚本时,系统可能会提示您在浏览器中对 Google 帐号进行身份验证。

render.py 脚本会生成输出,详细说明分解制作流水线中描述的流程。请注意,默认日志记录级别设置为 4 (INFO)。您可以使用 --verbose 标志替换默认日志记录级别以提供更多输出。如需了解详情,请使用 --help 标志。

监控渲染

运行脚本后,导航到 ZYNC 注册过程中预留的 https://[NAME].zync.io 网址来验证作业是否正在运行。ZYNC 最多需要五分钟来部署和分配渲染实例。实例列在机器面板中,如图 4 所示。

ZYNC 控制台
图 4:ZYNC 控制台。

提交作业进行渲染后,ZYNC 客户端应用会将文件从本地工作站上传到 Cloud Storage。您可以在作业详细信息面板以及日志标签下的 ZYNC 客户端应用中查看上传进度。

运行 render.py 脚本后,您将看到三个 ZYNC 渲染作业。每个作业都在渲染不同零件的 1-1000 帧,零件提取自 projectData.config 中的 parts 下的 Alembic 文件列表。

ZYNC 允许您按需启动任意数量的作业,并根据资源可用性和作业优先级自动对作业进行排队。在本教程中,您使用 Python API 将作业提交至 ZYNC。您还可以使用其他热门 3D 应用提交作业。您可以一次启动所有作业,也可以一次启动一个作业。

如需详细了解 ZYNC,请阅读其文档

渲染自己的几何图形

要在此流水线中渲染自己的几何图形,您需要访问可以导出为 Alembic 格式的 3D 应用。请按照以下步骤操作:

  1. 按照准备模型中的说明准备零件。
  2. 将模型以 Alembic 格式导出到 parts 目录。
  3. 重命名零件目录中的所有导出文件,以遵循以下命名惯例:part#.abcrender.py 脚本将接受任意长度的零件号。小于 1000 的数字会填充为四位数。
  4. projectData.config 中用您自己的 Alembic 文件名替换默认的零件列表。
  5. 按照运行渲染中的说明进行操作。

将最终渲染结果推送到 Cloud Storage

渲染完成后,ZYNC 客户端应用会自动将它们下载到 images/[PART_NAME] 下的工作目录中。

提交作业时,将使用名称 gs://[PROJECT-ID]-renders 创建 Cloud Storage 存储分区。


  1. 整个帧范围完成渲染和下载后,导航到 images 目录并使用 gsutil 将图像目录复制到存储分区:

    cd images/
    
    gsutil -m cp -r [PART-NAME] gs://[PROJECT-ID]-renders/
    

    例如:

    gsutil -m cp -r part01 gs://cad-iot-ml-renders
    
  2. 您还可以使用 gsutilrsync 功能将 images 目录中的所有目录上传到渲染存储分区:

    gsutil -m rsync -r . gs://[PROJECT-ID]-renders
    

问题排查

本教程同时依赖本地工作流和云工作流,因此某些步骤可能无法按预期正常完成。本部分介绍了一些常见问题以及应对方法。

工作目录

本教程的大部分内容都以您在设置部分的第 5 步中创建的工作目录为基础。虽然一些附带的脚本可以同时处理绝对路径和相对路径,但像 projectData.config 这样的文件依赖于相对路径来定位 ZYNC Render 部署所需的文件和绑定。

您必须确保:

  • 下载后,工作目录中的所有内容均保留在工作目录中。
  • 您有权读取和写入工作目录,以及在工作目录中创建新目录。

确保安装了 Python 库

render.py 脚本需要许多 Python 库才能运行。这些库列在 requirements.txt 中并在设置部分的第 8 步中进行安装。要确保正确安装这些库,请打开 Python shell 并键入以下内容:

from google.cloud import storage
import yaml

如果没有返回错误,则这些库已存在。如果这些库不存在,您将看到错误消息,例如:

ImportError: No module named yaml
ImportError: cannot import name storage

render.py 中的身份验证错误

如果在运行 render.py 脚本时遇到身份验证错误,请确保在 GCP 上进行身份验证时创建的密钥具有唯一的服务帐号名称。重复使用服务帐号名称可能导致身份验证失败。

提交 ZYNC 作业时出错

如果在运行 render.py 脚本时遇到 ZYNC 连接错误,例如:

zync.ZyncConnectionError: ZYNC is down at URL: https://[NAME].zync.io

请检查以下各项:

  • 在浏览器中导航到您的 ZYNC 网址,验证网址已启动并正在运行。
  • 按照设置部分第 9 步中的说明,检查 config.pyZYNC_URL 的值是否与 ZYNC 网址完全相同。

未找到文件

如果在 ZYNC 提交过程中遇到 'Files not found' 错误,请确保工作目录中的所有文件均可读。

查看渲染日志

在 ZYNC 控制台中,每个子作业(“分块”)都列在任务面板中:

查看渲染日志

日志列下,点击 maya 链接以查看关联分块的日志输出。如果渲染失败,请先查看渲染日志。

系统不下载渲染结果

每个分块完成后,ZYNC Render 会自动尝试将渲染图像下载到本地工作站。如果您将计算机置于休眠状态,退出 Google 帐号或退出 ZYNC 客户端应用,渲染作业将继续,渲染帧将存储在 ZYNC 帐号的存储空间中。当您重新连接、重新登录或启动 ZYNC 客户端应用时,ZYNC 会重新开始下载帧。

如果下载作业失败,您可以通过以下方式强制重新下载分块:

  1. 点击任务面板左侧列中的复选框,选择要下载的分块。
  2. 点击右上角任务下的菜单,然后选择重新下载任务

    重新下载任务

监控 ZYNC 活动

本地工作站和 ZYNC Render 之间的所有通信均通过 ZYNC 客户端应用进行。您可以选择 ZYNC 客户端应用中的日志标签来查看 ZYNC 活动日志:

ZYNC 活动日志

清理

为避免因本教程中使用的资源而导致系统向您的 Google Cloud Platform 帐号收取费用,请执行以下操作:

  1. 在 GCP Console 中,转到“项目”页面。

    转到“项目”页面

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除 ZYNC 资源

当任务完成、终止或遇到错误时,ZYNC 部署的实例将会被自动删除。删除这些资源无需任何操作。

删除存储的数据

同步资源和完成的渲染存储在 Cloud Storage 中,并按月计费。在删除数据之前,您需要为存储空间付费。如果您不再需要在 ZYNC 上保留项目数据,可以从 ZYNC 网页控制台的我的帐号页面项目标签中将其删除。

退出 virtualenv

如果您使用了 virtualenv,请在 shell 中输入 deactivate 来退出此临时环境。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Solutions