Light mode

SAVIOR

Semantic-Aware Visual-Inertial Odometry for Dynamic Environments

Sasanka Kuruppu Arachchige1 Kyuman Lee2,*

1Tampere University, Finland   2Kyungpook National University, Daegu, Korea   *Corresponding author

Paper under review: When Does Semantic Masking Help Visual-Inertial Odometry? A Controlled Study in Simulated Warehouse Scenes

Test split on Zenodo: record B · record C

Left: mask every movable object. Right: SAVIOR, mask only what moves. Heavy traffic in SAVIOR-Warehouse, real segmenter output in red. Masking every box, pallet and trolley also removes the parked ones on the racks, which are some of the best landmarks the estimator has.

The study in one minute

  • The question. Dynamic-scene visual-inertial odometry often masks every object of a movable class. We asked when that helps, with controls: each simulated warehouse trajectory is rendered at four traffic levels, from static to heavy, and the test split was frozen before it was rendered.
  • Masking helps when moving objects carry a large share of the measurements. In medium and heavy traffic, SAVIOR cut the error of OpenVINS by 48 % and was better on all 24 test trajectories. The gain comes from heavy traffic, where a forklift drives ahead of the camera; with few movers, no gain was detected.
  • Masking every movable class has a cost. It raised the error in static scenes by 42 %, because parked boxes and pallets are good landmarks. SAVIOR keeps them by default and beat all-class masking by 27 to 34 %.
  • A simple class prior does most of the work. Masking only people and forklifts did not differ detectably from SAVIOR's per-instance reasoning. A stress test with large moving loads was inconclusive.
  • A tuned filter is a strong rival in simulation, but not on real data. A tighter outlier gate in the filter beat the masks in simulation. On real walking-person sequences, tuned gates failed in 14 to 19 of 30 runs, against 1 of 30 with masks.
  • Practical. One mask image per frame is the only interface, so the same front end serves three unmodified estimators. The C++ node runs at the 20 Hz camera rate on a Jetson Orin NX.

Latest (November 2026). The paper is now framed as a controlled study of when masking helps. New since the first version: a class-prior baseline, a pre-specified stress test with dominant loads, a comparison with tuned and real-data-calibrated filter gates, and a check of how much the results depend on the environment.

Method

SAVIOR removes the features of moving objects in the VIO front end. The estimator itself is not modified: it only sees fewer features. Stereo images and the IMU are the only inputs.

System diagram of SAVIOR: stereo images and IMU enter the perception modules (detection, classification of dynamic outliers, post-processing), whose masks enter the VIO front-end between feature extraction and tracking, followed by an unmodified estimator.
System overview. Blue: SAVIOR modules. Black: the VIO front end, patched only to read the masks, and an unmodified estimator (OpenVINS, VINS-Fusion or DynaVINS).

Class prior

People are always masked. Forklifts, boxes, pallets and trolleys are only masked when there is evidence they move. Racks and walls are never masked.

Depth and association

Stereo depth links objects that touch in space, not just in the image. A link spreads from a mover to what it carries: person, then forklift, then load.

Motion evidence

IMU-compensated image motion confirms which objects move. An object stays masked until it has been confirmed static.

Mask interface

One 8-bit mask per camera and frame. An empty mask leaves OpenVINS bit-identical, which gives an exact control.

One frame, step by step

A driven forklift carries a pallet with four boxes, and a person walks in front. The steps run SAVIOR's code on ground-truth instance masks, so they show the decision logic, not segmentation errors.

Masks on a real run. Top left: camera. Top right: all-class masking. Bottom left: SAVIOR. Bottom right: ground-truth moving objects. All-class masking and SAVIOR use the same segmenter, and SAVIOR's output is shown as is, mistakes included.

SAVIOR-Warehouse dataset

No public stereo-inertial dataset lets you change the traffic while keeping everything else fixed. SAVIOR-Warehouse, rendered in NVIDIA Isaac Sim, renders every trajectory four times, from a static scene to heavy traffic with people, forklifts and carried loads. Camera path, scene and IMU noise are identical, so any difference comes from the moving objects.

One trajectory, four traffic levels: static, light (people), medium (people and driven forklifts) and heavy (including a forklift ahead of the camera).

The test split, 24 new trajectories in four environments (one from a different asset family), was frozen before rendering, together with the methods, five hypotheses and the analysis. The sensor is a ZED 2i-like stereo pair (672×376, 20 Hz) with a 200 Hz IMU, with ground-truth poses, depth and instance masks.

The four test environments at medium traffic.

Results

−48 %Error of OpenVINS with SAVIOR in medium and heavy traffic; better on all 24 test trajectories.
+42 %Error added by masking every movable class in static scenes. SAVIOR's static cost was not detectable, though a small one is not ruled out.
−27 to −34 %SAVIOR against all-class masking, in static and light traffic and in medium and heavy traffic.
≈ class priorMasking only people and forklifts did as well as SAVIOR (heavy traffic: SAVIOR between 26 % better and 11 % worse).
Tuned gateIn simulation, a tighter outlier gate beat SAVIOR by 20 %. On real data, gates failed in 14 to 19 of 30 runs, against 1 of 30 with masks.
10 → 1 of 30Failed runs on three real walking-person sequences with masking; on the third sequence masking was 27 % worse.

Error is the absolute trajectory error, compared in pairs per trajectory; negative is better.

The pre-registered test

Forest plot of five confirmatory hypotheses and two secondary comparisons: ATE change with 95 percent interval, with individual trajectories as ticks.
Five hypotheses, tested in a fixed order (24 trajectories, OpenVINS). The first four held:
  • perfect masks of moving objects beat perfect masks of all movable classes (−45 %);
  • SAVIOR beat all-class masking (Y-Cls) in medium and heavy traffic (−34 %) and in static and light traffic (−27 %);
  • SAVIOR beat the unmasked filter in medium and heavy traffic (−48 %).
The fifth, that SAVIOR costs nothing in static scenes, was not confirmed. When environment is added to the model, the first result is no longer significant (−5 % in the environment from a different asset family). The SAVIOR results still hold.
Scatter plots of ATE reduction by perfect masks against the share of measurements or pixels on moving objects; gain grows with the share.
When masking matters. Error reduction from perfect masks grows with the share of measurements (a) or pixels (b) on moving objects. Here positive is better.
A typical heavy-traffic run. OpenVINS (blue) and OpenVINS with SAVIOR (red) against ground truth (black). Error is 0.336 m versus 0.084 m, close to the median ratio over the 24 heavy-traffic trajectories. Some trajectories show no gain.

Real sequences

Real-world ATE per start offset for several methods on three sequences with a moving person and one static control.
Three real sequences with a walking person (a to c) and a static control (d). Ten runs per method; runs above the dotted line are failures. Only persons are masked here. Masking removed the failures on one sequence and reduced them on another. On the third, where the person holds only 2.5 % of the measurements, it was 27 % worse.

Real time on a Jetson Orin NX

The C++ node runs at the 20 Hz camera rate on a Jetson Orin NX 8 GB: 24.5 ms median and 49.1 ms p99 per frame, 110 ms end-to-end p99 latency from image to pose, at 10.9 W. It reproduces the Python reference bit for bit. In closed loop on the device, accuracy was 0.92 to 1.32 times the desktop value, with no failures.

Bar charts: mean time per frame by stage for the Python and C++ nodes with p99 marks against the 50 ms frame period, and end-to-end latency for OpenVINS alone and SAVIOR.
Time per frame by stage (a) and end-to-end latency (b).

Limitations

  • The main evidence is simulated, and the segmenter was trained in the same simulator. The real sequences contain only walking people (three sequences), no forklifts or loads.
  • SAVIOR's per-instance reasoning was not shown to improve on the class prior.
  • All gains are relative to the filter's default outlier gate. In simulation, a tuned gate beat the masks.
  • On the warehouse, unmasked DynaVINS is the most accurate system tested. Masks matter most for the filter that would otherwise fail.
  • The effect on accuracy of the deployment timeout, which drops 0.4 to 7 % of the masks, was not evaluated.

Code and data

Code, frozen configurations and the evaluation artefact are in the repository; start with the README, docs/DATA.md and experiments/README.md. The dataset and raw outputs are on Zenodo: record A (dataset and artefact), and records B and C (test split). Runs are deterministic offline replays with five start offsets per sequence, and an empty-mask control reproduced OpenVINS bit for bit in all 480 test runs. The freezes are internal checksums, not registered with a third party.

Cite

The paper is under review; please cite the software and artefact for now.

@software{savior_code,
  title        = {{SAVIOR}: code, frozen configurations and evaluation artefact},
  author       = {Kuruppu Arachchige, Sasanka and Lee, Kyuman},
  version      = {1.0.0},
  year         = {2026},
  month        = oct,
  doi          = {10.5281/zenodo.23803392},
  url          = {https://github.com/SasaKuruppuarachchi/SAVIOR},
  license      = {GPL-3.0-or-later},
  note         = {Paper under review}
}