Reconstruction review

Clip 9fc15f8c-5974-4a8f-a0d1-b64539474ed7 · 1 reconstruction mode: Instant NuRec · built 2026-10-29T13:04:21+00:00 · code 9481ff40f5
real footage reconstruction

Front camera scores

ModeCoverageMasked (covered pixels)Masked + exposure-matchedRaw full frameStatic-onlyActorsStatic Gaussians
PSNRSSIMLPIPSPSNRSSIMLPIPSGain r/g/bPSNRSSIMLPIPSPSNRSSIMLPIPS
Instant NuRec0.41819.400.5440.21819.700.5470.2300.96/0.95/0.9312.520.3650.59212.520.3670.572151,912,813
Masked scores only the pixels the render actually draws: render opacity ≥ 0.9 inside the ego-valid area. Coverage is that share of the ego-valid frame. Read every masked number next to its coverage, because a mode that draws less would otherwise score better. Exposure-matched fits one gain per colour channel per frame on the covered pixels (least squares; the means are shown) and scores again, which separates colour and exposure error from geometry error. A gain above 1 means the render is darker than the real frame. Raw and static-only are the page's earlier scores, kept for comparison.
These frames were also training frames for the reconstruction, which flatters every score on this page. There is no held-out view here; the lane-shift section is the only novel-view test.
Static-only masks out the ego vehicle and every detected track's projected 3D box, so it scores the background alone. Raw full frame also counts the cars, including the many the detector missed or the QA gate rejected, which were never placed back. The renders leave the sky black. The reconstructions do model a sky, but this pipeline drops it (see Known limits under About). Raw and static-only count those black pixels; masked does not.

Real camera vs reconstruction

Every camera at its full frame rate (render budget: 0.23 s/frame measured on the first 20 front frames, 22.0 min per mode). Boxes: cyan = composed actor (labelled with its track id), thin grey = detected by the LiDAR detector but not composed (no usable Step 1 crop, Step 2 failed, or rejected by the QA gate). Space plays/pauses, ←/→ steps one frame, F flips A/B.

Metrics per camera

CameraFramesInstant NuRec
CovPSNR mSSIM mLPIPS mPSNR m+eLPIPS m+ePSNR rawSSIM rawLPIPS rawPSNR sGain r/g/b
Front wide 120°5990.41819.400.5440.21819.700.23012.520.3650.59212.520.96/0.95/0.93
Cross left 120°5990.36517.880.4400.24818.390.23410.740.2950.70510.611.06/1.01/0.90
Cross right 120°5990.38019.520.5080.23619.930.23712.870.3210.68312.880.93/0.94/0.91
Rear left 70°5990.26718.090.5940.20219.570.1879.250.2240.8329.111.08/1.06/0.99
Rear right 70°5990.33717.130.5390.30819.080.2999.850.2190.8329.761.00/1.01/0.98
Front tele 30°5990.86718.910.4870.60619.790.58415.980.4610.68417.021.08/1.10/1.13

Cov = coverage; "m" = masked (covered pixels only); "m+e" = masked + exposure-matched; "s" = static-only (ego vehicle and every detected box masked); raw = full frame. PSNR is over the scored pixels. SSIM is the mean of the SSIM map over them. LPIPS (AlexNet) is computed after filling unscored pixels of the render with the real ones. Gain is the mean per-channel exposure gain. 6 cameras, 960 px wide.

Alignment check (before any metric)

Each render uses the camera's own calibration and its rolling-shutter start/end pose at that frame. Orange = edges in the real frame, cyan = edges in the render, white = both. The shift is the sub-pixel phase-correlation offset between the two frames (ego vehicle masked).

Instant NuRec

edge overlay Instant NuRec frame 149
t=4.868 s · shift (-0.42, +0.18) px · 50% of real edges have a render edge within 2 px
edge overlay Instant NuRec frame 299
t=9.868 s · shift (+0.56, -0.06) px · 49% of real edges have a render edge within 2 px
edge overlay Instant NuRec frame 449
t=14.868 s · shift (+0.04, +0.09) px · 44% of real edges have a render edge within 2 px

Lane shift: front camera, ego moved left

The same drive with the camera moved 1.5 m and 3.0 m to the left (rig +y). There is no real footage for these views, since the car never drove there. This is the novel-view test: the scene has to hold up away from the path it was trained on. Instant NuRec: a point 15 m ahead moved from u=483.3 px to u=535.6 px for 1.5 m left — the expected direction.

Removed-actor check

For each mode the scene was composed again without the actor that covers the most of the front camera (into a scratch directory; the real scene is untouched), and rendered at the frames where that car was closest. If the background behind it was reconstructed, the right image shows road; if not, a hole or a smear.

Hole fraction: share of the victim's projected-box pixels whose removed-render opacity < 0.9. Smear ratio: mean Sobel gradient magnitude (grey 0-255) inside the box / the same over a ring 6-24 px outside it, covered pixels only; ~1 = texture continuous with the surroundings, << 1 = smooth smear.

Instant NuRec — removed ext_0026 (automobile)

t (s)Box pxHole fractionGradient in boxGradient in ringSmear ratio
4.6016,2740.02855.554.81.01
4.96816,9010.36948.861.40.80
5.33456,1150.66051.272.00.71
real
Real · t=4.601 s
normal
Instant NuRec, all actors
removed
Instant NuRec, without ext_0026 (6,274 px box)
real
Real · t=4.968 s
normal
Instant NuRec, all actors
removed
Instant NuRec, without ext_0026 (16,901 px box)
real
Real · t=5.334 s
normal
Instant NuRec, all actors
removed
Instant NuRec, without ext_0026 (56,115 px box)

Actors (18 harvested tracks, Step 2 seed 0)

Left: real Step 1 crops the diffusion model saw. Right: the generated asset, fitted to the LiDAR cuboid, from the front, three-quarter, side and rear. "Front" is where the pipeline puts the car's front: the asset's −x end, unless the LiDAR box was reversed at the moment the asset was built (then +x). This was checked against the real cameras.

ext_0006

accepted Instant
automobile · spread 1.39x <= 1.8x threshold
Step 1 cropStep 1 crop
ext_0006 frontext_0006 three_quarterext_0006 sideext_0006 rear
cuboid L×W×H (LiDAR)4.77 × 1.95 × 1.69 masset extent after fit (p1–p99)4.48 × 1.79 × 1.43 mraw harvested extent0.458 × 0.264 × 0.912anisotropy spread1.39× (gate 1.8×)Gaussians89,828frontmodel -x (convention), harvest frame undecided

ext_0009

accepted Instant
automobile · spread 1.22x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 crop
ext_0009 frontext_0009 three_quarterext_0009 sideext_0009 rear
cuboid L×W×H (LiDAR)4.53 × 1.93 × 1.72 masset extent after fit (p1–p99)4.24 × 1.69 × 1.57 mraw harvested extent0.414 × 0.351 × 0.848anisotropy spread1.22× (gate 1.8×)Gaussians96,221frontmodel -x (convention)

ext_0019

rejected
automobile · anisotropy spread 2.36x > 1.8x threshold (QA gate)
Step 1 cropStep 1 crop
ext_0019 frontext_0019 three_quarterext_0019 sideext_0019 rear
cuboid L×W×H (LiDAR)4.53 × 1.95 × 1.76 masset extent after fit (p1–p99)4.15 × 1.81 × 1.46 mraw harvested extent0.797 × 0.348 × 0.775anisotropy spread2.36× (gate 1.8×)Gaussians96,424frontmodel -x (convention), harvest frame undecided

ext_0002

accepted Instant
automobile · spread 1.14x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0002 frontext_0002 three_quarterext_0002 sideext_0002 rear
cuboid L×W×H (LiDAR)4.52 × 1.87 × 1.63 masset extent after fit (p1–p99)4.31 × 1.75 × 1.57 mraw harvested extent0.446 × 0.350 × 1.021anisotropy spread1.14× (gate 1.8×)Gaussians103,560frontmodel -x (convention)

ext_0000

accepted Instant
automobile · spread 1.22x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0000 frontext_0000 three_quarterext_0000 sideext_0000 rear
cuboid L×W×H (LiDAR)4.23 × 1.74 × 1.61 masset extent after fit (p1–p99)4.08 × 1.62 × 1.48 mraw harvested extent0.392 × 0.333 × 0.807anisotropy spread1.22× (gate 1.8×)Gaussians99,093frontmodel -x (convention)

ext_0004

accepted Instant
automobile · spread 1.23x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0004 frontext_0004 three_quarterext_0004 sideext_0004 rear
cuboid L×W×H (LiDAR)4.66 × 1.89 × 1.59 masset extent after fit (p1–p99)4.45 × 1.67 × 1.50 mraw harvested extent0.376 × 0.274 × 0.996anisotropy spread1.23× (gate 1.8×)Gaussians98,457frontmodel -x (convention)

ext_0121

rejected
two_wheeler · anisotropy spread 4.29x > 1.8x threshold (QA gate)
Step 1 crop
ext_0121 frontext_0121 three_quarterext_0121 sideext_0121 rear
cuboid L×W×H (LiDAR)1.99 × 0.59 × 1.41 masset extent after fit (p1–p99)1.57 × 0.50 × 1.24 mraw harvested extent0.664 × 0.383 × 0.643anisotropy spread4.29× (gate 1.8×)Gaussians70,742frontmodel -x (convention)

ext_0026

accepted Instant
automobile · spread 1.25x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0026 frontext_0026 three_quarterext_0026 sideext_0026 rear
cuboid L×W×H (LiDAR)4.61 × 1.92 × 1.69 masset extent after fit (p1–p99)4.37 × 1.73 × 1.59 mraw harvested extent0.370 × 0.272 × 0.934anisotropy spread1.25× (gate 1.8×)Gaussians98,491frontmodel -x (convention)

ext_0128

accepted Instant
automobile · spread 1.28x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0128 frontext_0128 three_quarterext_0128 sideext_0128 rear
cuboid L×W×H (LiDAR)5.64 × 2.12 × 1.88 masset extent after fit (p1–p99)5.41 × 1.96 × 1.71 mraw harvested extent0.504 × 0.343 × 1.215anisotropy spread1.28× (gate 1.8×)Gaussians96,291frontmodel -x (convention)

ext_0142

accepted Instant
automobile · spread 1.17x <= 1.8x threshold
Step 1 crop
ext_0142 frontext_0142 three_quarterext_0142 sideext_0142 rear
cuboid L×W×H (LiDAR)4.94 × 2.10 × 1.99 masset extent after fit (p1–p99)4.70 × 1.96 × 1.91 mraw harvested extent0.403 × 0.338 × 0.973anisotropy spread1.17× (gate 1.8×)Gaussians92,221frontmodel -x (convention)

ext_0221

rejected
two_wheeler · anisotropy spread 3.99x > 1.8x threshold (QA gate)
Step 1 cropStep 1 crop
ext_0221 frontext_0221 three_quarterext_0221 sideext_0221 rear
cuboid L×W×H (LiDAR)1.59 × 0.56 × 1.07 masset extent after fit (p1–p99)1.26 × 0.49 × 0.98 mraw harvested extent0.730 × 0.828 × 0.466anisotropy spread3.99× (gate 1.8×)Gaussians105,090frontmodel -x (convention)

ext_0003

accepted Instant
automobile · spread 1.62x <= 1.8x threshold
Step 1 cropStep 1 crop
ext_0003 frontext_0003 three_quarterext_0003 sideext_0003 rear
cuboid L×W×H (LiDAR)4.51 × 1.94 × 1.66 masset extent after fit (p1–p99)4.25 × 1.77 × 1.49 mraw harvested extent0.558 × 0.290 × 0.836anisotropy spread1.62× (gate 1.8×)Gaussians95,562frontmodel -x (convention), harvest frame undecided

ext_0217

accepted Instant
automobile · spread 1.13x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 crop
ext_0217 frontext_0217 three_quarterext_0217 sideext_0217 rear
cuboid L×W×H (LiDAR)4.62 × 1.92 × 1.73 masset extent after fit (p1–p99)4.27 × 1.61 × 1.64 mraw harvested extent0.396 × 0.356 × 0.969anisotropy spread1.13× (gate 1.8×)Gaussians96,522frontmodel -x (convention)

ext_0067

accepted Instant
automobile · spread 1.23x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0067 frontext_0067 three_quarterext_0067 sideext_0067 rear
cuboid L×W×H (LiDAR)4.93 × 2.09 × 1.95 masset extent after fit (p1–p99)4.68 × 1.79 × 1.87 mraw harvested extent0.390 × 0.332 × 0.998anisotropy spread1.23× (gate 1.8×)Gaussians100,380frontmodel -x (convention)

ext_0108

accepted Instant
automobile · spread 1.14x <= 1.8x threshold
Step 1 crop
ext_0108 frontext_0108 three_quarterext_0108 sideext_0108 rear
cuboid L×W×H (LiDAR)4.53 × 1.92 × 1.67 masset extent after fit (p1–p99)4.34 × 1.61 × 1.60 mraw harvested extent0.421 × 0.366 × 1.092anisotropy spread1.14× (gate 1.8×)Gaussians103,476frontmodel -x (convention)

ext_0292

accepted Instant
automobile · spread 1.21x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0292 frontext_0292 three_quarterext_0292 sideext_0292 rear
cuboid L×W×H (LiDAR)4.90 × 1.94 × 1.85 masset extent after fit (p1–p99)4.64 × 1.72 × 1.76 mraw harvested extent0.364 × 0.361 × 1.150anisotropy spread1.21× (gate 1.8×)Gaussians92,098frontmodel -x (convention)

ext_0129

accepted Instant
automobile · spread 1.15x <= 1.8x threshold
Step 1 crop
ext_0129 frontext_0129 three_quarterext_0129 sideext_0129 rear
cuboid L×W×H (LiDAR)4.30 × 1.83 × 1.59 masset extent after fit (p1–p99)4.13 × 1.58 × 1.51 mraw harvested extent0.377 × 0.317 × 0.857anisotropy spread1.15× (gate 1.8×)Gaussians99,487frontmodel -x (convention)

ext_0319

accepted Instant
automobile · spread 1.15x <= 1.8x threshold
Step 1 cropStep 1 cropStep 1 cropStep 1 crop
ext_0319 frontext_0319 three_quarterext_0319 sideext_0319 rear
cuboid L×W×H (LiDAR)4.01 × 1.70 × 1.45 masset extent after fit (p1–p99)3.79 × 1.54 × 1.36 mraw harvested extent0.405 × 0.311 × 0.949anisotropy spread1.15× (gate 1.8×)Gaussians102,229frontmodel -x (convention)

Variations

Variations of this same reconstructed clip, made by the pipeline's variation stages (08-12): weather and light (appearance, applied to the rendered pixels; labels unchanged) and a pothole (geometry: carved into the ground mesh and the splats, driven over by a physics vehicle whose body motion moves the camera). Every item names its recipe, engine and seed; the run record is the scene manifest.

Weather and light (Instant NuRec)

rain_heavy: recipe rain_heavy, engine procedural, seed 23. Left: the original render; right: the variant. Labels hash-identical: yes. Flicker excess (deterministic part, /255): 0.339.
dust_haze: recipe dust_haze, engine procedural, seed 31. Left: the original render; right: the variant. Labels hash-identical: yes. Flicker excess (deterministic part, /255): 0.05.
dusk: recipe dusk, engine procedural, seed 41. Left: the original render; right: the variant. Labels hash-identical: yes. Flicker excess (deterministic part, /255): 0.023.
night_headlights: recipe night_headlights, engine procedural, seed 53. Left: the original render; right: the variant. Labels hash-identical: yes. Flicker excess (deterministic part, /255): 0.377.

Pothole on the dashcam (pothole_left_track, Instant NuRec)

Left: base scene at the recorded camera pose. Right: pothole_left_track, camera pose = recorded pose + the physics body motion (recorded x physics delta (10)); renderer 3dgrut.
Physics (mujoco 3.3.7): body height, pitch and roll of the pothole run minus the flat run, vertical acceleration and wheel loads; shaded = wheels inside the pothole.
Physics (mujoco 3.3.7): body height, pitch and roll of the pothole run minus the flat run, vertical acceleration and wheel loads; shaded = wheels inside the pothole.

Dip -3.5 cm at 12.49 s, rebound 5.0 cm, peak |Δpitch| 0.99°, |Δroll| 1.25°, peak vertical acceleration 6.2 m/s² (flat run 1.6); flat run ride-height std 4.8 mm, pitch std 0.16° (the ground mesh is not bumpy on its own).

Edit pothole_0: recipe pothole_left_track, seed 1023, 1.2 × 0.9 m, 0.12 m deep. Mesh vs splat projected-footprint IoU 0.979; pixels changed outside footprint + margin 0.000177; floaters 0.

Approach: base | edited, recorded poses (yellow: mesh footprint)
Approach: base | edited, recorded poses (yellow: mesh footprint)
Close-up at ~5 m: base | edited
Close-up at ~5 m: base | edited

Isaac Sim view (pothole_left_track)

Isaac Sim PhysX (isaac), chase camera: a programmatic vehicle (box chassis, four sprung wheels) driven along the recorded path over the carved ground collider (invisible) in the pothole-edited scene. Splats render hazier in Isaac than in 3DGRUT.
Isaac Sim PhysX (isaac), roadside camera: a programmatic vehicle (box chassis, four sprung wheels) driven along the recorded path over the carved ground collider (invisible) in the pothole-edited scene. Splats render hazier in Isaac than in 3DGRUT.
Cross-checkMuJoCoIsaac PhysX
dip_time_s12.49212.477
dip_dz_m-0.0352-0.0269
peak_abs_dpitch_deg0.9940.699
peak_abs_droll_deg1.2470.663
accel_peak_abs_ms26.1977.495

Same input to both (ground + edits + vehicle + recorded path), same output format. Reported, not gated: the Isaac tyre is the PhysX sphere contact itself (no separate tyre spring).

Stacked: pothole_left_track+rain_heavy (Instant NuRec)

pothole_left_track+rain_heavy: geometry pothole_left_track + appearance rain_heavy (procedural, seed 23). Left: the pothole render with physics poses; right: the same with rain. Labels (base + the pothole) hash-identical: yes.

Ground mesh (08, from the accumulated LiDAR, actors removed): 1,225,920 triangles at 0.1 m; agreement with the splat road median |Δz| 0.0274 m, p90 0.0532 m; corridor coverage 0.9726.

Run record: variations_instant/scene_manifest.json.

Explore it yourself

File (not hosted; shared on request)MBWhat
instant/scene_instant.usdz597.9Composed scene (instant background + actors), OpenUSD, for Isaac Sim
instant/static_scene_instant.ply147.3Static background only (instant), 3DGS PLY, SH degree 0
instant/combined_busiest_instant.ply169.7Static + actors at the busiest instant (instant), 3DGS PLY, for SuperSplat
Isaac Sim opens the usdz and plays the timeline, but renders these splats with a known milky haze compared to 3DGRUT. 3DGRUT is the canonical renderer for this pipeline; every image on this page is a 3DGRUT render.

SuperSplat (superspl.at/editor) opens the PLYs in a browser. It could not be tested headless here; instead the combined PLY was read back with plyfile. Instant NuRec: 2,495,534 Gaussians at t=0.0 s with 6 actors; standard 3DGS properties present: yes (checked with plyfile).

About

Input: one clip from NVIDIA's PhysicalAI Autonomous Vehicles dataset, with 7 cameras and a roof LiDAR, about 20 s at an intersection. These are not Indian roads and not EdgeRecon's own rig.

Cameras on this page: 6 of the clip's 7. The one left out is the rear telephoto (camera_rear_tele_30fov): full NuRec's six-camera recipe (car2sim_6cam) does not train on it, and every review uses the same cameras so that instant and full stay comparable. Instant NuRec ran its default pa-front model, which sees only the front wide camera, so the five other cameras are views Instant NuRec never saw.

Measured vs generated. The background is reconstructed from this clip's own camera and LiDAR data. The vehicles are not reconstructed: Asset Harvester's diffusion model generates them from a few camera crops, then they are placed on their LiDAR-tracked trajectories. A generated car can look plausible and still not match the real one.
Known limits. The detector misses many vehicles (grey and unboxed cars in the overlay). Without a fixed Step 2 seed the actor count varies between runs (15–17 seen); this run used Step 2 seed 0. Both reconstructions model the sky, but this pipeline drops it. Full NuRec trains a sky cubemap (nre-ga's sky-env-map) that its PLY export does not write. Instant NuRec writes its sky as a cubemap file next to its PLY, which the compose stage does not read. Isaac Sim renders the splats with a haze. Each actor is visible only inside its observed time window: the USD authors its visibility as invisible before its first and after its last LiDAR observation, and these renders read that.

live Raw clip → NCore conversion · aux masking/depth · Instant NuRec · full NuRec training · Asset Harvester · USD composition + validation · scene variations: weather and light, LiDAR ground mesh, pothole with vehicle physics
roadmap EdgeRecon's own rig and Indian-road capture · generative variations (Cosmos Transfer) · NuRec's native dynamic-actor layer (not functional in the public release)
gap close-range LiDAR cuboid fitting in dense traffic (diagnosed, not solved)

LIVE: has run end to end in this pipeline. ROADMAP: planned, not built yet. GAP: a known problem, not solved yet.

This run's GPU steps (from the watchdog logs)

StepWall (m:s)Card peak MiBRuns
01_detect_all_vehicles_nuscenes0:251,2481
02_ncore_convert2:465711
03_reconstruction_instant2:1111,9811
04_harvest_step1_ncore_parser—5,7782
04_harvest_step2—19,4182
07_review_render_instant18:083,6341
09_scene_edits—1,4804
10_physics—4,3584
11_variant_render—2,7145
b23_orientation0:262,7621
b23_part_a_gate0:251,4481
b23_part_c_overlay0:451,4481
b23_sky_850f6b51:0011,9811
render0:406101
render_fix0:306101
render_fix20:358741
render_t160:331,2881

"—": the docker steps' watchdog is stopped before it writes its peak line, and a re-run appends to the same log, so no single wall time or peak can be read from it.