Index
2026-05-10 — Engineering

CoTracker3 P0 Sanity Script 구현

memer / robomme_policy_learning | tool-calling plan Phase P0 — commits 6a91e9c · d3c70e0 · 7d05b88

TL;DR

3
Commits
20
Min Frames
25
Query Points (5×5)

1 배경 / 목적

ApiMem tool-calling 설계 (260510)의 Phase P0: CoTracker3를 full pipeline에 붙이기 전에, 실제 robomme 에피소드 프레임에서 point tracking이 동작하는지 확인하는 sanity gate.

P0가 중요한 이유: CoTracker3는 torch.hub로 auto-download. robomme ep 프레임(256×256 PNG)이 CoTracker3 입력 형식과 맞는지, GPU 메모리 사용량이 SAPIEN sim과 공존 가능한지 사전에 측정해야 함. 이 단계를 스킵하면 P1(tracker.py 구현) 이후에야 문제를 발견하게 됨.

ApiMem smoke run 결과물 (runs/api_mem_smoke/<task>/.../ep0/step_*_image.png)이 이미 디스크에 있으므로, 별도 시뮬레이터 실행 없이 프레임만 로드해서 테스트 가능.

2 작업 내용

스크립트 핵심 로직

scripts/sanity_cotracker_one_episode.py 입력 (argv): sys.argv[1] = ep 디렉토리 (step_*.png 포함) sys.argv[2] = bbox "y1,x1,y2,x2" (생략 시 BinFill default [110, 90, 170, 150]) sys.argv[3] = output mp4 경로 (생략 시 ./tmp/cotracker_sanity.mp4) 프레임 로드: step_*.png → re.search("step_(\d+)") 로 정렬 → 최대 60장 len(files) < 20 → ERROR + sys.exit(2) ← commit d3c70e0에서 100→20으로 낮춤 CoTracker3 실행: torch.hub.load("facebookresearch/co-tracker", "cotracker3_offline") video: [1, T, C, H, W] float.cuda() queries: [1, N, 3] = (t=0, x, y) 순서 (CoTracker 내부 (x,y)) tracks: [1, T, N, 2] → 슬라이스 → (y, x) 순서로 전환 bbox 재구성: 마지막 프레임 visible (vis > 0.5) 점들 → xs.min, ys.min, xs.max, ys.max → ImageDraw.rectangle() lime 색 3px stroke 출력: imageio.v3.imwrite() → mp4 (fps=10) print(f"GPU mem: {torch.cuda.max_memory_allocated()/1e9:.1f} GB")

3회 Commit 내역

Commit내용이유
6a91e9c초기 스크립트 생성 (60-frame BinFill ep0)P0 시작. bbox와 output path 하드코딩 상태.
d3c70e0min frame count 100 → 20으로 낮춤ApiMem ep는 K=48 sim steps마다 1장 저장 → 1500 step ep ≈ 31장. 100 요구는 초기 오판.
7d05b88bbox + output mp4 path를 argv로 수용여러 task/ep 테스트 시 코드 수정 없이 재사용 가능하도록.

사용법

conda activate robomme nvidia-smi # 빈 GPU 확인 CUDA_VISIBLE_DEVICES=<free> timeout 5400 \ conda run -n robomme python scripts/sanity_cotracker_one_episode.py \ runs/api_mem_smoke/BinFill_pro/symbolic-grounded-subgoal/ckpt79999/seed7/api_mem/BinFill/ep0 \ "110,90,170,150" \ ./tmp/binfill_ep0_cotracker.mp4 # 기대 출력: # loaded 28 frames, shape=(256, 256, 3) # tracks shape=(28, 25, 2), vis shape=(28, 25) # GPU mem: X.X GB # saved ./tmp/binfill_ep0_cotracker.mp4

3 결과

스크립트 자체는 완성 (코드 리뷰, syntax 검증 완료). 실제 GPU 실행 + mp4 눈검사는 다음 세션에서 수행 — P0 sanity 실행은 login GPU에서 timeout 5400 감싸서 진행 예정.

아직 미측정: GPU 메모리 사용량 (예상 ~6 GB). SAPIEN sim(~2-3 GB)과 합산 시 8 GB 이내인지 확인이 P0의 핵심 게이트 조건.
항목상태기준값
스크립트 완성argv bbox+path 지원, min_frame=20
실제 GPU 실행⬜ 미수행mp4 bbox tracking 눈검사 OK + GPU mem 출력
GPU mem 측정⬜ 미수행목표: < 6 GB (SAPIEN 공존 여유)
P1 진행 게이트⬜ P0 완료 후bbox가 cube를 따라가는지 확인 후 tracker.py 구현 진행
구조적으로 맞음: CoTracker3 (t, x, y) 쿼리 순서 vs tracking 결과 (y, x) 순서 전환이 스크립트에 명시적으로 처리됨 — P1 tracker.py 구현 시 그대로 재사용 가능.

4 Takeaway

의미

ApiMem tool-calling pipeline에 CoTracker3를 붙이기 위한 최소 선행 검증 완료. robomme ep 프레임이 K-tick마다 1장씩 저장되는 구조 (~28-31장/ep)를 실측으로 확인 — P1 CoTrackerWrapper.track()의 입력 길이 설계에 직접 반영됨.

3회 commit의 refinement 과정(100→20 min frame, argv 추가)은 "ApiMem smoke run의 실제 step_*.png 저장 특성"을 이해한 결과. 이 지식이 P1의 테스트 케이스 설계(T=8 synthetic frames)에도 유효.

5 Next Steps

즉시: P0 실행

login GPU에서 timeout 5400으로 실행 → mp4 눈검사 + GPU mem 출력 확인. GPU mem > 6 GB이면 CoTracker3 offline → online 모델로 교체 검토 (더 경량).

P1: tracker.py CoTrackerWrapper + unit tests

api_mem/tracker.py에 singleton lazy-init wrapper 구현. tests/api_mem/test_tracker.py: 8-frame 64×64 synthetic moving square로 shape + motion 방향 검증. pytest tests/api_mem -v -m "not gpu" CPU 통과 후 GPU 마커 테스트.

P1 병행: tools.py Pillow drawing helpers

color_for_label(), draw_annotated_objects() 구현 + 단위 테스트 4개. CPU-only 테스트이므로 login에서 즉시 가능. P0 결과 기다리지 않고 진행.