NVlabs/FoundationPose
요약
CVPR 2024에 발표될 FoundationPose는 모델 기반 및 모델 프리 설정을 모두 지원하는 통합 6D 객체 포즈 추정 및 추적 파운데이션 모델입니다. 미세 조정 없이도 새로운 객체에 즉시 적용 가능하며, BOP 리더보드 1위를 기록하며 강력한 일반화 성능을 입증했습니다.
핵심 포인트
- 모델 기반 및 모델 프리 설정을 통합한 6D 포즈 추정 프레임워크
- 미세 조정 없이 새로운 객체에 즉시 적용 가능한 Zero-shot 성능
- 신경 암시적 표현을 통한 효과적인 새로운 시점 합성 지원
- BOP 리더보드 모델 기반 포즈 추정 분야 세계 1위 달성
이것은 CVPR 2024 (Highlight)에 발표될 예정인 저희 논문의 공식 구현체입니다.
기여자 (Contributors): Bowen Wen, Wei Yang, Jan Kautz, Stan Birchfield
저희는 모델 기반 (model-based) 및 모델 프리 (model-free) 설정을 모두 지원하는 6D 객체 포즈 추정 (6D object pose estimation) 및 추적 (tracking)을 위한 통합 파운데이션 모델 (foundation model)인 FoundationPose를 제시합니다. 저희의 접근 방식은 CAD 모델이 주어지거나 소수의 참조 이미지 (reference images)가 캡처되어 있는 한, 미세 조정 (fine-tuning) 없이도 테스트 시점에 새로운 객체에 즉시 적용될 수 있습니다. 저희는 효과적인 새로운 시점 합성 (novel view synthesis)을 가능하게 하는 신경 암시적 표현 (neural implicit representation)을 통해 이 두 설정 사이의 간극을 메우며, 동일한 통합 프레임워크 내에서 다운스트림 포즈 추정 (pose estimation) 모듈이 불변성을 유지하도록 합니다. 대규모 합성 학습 (synthetic training), 대규모 언어 모델 (LLM)의 도움, 새로운 트랜스포머 기반 (transformer-based) 아키텍처, 그리고 대조 학습 (contrastive learning) 공식을 통해 강력한 일반화 성능을 달성했습니다. 도전적인 시나리오와 객체를 포함하는 여러 공개 데이터셋에 대한 광범위한 평가 결과, 저희의 통합 접근 방식이 각 작업에 특화된 기존 방법들을 큰 차이로 능가함을 보여줍니다. 또한, 줄어든 가정 (assumptions)에도 불구하고 인스턴스 수준 (instance-level) 방법들과 대등한 결과를 달성했습니다.
🤖 ROS 버전을 원하시면, TRT 빠른 추론 (fast inference)과 C++ 가속을 제공하는 Isaac ROS Pose Estimation을 확인해 주세요.
🥇 모델 기반 새로운 객체 포즈 추정 (model-based novel object pose estimation) 분야에서 전 세계 BOP 리더보드 1위 (2024/03 기준).

로봇 응용 분야 (Robotic Applications):
robot_mustard.mp4
AR 응용 분야 (AR Applications):
ar_maze_c.mp4
YCB-Video 데이터셋 결과:
ycbv_tracking_c.mp4
@InProceedings{foundationposewen2024,
author = {Bowen Wen, Wei Yang, Jan Kautz, Stan Birchfield},
title = {{FoundationPose}: Unified 6D Pose Estimation and Tracking of Novel Objects},
...
만약 모델 프리 (model-free) 설정이 유용하다고 느끼신다면, 다음을 인용하는 것도 고려해 주세요:
@InProceedings{bundlesdfwen2023,
author = {Bowen Wen and Jonathan Tremblay and Valts Blukis and Stephen Tyree and Thomas M"{u}ller and Alex Evans and Dieter Fox and Jan Kautz and Stan Birchfield},
title = {{BundleSDF}: {N}eural 6-{DoF} Tracking and {3D} Reconstruction of Unknown Objects},
...}
모든 네트워크 가중치 (network weights)를 여기에서 다운로드하여
weights/
폴더 아래에 넣어주세요.
Refiner를 위해서는 2023-10-28-18-33-37이 필요합니다.
Scorer를 위해서는 2024-01-11-20-02-45가 필요합니다.
데모 데이터 (demo data)를 다운로드하여
demo_data/
폴더 아래에 압축을 해제하세요.
[선택 사항] 당사의 대규모 학습 데이터 (large-scale training data)를 다운로드하세요: "FoundationPose Dataset"
[선택 사항] 모델 프리 (model-free) 퓨샷 (few-shot) 버전을 실행하기 위해, 여기에서 전처리된 참조 뷰 (preprocessed reference views)를 다운로드하세요.
cd docker/
docker pull wenbowen123/foundationpose && docker tag wenbowen123/foundationpose foundationpose # 또는 처음부터 빌드하려면: docker build --network host -t foundationpose .
bash docker/run_container.sh
컨테이너를 처음 실행하는 경우, 확장 기능 (extensions)을 빌드해야 합니다. 이 명령어를 Docker 컨테이너 내부에서 실행하세요.
bash build_all.sh
나중에는 재빌드 없이 컨테이너에 접속할 수 있습니다.
docker exec -it foundationpose bash
4090과 같은 최신 GPU의 경우, 이것을 참조하세요. 요약하자면, 다음과 같이 수행하면 됩니다:
docker pull shingarey/foundationpose_custom_cuda121:latest
그 다음, foundationpose:latest 대신 이 이미지를 사용하도록 bash 스크립트를 수정하세요.
환경 구축 (Create the environment) (C++ 빌드 의존성 + Python; 모두 conda-forge 사용):
conda env create -f environment.yml
conda activate foundationpose
사용자의 머신과 일치하는 CUDA 빌드로 PyTorch를 설치하세요. PyTorch "Get Started" 페이지에 올바른 --index-url이 나열되어 있습니다 (예를 들어 cu124는 대부분의 최신 NVIDIA 드라이버에서 작동합니다). 예시:
python -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
PyTorch3D 및 NVDiffRast 설치 (소스에서 컴파일해야 하며, nvcc를 위해 CUDA toolkit이 필요합니다. 설치된 위치에 따라 CUDA_HOME을 지정하세요. 예: /usr/local/cuda-12.8 또는 /usr/local/cuda):
export CUDA_HOME=/usr/local/cuda # 또는 예: /usr/local/cuda-12.8
export PATH="$CUDA_HOME/bin:$PATH"
python -m pip install --no-build-isolation "git+https://github.com/facebookresearch/pytorch3d.git"
...
빌드 과정에서 이미 설치된 torch를 인식할 수 있도록 --no-build-isolation 옵션이 필요합니다.
나머지 Python 의존성 설치 및 빌드 (BundleSDF의 mycpp 확장 기능인 mycuda 단계는 선택 사항입니다. model-free / NeRF 경로가 필요한 경우가 아니라면 건너뛰세요):
python -m pip install -r requirements.txt
bash build_all_conda.sh
선택 사항 — Kaolin (model-free 설정 시에만 필요하며, 버전이 PyTorch/CUDA와 일치해야 합니다 — Kaolin 설치 문서를 참조하세요).
경로들은 argparse에 의해 기본적으로 설정되어 있습니다. 장면(scene)을 변경해야 하는 경우, 그에 따라 인자(args)를 전달할 수 있습니다. 데모 데이터로 실행하면 로봇이 머스터드 병을 조작하는 모습을 볼 수 있습니다. 포즈 추정 (Pose estimation)은 첫 번째 프레임에서 수행된 후, 비디오의 나머지 부분에 대해 자동으로 트래킹 (tracking) 모드로 전환됩니다. 결과 시각화 자료는 argparse에 지정된 debug_dir에 저장됩니다. (참고: 온라인 컴파일로 인해 처음 실행할 때는 속도가 더 느릴 수 있습니다.)
python run_demo.py
argparse의 경로를 변경하여 드릴러(driller)와 같은 다른 물체에 대해서도 (재학습할 필요 없이) 자유롭게 시도해 보세요.
이를 위해서는 먼저 LINEMOD 데이터셋과 YCB-Video 데이터셋을 다운로드해야 합니다.
이 두 데이터셋에 대해 각각 모델 기반 (model-based) 버전을 실행하려면, 다운로드한 위치를 기준으로 경로를 설정하세요. 결과는 debug 폴더에 저장됩니다.
python run_linemod.py --linemod_dir /mnt/9a72c439-d0a7-45e8-8d20-d7a235d02763/DATASET/LINEMOD --use_reconstructed_mesh 0
python run_ycb_video.py --ycbv_dir /mnt/9a72c439-d0a7-45e8-8d20-d7a235d02763/DATASET/YCB_Video --use_reconstructed_mesh 0
모델 프리 (model-free) 퓨샷 (few-shot) 버전을 실행하려면, 먼저 Neural Object Field를 학습시켜야 합니다. ref_view_dir은 위의 "Data prepare" 섹션에서 다운로드한 위치를 기반으로 합니다. dataset 플래그를 관심 있는 데이터셋으로 설정하세요.
python bundlesdf/run_nerf.py --ref_view_dir /mnt/9a72c439-d0a7-45e8-8d20-d7a235d02763/DATASET/YCB_Video/bowen_addon/ref_views_16 --dataset ycbv
그 다음, 약간의 수정을 거쳐 모델 기반 (model-based) 버전과 유사한 명령어를 실행합니다. 여기서는 YCB-Video를 예시로 사용합니다:
python run_ycb_video.py --ycbv_dir /mnt/9a72c439-d0a7-45e8-8d20-d7a235d02763/DATASET/YCB_Video --use_reconstructed_mesh 1 --ref_view_dir /mnt/9a72c439-d0a7-45e8-8d20-d7a235d02763/DATASET/YCB_Video/bowen_addon/ref_views_16
4090과 같은 최신 GPU의 경우, [이곳]을 참조하세요.
Windows 환경 설정을 위해서는, [이곳]을 참조하세요.
비정상적인 결과가 나오는 경우, [이곳]과 [이곳]을 확인하세요.
우리의 학습 데이터에는 GSO 및 Objaverse의 3D 에셋을 사용하여 고품질의 포토리얼리즘 (photo-realism) 및 대규모 도메인 랜덤화 (domain randomization)로 렌더링된 장면들이 포함되어 있습니다. 각 데이터 포인트에는 **RGB, 깊이 (depth), 객체 포즈 (object pose), 카메라 포즈 (camera pose), 인스턴스 분할 (instance segmentation), 2D 바운딩 박스 (2D bounding box)**가 포함됩니다. [Google Drive].
- 카메라 파라미터(extrinsics 및 intrinsics 포함)를 구문 분석합니다.
glcam_in_cvcam = np.array([[1,0,0,0], [0,-1,0,0], [0,0,-1,0], [0,0,0,1]]).astype(float) W, H = camera_params["renderProductResolution"]
with open(f'{base_dir}/camera_params/camera_params_000000.json','r') as ff: camera_params = json.load(ff)
world_in_glcam = np.array(camera_params['cameraViewTransform']).reshape(4,4).T
cam_in_world = np.linalg.inv(world_in_glcam)@glcam_in_cvcam
world_in_cam = np.linalg.inv(cam_in_world)
focal_length = camera_params["cameraFocalLength"]
horiz_aperture = camera_params["cameraAperture"][0]
vert_aperture = H / W * horiz_aperture
focal_y = H * focal_length / vert_aperture
focal_x = W * focal_length / horiz_aperture
center_y = H * 0.5
center_x = W * 0.5
fx, fy, cx, cy = focal_x, focal_y, center_x, center_y
K = np.eye(3)
K[0,0] = fx
K[1,1] = fy
K[0,2] = cx
K[1,2] = cy`
Stable-Diffusion이 LAION 데이터셋으로 학습되었기 때문에 발생하는 법적 제한으로 인해, 저희는 확산 기반(diffusion-based) 텍스처 증강 데이터나 이를 사용한 사전 학습된 가중치(pretrained weights)를 공개할 수 없습니다. 따라서 저희는 확산 증강 데이터를 사용하여 학습하지 않은 버전을 공개합니다. 약간의 성능 저하가 예상됩니다.
코드 공개에 도움을 준 Jeff Smith, 합성 데이터 생성 지원을 해준 NVIDIA Isaac Sim 및 Omniverse 팀, 그리고 귀중한 논의를 제공해 준 Tianshi Cao에게 감사드립니다. 마지막으로 CVPR에서 리뷰어와 AC(Area Chair)들이 제기해주신 긍정적인 피드백과 건설적인 제안에도 감사합니다.
코드와 데이터는 NVIDIA Source Code License 하에 공개됩니다. Copyright © 2024, NVIDIA Corporation. All rights reserved.
문의사항은 Bowen Wen에게 연락 주십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기