데이터셋 생성
- VLMaps를 구축하기 위해, 우리는
Matterport3D 데이터셋
과 함께 Habitat 시뮬레이터
에서
- 10개의 장면에 걸쳐 10개의 RGB-D 비디오 시퀀스를 수동으로 수집
RGB-D 비디오를 생성하기 위한 스크립트
와 포즈 메타 데이터를 제공
- 다음 몇 단계를 따라 데이터셋을 생성하세요.
1. Matterport3D 데이터셋 다운로드
- 데이터셋 다운로드를 확인하고, 이용 약관에 서명한 후,
Habitat 시뮬레이터에서 사용할 Matterport3D 메쉬를 요청하려면 담당자에게 보내십시오.
- 회신 이메일에는 데이터를 다운로드하는 파이썬 스크립트가 첨부됩니다.
- 스크립트를 ~/download_mp.py 파일에 복사하고 붙여넣으세요.
- 다음 명령을 실행하여 데이터를 다운로드합니다:
cd ~
python2 download_mp.py -o . --task habitat
unzip v1/tasks/mp3d_habitat.zip
2. 데이터셋 생성
config/generate_dataset.yaml
을 구성합니다.
config/generate_dataset.yaml
에서 defaults/data_paths의 값을 default로 변경합니다.
config/data_paths/default.yaml
에서 habitat_scene_dir 및 vlmaps_data_dir을 다음 단계에 따라 변경합니다.
- habitat_scene_dir을 다운로드한 Matterport3D 데이터셋의 경로로 변경: ~/mp3d_habitat/mp3d
# habitat_scene_dir의 구조는 다음과 같습니다:
habitat_scene_dir
|-5LpN3gDmAk7
| |-5LpN3gDmAk7.glb
| |-5LpN3gDmAk7_semantic.ply
| |-...
|-gTV8FGcVJC9
| |-gTV8FGcVJC9.glb
| |-gTV8FGcVJC9_semantic.ply
| |-...
|-jh4fc5c5qoQ
| |-jh4fc5c5qoQ.glb
| |-jh4fc5c5qoQ_semantic.ply
| |-...
...
- vlmaps_data_dir을 다운로드한 데이터셋의 경로로 변경:
# vlmaps_data_dir의 구조는 다음과 같습니다:
vlmaps_data_dir
|-5LpN3gDmAk7_1
| |-poses.txt
|-gTV8FGcVJC9_1
| |-poses.txt
|-jh4fc5c5qoQ_1
| |-poses.txt
...
data_cfg.resolution.w
및 data_cfg.resolution.h
를 변경하여 생성되는 RGB, 깊이 및 시맨틱 이미지의 해상도를 조정
- RGB, 깊이 및 시맨틱 데이터를 생성하려면 해당 값을 true로 설정하고, 무시하려면 false로 설정
- camera_height를 변경하여 로봇 베이스에 대한 카메라 높이를 조정
cd dataset
python generate_dataset.py
Habitat-Sim에서 자체 데이터 수집
- 다음 코드를 실행하여 자체 데이터를 수집합니다(예: gTV8FGcVJC9 장면에 대해):
python dataset/collect_custom_dataset.py scene_names=["gTV8FGcVJC9"]
- 생성된 데이터 폴더는 config/datapaths/default.yaml의 vlmaps_data_dir 아래에 있는`<scene_name>` 형식으로 저장(이미 data_paths를 default로 설정한 경우).
- 위 명령에서
<scene_name>
은 gTV8FGcVJC9이고, <id>
는 이 장면의 기존 데이터 폴더에 따라 다릅니다. gTV8FGcVJC9_1이 이미 존재하면, 새로운 폴더 이름은 gTV8FGcVJC9_2가 됩니다.
VLMap 생성하기
생성된 데이터셋으로 VLMap 만들기
config/map_creation_cfg.yaml
에서 defaults/data_paths
의 값을 default로 변경
- config/data_paths/default.yaml에서 habitat_scene_dir 및 vlmaps_data_dir을 위의 데이터셋 생성 섹션의 단계에 따라 변경합니다.
- 다음 명령어를 실행하여 VLMap을 구축합니다.
- 이 코드는 각 보셀(voxel)에 LSeg 임베딩이 포함된 3D 지도를 만듭니다.
cd application
python create_map.py
생성된 VLMap 구성하기
- config/map_creation_cfg.yaml에서 scene_id를 변경하여 VLMap을 생성할 장면을 선택합니다 (0-9).
- 사용자 정의 데이터를 사용하는 경우, scene_id는 config/paths/default.yaml에서 설정한 vlmaps_data_dir 경로의 정렬된 하위 폴더의 id를 나타냅니다.
- config/params/default.yaml에서 매개변수를 변경하여 지도를 사용자 정의
- cs(셀 크기, 미터 단위)와 gs(그리드 크기)를 변경하여 지도의 해상도를 조정
- config/vlmaps.yaml에서
카메라 포즈
와 베이스 포즈
를 변경
- pose_info 섹션을 수정하세요.
- pose_type:
- poses.txt 파일에 저장된 포즈 유형을 의미
- 로봇 베이스의 포즈인 경우 mobile_base로 설정하고,
- 카메라의 포즈인 경우 camera_base로 설정합니다.
- rot_type:
- poses.txt 파일의 각 줄에 저장된 데이터 형식을 의미합니다.
- 포즈가 px, py, pz, qx, qy, qz, qw로 저장된 경우 quat로 설정하고,
- (4, 4) 변환 행렬로 저장된 경우 mat로 설정합니다.
- 기본값은 quat입니다.
- pose_type을 mobile_base로 설정한 경우, pose_info의 다음 매개변수도 수정해야 합니다:
- camera_height:
- 베이스에 대한 카메라 높이입니다. 데이터셋 생성 시 다른 카메라 높이를 설정한 경우 이를 변경합니다.
- base2cam_rot:
- 로봇 베이스에서 카메라 좌표계로의 행렬형 회전 행렬(z 축이 앞으로, x 축이 오른쪽, y 축이 아래로).
- base_forward_axis, base_left_axis, base_up_axis:
- 로봇 베이스 좌표계입니다.
- 이는 로봇 베이스 프레임에 투영된 전방 단위 벡터 [1, 0, 0], 좌측 단위 벡터 [0, 1, 0], 상단 단위 벡터 [0, 0, 1]의 좌표를 의미
- config/vlmaps.yaml의 기타 설정:
- skip_frame: frame_i % skip_frame == 0일 때만 프레임을 사용
- cam_calib_mat: 평면화된 카메라 내재 행렬
- depth_sample_rate:
- 각 프레임에서 무작위로 샘플링된 h * w / depth_sample_rate 픽셀만 역투영합니다.
- 매핑 속도를 높이려면 이 값을 높이세요.
- 그러나 각 프레임에서 포인트 클라우드가 더 희박해짐
VLMap 인덱싱
- config/map_indexing_cfg.yaml에서 defaults/data_paths의 값을 default로 변경합니다.
- config/data_paths/default.yaml에서 habitat_scene_dir 및 vlmaps_data_dir을 위의 데이터셋 생성 섹션의 단계에 따라 변경합니다.
- 다음 명령어를 실행하여 빌드된 VLMap을 인덱싱합니다.
cd application
python index_map.py
인덱싱 구성
- config/map_indexing_cfg.yaml 파일을 변경합니다:
- decay_rate:
- 히트맵 감쇠율을 설정합니다.
- 값이 작을수록 열의 전이가 더 뚜렷하고 더 넓은 영역을 덮습니다.
- index_2d:
- 2D 히트맵을 시각화하려면 True로 설정합니다.
- 3D 히트맵을 시각화하려면 False로 설정합니다.
- init_categories:
- 인덱싱을 위해 선택할 고정된 카테고리 목록(MatterPort3D 카테고리)을 제공하려면 True로 설정합니다
- (자세한 내용은 vlmaps/utils/matterport3d_categories.py를 확인).
- 텍스트로 쿼리할 때, 코드는 고정 목록에서 가장 가까운 카테고리를 찾기 위해 GPT를 사용합니다.
- 인덱싱을 위해 입력 쿼리만 사용하려면 False로 설정합니다.
- True로 설정한 경우, 터미널에서 OPENAI_KEY=xxx를 실행하여 환경 변수 OPENAI_KEY를 OpenAI API 토큰으로 설정해야 합니다.
내비게이션 테스트
OpenAI 설정
- 우리 방법으로 객체 목표 내비게이션 및 공간 목표 내비게이션 작업을 테스트하려면 다음 단계를 통해 OpenAI API 계정을 설정해야 합니다:
- OpenAI 계정에 가입하고, 계정에 로그인하고, 계정을 하나 이상의 결제 방법과 연결합니다.
- OpenAI API 키를 얻고 복사합니다.
- ~/.bashrc 파일을 열고, export OPENAI_KEY=<복사한 키>라는 새 줄을 붙여넣고 파일을 저장합니다.
객체 목표 내비게이션 실행
- 객체 목표 내비게이션을 실행
- 코드는 <scene_folder>/object_navigation_tasks.json에 지정된 작업을 로드
- 결과는 <scene_folder>/vlmap_obj_nav_results/에 저장
cd application/evaluation
python evaluate_object_goal_navigation.py
cd application/evaluation
python compute_object_goal_navigation_metrics.py
- config/object_goal_navigation_cfg.json을 구성합니다:
- nav/vis를 true로 수정하여 내비게이션 결과(POV, 탑다운 경로, 예측 목표 등)를 시각화
- scene_id를 숫자(0~9) 또는 [0,1,3]와 같은 목록으로 수정하여 평가할 장면을 지정
공간 목표 내비게이션 실행
- 공간 목표 내비게이션을 실행
- 코드는 <scene_folder>/spatial_goal_navigation_tasks.json에 지정된 작업을 로드
- 결과는 <scene_folder>/vlmap_spatial_nav_results/에 저장
- config/spatial_goal_navigation_cfg.json에서 nav/vis를 true로 수정하여 내비게이션 결과(POV, 탑다운 경로, 예측 목표 등)를 시각화
cd application/evaluation
python evaluate_spatial_goal_navigation.py
최종 메트릭을 계산하려면 다음을 실행합니다:
cd application/evaluation
python compute_spatial_goal_navigation_metrics.py
config/spatial_goal_navigation_cfg.json을 구성합니다:
- nav/vis를 true로 수정하여 내비게이션 결과(POV, 탑다운 경로, 예측 목표 등)를 시각화합니다.
- scene_id를 숫자(0~9) 또는 [0,1,3]와 같은 목록으로 수정하여 평가할 장면을 지정합니다.