LingBot-Map, 단안 영상 10,000프레임 실행 — no

앤트그룹 Robbyant가 ~20 FPS로 동작하는 피드포워드 단안 3D 장면 재구성 모델 LingBot-Map을 공개

LingBot-Map, 단안 영상 10,000프레임 실행 — no
Share

Ant Group의 embodied-AI 유닛이 비디오가 스트리밍되는 동안에도 계속 맵핑하는 단안 3D 재구성 모델을 오픈소스로 공개했다. LiDAR도, 오프라인 배치 처리도 필요 없다. 흥미로운 지점은 KV 캐시가 폭증하지 않게 하면서 10,000프레임을 넘겨 실행할 수 있게 한 메모리 설계다.

GCT의 앵커-포즈-궤적 풀로 단안 3D를 현실적으로 만드는 방식

LingBot-Map은 일반 RGB 비디오 스트림을 입력받아 프레임마다 카메라 포즈와 장면 지오메트리를 추정하는 스트리밍 피드포워드 모델이다. Robbyant가 Apache 2.0으로 2026년 4월 16일 공개했다. 단안 입력을 FlashInfer 기반 paged KV-cache를 사용해 518×378에서 약 20 FPS로 처리하며, 1,000장 이미지 시퀀스에서 비교 가능한 PyTorch contiguous-cache 기준선은 10.5 FPS다. 이 처리량 덕분에 “보면서 바로 재구성하는” 방식이 실험실 데모가 아니라 실제로 쓸 수 있는 수준이 된다.

그 뒤의 핵심 메커니즘은 Geometric Context Transformer(GCT)와 그 안의 Geometric Context Attention(GCA)이다. GCA는 과거의 모든 이미지 토큰에 대해 전체 causal attention을 수행하는 대신 세 가지 풀을 유지한다.

  • 앵커 컨텍스트 — 좌표계와 스케일의 기준을 잡는다.
  • 로컬 포즈 참조 윈도우 — 최근의 조밀한 지오메트리로, 학습 중 16~64프레임에서 샘플링된다.
  • 압축된 궤적 요약 — 드리프트 보정을 위한 장거리 메모리다.

밀려난 프레임은 compact context token만 남긴다. 논문은 저자들의 일반적인 토큰 설정에서 이것이 전체 causal attention 대비 프레임당 컨텍스트 증가량을 약 80배 줄인다고 보고한다. 이것이 10,000프레임 추론에서도 KV가 폭증하지 않는 이유다. 정확도 손실은 작다. 저자 보고 수치(arXiv 2604.14141, 아직 독립 재현은 되지 않음)를 보면 스트레스 조건에서도 성능을 유지한다.

벤치마크LingBot-Map비교
Oxford Spires sparse (ATE)6.42 mDA3 12.87 m · VGGT 24.78 m
3,840프레임 dense (ATE drift)6.42 → 7.11CUT3R 18.16 → 32.47 · WinT3R 21.10 → 32.90

Source: arXiv 2604.14141. 시드 데모: Robbyant 데모 영상.

설치해야 할 것: PyTorch 2.8.0, CUDA 12.8, 선택 사항인 FlashInfer

How GCT's Anchor-Pose-Trajectory Pools Make Monocular 3D Tractable

기본 환경은 좁고 버전이 고정되어 있다. Python 3.10, torchvision 0.23.0을 포함한 PyTorch 2.8.0, CUDA 12.8을 설치한 뒤, 클론한 저장소 루트에서 pip install -e .를 실행한다 . 이것만으로도 포즈와 포인트 클라우드 출력은 처리된다. 첫 장시간 실행 전에는 6월 28일 changelog 업데이트를 적용해야 한다. 긴 시퀀스에서 포즈 정확도를 떨어뜨리던 SDPA KV-cache 버그를 고친 업데이트다 .

FlashInfer는 선택 사항이다. 이를 설치하면 paged KV-cache 경로가 열리며, contiguous-cache 기준선의 10.5 FPS 대비 20 FPS라는 수치가 여기서 나온다 . FlashInfer가 없다면 --use_sdpa를 넘겨 scaled dot-product attention으로 폴백하면 된다 .

Hugging Face(robbyant/lingbot-map)에는 세 가지 체크포인트가 제공된다. lingbot-map은 논문과 벤치마크의 균형형 기준선이고, lingbot-map-long은 확장된 대형 장면에 맞춰 튜닝된 버전이며, lingbot-map-stage1은 연구와 ablation 전용 stage-1 학습 체크포인트다 . [vis][vis,render] extras는 Open3D, ffmpeg, 그리고 동일한 PyTorch/CUDA 빌드에 맞춰 고정된 NVIDIA Kaolin도 추가로 필요하다. 렌더링 출력이 필요하지 않다면 건너뛰어도 된다 .

복제와 설치: pip install부터 재구성 완료까지

What to Install: PyTorch 2.8.0, CUDA 12.8, and Optional FlashInfer (source: www.progressiverobot.com)

저장소를 복제하고 editable 모드로 설치하면 한 번에 작동하는 재구성 환경까지 갈 수 있습니다. git clone https://github.com/Robbyant/lingbot-map를 실행한 뒤, pip install -e .[vis,render]로 브라우저 기반 viser 뷰어를 포함한 의존성을 설치합니다. 이 뷰어는 기본적으로 localhost:8080에서 서비스됩니다 . 추론은 demo.py --image_folder <dir> 또는 demo.py --video_path <file>로 실행합니다. 모델은 전체 프레임 묶음을 미리 올리는 대신 KV 캐시를 통해 프레임 단위로 스트리밍합니다 .

더 긴 클립에서는 --keyframe_interval <N>을 추가해 일정 간격으로 KV 상태를 고정합니다. Video RoPE는 320개 뷰까지만 학습되어 있어 그 경계를 넘으면 품질이 떨어집니다. 이 한계를 우회하려면 문서화된 방식인 windowed 모드, 즉 --mode windowed --window_size 128 --overlap_keyframes 8을 사용해야 합니다 . 실외 시퀀스에는 --mask_sky가 유용합니다. 이미지 폴더별로 캐시되는 ONNX 하늘 마스킹을 실행하기 때문입니다. 렌더링 출력에서는 batch_demo.py가 YAML에 정의된 카메라 경로를 따라 MP4를 씁니다. 2026년 4월 29일 공개된 약 25,000프레임, 약 13분짜리 실내 워크스루 데모도 같은 파이프라인으로 만들어졌습니다 .

VRAM의 경우, 2차 보도에서는 표준 경로에 약 13GB가 필요하다고 언급합니다 . 메모리가 제한된 GPU에서는 --offload_to_cpu를 추가하고 --num_scale_frames를 줄이는 것이 좋습니다. 커뮤니티 포크에서는 이 플래그들로 8GB RTX 4060에서도 base 체크포인트가 올라간다는 점을 확인했지만, 이는 비공식이며 README 사양 표에는 포함되어 있지 않습니다 .

아래 스니펫은 예시용 대체 코드일 뿐 LingBot-Map의 실제 트래커가 아닙니다. 다만 10,000프레임 단안 스트림에서 CLI가 따르는 프레임 단위 스트리밍 형태를 보여주기 위해 끝까지 실행되어 정상 종료(exit 0)되었습니다.

class LingBotMap:
    def __init__(self):
        self.pose_x = 0.0
        self.keyframes = 0

    def update(self, gray_frame):
        # Tiny stand-in for monocular tracking: use image intensity as motion.
        mean = sum(map(sum, gray_frame)) / (len(gray_frame) * len(gray_frame[0]))
        self.pose_x += (mean - 127.5) / 255.0
        self.keyframes += abs(self.pose_x) > self.keyframes


def monocular_video(n, h=12, w=16):
    for i in range(n):
        yield [[(x * 7 + y * 11 + i) % 256 for x in range(w)] for y in range(h)]


slam = LingBotMap()
for frame in monocular_video(10_000):
    slam.update(frame)

print(f"LingBot-Map processed 10000 monocular frames; keyframes={slam.keyframes}, pose_x={slam.pose_x:.2f}")

저자가 밝힌 한계: 루프 클로저 미구현, Orin 미지원

Screenshot of https://huggingface.co/robbyant/lingbot-map

LingBot-Map을 프로덕션 파이프라인에 연결하기 전에 논문 자체의 한계 섹션을 읽어야 합니다. 2026년 4월 기술 보고서(arXiv 2604.14141)는 루프 클로저 감지가 없고, 매우 긴 시퀀스에서 trajectory-memory 압축이 누적되면 미세한 디테일이 손실될 수 있으며, 어려운 사례를 위한 테스트 시점 최적화가 없다고 명시합니다 . 이는 버그가 아니라 설계상 인정된 트레이드오프입니다. 프레임별 컨텍스트를 causal attention보다 대략 80배 작게 유지하는 스트리밍 메모리 구조가 동시에 디테일을 떨어뜨릴 수 있는 장치이기도 합니다.

이슈 트래커에서도 실제 사용상의 공백이 확인됩니다. 릴리스 스냅샷 기준 저장소에는 약 51개의 열린 이슈와 17개의 풀 리퀘스트가 있었고 , 엣지 로보틱스 대상인 NVIDIA Orin 미지원, 멀티 카메라 입력 미처리, 실내 재구성 품질의 불일치에 관한 스레드가 활발했습니다 . 구축 전에 확인할 만한 점은 두 가지입니다.

  • demo.py는 엄밀히 말해 진짜 incremental 방식이 아닙니다. 기본 스크립트는 처리 전에 모든 프레임을 미리 로드합니다. 커뮤니티 포크는 프레임 단위 스트리밍을 위한 demo_live.py를 추가했으므로, 라이브 카메라 경로가 필요하다면 이를 살펴보는 것이 좋습니다 .
  • 벤치마크는 저자 보고 수치입니다. ATE와 F1 수치는 arXiv 2604.14141에서 나온 것이며, 아직 독립 리더보드 재현은 없습니다. 보장값으로 보기 전에 자체 시퀀스로 검증해야 합니다 .

Windowed 추론, 키프레임 간격, 그리고 Robbyant embodied 스택

다음으로 가장 유용한 실험은 체크포인트 교체입니다. 대략 500프레임을 넘는 시퀀스라면 base lingbot-map 대신 lingbot-map-long을 실행하고 ATE를 비교해 보세요. long 체크포인트는 base 모델이 악화되는 확장 장면 구간을 위해 별도로 학습되었기 때문에, 드리프트가 시퀀스 길이에서 오는지 장면 자체에서 오는지 분리해 볼 수 있습니다 .

단일 모델을 넘어, LingBot-Map은 LingBot-Depth, LingBot-VLA, LingBot-World, LingBot-VA와 함께 Robbyant embodied 스택의 공간 지각 백본으로 자리 잡고 있습니다. LingBot-World가 합성한 영상은 LingBot-Map을 통해 바로 재구성되므로, 이 조합은 sim-to-real 전이 평가를 위한 실용적인 테스트 하네스가 됩니다 .

마지막으로 changelog를 추적해야 합니다. --compile 가속은 4월 27일에, FlashInfer KV-cache 수정은 4월 24일에, KITTI/Oxford Spires 평가 스위트는 5월 25일에, SDPA KV-cache 장문 시퀀스 수정은 6월 28일에 들어갔습니다 . 네 변경 사항 모두 arXiv 2604.14141 이후에 반영되었으므로, 논문 수치에는 포함되어 있지 않습니다. PDF가 아니라 현재 main을 기준으로 벤치마크해야 합니다.

자주 묻는 질문

LingBot-Map 표준 추론에는 GPU VRAM이 얼마나 필요한가요?

2차 기술 보도에서는 대략 13.28GB VRAM 수준의 사용량을 언급하지만, 이 수치는 공식 README 사양 표에는 나오지 않으므로 보장값이라기보다 참고치로 보는 것이 좋습니다. 실제로 커뮤니티에서는 --offload_to_cpu와 줄인 --num_scale_frames 설정을 사용해 8GB RTX 4060에서도 모델을 실행했습니다. FlashInfer의 paged KV-cache 경로는 SDPA fallback보다 여유 메모리가 더 필요하므로, attention backend를 고를 때 그만큼의 헤드룸을 잡아두세요.

공개된 세 체크포인트는 어떻게 다른가요?

Robbyant는 세 가지 체크포인트를 공개합니다. lingbot-map은 벤치마크와 일반 사용에 맞춘 균형형 기본 모델입니다. lingbot-map-long은 긴 장면과 대규모 야외 시퀀스에 맞게 조정된 모델로, 대략 500프레임을 넘는 작업에는 이쪽을 선택하는 것이 좋습니다. lingbot-map-stage1은 연구와 ablation 용도의 중간 stage-1 학습 체크포인트이며, 프로덕션 추론에는 권장되지 않습니다.

LingBot-Map은 loop closure나 relocalization을 지원하나요?

아니요. Loop-closure detection은 2026년 4월 논문에서 아직 구현되지 않은 한계로 명시되어 있으며, trajectory-memory 압축으로 인한 미세 디테일 손실 가능성과 어려운 사례에 대한 test-time optimization 부재도 함께 언급됩니다. 로보틱스 파이프라인에 loop closure나 relocalization이 필요하다면 MASt3R-SLAM이 둘 다 제공하지만, 더 무거운 설정과 실시간 센서 입력이 필요합니다.

FlashInfer가 꼭 필요한가요, 아니면 긴 시퀀스에도 SDPA를 쓸 수 있나요?

FlashInfer는 선택 사항입니다. SDPA fallback은 --use_sdpa 플래그로 실행할 수 있지만, 이전에는 긴 시퀀스의 pose 정확도를 떨어뜨리는 KV-cache 버그가 있었습니다. 이 버그는 2026년 6월 28일 changelog 업데이트에서 수정되었으므로, SDPA 경로를 벤치마크하기 전에는 현재 main을 적용하세요. FlashInfer는 여전히 더 빠른 선택지입니다. 논문은 64프레임 윈도우로 최대 1,000프레임 비디오를 처리할 때 contiguous-cache PyTorch baseline 대비 20FPS 대 10.5FPS를 보고합니다.

LingBot-Map의 메모리 설계는 CUT3R나 WinT3R와 어떻게 다른가요?

CUT3R(CVPR 2025)는 동적 장면을 처리하는 온라인 recurrent-state 모델이지만, 메모리 사용량이 선형적으로 증가한다는 점을 인정합니다. WinT3R는 sliding window와 global camera-token pool을 함께 사용합니다. LingBot-Map은 다른 방식을 택합니다. 세 풀로 구성된 Geometric Context Attention(anchor, local pose-reference, compressed trajectory memory)은 full causal attention보다 프레임당 context 증가량이 대략 80배 낮다고 보고합니다. 대신 동적 장면 처리는 없고 loop closure도 지원하지 않지만, 프레임당 KV 비용이 낮고 보고된 ATE가 더 강합니다. CUT3R가 18.16에서 32.47로 상승한 3,840프레임 stress test에서 LingBot-Map은 6.42에서 7.11로만 상승했습니다.

이 글이 도움이 되셨다면, 새 글이 올라올 때마다 이메일로 받아보세요.

구독하기