Skip to content

fix(nuscenes): make lidar model estimation robust for all scenes#148

Merged
janickm merged 1 commit into
NVIDIA:mainfrom
janickm:fix/nuscenes-lidar-model-monotonic
Jun 16, 2026
Merged

fix(nuscenes): make lidar model estimation robust for all scenes#148
janickm merged 1 commit into
NVIDIA:mainfrom
janickm:fix/nuscenes-lidar-model-monotonic

Conversation

@janickm

@janickm janickm commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

The nuScenes conversion crashed during lidar model estimation on several scenes (trainval scene-0007, and v1.0-mini 0103/0655/0796/1077) with:

AssertionError: Column azimuth angles must be sorted in the spinning direction
so the diff between relative angles of consecutive columns should always be positive
  (ncore/impl/data/types.py)

The assertion was masking estimators that produced malformed (non-monotonic / wrapping) column azimuths. Rather than repair the symptom downstream, this PR fixes each root cause at source so the estimators produce valid azimuths by construction.

Root causes & fixes

1. util.relative_angle mixed-precision reduction. It reduced the scalar reference with % 2pi in float64 while reducing a float32 array in float32, so the same value reduced to results ~1 ULP apart. relative_angle(arr[0], arr, ...) therefore did not reliably return 0 at index 0 -- for a float32 array whose first element reduces near the +/-pi boundary the self-distance wrapped to ~2*pi, spuriously failing the monotonicity check for otherwise-valid azimuths. Fix: subtract before reducing (a python scalar does not upcast a float32 numpy/torch array, so the computation stays in the array dtype); (a - b) mod 2pi == (a mod 2pi - b mod 2pi) mod 2pi, so it is exact. Adds direct relative_angle tests (the function had none), including a torch case.

2. derive_model_from_decompensated used a single reference row. That row's individual returns carry gross outliers (spurious points, multipath) -- adjacent columns could jump by ~1.7-2.9 rad (100-170 deg) and reorder. Fix: estimate each column azimuth as the circular median across all valid rows. Every beam in a column fires at nearly the same azimuth, so the median rejects per-beam outliers and yields a clean, already-monotonic sweep.

3. optimize_model applied independent per-column corrections. On a 4x-upsampled grid, adjacent columns sample different point subsets, so the per-column median correction carried high-frequency noise that exceeded the column spacing and reordered columns; it also left unobserved columns at the nominal value while shifting observed ones under a systematic phase offset. Fix: remove the global offset from every column, then interpolate the per-column correction across unobserved columns and smooth it -- a smooth correction added to a monotonic ramp stays monotonic by construction.

With the estimators producing valid azimuths directly, enforce_spinning_monotonic (generalized for cw and ccw) is now only a cheap coordinate-normalization and final guard: it raises on genuinely malformed input (span >= 2*pi) rather than silently reshaping it.

Other changes

  • Align NuScenesConverter4Config defaults with the CLI and README so a programmatically-built config matches the command line.
  • Default --lidar-model-source to empirical (see results); nominal remains available for the data-independent case.
  • Document expected accuracy in both README files and the //tools:ncore_evaluate_lidar_model tool.

Results

Measured with //tools:ncore_evaluate_lidar_model (per-point mean angular error over far-range points > 20 m; HDL-32E, 4x resolution, 1 optimization pass), all 10 v1.0-mini scenes plus trainval scene-0007:

scene empirical far nominal far
0061 0.033 0.031
0103 0.035 0.141
0553 0.020 0.022
0655 0.037 0.172
0757 0.028 0.027
0796 0.033 0.183
0916 0.033 0.032
1077 0.033 0.141
1094 0.037 0.037
1100 0.022 0.021
0007 0.035 0.577

Summary: empirical 0.02-0.04 deg far-range, |azimuth bias| < 0.005 deg; nominal 0.02-0.6 deg, azimuth bias up to ~0.4 deg. Empirical is up to ~15x more accurate at far range and never worse, so it is the default.

Validation

  • All 10 v1.0-mini scenes plus trainval scene-0007 convert with both model sources at resolution 4; previously-crashing configs now succeed, previously-working ones are unchanged or improved.
  • bazel test //tools/data_converter:pytest_structured_lidar_model_{3_11,3_8} and //ncore/impl/data:pytest_util_{3_11,3_8} pass, with new regression tests for: the relative_angle precision fix (numpy + torch), the derive outlier rejection, the optimize correction smoothing, and enforce_spinning_monotonic (cw/ccw, malformed-input rejection).
  • NUSCENES_DIR=... bazel test //tools/data_converter/nuscenes:pytest_converter_3_11 passes.

@janickm janickm self-assigned this Jun 11, 2026
@janickm

janickm commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator Author

CC @OatmealLiu

@janickm janickm marked this pull request as draft June 11, 2026 12:48
@copy-pr-bot

copy-pr-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@janickm

janickm commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator Author

setting to draft still as I still see some remaining issues - still testing on some more sequences / variants

@janickm janickm marked this pull request as ready for review June 11, 2026 14:58
@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from c512639 to 111998b Compare June 11, 2026 14:58
@OatmealLiu

Copy link
Copy Markdown

[More scene testing passed; Fix is validated] @janickm

I tested the new code, including the optimizer issue fixes for the structured spinning LiDAR model, on 10 nuScenes scenes that previously encountered the following assertion error:

File ".../tools/data_converter/structured_lidar_model.py", line 459, in optimize_model
    return RowOffsetStructuredSpinningLidarModelParameters(
File ".../ncore/impl/data/types.py", line 727, in __post_init__
    assert np.all(np.diff(relative_column_azimuths_rad.relative_angle_rad) > 0), (
AssertionError: Column azimuth angles must be sorted in the spinning direction so the diff
between relative angles of consecutive columns should always be positive

All 10 scenes passed the test and were successfully converted to NCoreV4. I also eyeballed the LiDAR projection results, and they look good to me.

Testing log:

Validating the azimuth-span fix on 10 scene(s) from 'v1.0-trainval' (empirical/4x defaults) ...
  root=/lustre/fs11/portfolios/nvr/projects/nvr_dvl_research/datasets/nuscenes
  out =/lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation
  scenes: scene-0007 scene-0055 scene-0057 scene-0129 scene-0180 scene-0241 scene-0246 scene-0367 scene-0403 scene-0457

[ 1/10] scene-0007   OK   (106s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0007.log
[ 2/10] scene-0055   OK   (103s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0055.log
[ 3/10] scene-0057   OK   (103s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0057.log
[ 4/10] scene-0129   OK   (104s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0129.log
[ 5/10] scene-0180   OK   (103s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0180.log
[ 6/10] scene-0241   OK   (104s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0241.log
[ 7/10] scene-0246   OK   (103s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0246.log
[ 8/10] scene-0367   OK   (104s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0367.log
[ 9/10] scene-0403   OK   (106s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0403.log
[10/10] scene-0457   OK   (104s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0457.log

==================== SUMMARY ====================
Version   : v1.0-trainval
Tested    : 10   OK=10  FAIL=0   (elapsed 1040s)
Output    : /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation
Logs      : /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs  (<scene>.log, results.csv)
RESULT    : ALL PASSED -- azimuth-span fix validated on the previously-failing scenes.
            Safe to launch the full run: tools/data_converter/nuscenes/convert_scene_by_scene.sh

@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch 8 times, most recently from c466b91 to cf5e424 Compare June 12, 2026 13:36
@janickm

janickm commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for testing @OatmealLiu - I'm still working on further simplifications of the root / core issue before I can merge this - I'll let you know once it's done

@OatmealLiu

Copy link
Copy Markdown

Thanks for testing @OatmealLiu - I'm still working on further simplifications of the root / core issue before I can merge this - I'll let you know once it's done

Sure. Let me know when it's merged so that I can test again and compare. Thanks @janickm !

@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from cf5e424 to 0d7f667 Compare June 12, 2026 14:05
@janickm

janickm commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for testing @OatmealLiu - I'm still working on further simplifications of the root / core issue before I can merge this - I'll let you know once it's done

Sure. Let me know when it's merged so that I can test again and compare. Thanks @janickm !

@OatmealLiu The latest version now contains the condensed version of the proper fixes for the core numerical issues - maybe you can run through the previously failing ones? If this is positive we can look into finalizing this PR [I'm just pushing one more docs update in a sec]

@janickm janickm assigned OatmealLiu and unassigned janickm Jun 12, 2026
@OatmealLiu

Copy link
Copy Markdown

Thanks for testing @OatmealLiu - I'm still working on further simplifications of the root / core issue before I can merge this - I'll let you know once it's done

Sure. Let me know when it's merged so that I can test again and compare. Thanks @janickm !

@OatmealLiu The latest version now contains the condensed version of the proper fixes for the core numerical issues - maybe you can run through the previously failing ones? If this is positive we can look into finalizing this PR [I'm just pushing one more docs update in a sec]

Sure. Did you push already? If so, I can go ahead with the latest branch

@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from 0d7f667 to 598da1a Compare June 12, 2026 14:49
@janickm

janickm commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator Author

Yes, the code is updated

@OatmealLiu

Copy link
Copy Markdown

I tested the new push of this branch, the same numerical error occurred again, as the failed scenes shown below:

[ 1/10] scene-0007   FAIL (124s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0007.log
[ 2/10] scene-0055   FAIL (56s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0055.log
[ 3/10] scene-0057   FAIL (57s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0057.log
[ 4/10] scene-0129   FAIL (54s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0129.log
[ 5/10] scene-0180   FAIL (54s)  log: /lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/datasets/ncoreV4/nuscenes_fix_validation/_conversion_logs/scene-0180.log

where the errorrs are :

  File "<string>", line 10, in __init__
  File "/lustre/fs12/portfolios/nvr/projects/nvr_dvl_research/users/mingxuanl/cache/bazel/_bazel_mingxuanl/fba04c661583e38390b22b799101f3f9/execroot/_main/bazel-out/k8-fastbuild/bin/tools/data_converter/nuscenes/convert.runfiles/_main/ncore/impl/data/types.py", line 941, in __post_init__
    assert np.all(np.diff(relative_column_azimuths_rad.relative_angle_rad) > 0), (
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Column azimuth angles must be sorted in the spinning direction so the diff between relative angles of consecutive columns should always be positive

@janickm

janickm commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator Author

Huh, interesting! I was testing with the dust one actually, will double check

@OatmealLiu

Copy link
Copy Markdown

Huh, interesting! I was testing with the dust one actually, will double check

Yeah. Let me know. I will also double check my config file. Maybe I left some customized config as conversion args. Will do some test soon. Have a nice weekend!

@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from 598da1a to 19229e6 Compare June 13, 2026 06:29
@janickm

janickm commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator Author

@OatmealLiu Thanks for catching that. Your run hit an intermediate push of the branch (the failure was still the column-azimuth monotonicity assert, just relocated to types.py:941 after the recent main changes). I've since:

  1. Landed the proper root-cause fixes (derive now uses a per-column circular median across all valid rows instead of a single reference row, which rejects the per-beam outliers that were reordering columns; optimize smooths its per-column correction; relative_angle reduces consistently in the input dtype).
  2. Rebased the branch onto the current main so we're testing identical code.

I reproduced your 5 failing scenes locally (scene-0007/0055/0057/0129/0180, trainval, empirical/4x defaults) on the rebased branch — all convert successfully now:

scene-0055 : OK   far-range err 0.055 deg
scene-0057 : OK   far-range err 0.028 deg
scene-0129 : OK   far-range err 0.027 deg
scene-0180 : OK   far-range err 0.031 deg
scene-0007 : OK   far-range err 0.037 deg

The branch is updated (force-pushed after rebase). Could you re-run your 10-scene validation against the latest? If it's green we can finalize.

@OatmealLiu

OatmealLiu commented Jun 13, 2026

Copy link
Copy Markdown

@janickm Sure! I just tested the newest push of the fix branch. All test passed. Fixes are validated for the azimuth-span issue. I paste the testing log below.

timestamp,scene,status,seconds
2026-06-13T10:30:13-07:00,scene-0007,OK,119
2026-06-13T10:32:37-07:00,scene-0055,OK,144
2026-06-13T10:34:45-07:00,scene-0057,OK,128
2026-06-13T10:36:40-07:00,scene-0129,OK,115
2026-06-13T10:39:07-07:00,scene-0180,OK,146
2026-06-13T10:41:50-07:00,scene-0241,OK,163
2026-06-13T10:44:02-07:00,scene-0246,OK,132
2026-06-13T10:45:58-07:00,scene-0367,OK,116
2026-06-13T10:49:03-07:00,scene-0403,OK,185
2026-06-13T10:51:17-07:00,scene-0457,OK,134

@OatmealLiu

OatmealLiu commented Jun 13, 2026

Copy link
Copy Markdown

Besides, I have completed the full 850 scenes conversion. With the new fix, 849/850 scenes are converted successfully, while only scene-0356 failed.

Another different assertion error can be observed fro scene-0356. Below is the raised error log (removed path stuff). Shall we sort this out in this PR or we open another one?

ncore/impl/data/types.py", line 716, in __post_init__
  assert np.all(np.diff(relative_row_elevations_rad.relative_angle_rad) > 0), (
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Row elevation angles must be sorted in descending order (cw)

@janickm

janickm commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator Author

Great, thanks @OatmealLiu! so only one more to go, I'll try to check that one also

@janickm janickm assigned janickm and unassigned OatmealLiu Jun 13, 2026
@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from 19229e6 to 8b34772 Compare June 13, 2026 21:21
@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from 8b34772 to 9a1a931 Compare June 14, 2026 19:08
@janickm

janickm commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator Author

@OatmealLiu Fixed scene-0356 and dug into the root causes properly (rather than relying on a clamp). Two distinct sources, both now fixed at the source:

  1. Row elevations (the scene-0356 crash): the HDL-32E does not fire its beams in monotonic elevation order -- its two lowest lasers are interleaved (confirmed in the data: firing-beam 0 = -28.2 deg, beam 1 = -29.0 deg). The code assumed firing order was the exact reverse of elevation order. Fixed by recovering the beam-to-row mapping from the data: sort beams by measured elevation and permute every per-beam quantity. The elevation ramp is now monotonic by construction.

  2. Column azimuths: I ran a full resolution-factor analysis (1x/2x/4x, all staged scenes). Findings:

    • Accuracy improves with resolution: ~0.105 deg (1x) -> ~0.056 (2x) -> ~0.044 (4x) far-range error, so 4x stays the default.
    • The azimuth ordering ambiguity is purely an upsampling artifact -- at native (1x) resolution the multi-frame estimate is perfectly monotonic and no repair ever fires.
    • Replaced the noisy per-sub-column median in optimize_model with adaptive binning (pool >=200 obs/bin), a genuinely better estimate that pools all frames. Improved quality (e.g. scene-0356 far 0.068 -> 0.053).
    • Made the monotonic guard wrap-robust (it was rotating some models by a full 360 deg at the +/-pi seam) and made it compress a marginal seam-overlap rather than error. The residual projection now touches <=66/4340 columns by <=0.4 deg (below model accuracy) and never fires at native resolution.

Validated: all your scenes (0007/0055/0057/0129/0180/0356) plus the v1.0-mini set convert in both empirical and nominal at 4x, far-range error 0.018-0.058 deg. Unit + lidar integration + ncore suites pass.

Branch updated (force-pushed after rebase on main). A re-run of your full 850-scene sweep would be the ideal final check when you have a chance.

@OatmealLiu

Copy link
Copy Markdown

Thanks a lot @janickm ! Yep. I will sweep the 850 scenes using the new branch again to make a final, consistent nuScenes in ncoreV4 format.

@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from 9a1a931 to 3357d34 Compare June 15, 2026 09:42
The nuScenes conversion crashed during lidar model estimation on several
scenes (e.g. trainval scene-0007 and mini scenes 0103/0655/0796/1077) with:

  AssertionError: Column azimuth angles must be sorted in the spinning
  direction so the diff between relative angles of consecutive columns
  should always be positive   (ncore/impl/data/types.py)

The assertion was masking estimators that produced malformed (non-monotonic /
wrapping) column azimuths. Root causes, fixed at source:

1. util.relative_angle reduced the scalar reference with `% 2pi` in float64
   while reducing a float32 angle array in float32, so the same value reduced
   to results ~1 ULP apart. relative_angle(arr[0], arr, ...) therefore did not
   reliably yield 0 at index 0: for a float32 array whose first element reduces
   near the +/-pi boundary the self-distance wrapped to ~2*pi, spuriously
   failing the structured-model monotonicity check for otherwise-valid
   azimuths. Fixed by subtracting before reducing (a python scalar does not
   upcast a float32 numpy/torch array, so the whole computation stays in the
   array dtype); (a - b) mod 2pi == (a mod 2pi - b mod 2pi) mod 2pi, so the
   result is exact. Adds direct relative_angle tests (the function had none),
   including a torch case.

2. derive_model_from_decompensated took the column azimuths from a single
   reference row's raw measurements. That row's individual returns carry gross
   outliers (spurious points, multipath) -- adjacent columns could jump by
   ~1.7-2.9 rad (100-170 deg) and reorder. Fixed by estimating each column
   azimuth as the circular median across all valid rows: every beam in a column
   fires at nearly the same azimuth, so the median rejects per-beam outliers
   and yields a clean, already-monotonic sweep.

3. optimize_model applied independent per-(sub-)column median corrections. On a
   4x-upsampled grid each sub-column is hit by only a few points, so its median
   residual was assignment noise that reordered neighbours; the multi-frame data
   is, however, more than sufficient at coarser granularity (~3900 obs per native
   column). Fixed by estimating the local correction with adaptive binning
   (pool >=200 observations per bin, interpolate back): a strictly better
   estimate that pools all frames, not a smoothing band-aid. A global circular-
   mean offset is still removed first so a systematic model/data phase offset
   does not tear the ramp apart.

4. derive_model_from_decompensated assumed a fixed firing-to-row order
   (reverse the beams). Spinning lidars do not necessarily fire beams in
   elevation order -- the HDL-32E interleaves its two lowest lasers -- so the
   reversal left two rows out of descending order, tripping the sibling "Row
   elevation angles must be sorted in descending order" assertion (scene-0356).
   Fixed at the source by recovering the beam-to-row mapping from the data: sort
   beams by measured elevation and apply that permutation to every per-beam
   quantity (elevations and azimuth offsets). The elevation ramp is then
   monotonic by construction, with no repair needed.

Resolution analysis: model far-range error improves monotonically with column
resolution (~0.105 deg at 1x, ~0.056 at 2x, ~0.044 at 4x), so 4x stays the
default. The upsampling is also the sole source of the residual azimuth
ordering ambiguity: it creates sub-columns finer than the data resolves, so a
few adjacent ones can come out marginally out of order. enforce_spinning_monotonic
resolves this with the minimal monotonic projection -- measured to touch <=66 of
4340 columns by <=0.4 deg (below the model's own accuracy), and to never fire at
native resolution. It unwraps into a continuous ramp (no fragile re-wrap or
global shift that could rotate the whole model by 2*pi when element 0 sits on the
+/-pi seam), compresses a sweep that marginally overshoots one revolution (a real
scan can overlap slightly at the seam), and rejects only gross (>5%) overflow as
malformed input.

Other changes:
- Align NuScenesConverter4Config defaults with the CLI and README so a
  programmatically-built config matches the command line.
- Default --lidar-model-source to empirical (see results below); nominal remains
  available for the data-independent case.
- Document expected accuracy in the README files and the
  //tools:ncore_evaluate_lidar_model tool.

Results (//tools:ncore_evaluate_lidar_model, per-point mean angular error over
far-range points > 20 m, HDL-32E at 4x resolution, 1 optimization pass):

  empirical: 0.02 - 0.04 deg far-range error, |azimuth bias| < 0.005 deg
  nominal:   0.02 - 0.6  deg far-range error, azimuth bias up to ~0.4 deg

  scene   empirical_far  nominal_far
  0061    0.033          0.031
  0103    0.035          0.141
  0553    0.020          0.022
  0655    0.037          0.172
  0757    0.028          0.027
  0796    0.033          0.183
  0916    0.033          0.032
  1077    0.033          0.141
  1094    0.037          0.037
  1100    0.022          0.021
  0007    0.035          0.577

Empirical is up to ~15x more accurate at far range and never worse, so it is
the default.

Validation: all 10 v1.0-mini scenes plus trainval scene-0007 convert with both
model sources at resolution 4; previously-crashing configs now succeed and
previously-working ones are unchanged or improved. ncore data/sensors suites,
the structured lidar model unit tests (3.11 + 3.8), and the nuScenes
integration test all pass.
@janickm janickm force-pushed the fix/nuscenes-lidar-model-monotonic branch from 3357d34 to 4bff82e Compare June 15, 2026 15:27
@janickm

janickm commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

@OatmealLiu I'm going ahead and merge this one to fix the obvious apparent issues in main for nuScenes - please let me know if you still find errors

@janickm janickm added this pull request to the merge queue Jun 16, 2026
Merged via the queue into NVIDIA:main with commit b743c1a Jun 16, 2026
5 checks passed
@janickm janickm deleted the fix/nuscenes-lidar-model-monotonic branch June 16, 2026 07:32
@janickm janickm requested a review from mpelko-nvidia June 16, 2026 07:33
@OatmealLiu

Copy link
Copy Markdown

@janickm Hi!

To complete this fix's testing: I re-converted the whole 850 nuScenes' scenes with the newly fixed NCore codebase. All 850 scenes are successfully converted. The fix is validated.

Further, I observed an improvement in conversion speed. On the same machine, the per-scene conversion time goes down from ~110s (before fix) to ~95s (after fix) on average, on the same machine with the same resources.

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants