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로만 상승했습니다.

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

구독하기

AI developer tools and ecosystem news for developers and technical founders

Sign up for insights and ideas

Subscribe for the latest news, stories, tips, and updates.

Subscribe