Open-source project
amap-cvlab/ABot-Recon avatar
amap-cvlab/ABot-Recon

ABot-Recon: streaming 3D reconstruction with a fixed 12-frame context

Streaming 3D reconstruction from only video input: Revisiting Local Context for Long-Horizon Streaming 3D Reconstruction

943 stars61 forksPythonApache-2.0

At a glance

What is it?
ABot-Recon reconstructs long video streams by solving the same bounded prediction problem at every step, with no persistent learned long-range memory. Here is what the repository documents, where the design stops, and who should wait.
Who is it for?
ABot-Recon fits teams that already run PyTorch 2.5.1 on CUDA 12.1 hardware and want streaming camera poses and point maps without building a long-range state machinery. Skip it if you need Windows support, a pip-installable loop-closure path, or a published per-sequence breakdown of the reported numbers.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 21, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem ABot-Recon attacks: long video, bounded memory

Most streaming reconstruction systems grow something as the video gets longer. Either the model keeps a learned long-range state, or the map keeps accumulating anchors that have to be fused and corrected. ABot-Recon takes the opposite route and keeps the prediction problem the same size at every step. The README states the design in one line: reconstruct with a fixed 12-frame local context, composing current-frame geometry and adjacent relative poses into a global reconstruction without persistent learned long-range memory. The intended user is an engineer or researcher who has a monocular video stream, wants a camera trajectory and a point cloud out of it, and does not want per-frame compute or model-state memory to scale with how long the stream runs. The repository is Python, licensed Apache-2.0, and ships a checkpoint on Hugging Face and ModelScope plus an online demo on both platforms.

How the 11-frame KV cache and pose composition actually work

The mechanism is described as a repeated bounded solve. At each time step the model caches KV features from the preceding 11 frames, predicts a point map P_i in the current camera coordinate system, estimates the adjacent relative pose T_{i-1<-i}, and recovers the global trajectory and point cloud through sequential pose composition. That is the whole loop. There is no anchor store, no global bundle adjustment in the base path, and no learned memory carried across the horizon. Two components exist specifically because composing local poses over long horizons drifts: a lightweight motion-visual rotation refiner and a composition-aware pose loss. The trade-off is visible in the architecture. Per-frame cost is flat, which is what makes a 22000-frame default stream length plausible, but every error in a relative pose is baked into everything after it. The README reports Oxford Spires camera pose at ATE 4.35 m and RPE-R 0.12 degrees with the streaming model only and no loop closure, which is the honest framing of what the local design buys and what it costs.

Installing ABot-Recon on Linux with CUDA 12.1

The released configuration targets Linux, Python 3.10 or later, PyTorch 2.5.1 and CUDA 12.1. The release environment was validated on an NVIDIA A100, while the runtime benchmark in the paper uses an H100. The README's install sequence creates a conda environment, installs the pinned torch and torchvision wheels from the CUDA 12.1 index, then installs the package itself in editable mode, which is what makes the abot-recon console script from pyproject.toml available.

bash
conda create -n abot-recon python=3.11 -y
conda activate abot-recon

pip install torch==2.5.1 torchvision==0.20.1 \
  --index-url https://download.pytorch.org/whl/cu121
pip install -e .

The README lists an optional acceleration step. ABot-Recon uses paged KV-cache operators from FlashInfer when they are available and falls back to PyTorch SDPA otherwise, and compiling cuRoPE further accelerates rotary position encoding. Both are optional, and the fallback path is what runs if you skip this block.

bash
pip install flashinfer-python
flashinfer show-config

cd abot_recon/modeling/pi3/models/curope
pip install ninja
python setup.py build_ext --inplace
cd -

The checkpoint downloads automatically from Hugging Face through the Python API and the demo and is reused from the local cache. For offline inference the README says to download it manually and place it at checkpoints/abot_recon.safetensors. A first run looks like this, with the base model and loop closure disabled.

bash
python demo.py \
  --image-dir examples/images \
  --output-dir outputs/demo \
  --attention-backend auto \
  --no-loop-closure

Input images are sorted lexicographically, so frame names should be zero-padded, for example 000001.jpg and 000002.jpg. The run performs one causal pass and writes the raw camera trajectory, adjacent relative poses, local point maps, confidence maps and run metadata. Adding --save-world-points transforms the local point maps using the final trajectory and saves a global point cloud, and --confidence-threshold T masks points below T in the range [0, 1].

Where the local-context design breaks down

The failure mode is drift, and the repository is direct about it. Sequential pose composition means the global trajectory is only as good as the chain of adjacent relative poses underneath it, and the reported Oxford Spires ATE of 4.35 m is measured without loop closure. Loop closure is the correction path, but it is not in the base install. pyproject.toml puts faiss-cpu, opencv-python, pypose and scipy behind an optional extra named loop, and the README's quick start passes --no-loop-closure even though the flag defaults to enabled. If you install with plain pip install -e . and then run the default configuration, the loop-closure dependencies are simply not present. The second boundary is hardware. The released configuration targets Linux, PyTorch 2.5.1 and CUDA 12.1, so a CPU-only or Windows machine is outside what the repository documents. The third is the benchmark framing itself. The 24.45 FPS and 6.71 GiB figures are stated at 504x280 on an NVIDIA H100 with input storage excluded, and the README does not publish a per-sequence table of those numbers, so treat them as a ceiling rather than an expectation. This is the wrong tool if your sequence has many revisited regions and you cannot install the loop extra, or if you need a reconstruction that is globally consistent by construction rather than by post-correction.

ABot-Recon against anchor-based streaming SLAM

The natural comparison is a classical visual SLAM pipeline such as ORB-SLAM style systems, which maintain a persistent map of landmarks, keyframes and a pose graph, and run bundle adjustment or pose-graph optimisation to keep the map globally consistent. That approach is explicitly global: it revisits old observations and corrects them. ABot-Recon's base path is explicitly local: it never revisits, it composes. The practical difference shows up in resource shape. An anchor-based system's memory and optimisation cost grow with the map, while ABot-Recon's per-frame computation and model-state memory stay independent of elapsed sequence length, which is the property the README claims. The cost is that global consistency becomes an optional add-on rather than an intrinsic property. The optional loop extra (faiss-cpu, opencv-python, pypose, scipy) is the bridge, and the README describes it as trajectory refinement on sequences with revisited regions. If your video is a single forward pass down a corridor, the local design is the cheaper choice. If it is a room you walk around three times, you are depending on that optional path.

Maintenance, licence and the cost of upgrading

The repository is not archived and the last push was on 2026-09-16. There are no retrieved releases, so adoption means tracking the main branch or pinning a commit rather than following tags, and pyproject.toml still carries version 0.1.0. Two dependency facts drive upgrade cost. Torch is pinned to exactly 2.5.1 and torchvision to 0.20.1 in both the install command and the dependency list, so moving to a newer PyTorch is a deliberate migration, not a version-range bump. The loop extra is version-ranged rather than pinned, which means the optional path is the one most likely to shift under you. On licensing, the repository ships a LICENSE file classified as Apache-2.0, and it also ships MODEL_LICENSE.md, MODEL_USAGE_GUIDELINES.md, MODEL_USAGE_GUIDELINES_ZH.md, NOTICE and THIRD_PARTY_NOTICES.md. The code licence and the model licence are separate documents here, and the checkpoint is distributed through Hugging Face and ModelScope rather than in the repository. Read MODEL_LICENSE.md before shipping the weights in a product; this is a description of what the repository contains, not legal advice.

Editorial conclusion

ABot-Recon fits teams that already run PyTorch 2.5.1 on CUDA 12.1 hardware and want streaming camera poses and point maps without building a long-range state machinery. Skip it if you need Windows support, a pip-installable loop-closure path, or a published per-sequence breakdown of the reported numbers. Before adopting, reproduce the quick start on examples/images, check the FPS and memory figures on your own GPU rather than the H100 cited in the README, and read MODEL_LICENSE.md alongside the Apache-2.0 LICENSE file, because the repository ships both.

Frequently asked questions

What hardware and Python version does ABot-Recon require?

The released configuration targets Linux, Python 3.10 or later, PyTorch 2.5.1 and CUDA 12.1. The README states the release environment was validated on an NVIDIA A100, while the paper's runtime benchmark uses an NVIDIA H100.

How do I run ABot-Recon on my own video frames?

Point demo.py at a directory of images with --image-dir and set --output-dir for the results. Frames are sorted lexicographically, so name them with zero padding such as 000001.jpg, and pass --no-loop-closure for a base run without the loop dependencies.

Does ABot-Recon need loop closure to produce a trajectory?

No. The README states the base model requires neither loop-closure dependencies nor loop assets, and the minimal example performs one causal pass and writes the raw camera trajectory, adjacent relative poses, local point maps and confidence maps. Loop closure is described as optional trajectory refinement for sequences with revisited regions.

Official sources

  1. amap-cvlab/ABot-Recon on GitHub
  2. Issues
  3. License: Apache-2.0
  4. Project website
  5. README
Community notes

Community notes