Skip to main content

输出与数据类型

输出格式​

格式扩展名类型适用
JPEG.jpg有损RGB(质量可配,默认 85)
PNG.png无损分割、边缘、RGBA
BMP.bmp无压缩调试
EXR.exrHDR float世界法线、高动态范围
NPY.npyNumPy 原始深度、光流、法线(零解析开销)
NPZ.npzNumPy + zlib压缩 NumPy
PFM.pfmFloat32OpenCV 兼容浮点图(仅适用于单通道浮点模态,如深度)
LZ4.lz4快速压缩极速解压,自定义头

另支持 TIFF(8-bit 灰度、32-bit 浮点、32-bit 整型灰度)。传感器专用格式:PCD(LiDAR / 雷达点云)、CSV(IMU,EuRoC 兼容)、TUM(Odometry 轨迹)。

:::info 双轨格式原则 像素模态同时支持两类一次性合法直出:① 无损 canonical 集(NPY / EXR / PNG / LZ4),用于保真 ML 消费;② 合法有损的行业通用格式(如 RGB→JPEG),用于即用交付。请按需选择,引擎不强制只出无损。

注意几类会坏数据的组合(应避免,其中前一类运行时会告警):给非单通道浮点模态选 PFM(输出是垃圾数据);给 8-bit 模态选 EXR(不会有任何精度收益);双通道光流走 EXR(有损)。 :::

格式选择推荐​

用途推荐格式理由
ML 训练(Python 消费)NPY / LZ4NumPy 原生 dtype,零解析;LZ4 压缩省 IO
深度数据(float32)TIFF / NPYTIFF Gray32-float 可直接预览;NPY 零开销
分割 ID(零精度损失)NPY / LZ4 / TIFFuint32 ID 全保留
可视化 / 标注PNG / JPEG通用格式;分割模态输出假彩色,不含原始 ID

输出目录结构​

Saved/IACapture/
├── capture_config.json (采集启动时自动归档本次生效的原始 JSON 配置)
├── capture_report.json (含性能时序、场景关卡/载体信息与传感器实例拓扑)
├── rig_calibration.json (同时启用相机与 IMU 时自动生成)
├── camera_0/
│ ├── RGB/ RGB_000000.jpg, ...
│ ├── GPlanarDepth/ Depth_000000.npy, ...
│ ├── WorldNormal/ WorldNormal_000000.exr, ...
│ ├── metadata/ frame_000000.json, ...
│ └── labels/ frame_000000.json (Box3D)
├── lidar/
│ ├── pointcloud/ pointcloud_000000.pcd, ...
│ └── metadata/ scan_000000.json, ...
├── radar/
│ ├── radar_points/ radar_000000.pcd (或 .npy, 6列: x, y, z, doppler_velocity, rcs, snr)
│ ├── radar_targets/ targets_000000.json (含 range_m, azimuth_deg, elevation_deg, doppler_mps, rcs_dbsm, object_id)
│ ├── metadata/ radar_000000.json (含 world_pose, extrinsics, frame_convention="iso8855")
│ └── RadarMaterialMapping.json
├── imu/
│ ├── data.csv
│ ├── data_groundtruth.csv
│ └── imu_params.yaml
├── odometry/
│ ├── data.tum
│ └── data_groundtruth.tum
└── gnss/
├── data.jsonl
├── data.csv
├── data_groundtruth.jsonl
└── gnss_params.yaml

多相机或多传感器实例时,每个实例各自以该传感器 Actor 的 SensorName(即 capture_config.json 中 sensors.<类型>.instances[].name,如 front_cam/、panorama/、LiDar_top/、imu_center/)作为独立子目录,内部结构同上。

本地可视化复盘看板(Dashboard)​

通过编辑器菜单 Tools ▸ IADataSDG ▸ Open Dashboard 可一键启动本地复盘看板(使用引擎内置 Python,无需另装环境):

  • 配置驱动与按需加载:Dashboard 自动读取输出目录下的 capture_config.json 与 capture_report.json,仅加载和运行本次实际开启的相机模态与传感器管线,未采集的模态与传感器自动跳过。
  • 场景与被采集对象概览:顶部直接展示被采集关卡名称、天气与时间、时钟步长、挂载载体(Pawn / Actor)、语义词表覆盖率、语义分割 Stencil 类别色卡以及 3D 检测目标类别分布。
  • 传感器组件名对齐:相机矩阵、3D 点云卡片与传感器时序图直接显示 capture_config.json 中配置的传感器实例名称、型号/预设与采样率。

启用热红外派生输出时,同一相机下会生成对应的派生子目录:

main_camera/
├── ThermalLWIR/ ThermalLWIR_000000.npy # 主输出(float32)
├── ThermalLWIR_raw16/ ThermalLWIR_raw16_000000.png # 16-bit 定标 PNG
├── ThermalLWIR_preview/ ThermalLWIR_preview_000000.png # ironbow 伪彩(仅供目检)
└── ThermalLWIR_radiance/ ThermalLWIR_radiance_000000.npy # output_unit 未选的那个单位

这样按模态目录遍历的下游脚本不会把派生文件误当主数据读入。

热红外 raw16 解码​

raw16 是 16-bit 灰度 PNG,携带线性温度定标,窗口由 thermal.outputs.raw16_min_c / raw16_max_c 决定(默认 −40…+180 °C):

import numpy as np
from PIL import Image

code = np.asarray(Image.open("ThermalLWIR_raw16/ThermalLWIR_raw16_000000.png"), dtype=np.uint32)

raw16_min_k, raw16_max_k = 233.15, 453.15 # -40 C .. +180 C
T = raw16_min_k + code * (raw16_max_k - raw16_min_k) / 65535.0 # Kelvin

逆推误差为半个量化步长(默认窗口下步长约 0.0034 K)。窗口外的值饱和,不回绕 —— 回绕会把热物体变成冷物体,是热像最糟的失效模式。伪彩预览是给人眼看的,请勿从它反推温度。

逐帧元数据​

每帧每相机写出一个 metadata/frame_{N}.json,包含外参(位置/旋转)与内参(FOV、分辨率、fx/fy/cx/cy):

{
"frame": 0,
"camera_name": "main_camera",
"timestamp": 1234567890.123,
"extrinsics": { "position": {"x":0,"y":0,"z":0}, "rotation": {"pitch":0,"yaw":0,"roll":0} },
"intrinsics": { "fov": 90.0, "resolution_x": 1920, "resolution_y": 1080,
"fx": 960.0, "fy": 960.0, "cx": 960.0, "cy": 540.0 }
}

分割 ID 与读取​

  • InstanceSegmentation:实例 ID 是 component / primitive 级的,不是每个 Actor 一个 ID —— 一个由多个网格组成的 Actor 会得到多个 ID。ID 为 24-bit,在所有相机投影下都无损写出。
  • NPY 读取:分割模态保存为 <u4 (H,W) uint32 ID;PNG 仅为可视化假彩色,不含原始 ID。

全局光流读取示例​

import numpy as np

flow = np.load("global_optical_flow/global_optical_flow_000005.npy") # (H, W, 4) float16
velocity_uv = flow[:, :, :2] # 屏幕位移
validity = flow[:, :, 2] > 0.5 # True = 可靠(非遮挡)
masked_flow = velocity_uv * validity[:, :, np.newaxis]
OpticalFlowGlobalOpticalFlow
内容仅可动物体速度相机 + 物体运动
静态场景 + 移动相机全零非零(含相机运动)
遮挡处理无有效性掩码(通道 2)
依赖r.VelocityOutputPass=1深度模态(自动启用)

:::note Oodle 注意 Oodle 为 Epic 私有编解码器,Python 生态无标准解码库,适合 UE 内部管线消费,不建议直接交付给 ML 团队。 :::