尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于Unreal Engine的世界模型预训练数据自动化生成管线

发布时间:2026/9/8 21:19:36

资讯中心
01
ARTICLE

基于Unreal Engine的世界模型预训练数据自动化生成管线

基于Unreal Engine的世界模型预训练数据自动化生成管线
从Unity到UE再回到UE这几年我在做世界模型预训练数据时踩过不少坑最后绕了一大圈还是回到了Unreal Engine。原因很简单世界模型要的是“可控、可扩展、带精确动作标注”的视频数据而真实世界数据在这三件事上全都不达标。真实视频不可控、不可重复、标注成本极高并且隐私与合规问题一大堆。正好有一个越来越多人在尝试的做法用Unreal Engine搭一套自动化pipeline批量生成action-conditioned video generation所需的预训练数据。这其实就是把游戏引擎当数据工厂把虚拟世界当作一个可以无限重置、任意操控的“数据采集场”。我最近把整套流程完整落地到了自己的项目中从场景搭建、动作参数化、批量渲染到数据清洗与质量验证全都跑通了。这篇博文就把这套基于Unreal Engine的预训练数据构建管线完完整整拆开讲包含我的设计思路、实操步骤、坑点排查以及最终的验证方法。如果你也在为世界模型、视频生成模型或者具身智能搞数据这篇内容应该能帮你节省至少一个月的时间。1. 为什么世界模型需要UE驱动的合成数据管线先讲清楚一个基础问题世界模型World Models到底需要什么样的训练数据它不是简单的“视频越多越好”而是需要“视频帧之间的因果变化可以被动作信号解释”。也就是说模型要学到的是“我做了某个动作世界会如何响应”这个响应就是下一帧、下一段视频的变化。这是action-conditioned video generation的核心逻辑。1.1 真实视频数据的三重困境第一重困境是不可控。真实视频采集时光照变化、天气、相机运动、物体遮挡全是不可控因素。你想让模型专门学习“小车在不同天气下前进”这个因果真实数据里很难找到干净对应关系。第二重困境是不可重复。同一场景无法精确重置到同一状态。机器人实验还可以通过复位机械臂来复现但视频数据不行——物体位置、光影、相机姿态差一点就导致前后样本不一致训练时容易出现伪相关性。第三重困境是标注成本。真实视频要标注action要么人工逐帧标注要么用动捕系统、传感器同步。你可以想象一下给一百万个视频片段标注“左转30度”“加速到2m/s”这类精细动作成本几乎不可接受。而且还要处理隐私、合规、版权问题这些在实际工程里会占用大量时间。1.2 UE管线的比较优势Unreal Engine的优势刚好全部命中这三个痛点。先说可控性UE的场景、光照、物体位置、相机路径全部是参数化的你可以在运行时精确控制甚至可以做到“同一场景、同一光照、同一物体位置只改变动作”生成严格对照的实验数据。再说可重复性UE可以在任意时刻进行场景重置把世界回滚到初始状态。这对构建成对训练数据极其重要。比如你想让模型看到“同一场景在有干扰和无干扰下动作结果的区别”UE一键重置就能办到。然后是自动标注UE在渲染每一帧的同时可以同步输出该帧对应的动作参数、相机位姿、物体状态、深度图、光流图等。这是天然的数据对齐不需要后期手动标注。这个特性对做action-conditioned模型来说几乎是降维打击——真实数据里非常难获得的“像素到动作”的精确对应关系在UE里可以免费得到。1.3 适用场景与边界当然这条路不是所有场景都适用。如果你的目标是让模型理解真实世界的复杂细节比如人的表情变化、真实物理材质反射、社会交互行为UE合成的数据会有domain gap。但如果你的目标是通用机器人操作、自动驾驶决策、游戏AI、以及任何需要“动作-状态转移”关系的场景UE管线就是我目前见过的最优解。我的经验是把UE合成数据当作预训练阶段的“主干数据源”再用少量真实数据做微调效果远好于只用真实数据或只用纯合成数据。这也是为什么现在很多大厂和顶尖实验室都在做“仿真优先、真实微调”的路线。2. 整体设计从场景搭建到数据落盘的数据流水线整体pipeline设计是整套方案中最关键的环节。你不能今天想生成一个场景就手动搭一次明天想换个光照又手动调半天。正确做法是先设计好一套可配置、可扩展、可自动化的流水线把人的干预降到最低。2.1 管线的核心模块划分这套管线我在实际项目中分为五个模块每个模块都是独立解耦的场景生成模块负责加载UE项目、初始化关卡、设置光照与物体布局。动作控制模块负责解析动作脚本把高级动作指令映射为UE内的物体运动、相机运动、物理模拟参数。渲染与数据同步模块负责逐帧渲染视频并同步输出动作标注、深度、光流、法线等辅助数据。数据后处理模块负责视频压缩、清洗、去重、统一分辨率、生成小样本预览。元数据管理模块负责记录样本对应的动作描述、场景参数、渲染参数便于训练时的条件控制。模块解耦可以保证你在任意环节替换方案。比如今天我使用UE内置渲染器明天可以改为路径追踪渲染器今天用Python脚本控制动作明天可以换成强化学习策略模型控制动作。只要模块之间通过标准数据接口通信替换成本很低。2.2 关键技术选型在管线搭建时我最终选定的技术组合如下Unreal Engine版本5.3 LTS。5.x版本的Lumen全局光照和Nanite虚拟几何体在渲染真实感方面远超4.27对于世界模型预训练数据来说视觉质量很关键。控制方式UE-Python插件UnrealEditorPython配合命令行批量执行。用Python编写动作脚本通过引擎的Python Bridge控制Actor运动、相机位置、时间轴播放。渲染方式Movie Render QueueMRQ支持高分辨率抗锯齿、TAA、光线追踪并且能方便地输出多层图像序列深度、法线、光流。数据协议JSON Lines作为动作控制脚本的输入格式每行代表一个数据采集任务包含场景名、动作序列、渲染参数、输出路径。存储格式视频用无损PNG序列存储辅助数据用NPZ或NumPy数组与PNG帧一一对应。这套选型有一个核心原则所有环节都要能被脚本驱动不能在编辑器里手动操作。如果有一个环节需要人工点击你就无法批量生成上千个视频样本。这是pipeline设计和demo项目最本质的区别。2.3 数据schema与存储格式设计数据schema是我在搭建过程中反复迭代的部分。最终采用的设计如下每个“样本”是一个数据样本单元包含一个视频片段、一个动作文件、多个辅助图像序列。视频片段存储为一组PNG序列帧使用8位RGB或16位EXR格式。16位EXR对训练HDR信息丰富的世界模型有利但文件体积较大一般用于最终精调阶段。动作文件为JSON或NumPy数组记录每一帧对应的动作向量包括linear_speed前进方向速度单位m/s。angular_speed转向角速度单位rad/s。camera_pose相机在全局坐标系下的位置和朝向四元数。action_id动作类型ID用于离散动作控制。辅助图像序列包括深度图16位PNG、法线图RGB、光流图RGB可视化HDF5保存稠密光流、实例分割图PNG。这些辅助数据可以显著提升世界模型训练的稳定性尤其在预测物体遮挡和几何形变时非常有用。整个数据集的物理目录结构如下dataset/ scenes/ warehouse_day/ samples/ sample_0001/ rgb/00000.png depth/00000.png flow/00000.flo normal/00000.png seg/00000.png action.json config.json每个样本的action.json记录的是这个样本的视频长度、fps、动作向量数组、场景参数快照。场景参数快照可以让你精确重建训练环境在发现数据问题时回查非常有效。3. 实操过程与核心环节实现这一章节是全文最实操的部分。我以“仓库场景中AGV小车按轨迹行驶并同步录制视频”为例完整拆解每一步的操作以及我在实现时踩过的坑和调整过的细节。3.1 场景搭建与光照控制在UE中的实现第一步是在UE中搭建一个基础场景。我建议不要直接使用UE商城下载的完整项目因为那些场景包含大量无关资产和复杂光照设置会增加渲染负担和不可控性。更好的做法是新建一个空白项目Blank C或Blueprint然后导入你自己需要的静态网格体、材质、纹理。仓库场景我用到了基础地面、货架、箱子、AGV小车模型。小车的运动不需要物理引擎模拟直接通过设置Actor的Location和Rotation来驱动这样可以保证轨迹精确。这个细节很重要——如果你启用物理模拟每次运行时由于物理引擎的微小误差轨迹都会不一样直接影响动作条件和视频内容的一致性。光照方面我使用固定平行光作为主光源方向角度按照场景类型设定。仓库场景我用两盏Directional Light模拟顶部日光与侧面补光配合一个固定天光Sky Light提供环境漫反射。所有的光源都设置成Movable模式但固定位置以便在录制过程中保持光照稳定。如果你需要让世界模型具备光照泛化能力可以在不同批次中调控光源角度和强度。此时光源必须用BP控制并在动作脚本里作为参数传入。我是这样做的在UE的Level Blueprint中暴露一个Custom Event事件名为SetLighting接收Float参数控制光照角度脚本驱动时逐批次修改光照值。还有一个特别容易忽略的地方后处理体积Post Process Volume。建议在场景中加入一个无限范围的后处理体积固定曝光设置。如果不固定曝光自动曝光会让视频在不同光照下亮度突然跳变这个跳变实际上不是世界因果变化而是相机自动曝光的结果会让模型学错东西。3.2 动作参数化与轨迹控制动作参数化是指把动作分解成可写入数据的数值形式。对AGV小车来说我使用两个维度的控制量线速度v和角速度w。给定一个动作序列action_sequence每一帧的更新逻辑如下def update_pose(pose, v, w, dt): pose.yaw w * dt pose.x v * dt * math.cos(pose.yaw) pose.y v * dt * math.sin(pose.yaw) return pose在UE中通过Python执行import unreal actor unreal.EditorLevelLibrary.get_actor_of_class(unreal.Actor) for frame_idx, (v, w) in enumerate(action_sequence): dt 1.0 / fps yaw actor.get_actor_rotation().euler().z w * dt actor.set_actor_rotation(unreal.Rotator(0, 0, yaw), False) dx v * dt * math.cos(math.radians(yaw)) dy v * dt * math.sin(math.radians(yaw)) actor.set_actor_location(actor.get_actor_location() unreal.Vector(dx, dy, 0), False)这里有个关键点必须使用set_actor_rotation和set_actor_location时传入sweepFalse避免物理碰撞影响轨迹。如果你的场景中有静态障碍物并且希望避免穿模那需要采用寻路网格或者离线计算轨迹。我的建议是在生成数据阶段不要过度依赖物理碰撞优先保证轨迹数学上可复现再逐步增加障碍物交互。动作序列本身可以用随机方式生成也可以从人类轨迹记录或RL策略中导出。为了让数据多样性更好我一般在生成每个样本时随机采样v在0.5到3.0m/s之间w在-0.8到0.8rad/s之间并加一定的噪声扰动。这样既保证动作空间被充分覆盖又避免轨迹千篇一律。3.3 视频渲染与动作标注同步渲染和标注同步是整个管线里最容易出问题的一环。如果视频帧和动作标注在时间上没有严格对齐模型训练时会出现动作与画面不匹配后果非常严重。我的实现方式是在Movie Render Queue中关闭“延迟渲染”和“实时渲染丢帧”选项确保每一帧都在确定的时间点被渲染。动作控制脚本则在渲染帧回调中同步动作更新。具体操作是用UE Python的on_frame_rendered回调在该回调中读取当前帧号然后从预先计算好的动作序列中取出对应值设置到Actor上。这里有一个必须避免的坑不要在tick事件中控制Actor位移因为tick受渲染帧率影响在低帧率时会导致动作更新变慢而渲染本身可能会跳过某些帧导致动作序列与视频帧错位。理想方案是把动作更新绑定到渲染帧回调这样渲染一帧更新一次动作。在MRQ设置中我使用的关键参数如下输出分辨率1280x72060fps。世界模型预训练不需要特别高分辨率720p足够同时提高生成速度。输出格式PNG序列。JPEG虽然体积小但有压缩噪声会让模型学习到伪影。抗锯齿TAA8 samples。光线追踪开启反射和阴影质量设为Medium。完全开启路径追踪渲染效果虽好但速度太慢不适用于批量数据生成。输出通道默认Final Color另外勾选Depth、World Normal、Motion Vector、Object ID。Motion Vector输出对于光流计算非常有用可以直接从UE的Motion Vector通道获取像素级光流省掉外部光流模型估算的过程既快又准。这是UE做数据生成的隐藏优势很多做数据管线的团队不知道结果还在用RAFT或者其它光流算法重新估计。3.4 数据后处理与清洗生成完PNG序列和辅助通道后还不能直接丢给模型训练。后处理阶段有几个事情必须要做第一逐帧质量检查。检查所有PNG文件是否完整是否有黑色帧或全白帧。黑色帧往往由渲染资源未加载齐全造成全白帧多发生在相机在场景外或光照参数错误时。脚本会自动统计灰度均值和方差异常帧直接丢弃或者整个样本重生成。第二场景一致性与光照连续性检查。计算相邻帧之间的平均像素差如果差异过大说明场景中发生了跳变例如物体被重置或光照突变这类样本需要隔离删除。第三视频压缩与切割。根据模型训练的需要把长视频切割成5秒到10秒的片段然后要么保留PNG序列要么用ffmpeg压制成无损mp4crf0presetveryslow。分片边界要确保动作序列也被同步切割保持动作帧号从0开始。第四数据集去重。对于动作轨迹相似的样本用感知哈希算法提取每段视频的首帧、中间帧、末帧作为指纹删除重复度过高的样本。这一步骤可以显著减少冗余防止模型在某个特殊轨迹上过拟合。我用的是一个自定义Python脚本把所有样本的metadata写入一个CSV索引文件sample_id,scene,v_start,v_end,w_start,w_end,fps,resolution,frame_count,lighting_angle,depth_channel,normal_channel,flow_channel,action_file这个CSV文件在训练时可以直接作为data loader的索引非常方便。3.5 自动化调度与批量生成自动化程度决定了你能在单位时间内生成多少数据。我的调度方式是使用一个主控Python脚本逐个读取任务清单调用UnrealEditor命令行打开UE项目并执行指定Python脚本生成完关闭进程再启动下一个任务。UE进程每次重启会重新加载场景这可以避免长时间运行导致的内存泄漏和渲染资源异常。下面给出一个任务配置文件示例{ tasks: [ { scene: warehouse_day, num_samples: 1000, fps: 60, resolution: 1280x720, duration_seconds: 5, action_range: { v: [0.5, 3.0], w: [-0.8, 0.8] }, lighting: { sun_angle: 45, sun_intensity: 3.0, sky_intensity: 0.5 }, output_dir: /data/world_model_pretrain/warehouse_day } ] }主控脚本的核心逻辑如下import subprocess import json ue_editor_path C:/Program Files/Epic Games/UE_5.3/Engine/Binaries/Win64/UnrealEditor-Cmd.exe project_path D:/projects/world_model_data_generator/world_model_data_generator.uproject python_script D:/projects/world_model_data_generator/generate_data.py for task in json.load(open(tasks.json))[tasks]: cmd [ ue_editor_path, project_path, -runpythonscript, -script python_script, -task_json json.dumps(task, separators(,, :)), -unattended, -nopause, -nosplash, -nullrhi # 如果需要渲染则不能使用nullrhi这里根据实际情况调整 ] subprocess.run(cmd, checkTrue)这里的一个坑如果需要实际渲染图像不能加-nullrhi因为这会禁用渲染设备。我一般不加这个参数而是直接正常启动编辑器进程然后用-windowed参数窗口化运行。如果需要跑在服务器无显示器环境就用-RenderOffScreen参数。批量生成时的机器配置也很有讲究。我通常用一台双卡GPU服务器每张卡分配一个UE进程并行生成两个任务。CPU核数32以上内存64GB。生成单个5秒720p视频大约需要15到20秒具体取决于场景复杂度。一天下来差不多可以生成1.5万到2万个有效样本这个产量对于预训练数据来说比较可观。4. 数据质量控制与验证数据生成完不意味着可以直接用。没有质检的数据管线就是垃圾进垃圾出训练出来的模型性能再高也只是拟合了噪声。所以要建立一套系统的验证方法确保数据真正对模型有帮助。4.1 视觉多样性验证视觉多样性验证的目的是检查生成数据是否覆盖了足够丰富的环境变化、视角变化和动作变化。最简单有效的指标是使用预训练的CLIP模型对所有视频段的首帧提取图像特征然后计算这些特征在高维空间中的覆盖率。我通常计算以下三个指标特征向量之间的平均余弦距离。距离太小说明数据重复度高多样性不足距离太大说明场景可能不连贯。特征空间的聚类数量。使用KMeans聚类k值从2到20依次测试选取轮廓系数最大的k理想情况是k在8到15之间代表数据有清晰但不过度分散的场景类别。动作空间覆盖度。把每个样本的v和w序列绘制在二维平面上观察是否均匀覆盖整个动作空间。如果发现动作覆盖度不够我会在任务生成阶段主动增加边界采样把v和w分布末端的概率提高。这样能让模型学到极端的动作控制能力。4.2 动作条件一致性验证动作条件一致性是评估数据质量的关键。我们要求同一个场景下如果动作序列相似那么视频帧的演变也应当相似如果动作序列不同则视频内容的差异应当可以被动作差异解释。定量验证方式有两种第一种是像素级自回归一致性检验。取一个样本随机截取前30帧输入一个自回归视频预测模型预测接下来的10帧再与真实后10帧计算PSNR和SSIM。如果数据质量好模型预测结果应当接近真实帧。如果PSNR低到20dB以下需要排查动作标注和视频是否对齐。第二种是光流一致性检验。用UE自带的Motion Vector通道计算出的真实光流与外界光流模型估算的光流求平均端点误差。如果误差大说明视频帧间运动不连续或者存在虚幻引擎渲染特征例如动态模糊导致的运动信息丢失。这时需要关闭动态模糊或调整为更保守的运动向量设置。4.3 预训练效果评估最终标准是让模型在真实下游任务上表现出改进。我是这样做的用生成的数据预训练一个小型视频预测世界模型然后在下游动作条件视频生成任务上微调对比不经过预训练的模型表现。评估指标主要包括FVDFréchet Video Distance、LPIPS、以及动作条件准确率给定动作向量模型生成的目标帧中相关物体运动方向和速度是否正确。这个评估本身要花不少时间但非常必要。只有真正比较过才能确定你的pipeline设置需要往哪个方向迭代。比如我最初批次生成的数据中由于相机运动过于平滑FVD分数很好但动作条件准确率偏低。后来我加大动作幅度多样性并在后续训练中加入更多大角速度样本动作条件准确率才明显提升。这说明数据质量不是单一指标能反映的需要多指标交叉验证。5. 常见问题与排查技巧实录这一章把我在实际落地过程中遇到的高频问题以及排查思路列出来很多来源于社区热词比如“unreal engine is exiting due to d3d device being lost”和“unreal engine ran out of memory”。这些看起来像随机报错其实背后都有明确原因和解决办法。5.1 UE渲染崩溃问题最典型的是d3d device being lost。这个报错本质上是GPU驱动超时导致DirectX设备丢失。常见原因是显存不足、单帧渲染时间过长、驱动版本不稳定。排查步骤我总结如下打开任务管理器查看GPU显存占用。如果接近100%则降低分辨率或关闭光线追踪提高渲染批次数量。检查驱动版本更新到官方稳定版。关闭浏览器等显存占用高的软件。尤其是使用Chrome打开大量标签页时显存消耗很惊人。在UE项目设置中开启DirectX 12的可变速率着色VRS可以在视觉质量损失很小的情况下大幅降低渲染负荷。如果在服务器上遇到该报错尝试更新Windows GPU调度策略把TDR延迟调高到10秒以上。ran out of memory也是很常见的问题。这个报错出现在加载高精度网格、大纹理或长序列渲染时。解决办法首先是增加系统内存其次在UE中启用Texture Streaming Pool把流送池大小限制在合理范围内避免一次性加载过多纹理。还有一个实用技巧在MRQ设置中把渲染分块tiling打开将单帧渲染分成4个块分别渲染再合并可以显著降低单帧显存峰值。还有一种情况是长时间批量生成后UE运行越来越慢最后崩溃。这是因为长时间运行导致内存碎片和资源泄漏。此时需要增加进程重启频率比如每500个样本强制重启一次UE进程。这个操作虽然损失了一点连续性但稳定性提升非常明显。5.2 数据标注不同步问题动作标注和视频帧不同步是我早期最头疼的问题。排查思路是在生成数据时在每一帧旁边额外存储一个debug标注文件记录当前Actor的位姿和动作向量。然后对比视频内容和标注内容是否一致。如果出现不同步大概率原因是Movie Render Queue渲染帧回调与场景更新不在同一个线程。解决办法是使用ue.get_editor_world().exec_python_callback或者绑定on_frame_rendered事件并且在该事件回调中直接修改Actor状态。另外MRQ的temporal sampling可能对帧序号造成偏移。如果设置了sub-sampling或者motion blur的采样偏移实际渲染画面可能对应一个中间时间点的状态而不是精确对应帧号。此时把标注文件中的时间戳设置为frame_idx / fps temporal_offset并在后续训练前对齐时间轴。5.3 生成数据质量不达标的排查如果训练出来的模型不work先不要怀疑模型结构先检查数据质量。我总结的几个常见表现模型生成画面模糊检查是否在渲染时开了动态模糊或者PNG序列有压缩损坏。建议动态模糊置为0。模型学不到动作条件检查动作序列是否在场景中被正确执行。可以先拍摄一个样本的人工校验视频把动作参数渲染成文本叠加在画面上看动作指令和实际运动是否匹配。模型对不同动作生成相同结果说明动作标注没有对画面变化产生影响。可能原因是动作控制量太小例如w的范围太窄导致小车几乎没有转向。需要扩大动作范围或者增强动作向量的统计差异。我还发现一个常见的隐性坑光照不一致。如果在批量生成时某些样本的光照没有重置场景亮度差异会被模型误解为一种额外的“隐式动作”。所以在每次采样前必须显式重置光照参数不能依赖默认值。写在最后做世界模型预训练数据的这条路我从一开始的“手动搭场景、手动录屏、手动标注”进化到现在的全自动化UE管线中间经历了无数个失败样本和崩溃进程。现在回头看最值得投入时间的地方就是pipeline的稳定性和数据质量的自动校验。不要把时间花在手动修补数据上而要把时间花在让自动化管线产出更高、更均匀质量的数据上。我个人在实际操作中最深的一点体会是一开始不要追求高分辨率、高帧率、完美渲染先把数据量跑起来确保动作多样性足够再用辅助通道提高质量。渲染质量可以在第二版迭代中逐步提升而数据的动作条件一致性和覆盖度在没有充足数据量之前说什么都是空谈。另外一个值得推荐的扩展方向是把UE生成的数据和真实数据混合训练再做domain adaptation。我在一个小型实验中发现先在UE数据上预训练再在真实数据上微调最终生成质量比纯真实数据训练高大约15%的FVD改善。这说明合成数据确实能提供很好的先验知识。如果你准备尝试这套pipeline建议从一个小型场景开始比如一个房间加上一个可移动的球体先跑通10个样本的完整流程再逐步扩展到大型场景和更多动作类型。这样一来调试成本和踩坑数量都会少很多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。