AxisTilted2 โ Tartan IMU Challenge (IROS 2026) final submission
A shared model that estimates body-frame velocity from raw six-axis IMU across car, quadruped, drone and handheld motion. It combines spectral and recurrent neural features with a learned, calibrated Gaussian smoother. Inference uses 64-second contexts and is offline and non-causal.
This release contains the weights, inference code and exact predictions for team AxisTilted2, Kaggle submission 56287620 (public score 0.27765).
Authors: Sanjayan Sreekala (san@sankala.me) and Chinmayan Pradeep (chinpradk@gmail.com), both Independent Researchers. Code and weights: Apache-2.0.
The official all-89 evaluation returned 0.21556 (ATE20 0.56008 m, AVE 0.17614 m/s, RTE 0.82921 m). This is distinct from the public leaderboard population.
| Model | CalibratedIMU โ one shared model, 3,549,642 parameters |
| Weights | model.pt, SHA256 0caa21fed31c77b5ed11f258d49459064e5cf6e6a72a318f3e52e28718fcd1f9 |
| Predictions | submission.csv, 30,644 rows, MD5 62c722045add864387c1b01c83695a1b, SHA256 529ebc972daed3cea5de317096769436a87a652af35819383bcb1164388dc916 |
| Inference input | Raw six-axis IMU at 200 Hz and the public test window index only |
| Context | 64-second windows, stride 32, overlap-weighted, offline within one trajectory |
| Runtime | Python 3.12, torch==2.10.0+cu128; ~10 s and ~0.5 GB GPU memory for the full test set on an RTX 3090 |
| Training data | Released train + validation labels only (475 trajectories); no external data or pretrained weights |
| Report | Technical report |
Reproduce the submission
python3.12 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python scripts/infer_candidate.py --weights model.pt --data-root /path/to/competition --output out/submission.csv --device cuda
--data-root must contain index/test_windows.csv, sample_submission.csv
and test/*.npz from the competition release. The script writes
out/submission.csv.json with the output hashes. Two runs on the original
RTX 3090 reproduced the submitted CSV exactly. A fresh Python 3.12 install
with the pinned dependencies also ran successfully on an RTX 4090: 30,644
rows in 8.31 seconds, with 0.52 GB peak reserved CUDA memory. Two runs on that
setup produced the same hash, but differed from the RTX 3090 output.
| Tested setup | Reference CSV SHA256 |
|---|---|
| RTX 3090 (submitted predictions) | 529ebc972daed3cea5de317096769436a87a652af35819383bcb1164388dc916 |
| RTX 4090 (reproduction reference) | 35683cd11a39f2ddf91390c063518e3e6fbcb7053530df80e1f7623710eb14e0 |
Window IDs and row order match. Across the two GPUs, the mean per-window
velocity-vector difference is 0.000421 m/s and the maximum absolute
component difference is 0.014917 m/s. Disabling TF32 did not remove the
difference; BF16 computation and hardware-dependent cuDNN kernels are the
suspected sources. Bit-exact cross-hardware reproduction is not guaranteed.
See the RTX 4090 measurements and reference CSV
for the environment and details. The root submission.csv is the original
RTX 3090 output used for all reported competition scores.
CPU inference also differs from the submitted output: the macOS check found mean/max absolute component differences of 0.000381/0.071294 m/s. These are component statistics, distinct from the GPU vector-difference mean above.
release_files.sha256.json lists hashes for this release.
artifact_manifest.json records the original inference package; its README
is preserved as FROZEN_PACKAGE_README.md.
Model
One shared network for all platforms: a dilated 1D CNN over raw IMU (20 Hz features), per-second statistics and a local spectrogram branch, a two-layer bidirectional GRU at 4 Hz, and a 20 Hz decoder producing a shared velocity plus four soft-gated internal residual heads. A small sensor-calibration subnetwork (86,610 parameters), supervised separately on released relative-rotation and gravity labels and then frozen inside the same checkpoint, supplies gyro corrections, gravity direction and confidence to a nine-state (velocity, accelerometer bias, gravity) conditional Gaussian smoother. The smoother output is blended with the raw neural velocity by a learned strength.
Disclosures: platform-supervised internal gating (signal-only at inference); EMA .995 during training; overlap-weighted blending of 64 s contexts at stride 32; non-causal context within a trajectory; no ensemble, no test-time augmentation, no test-time adaptation, no platform labels, no external pretrained weights. Model selection used three family-grouped folds over the 475 released labelled trajectories; the final weights are one fresh fit on all 475. See the technical report for the full description and the five compliance answers.
Training
training/frozen_source.tar.gz is the exact source archive used for the
training run (SHA256 94e150da0446e957a67dcefa4ca3a87235e0e1afe3d26ad146f98f6d750c09a5;
per-file hashes in training/frozen_source_manifest.json). Entry points:
scripts/prepare_combination_assets.py then
scripts/run_combination_cv.py --config config/combination_cv_20260916.json.
It is a research workspace with remote-machine paths, provided for audit, not
a one-command training release. Competition data is not redistributed here.
License and data
Model weights and code in this repository are released under the
Apache License 2.0 (see LICENSE). references/TartanIMU/LICENSE is the
Apache-2.0 license of the organizer's reference code used for the metric. The Tartan IMU Challenge
dataset is licensed for the competition and non-commercial academic research
only; it is not included here.