NuRec usage issues

Hi, I encountered a problem with inserting external entities. When using NuRec’s gRPC to insert external dynamic objects, the insertion failed.
USDZ files generated using official data can be inserted normally, but USDZ files generated using my own sensor data cannot be inserted, although there is no error message.

environment

system:

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.6 LTS
Release:        20.04
Codename:       focal

Graphics card driver version

NVIDIA-SMI 550.127.08             Driver Version: 550.127.08     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA A100 80GB PCIe          Off |   00000000:34:00.0 Off |                    0 |
| N/A   77C    P0            311W /  300W |   63391MiB /  81920MiB |    100%      Default |
|                                         |                        |             Disabled

cuda version:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Feb_27_16:19:38_PST_2024
Cuda compilation tools, release 12.4, V12.4.99
Build cuda_12.4.r12.4/compiler.33961263_0

The following are the instructions or codes designed during the operation.

instructions

Generate NuRec Auxiliary Data

docker run --shm-size=2g -it --rm --gpus '"device=7"' \
  -e NGC_API_KEY=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 \
   --volume / NuRec/data/docker/dataset:/workdir/dataset \
   --volume / NuRec/data/docker/output:/workdir/output \
   nvcr.io/nvidia/nre/nre-tools-ga:latest \
   --dataset-path=/workdir/dataset/yj/tj/my_custom_drive_001.json \
   --output-dir=/workdir/output/yj/tj \
   --store-meta \
   --no-seg-logits \
   --lidar-seg-camvis

Reconstruct

docker run --shm-size=64g --rm --gpus '"device=7"' \
  -e NGC_API_KEY=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 \
  --volume / NuRec/data/docker/dataset:/workdir/dataset \
  --volume / NuRec/data/docker/output:/workdir/output \
  nvcr.io/nvidia/nre/nre-ga:latest \
  mode=train \
  out_dir=/workdir/output/reconstruction/yj \
  --config-name=configs/apps/prod/Hyperion-8.1/car2sim_6cam.yaml \
  dataset.path=/workdir/dataset/yj/my_custom_drive_001.json \
  dataset.camera_ids=[cam_back] \ #  Change based on USDZ
  dataset.lidar_ids=[lidar_back] \ # Change based on USDZ
  dataset.aux_data=True 

Use Asset Harvester Output in Reconstructions

docker run --shm-size=64g -it --rm --gpus '"device=7"'  \
  --net=host \
  --privileged \
  --volume / NuRec/data/docker/output:/workdir/output \
  --volume / NuRec/data/docker/dataset:/workdir/dataset \
  nvcr.io/nvidia/nre/nre-ga:latest \
  export-external-assets \
  --artifact-path /workdir/output/reconstruction/yj/SMZcLV7gPsq5ApwsySUeas/artifacts/last.usdz \
  --external-assets-dir /workdir/dataset/harvester/customer/0 \
  --output-edit-file /workdir/output/render-harvester/edit_assets.json \
  --output-artifact-path /workdir/output/render-harvester/reconstruction-bj-2.usdz

External entity check(Both used the same external entity)

  1. Huggingface data generation
  2. Own sensor data generation

gRPC service startup command:

docker run --shm-size=64g -it --rm --gpus all  \
    -e CUDA_VISIBLE_DEVICES=7  \
    --net=host  \
    --privileged  \
    --volume /NuRec/data/docker/output:/workdir/output \
      nvcr.io/nvidia/nre/nre-ga:latest \
      serve-grpc  \
    --host="0.0.0.0"  \
    --port=1001  \
    --artifact-glob /workdir/output/render-harvester/reconstruction-n-pure.usdz  \
    --test-scenes-are-valid \
    --enable-editing-actors \
    --no-enable-nrend 

API call Insert code

Summary
import asyncio

import grpc.aio
import numpy as np
from scipy.spatial.transform import Rotation as R

from nre.grpc.protos.common_pb2 import (
    Empty, Pose, Vec3, Quat, Trajectory, PoseAtTime, AABB
)
# Import generated gRPC code
from nre.grpc.protos.sensorsim_pb2 import (
    RGBRenderRequest,
    PosePair,
    ImageFormat,
    EditAssetsRequest,
    DynamicObjectTrack,
    CameraSpec
)
from nre.grpc.protos.sensorsim_pb2_grpc import SensorsimServiceStub


def se3_to_grpc_pose(matrix_4x4):
    """
    Convert a 4x4 SE3 matrix to a gRPC Pose object.
    
    Args:
        matrix_4x4 (np.ndarray): 4x4 transformation matrix (Rig to World or Camera to World)
        
    Returns:
        Pose: gRPC Pose object with vec (translation) and quat (rotation)
    """
    translation = matrix_4x4[:3, 3]
    rotation_matrix = matrix_4x4[:3, :3]
    quat = R.from_matrix(rotation_matrix).as_quat()  # (x, y, z, w)
    
    return Pose(
        vec=Vec3(x=float(translation[0]), y=float(translation[1]), z=float(translation[2])),
        quat=Quat(x=float(quat[0]), y=float(quat[1]), z=float(quat[2]), w=float(quat[3]))
    )

class TrajectoryController:
    def __init__(self, host='10.102.1.70', port=1001):
        self.host = host
        self.port = port
        self.channel = None
        self.stub = None
        
    async def connect(self):
        self.channel = grpc.aio.insecure_channel(f'{self.host}:{self.port}')
        self.stub = SensorsimServiceStub(self.channel)
        print(f"Connected to SensorsimService at {self.host}:{self.port}")

    async def get_scenes(self):
        response = await self.stub.get_available_scenes(Empty())
        return response.scene_ids


    async def add_dynamic_vehicle(self, scene_id, track_id, trajectory_points, asset_id):
        """
        Adds a dynamic vehicle (NPC) to the scene with a specific trajectory.
        
        Args:
            scene_id (str): Scene ID
            track_id (str): Unique ID for this vehicle instance
            trajectory_points (list): List of {'timestamp_us': ..., 'pose': 4x4 matrix}
            asset_id (str): The model to use for the vehicle
        """
        poses_at_time = []
        for pt in trajectory_points:
            poses_at_time.append(PoseAtTime(
                pose=se3_to_grpc_pose(pt['pose']),
                timestamp_us=pt['timestamp_us']
            ))
            
        track = DynamicObjectTrack(
            id=track_id,
            semantic_class="automobile",
            asset_id=asset_id,
            trajectory=Trajectory(poses=poses_at_time),
            object_size=AABB(size_x=4.5, size_y=1.8, size_z=1.5), # Approximate sedan size
        )

        request = EditAssetsRequest(
            scene_id=scene_id,
            insert=[track]
        )
        
        response = await self.stub.edit_assets(request)
        if response.success:
            print(f"Successfully added dynamic obj '{track_id}' to scene.")
        else:
            print(f"Failed to add dynamic obj: {response.message}")
        return response

    async def close(self):
        if self.channel:
            await self.channel.close()

def generate_linear_trajectory(start_pos, end_pos, duration_s, fps=100):
    """
    Helper to generate a simple straight line trajectory.
    """
    num_frames = int(duration_s * fps)
    trajectory = []
    
    for i in range(num_frames):
        alpha = i / (num_frames - 1)
        current_pos = start_pos + alpha * (end_pos - start_pos)
        
        # Simple identity rotation (looking forward along X axis)
        pose = np.eye(4)
        pose[:3, 3] = current_pos
        
        trajectory.append({
            'timestamp_us': int(i * (1e6 / fps)),
            'pose': pose
        })
    return trajectory

async def main():
    controller = TrajectoryController()
    await controller.connect()
    
    scenes = await controller.get_scenes()
    if not scenes:
        print("No scenes available.")
        return
    
    scene_id = scenes[0]
    
    #  Add an NPC vehicle moving across the scene
    npc_start = np.array([5, 5, 0])
    npc_end = np.array([5, -5, 0])
    npc_traj = generate_linear_trajectory(npc_start, npc_end, duration_s=2.0, fps=5)
    
    await controller.add_dynamic_vehicle(scene_id, "0", npc_traj, '0')
    
    await controller.close()

if __name__ == "__main__":
    asyncio.run(main())

API call query code

Summary
import asyncio

async def query_all_available_objects(host='10.102.1.70', port=1001):
    """
    Query all available external objects
    """
    import grpc.aio
    from nre.grpc.protos.sensorsim_pb2_grpc import SensorsimServiceStub
    from nre.grpc.protos.common_pb2 import Empty
    from nre.grpc.protos.sensorsim_pb2 import (
        AvailableTrajectoriesRequest,
        AvailableCamerasRequest,
        AvailableDynamicObjectsRequest,
        ExternalAssetObjectsRequest
    )

    channel = grpc.aio.insecure_channel(f'{host}:{port}')
    stub = SensorsimServiceStub(channel)

    try:
        print("=" * 60)
        print("All available external objects and services")
        print("=" * 60)

        # 1. Get available scenes
        print("\n1. Available scenes")
        print("-" * 40)
        scenes_response = await stub.get_available_scenes(Empty())
        if scenes_response.scene_ids:
            for i, scene_id in enumerate(scenes_response.scene_ids):
                print(f"   [{i}] Scene ID: {scene_id}")
        else:
            print("   No available scenes")

        if not scenes_response.scene_ids:
            print("\nNo available scenes, cannot query other objects")
            return

        scene_id = scenes_response.scene_ids[0]
        print(f"\nUsing scene: {scene_id} for detailed query")

        # 2. Get available trajectories
        print("\n2. Available trajectories")
        print("-" * 40)
        traj_req = AvailableTrajectoriesRequest(scene_id=scene_id)
        traj_response = await stub.get_available_trajectories(traj_req)
        if traj_response.available_trajectories:
            for i, traj_info in enumerate(traj_response.available_trajectories):
                poses_count = len(traj_info.trajectory.poses)
                print(f"   [{i}] Trajectory ID: {traj_info.trajectory_idx}")
                print(f"       Pose count: {poses_count}")
                if poses_count > 0:
                    first_pose = traj_info.trajectory.poses[0]
                    last_pose = traj_info.trajectory.poses[-1]
                    print(f"       Time range: {first_pose.timestamp_us}μs - {last_pose.timestamp_us}μs")
        else:
            print("   No available trajectories")

        # 3. Get available cameras
        print("\n3. Available cameras")
        print("-" * 40)
        cam_req = AvailableCamerasRequest(scene_id=scene_id)
        cam_response = await stub.get_available_cameras(cam_req)
        if cam_response.available_cameras:
            for i, cam in enumerate(cam_response.available_cameras):
                print(f"   [{i}] Camera logical ID: {cam.logical_id}")
        else:
            print("   No available cameras")

        # 4. Get dynamic objects
        print("\n4. Dynamic objects")
        print("-" * 40)
        dynamic_req = AvailableDynamicObjectsRequest(scene_id=scene_id)
        dynamic_response = await stub.get_dynamic_objects(dynamic_req)
        if dynamic_response.dynamic_objects:
            for i, obj in enumerate(dynamic_response.dynamic_objects):
                print(f"   [{i}] Object ID: {obj.id}")
                print(f"       Asset ID: {obj.asset_id}")
                print(f"       Semantic class: {obj.semantic_class}")
        else:
            print("   No dynamic objects")

        # 5. Get external asset objects
        print("\n5. External asset objects")
        print("-" * 40)
        assets_req = ExternalAssetObjectsRequest(scene_id=scene_id)
        assets_response = await stub.get_external_asset_objects(assets_req)
        if assets_response.track_ids:
            for i, track_id in enumerate(assets_response.track_ids):
                print(f"   [{i}] ID: {track_id}")
        else:
            print("   No external asset objects")

        # 6. External service information
        print("\n6. External services")

        print("\n" + "=" * 60)
        print("Query completed")
        print("=" * 60)

    except Exception as e:
        print(f"error: {e}")
    finally:
        await channel.close()

async def main():
    await  query_all_available_objects()


if __name__ == "__main__":
    asyncio.run(main())

The USDZ generated by HuggingFace can be used to query inserted dynamic objects, but the USDZ of free data cannot be queried.
I don’t know what the problem is. I hope you can take a look. Thank you.

For your own-sensor-data USDZ, please share:

  • edit_assets.json produced by export-external-assets — does it actually contain track entries, or is the AssetBank empty?

  • serve-grpc stderr at startup — look for an AssetBank initialized with N track assets log line.

  • The harvester output directory you passed to --external-assets-dir — does metadata.yaml exist and point at valid .ply files?

  • Number of cameras used in reconstruction: you used cam_back + lidar_back only on a 6-cam config. Single-camera reconstructions often produce degraded external-asset geometry, which can cause them to be skipped at bake time.

Hi, the only difference in the entire execution process lies in the data source and the configuration file during reconstruction (car2sim_6cam.yaml for Huggingface data, and _base_3dgut_dynamic_road_semantic.yaml for proprietary data), while other processes are the same.

  1. edit_assets.json
Summary
{
  "metadata": {
    "output_artifact_path": "/workdir/output/render-harvester/reconstruction.usdz",
    "external_assets_metadata": [
      {
        "track_id": "0",
        "label_class": "output",
        "cuboid_dims": [
          0.6380726099014282,
          0.6982676982879639,
          1.7431278228759766
        ]
      }
    ]
  },
  "replace": [],
  "remove": [],
  "insert": {
    "asset_ids": [],
    "data": {}
  }
}
  1. export-external-assets

    metadata.yaml
assets:
  '0':
    cuboids_dims:
    - 0.6380726099014282
    - 0.6982676982879639
    - 1.7431278228759766
    label_class: output
    ply_file: gaussians.ply
  1. serve-grpc
  • startup logs
Summary
[2026-05-06 06:28:27,513][INFO] serve-grpc args (nre_version=26.2.158-2b8da993):
{
  "host": "0.0.0.0",
  "port": 1001,
  "artifact_glob": "/workdir/output/render-harvester/reconstruction-bj.usdz",
  "test_scenes_are_valid": true,
  "enable_editing_actors": true,
  "enable_nrend": false,
  "health_port": null,
  "enable_difix": false,
  "difix_url": "https://api.ngc.nvidia.com/v2/org/nvidia/team/nre/models/nurec-fixer/versions/cosmos_3dgut/files/cosmos_3dgut.pt",
  "difix_cache": "~/.cache/nre/difix",
  "difix_model_filename": "cosmos_3dgut.pt",
  "difix_resolution": [
    576,
    1024
  ],
  "ray_chunk_size": 4611686018427387904,
  "egocar_hood_dir": null,
  "download_cache_dir": "~/.cache/nre/downloaded_scenes",
  "download_cache_size": 5,
  "max_workers": 1,
  "cache_size": 10,
  "metrics_output_dir": null,
  "enable_timing": false,
  "timing_verbosity": "BASIC",
  "timing_logfile": null,
  "timing_synchronize": false,
  "profiling_backend": "NONE"
}
[2026-05-06 06:28:27,513][INFO] Starting grpc server with grpc_config.max_workers=1 and cache_size=10 (LRU with OOM retry)
[2026-05-06 06:28:27,525][INFO] Scene cache initialized in /home/.cache/nre/downloaded_scenes with max size 5
[2026-05-06 06:28:27,525][INFO] Identifying as self.version_id=version_id: "26.2.158"
git_hash: "2b8da993"
grpc_api_version {
  patch: 1
}

[2026-05-06 06:28:27,528][INFO] Available scenes: ['my_custom_drive_001'].
[2026-05-06 06:28:27,528][INFO] Available egocar masks: EgocarRigBank().
[2026-05-06 06:28:27,532][INFO] BackendCache initialized with LRU eviction: maxsize=10, OOM retry enabled
[2026-05-06 06:28:27,532][INFO] Testing gathered scenes...
[2026-05-06 06:28:27,532][INFO] Creating new backend for my_custom_drive_001 from /workdir/output/render-harvester/reconstruction-bj.usdz
[2026-05-06 06:28:28,729][INFO] Config v26.2.158 is already compatible with NuRec v26.2.158, no upgrade needed
[2026-05-06 06:28:28,783][INFO] Using renderer: 3dgut-nrend
[2026-05-06 06:28:28,815][INFO] World Size: 1
[2026-05-06 06:28:28,815][INFO] Node Count: 1
[2026-05-06 06:28:28,815][INFO] Device Count per Node: 1
[2026-05-06 06:28:28,815][INFO] Log every 50 steps
[2026-05-06 06:28:29,139][INFO] GaussiansComposite/__init__
[2026-05-06 06:28:29,179][INFO] FreePoseCalib: calib OFF for cameras
[2026-05-06 06:28:29,179][INFO] FreePoseCalib: calib OFF for lidars
[2026-05-06 06:28:29,179][INFO] FreePoseCalib: enable_torch_compile=True
[2026-05-06 06:28:29,180][INFO] SkyEnvMapBackground: min_grad_updates=1000
[2026-05-06 06:28:29,204][INFO] LayerTrackIds: Initializing track filtering from 0 available tracks
[2026-05-06 06:28:29,214][INFO] SHGaussianModel/progressive_training: increase_frequency=1000 increase_step=1
[2026-05-06 06:28:29,220][INFO] LayerTrackIds: Initializing track filtering from 0 available tracks
[2026-05-06 06:28:29,227][INFO] SHGaussianModel/progressive_training: increase_frequency=1000 increase_step=1
[2026-05-06 06:28:29,235][INFO] LayerTrackIds: Initializing track filtering from 0 available tracks
[2026-05-06 06:28:29,244][INFO] LayerTrackIds: Initializing track filtering from 0 available tracks
[2026-05-06 06:28:29,246][INFO] call/n_frames_per_camera: [144]
[2026-05-06 06:28:29,246][INFO] call/n_frames_per_lidar: []
[2026-05-06 06:28:29,246][WARNING] Single camera training with per-camera bilateral grids may reduce quality! It's recommended to disable per-camera bilateral grids in this configuration.
[2026-05-06 06:28:29,246][INFO] Creating bilateral grid with 1 frames
[2026-05-06 06:28:29,248][INFO] call/n_frames_per_camera: [144]
[2026-05-06 06:28:29,248][INFO] call/n_frames_per_lidar: []
[2026-05-06 06:28:29,248][INFO] Creating bilateral grid with 144 frames
[2026-05-06 06:28:29,250][INFO] GSplatStrategy/densify:
[2026-05-06 06:28:29,250][INFO]     |─start_iteration=500
[2026-05-06 06:28:29,250][INFO]     |─end_iteration=15000
[2026-05-06 06:28:29,250][INFO]     └─frequency=300
[2026-05-06 06:28:29,250][INFO] GSplatStrategy/prune:
[2026-05-06 06:28:29,250][INFO]     |─start_iteration=500
[2026-05-06 06:28:29,250][INFO]     |─end_iteration=15000
[2026-05-06 06:28:29,250][INFO]     └─frequency=100
[2026-05-06 06:28:29,251][INFO] GSplatStrategy/reset_density:
[2026-05-06 06:28:29,251][INFO]     |─start_iteration=0
[2026-05-06 06:28:29,251][INFO]     |─end_iteration=15000
[2026-05-06 06:28:29,251][INFO]     └─frequency=3000
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.positions> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.scales> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.rotations> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.densities> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.features_albedo> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.features_specular> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.extra_signal> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.camera_extra_signal> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.lidar_extra_signal> in the state_dict.
[2026-05-06 06:28:29,260][INFO] Gaussian3DNRenderer: enable_ray_based_culling: True
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.positions> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.scales> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.rotations> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.densities> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.features_albedo> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.features_specular> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.extra_signal> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.camera_extra_signal> in the state_dict.
[NuRec::NRend][WARNING] ::: NRESHGaussianModel : missing parameters tensor <.lidar_extra_signal> in the state_dict.
[2026-05-06 06:28:29,268][INFO] Gaussian3DNRenderer: enable_ray_based_culling: True
[2026-05-06 06:28:34,582][INFO] Model v$26.2.158 is already compatible with NuRec v26.2.158, no upgrade needed
[2026-05-06 06:28:35,069][INFO] AssetBank initialized with 1 track assets: ['0']
[2026-05-06 06:28:35,408][INFO] ...done testing gathered scenes.
[2026-05-06 06:28:35,931][INFO] Serving on 0.0.0.0:1001 (health on same port)
[2026-05-06 06:29:57,257][INFO] get_available_scenes
[2026-05-06 06:29:57,263][INFO] get_available_trajectories
[2026-05-06 06:29:57,270][INFO] get_available_cameras
[2026-05-06 06:29:57,277][INFO] get_dynamic_objects for scene my_custom_drive_001
[2026-05-06 06:29:57,307][INFO] get_external_asset_objects
[2026-05-06 06:30:24,113][INFO] get_available_scenes
[2026-05-06 06:30:24,123][INFO] edit_assets for scene my_custom_drive_001
[2026-05-06 06:31:05,230][INFO] get_available_scenes
[2026-05-06 06:31:05,237][INFO] get_available_trajectories
[2026-05-06 06:31:05,243][INFO] get_available_cameras
[2026-05-06 06:31:05,248][INFO] get_dynamic_objects for scene my_custom_drive_001
[2026-05-06 06:31:05,261][INFO] get_external_asset_objects
  • Client log
1.USDZ data query
  4. Dynamic objects
  ----------------------------------------
     No dynamic objects
  5. External asset objects
  ----------------------------------------
2.Insert Dynamic Objects Response
  Connected to SensorsimService at 10.100.1.10:1001
  Successfully added dynamic obj '0' to scene.
3.USDZ data query after dynamic objects are inserted.
  4. Dynamic objects
  ----------------------------------------
     No dynamic objects
  5. External asset objects
  ----------------------------------------
     [0] ID: 0
  1. Reconstruct,the rebuild command was not clearly described; different data sources used different commands.
  • HuggingFace
docker run --shm-size=64g --rm --gpus '"device=7"' \
  --volume /NuRec/data/docker/dataset:/workdir/dataset \
  --volume /NuRec/data/docker/output:/workdir/output \
  nvcr.io/nvidia/nre/nre-ga:latest \
  mode=train \
  out_dir=/workdir/output \
  --config-name=configs/apps/prod/Hyperion-8.1/car2sim_6cam.yaml \
  dataset.path=/workdir/dataset/02a6f330-5ab0-4e92-99d4-d19e406952f4/pai_02a6f330-5ab0-4e92-99d4-d19e406952f4.json \
  dataset.camera_ids=[camera_front_wide_120fov,camera_cross_left_120fov,camera_cross_right_120fov,camera_rear_left_70fov,camera_rear_right_70fov] \
  dataset.lidar_ids=[lidar_top_360fov] \
  dataset.aux_data=True
  • own-sensor-data
docker run --shm-size=64g --rm --gpus '"device=7"' \
  --volume /NuRec/data/docker/dataset:/workdir/dataset \
  --volume /NuRec/data/docker/output:/workdir/output \
  nvcr.io/nvidia/nre/nre-ga:latest \
  mode=train \
  out_dir=/workdir/output/reconstruction/yj/tj \
   --config-name=configs/apps/AV/_base_3dgut_dynamic_road_semantic.yaml \
  logger.enabled=False \
  logger.name=dummy \
  dataset.path=/workdir/dataset/yj/tj/my_custom_drive_001.json \
  dataset.camera_ids=[cam_front] \
  dataset.lidar_ids=[lidar_middle] \
  dataset.aux_data=True \
  checkpoint.artifact.enabled=True

Hi,the following is the processing procedure based on the render-grpc method, and the result is the same as that of the API method.

  1. edit_assets.json
Summary
{
  "insert": {
    "asset_ids": [
      "0"
    ],
    "data": {
      "cuboidtracks_data": {
        "cuboids_dims": [
          [
            0.6380726099014282,
            0.6982676982879639,
            1.7431278228759766
          ]
        ]
      },
      "tracks_data": {
        "tracks_flags": [
          "DYNAMIC|CONTROLLABLE"
        ],
        "tracks_id": [
          "outpu_0"
        ],
        "tracks_label_class": [
          "person"
        ],
        "tracks_poses": [
          [[
              14.3984375,
              -7.52734375,
              1.2021484375,
              0.000243431466515176,
              0.0005167925264686346,
              0.9997815489768982,
              0.02089492231607437
            ],
            [
              14.3984375,
              -7.52734375,
              1.2021484375,
              0.000243431466515176,
              0.0005167925264686346,
              0.9997815489768982,
              0.02089492231607437
            ]
          ]
        ],
        "tracks_timestamps_us": [
          [
            -63599,
            36645
          ]
        ]
      }
    }
  },
  "metadata": {
    "external_assets_metadata": [
      {
        "cuboid_dims": [
          0.6380726099014282,
          0.6982676982879639,
          1.7431278228759766
        ],
        "label_class": "person",
        "track_id": "0"
      }
    ],
    "Aoutput_artifact_path": "/workdir/output/render-harvester/reconstruction-bj.usdz" # Change based on USDZ
  },
  "remove": [],
  "replace": []
}
  1. Rendering(there is no abnormality in the process)
  • HuggingFace
docker run --shm-size=64g -it --rm --gpus '"device=7"' \
    --network host \
    --volume /share/home/hcy/NuRec/data/docker/output:/workdir/output \
    nvcr.io/nvidia/nre/nre-ga:latest \
    -- render-grpc \
    --port=1001 \
    --artifact-path "/workdir/output/render-harvester/reconstruction-n-pure.usdz" \
    --output-dir "/workdir/output/reconstruction/harverster/render/reconstruction-n-pure" \
    --edit-assets /workdir/output/reconstruction/harverster/edit_assets_myedit_inster_n_pure.json \
    --camera-id camera_front_wide_120fov 
  • own-sensor-data
docker run --shm-size=64g -it --rm --gpus '"device=7"' \
    --network host \
    --volume /share/home/hcy/NuRec/data/docker/output:/workdir/output \
    nvcr.io/nvidia/nre/nre-ga:latest \
    -- render-grpc \
    --port=1001 \
    --artifact-path "/workdir/output/render-harvester/reconstruction-n-pure.usdz" \
    --output-dir "/workdir/output/reconstruction/harverster/render/reconstruction-n-pure" \
    --edit-assets /workdir/output/reconstruction/harverster/edit_assets_myedit_inster_n_pure.json \
    --camera-id camera_front_wide_120fov 
  1. USDZ data query response
  • HuggingFace
1.USDZ data query
  4. Dynamic objects(The quantity is 347)
  ----------------------------------------
    ......
    [347] Object ID: 9
      Asset ID: none
      Semantic class: person
  5. External asset objects
  ----------------------------------------
    [0] ID: 0
2.USDZ data query after dynamic objects are inserted.
  4. Dynamic objects(The quantity is 348)
  ----------------------------------------
    .....
    [348] Object ID: outpu_0
       Asset ID: none
       Semantic class: person
  5. External asset objects
  ----------------------------------------
     [0] ID: 0
  • own-sensor-data
  1.USDZ data query
    4. Dynamic objects
    ----------------------------------------
       No dynamic objects
    5. External asset objects
    ----------------------------------------
       [0] ID: 0
  2.USDZ data query after dynamic objects are inserted.
    4. Dynamic objects
    ----------------------------------------
       No dynamic objects
    5. External asset objects
    ----------------------------------------
       [0] ID: 0

Thank you for your post. I will reach out to a NuRec expert and have them get back to you.

Log supplement

  1. own-sensor-data
  1. huggingface

Compare to serve-grpc log,
huggingface has “LayerTrackIds: Initializing track filtering from 436 available tracks”
own-sensor-data has “LayerTrackIds: Initializing track filtering from 0 available tracks”

LayerTrackIds is NuRec’s per-layer dynamic-actor filter. It reports the size of the track list that came out of the NCore Cuboids component baked into the USDZ. Zero available tracks = the underlying NCore sequence has no CuboidsComponent (or has one with no observations).

Please make sure you add a CuboidsComponent to NCore converter. Validate by re-running serve-grpc and grepping for LayerTrackIds: Initializing track filtering from N available tracks with N > 0.

it uses --config-name=configs/apps/AV/_base_3dgut_dynamic_road_semantic.yaml
and huggingface uses --config-name=configs/apps/prod/Hyperion-8.1/car2sim_6cam.yaml

You might want to use car2sim.yaml (the generic Hyperion-8.1 entrypoint) and override the sensor mixin to the 1-cam option