訓練 物理 AI 模型用于驅動自主機器(例如機器人和自動駕駛汽車),需要大量數據。獲取大量多樣化的訓練數據可能很困難、耗時且昂貴。數據通常因隱私限制或問題而受到限制,或者僅僅因為新穎的用例而不存在。此外,可用數據可能不適用于各種潛在情況的全范圍,從而限制了模型準確預測和響應各種場景的能力。
合成數據, 通過計算機模擬從數字孿生中生成,可替代真實數據,使開發者能夠啟動物理 AI 模型訓練。您可以快速生成大量多樣化的數據集,通過改變許多不同的參數,如布局、資產放置、位置、顏色、物體大小和光照條件。然后,這些數據可用于幫助創建通用模型。
實現逼真度對于縮小模擬到現實領域的差距至關重要。該過程旨在使用正確的屬性(例如材料和紋理)表示虛擬環境中的每個對象,以準確地模仿其真實世界的表示。如果沒有人工智能的幫助,這是一個耗時的手動過程。生成式人工智能可以幫助加速從資產創建到代碼生成的過程的許多方面,支持開發者構建穩健且多樣化的訓練數據集。
本文介紹了如何使用 NVIDIA NIM 微服務為 USD 與 NVIDIA Omniverse Replicator 構建自定義合成數據生成(SDG)流程。NVIDIA NIM 是一組加速推理微服務,允許組織在任何位置——云、數據中心、工作站和 PCs 上——在 NVIDIA GPUs 上運行 AI 模型。Omniverse Replicator 是基于 Universal Scene Description(OpenUSD)和 NVIDIA RTX 構建的 SDK。
本文還將介紹如何獲取生成的圖像,并使用示例 ComfyUI 工作流程作為參考管道的一部分進一步增強這些圖像。然后,生成的圖像可用于預訓練模型和工具,例如 TAO、PyTorch 或 TensorFlow。
參考工作流程概述
該工作流程從現有倉庫的 3D 場景開始,該場景包含所有必要的 3D 資產,例如貨架、箱子、托盤等。如需了解有關創建工廠數字孿生的更多信息,請參閱工作流程示例。為了進一步增強 3D 場景,可以使用 3D NIM 微服務添加更多資產,并更改 360 HDRI 背景圖像以實現更多隨機化。

下一步是使用USD Code NIM生成域隨機化所需的代碼,USD Code NIM是一種先進的大型語言模型(LLM),可回答OpenUSD知識查詢并生成 USD-Python 代碼。域隨機化是創建合成數據的強大且必要的步驟。在 Omniverse Replicator 中,許多場景參數可以以編程方式進行更改。
生成帶注釋的合成數據后,我們將執行生成式 AI 增強,使用簡單的提示進一步分散和擴展數據集。
使用 USD NIM 微服務生成場景
USD Code 使您能夠在現有的 3D 開發工作流程中更高效地學習和開發 OpenUSD,只需通過輸入提示并獲得回復。USD Code 既可以回答您的問題,也可以編寫自定義的 OpenUSD Python 代碼。
您可以在 NVIDIA NIM API 目錄中或通過 Visual Studio Code 試用 USD Code,在 Omniverse Kit 中將其用作修改 OpenUSD 階段的示例擴展程序。有關詳細信息,請參閱 USD Code NIM 文檔。
請參閱下面的示例提示以生成代碼:
編寫一個 Python 函數,在給定的 stage 中,在 x 和 y 軸上的 6×5 網格中添加矩形 lights,尺寸為 x:5 和 y:10。每個矩形 lights 的強度應為 5000,曝光值應為 1,大小為 (10,3)。lights 應在 z 軸上對齊,并嵌入在名為 Lights 的 xform 中。
生成的代碼如下所示:
from pxr import Sdf, Usd, UsdGeom, UsdLux def create_rect_lights(stage: Usd.Stage) - > None : """Create a 6x5 grid of rect lights on the x and y axis.""" lights_xform = UsdGeom.Xform.Define(stage, Sdf.Path( "/Lights" )) for i in range ( 6 ): for j in range ( 5 ): light_path = Sdf.Path(f "/Lights/Light_{i}_{j}" ) rect_light = UsdLux.RectLight.Define(stage, light_path) rect_light.CreateIntensityAttr(). Set ( 5000 ) rect_light.CreateExposureAttr(). Set ( 1 ) rect_light.CreateSizeAttr(). Set (( 10 , 3 )) rect_light.AddTranslateOp(). Set ((i * 5 , j * 10 , 0 )) lights_xform.AddChild(rect_light.GetPrim()) |
執行后生成的代碼會在倉庫中按照規定的間距創建并填充 30 個新 lights (圖 2)。此過程可用于添加更多資產 (如 shelves
、boxes
和 forklifts
),以完成場景。

如果您需要其他資產或背景來增強場景,還可以使用使用NVIDIA Edify構建的服務。NVIDIA Edify是一種功能強大的多模態架構,用于構建 AI 模型,用于生成視覺內容,例如 4K 圖像、詳細的 3D 網格、16K 360 HDRi、PBR 材料和視頻。然后,我們會對AI模型進行優化和打包,以通過NVIDIA NIM實現最大性能。這將加速內容創作過程。
借助 NVIDIA Edify 提供支持的 Shutterstock Generative 3D,您可以在 10 秒內通過文本提示或參考圖像生成網格預覽。然后,您可以在幾分鐘內使用 PBR 材質生成可隨時編輯的網格,從而實現快速的布景、概念或原型設計。此外,360 HDRi 生成也由 NVIDIA Edify 提供支持,使用戶能夠使用文本或圖像提示生成 16K 360 HDRi,以生成背景和 3D 場景的照明匹配。
?
Shutterstock Generative 3D APIs 處于商業 beta 階段,可通過 TurboSquid by Shutterstock 進行訪問。
此外,fVDB 是一個開源深度學習框架,可用于使用真實的 3D 數據生成大規模場景,以訓練空間智能。它基于 OpenVDB 構建 AI 運算符,以創建真實環境的高保真虛擬表示,包括 Neural Radiance Fields (NeRF)、從點云進行表面重建,甚至大規模生成式 AI。這些豐富的 3D 數據集都是 AI-ready 的,支持高效的模型訓練和推理。如需了解詳情,請參閱《使用 Deep-Learning Framework fVDB 從真實的 3D 數據構建 Spatial Intelligence》。
生成域隨機化代碼
域隨機化是向數據集添加多樣性的一項重要技術。它是Omniverse Replicator的核心功能之一。您可以以編程方式更改給定場景中的任意數量的變量,包括照明、對象位置、材料和紋理等。創建多樣化的數據集有助于感知模型在許多不同的場景中執行操作。
但是,為大規模領域隨機化編寫代碼可能會很繁瑣,并且會拖慢數據生成的迭代過程。解決方案是什么?利用 USD Code NIM 的強大功能充當 copilot。
本節介紹如何使用 USD Code NIM 生成代碼,以此作為域隨機化的起點。您可以選擇在 Visual Studio Code 中激活 USD Code,也可以直接在任何基于 Omniverse Kit 的應用程序中激活 USD Code,其中 ChatUSD agent 擴展程序可以打開 USD Code 窗口,以便輸入提示。

首先,輸入以下提示:
在開放舞臺中,我想使用一個函數,僅在 x 軸上隨機移動名為 “/Root/RectLight_03” 的光線,距離在 0 到 -20 米之間。
import omni.replicator.core as rep from omni.replicator.core.distribution import uniform import asyncio import omni.kit stage = omni.usd.get_context().get_stage() camera = '/OmniverseKit_Persp' render_product = rep.create.render_product(camera, ( 1024 , 1024 )) def move_light() - > None : pass # Initialize and attach writer writer = rep.writers.get( "BasicWriter" ) writer.initialize(output_dir = "_output" , rgb = True ) writer.attach([render_product]) async def go(num_frames = 10 ): for _ in range (num_frames): move_light() await rep.orchestrator.step_async() asyncio.ensure_future(go())” |

您可以通過限制光線的 Y 和 Z 位置、檢查光線是否具有正確的變換等方法進一步改進這一點。請注意,雖然這是一個迭代過程,但使用 USD Code
作為 copilot 將幫助您比自己編寫代碼更快達成無錯誤代碼。
最終代碼如下所示:
import omni.replicator.core as rep from omni.replicator.core.distribution import uniform from pxr import Usd, UsdGeom, Gf import asyncio import omni.kit stage = omni.usd.get_context().get_stage() camera = '/OmniverseKit_Persp' render_product = rep.create.render_product(camera, ( 1024 , 1024 )) import random def move_light() - > None : """Randomly move the light named "/Root/RectLight_03" between 0 and -20 meters on only the x-axis.""" light_prim = stage.GetPrimAtPath( "/Root/RectLight_03" ) translate_attr = light_prim.GetAttribute( "xformOp:translate" ) if translate_attr: current_translation = translate_attr.Get() new_x = random.uniform( - 20 , 0 ) # random x value between -20 and 0 new_translation = Gf.Vec3d(new_x, current_translation[ 1 ], current_translation[ 2 ]) translate_attr. Set (new_translation) else : new_x = random.uniform( - 20 , 0 ) # random x value between -20 and 0 light_prim.AddAttribute( "xformOp:translate" , Sdf.ValueTypeNames.Float3). Set (Gf.Vec3d(new_x, 0 , 0 )) # Initialize and attach writer writer = rep.writers.get( "BasicWriter" ) writer.initialize(output_dir = "_output" , rgb = True , normals = True , distance_to_image_plane = True , semantic_segmentation = True ) writer.attach([render_product]) async def go(num_frames = 10 ): for _ in range (num_frames): move_light() await rep.orchestrator.step_async() asyncio.ensure_future(go()) |
在 Replicator 腳本編輯器中執行代碼將導致倉庫中的燈光隨機地打開和關閉 (圖 5)。

此示例代碼只是使用 USD NIM
進行域隨機化的眾多示例之一。您可以通過在場景中添加隨機化并增加數據集的多樣性來繼續迭代。您還可以指定 Python 編寫以支持開發可在不同場景中輕松重復使用的輔助函數,從而提高未來運行的效率。
導出帶注釋的圖像
通過在 Replicator 中設置域隨機化,您現在可以導出第一批帶注釋的圖像。Replicator 具有許多開箱即用的annotators,例如 2D Bounding Boxes、semantic segmentation、depth、normals 等。輸出類型 (例如 Bounding Box 或 segmentation) 將取決于模型或用例的類型。可以使用 BasicWriter 將數據導出為基本數據,使用 KITTI Writer 將數據導出為 KITTI,或者使用 custom writers 將數據導出為 COCO。
更重要的是,Replicator 生成的數據可捕捉各種物理交互,如剛體動力學(例如運動和碰撞)或環境中的光線交互方式。圖 6 顯示了可以從 Replicator 導出的帶注釋數據類型示例。

使用 ComfyUI 增強合成數據集
進一步增強合成數據集可以創建新的變體,例如更改背景以及添加額外的紋理和材質細節,所有這些操作都使用文本提示。這樣可以生成廣泛的變體,不僅有益,還可以縮小外觀領域差距,獲得高度逼真的結果。總體而言,在數據集上花費的時間、大型高質量數字資產的負擔,以及在增強階段重新生成新變體的靈活性可節省大量時間。
ComfyUI 是一個基于 Web 的后端和 GUI,用于使用擴散模型構建和執行 pipelines。這是一個功能強大的開源工具,可在 GitHub 上下載。它可以與 SDXL、其他擴散模型或您選擇的 fine-tuned 模型一起使用。更廣泛的社區創建了一個包含額外技術和功能的生態系統,作為 ComfyUI 的節點,您可以將其集成到您的 graphs 中。
如需入門參考,請參閱Generative AI for Digital Twins Guide,以獲取 ComfyUI 圖形。

從高層次上講,該圖形可被視為“programming with models”。區域提示用于指導數據集圖像中的擴散生成輸出。ControlNet 節點接收從法線和分割創建的輪廓圖像。The ControlNets,combined with regional prompting,是控制變異的關鍵因素,同時保留了此數據集一致性的重要結構。
在圖 7 的最右側,即啟動‘queue prompt’后,可以看到增強輸出。輸出是傳統渲染合成數據和增強區域的組合。模型通常能夠從更廣闊的圖像中獲取照明線索和上下文,并對增強區域進行適當的照明或陰影處理。
可以在現有圖像中更改地板類型、物體顏色等詳細信息。以下四個提示的結果圖像如圖 8 所示。
提示 1
白色平鋪 linoleum 地板
綠色閃亮的新 counterbalance 叉車
wooden pallet 淺色 pine wood,softwood
垃圾 container
提示 2
深色開裂的臟混凝土地板
黃色平衡叉車
木托盤(木材為淺色松木軟木)
和黑色垃圾桶
提示 3
開裂的混凝土地板
白色平衡重叉車
木托盤淺色松木,軟木
垃圾容器
提示 4
綠色切口 linoleum 地板
藍色生銹 counterbalance forklift
木托盤淺色 pine wood,softwood
垃圾 container

訓練模型
雖然本文并未明確介紹,但符合邏輯的下一步是訓練計算機視覺模型。您可以啟動 NVIDIA 預訓練計算機視覺模型或選擇您自己的模型。然后,可以使用 NVIDIA TAO 等訓練框架對預訓練模型進行微調。TAO 基于 TensorFlow 和 PyTorch 構建,并使用遷移學習來加速模型訓練過程。與您使用真實數據一樣,您可能必須經過多次迭代才能對模型 KPI 感到滿意。
鑒于您已經有了 pipeline 設置,您可以返回到 3D simulation 環境,通過更改 additional parameters 并使用 ComfyUI workflow 對其進行 augmenting 來生成新數據。自動化 pipeline 減少了生成和 label 新數據所需的時間,而這通常是訓練 models 時的瓶頸。
總結
正如本文所述,您可以使用 NVIDIA NIM 微服務和 NVIDIA Omniverse Replicator 快速輕松地構建自定義合成數據生成流程。然后,您可以使用 ComfyUI 進一步增強生成的圖像。這些生成的圖像隨后可以與預訓練模型和工具,如 NVIDIA TAO、PyTorch 或 TensorFlow 等一起使用。
我們很高興看到您如何使用此工作流開發自己的 SDG pipeline。首先,查看詳細的端到端工作流。
- 訪問?Synthetic Data for AI 和 3D Simulation,獲取更多資源。
- 開發者可以訪問 NVIDIA Omniverse,獲取所有在 Omniverse 上開始開發所需的必備要素。
- 訪問OpenUSD 資源集合,包括 USD 示例和樣本。
- 加入Omniverse 開發者社區。
在 SIGGRAPH 2024 大會上,NVIDIA 首席執行官 Jensen Huang 先生與 Meta 創始人兼首席執行官 Mark Zuckerberg 和 WIRED 高級作家 Lauren Goode 進行了爐邊談話。點播觀看 NVIDIA 在 SIGGRAPH 2024 大會上的爐邊談話和其他會議從?NVIDIA 在 SIGGRAPH 2024?上點播。?
訂閱我們的時事通訊,并在 YouTube、Discord 和 Medium 上關注 NVIDIA Omniverse,保持最新動態。
?