[code] / [ali-dev] ConceptGraphs: Open-Vocabulary 3D Scene Graphs for Perception and Planning

About_work·2024년 8월 4일
0

scene graph

목록 보기
3/5

1. 시작하기 비디오 튜토리얼

  • 이 1.5시간짜리 유튜브 비디오는 2024년 5월 7일 기준으로 아래 README를 자세히 다루는 시작하기 튜토리얼
  • 여기서는 빈 Ubuntu 20.04에서 시작하여 ConceptGraphs를 설정하고, replica 데이터셋과 iPhone 스캔을 사용하여 맵을 만드는 방법을 설명
  • 또한 직접 스트리밍 옵션도 다룹니다!
  • 아주 상세하게 설명했으니, 너무 느리다고 생각되면 부분적으로 건너뛰어도 좋습니다.

2. 데이터셋

2.1. Replica

  • 코드를 실행하려면 데이터를 준비해야 하는데, 가장 쉬운 방법은 Replica를 사용하는 것
  • 다음 명령어를 사용하여 설치할 수 있습니다:
cd /path/to/data
# Replica.zip을 수동으로 다운로드할 수도 있습니다.
# 링크: https://caiyun.139.com/m/i?1A5Ch5C3abNiL 비밀번호: v3fY (압축 파일 크기 제한으로 인해 작은 zip 파일로 나뉘어 있음)
wget https://cvg-data.inf.ethz.ch/nice-slam/data/Replica.zip
unzip Replica.zip

2.2. iPhone scan via Record 3D app (r3d file) of a convenience store aisle

  • "편의점에서 많은 물체가 있는 스캔 파일"을 Kaggle에서 다운로드할 수 있음 (https://www.kaggle.com/datasets/alihkw/convinience-store-recording-via-the-record3d-app/)
  • 이 파일은 .r3d 파일이며, 데이터셋으로 사용하기 전에 전처리가 필요
    • 이에 대한 자세한 내용은 아래에 설명되어 있습니다.
  • 그리고 이제 conceptgraph/hydra_configs 디렉토리의 구성 파일에서 경로를 업데이트해야 합니다.
    • 이는 아래에 설명되어 있습니다:

3. 사용 방법

  • 여러 기능을 가진 다양한 스크립트가 있지만, rerun_realtime_mapping.py 스크립트부터 시작하는 것을 권장합
  • 이 스크립트는 감지를 실행하고, 씬 그래프를 빌드하며, 결과를 하나의 루프에서 시각화
  • 필요한 구성 값을 변경한 후, 다음과 같은 간단한 명령어로 스크립트를 실행할 수 있습니다:
# set up your config first as explained below, then
cd /path/to/code/concept-graphs/conceptgraph/
python slam/rerun_realtime_mapping.py

3.1. Setting up your configuration

  • 구성을 관리하기 위해 hydra 패키지를 사용합니다.
  • 명령줄 인수를 많이 제공할 필요 없이,
    • ./conceptgraph/hydra_configs 디렉토리의 해당 .yaml 파일에서
      • 항목을 편집하고 스크립트를 실행하면 됩니다.

예를 들어, 제 ./conceptgraph/hydra_configs/rerun_realtime_mapping.yaml 파일은 다음과 같습니다:

defaults:
  - base
  - base_mapping
  - replica
  - sam
  - classes
  - logging_level
  - _self_

detections_exp_suffix: s_detections_stride_10_run2 # 감지 실행의 편리한 이름
force_detection: !!bool False
save_detections: !!bool True

use_rerun: !!bool True
save_rerun: !!bool True

stride: 10
exp_suffix: r_mapping_stride_10_run2 # 매핑 실행의 편리한 이름
  • 값은 먼저 base.yaml, 그런 다음 base_mapping.yaml, 그런 다음 replica.yaml에서 로드됩니다.
  • 충돌이 발생하면(즉, 두 파일이 동일한 구성 매개변수를 수정하는 경우) 이전 파일의 값이 덮어씁니다.
    • 즉, replica.yaml이 base.yaml의 충돌하는 값을 덮어씁니다.
  • 마지막으로 self가 로드되며, 이는 rerun_realtime_mapping.yaml 자체의 값입니다.
    • 여기에서 사용자 정의 값을 입력할 수 있습니다.
    • 또한 ./conceptgraph/hydra_configs/에 자체 .yaml 파일을 추가하면 동일한 방식으로 로드됩니다.

3.1.1. Paths

  • 구성 파일에서 가장 먼저 설정해야 할 것은 conceptgraphs를 설치한 위치와 데이터를 저장한 위치입니다.
  • 이는 ./conceptgraph/hydra_configs/base_paths.yaml 파일에서 업데이트합니다.
  • 저의 경우는 다음과 같습니다:
repo_root: /home/kuwajerw/repos/concept-graphs
data_root: /home/kuwajerw/local_data

3.2. 맵 빌드

  • 맵을 빌드하려면, conceptgraph 디렉토리에서 다음 명령어를 실행합니다:
cd /path/to/code/concept-graphs/conceptgraph/
python /slam/rerun_realtime_mapping.py
  • 모델이 설치되지 않은 경우 자동으로 다운로드될 것

  • 결과는 해당 데이터셋 디렉토리에 있는 exps 폴더에 저장

  • 구성 파일에 설정된 exp_suffix 이름으로 폴더가 생성되며,

    • 실행에 사용된 구성 매개변수가 포함된 config_params.json 파일도 저장됩니다.
  • 참고:

    • 편의를 위해 스크립트는 /concept-graphs/latest_pcd_save -> Replica/room0/exps/r_mapping_stride_10_run2/pcd_r_mapping_stride_10_run2.pkl.gz로의 심볼릭 링크도 자동으로 생성하여
      • 최신 결과를 latest_pcd_save 경로로 쉽게 접근할 수 있도록 합니다.
  • Replica 데이터셋의 room0에서 매핑 스크립트를 실행한 출력은 다음과 같습니다:

./Replica # 데이터셋 루트
./Replica/room0 # scene_id
./Replica/room0/exps # conceptgraphs의 모든 결과의 부모 폴더
./Replica/room0/exps/s_detections_stride_10_run2 # 감지 실행의 폴더, exp_suffix에 따라 이름이 지정됨
./Replica/room0/exps/s_detections_stride_10_run2/vis # 시각화가 저장되는 위치, 경계 상자와 마스크가 오버레이된 이미지들
./Replica/room0/exps/s_detections_stride_10_run2/detections # 감지 결과가 저장되는 위치, 사전 형식의 pkl.gz 파일로 저장됨
./Replica/room0/exps/r_mapping_stride_10_run2/ # 특정 실행의 매핑 출력 폴더, exp_suffix에 따라 이름이 지정됨
./Replica/room0/exps/r_mapping_stride_10_run2/config_params.json # 실행에 사용된 구성 파일
./Replica/room0/exps/r_mapping_stride_10_run2/config_params_detections.json # 사용된 감지 실행의 구성 파일도 저장됨
./Replica/room0/exps/r_mapping_stride_10_run2/pcd_r_mapping_stride_10_run2.pkl.gz # 매핑 결과가 저장된 pkl.gz 파일
./Replica/room0/exps/r_mapping_stride_10_run2/s_mapping_r_mapping_stride_10_run2.mp4 # 매핑 프로세스 비디오가 저장된 mp4 파일
./Replica/room0/exps/r_mapping_stride_10_run2//saved_obj_all_frames # save_objects_all_frames=True로 설정된 경우, 개체 매핑 결과가 저장됨
./Replica/room0/exps/r_mapping_stride_10_run2/saved_obj_all_frames/det_exp_s_detections_stride_10_run2 # 각 감지 실행에 대한 폴더, 각 개체 매핑 결과에 대한 pkl.gz 파일이 있음

4. Running the visualization script

  • 이 스크립트는 3D에서 맵을 시각화하고 텍스트로 맵 개체를 쿼리할 수 있게 합니다.
  • 최신 매핑 결과를 가리키도록 설정된 latest_pcd_save 심볼릭 링크를 사용하거나
    • 원하는 다른 매핑 결과를 직접 가리킬 수도 있습니다.
cd /path/to/code/concept-graphs
python conceptgraph/scripts/visualize_cfslam_results.py \
    --result_path latest_pcd_save
  • 또는 특정 결과를 가리키려면 pkl.gz 파일을 직접 가리킬 수도 있습니다:
cd /path/to/code/concept-graphs
python conceptgraph/scripts/visualize_cfslam_results.py \
    --result_path /path/to/data/Replica/room0/exps/r_mapping_stride_10_run2/pcd_r_mapping_stride_10_run2.pkl.gz

5. 텍스트로 맵 검색

  • open3d 시각화 창에서 다음 키 콜백을 사용하여 시각화를 변경할 수 있습니다:

    • b를 눌러 배경 포인트 클라우드(벽, 바닥, 천장 등)를 전환
      • ConceptGraphs-Detect에서만 작동
  • c를 눌러 태깅 모델의 개체 클래스로 포인트 클라우드를 색칠

    • ConceptGraphs-Detect에서만 작동합니다.
  • r을 눌러 RGB로 포인트 클라우드를 색칠

  • f를 눌러 텍스트를 입력한 다음, 입력 텍스트와 CLIP 유사성으로 포인트 클라우드를 색칠

  • i를 눌러 개체 인스턴스 ID로 포인트 클라우드를 색칠

  • Replica room0 씬에서 "cabinet"을 검색하는 예시는 다음과 같습니다.

    • 먼저 스크립트를 실행한 다음, f를 눌러 Enter your query: 입력을 트리거합니다.
    • 텍스트 상자에 "cabinet"을 입력하고 엔터를 누르면, 포인트
    • 클라우드가 입력 텍스트와 CLIP 유사성으로 색칠됩니다.

6. iPhone을 RGB-D 센서로 사용하기

  • 이를 위해 Record3D 앱의 프리미엄 버전을 구매해야 하며, 비용은 약 5-10달러입니다.
    • 앱을 사용하여 만든 스캔을 .r3d 파일로 내보낼 수 있습니다.
  • 그런 다음 Google Drive 또는 USB 케이블을 사용하여 컴퓨터로 .r3d 파일을 가져옵니다.
    • 파일을 추출하여 편리한 이름으로 폴더를 바꾸는 것이 좋습니다.
  • 그런 다음 concept-graphs/conceptgraph/dataset/preprocess_r3d_file.py를 사용하여 이를 ConceptGraphs에서 사용할 수 있는 데이터셋으로 변환
  • 이는 시작하기 비디오에서도 다룹니다.
  • preprocess_r3d_file.py에서 datapath 변수를 추출한 r3d 폴더로 설정합니다.
  • 저의 경우는 다음과 같습니다:
class ProgramArgs:
    # 이 폴더에는 메타데이터 폴더와 rgb 폴더 등이 포함되어 있습니다.
    datapath = "/home/kuwajerw/local_data/record3d_scans/co_store"
  • 스크립트를 실행하면, 이제 /home/kuwajerw/local_data/record3d_scans/co_store_preprocessed 폴더가 생성되며, 이를 ConceptGraphs와 함께 사용할 수 있습니다.
  • Replica 데이터셋과 동일한 지침을 따릅니다.

7. 스캔하는 동안 iPhone에서 직접 맵 스트리밍

  • 데이터셋 만들기 과정을 건너뛰고 스캔을 기록하는 동안 실시간으로 맵을 빌드하려면,
    • concept-graphs/conceptgraph/slam/r3d_stream_rerun_realtime_mapping.py 스크립트를 사용할 수 있음
    • 이는 시작하기 비디오에서도 다룹니다.
    • 먼저 cmake를 설치해야 합니다.
    • 그런 다음 Record3D 앱의 USB 스트리밍 옵션을 사용하고,
    • r3d_stream_rerun_realtime_mapping.py 스크립트를 실행하여 즉시 맵을 빌드합니다. 다음과 같이 진행합니다:
sudo apt install cmake
  • 그런 다음, conceptgraph conda 환경을 활성화한 상태에서 record3D 깃허브 README 파일의 명령어를 실행합니다:
git clone https://github.com/marek-simonik/record3d
cd record3d
python setup.py install
  • 이제 이전 스크립트와 동일하게 r3d_stream_rerun_realtime_mapping.py를 실행할 수 있습니다.
  • 물론, 스크립트를 실행하는 동안 iPhone을 USB를 통해 컴퓨터에 연결해야 합니다.
cd /path/to/code/concept-graphs/conceptgraph/
python /slam/r3d_stream_rerun_realtime_mapping.py

8. 디버깅

  • 디버깅을 간단하게 하기 위해 사전 제작된 vscode 디버그 구성 파일을 리포지토리에 커밋했습니다.
  • 이를 concept-graphs/.vscode/launch.json에서 찾을 수 있습니다.
  • 여기에서 이 README에서 언급된 핵심 스크립트를 실행하는 명령어를 찾을 수 있습니다.
  • vscode 디버거에 익숙하지 않다면, 시작하기 비디오 또는 vscode 문서를 참조하세요.

9. 기타

  • 스크립트를 일찍 중지하려면, concept-graphs/conceptgraph/hydra_configs/early_exit.json 파일을 사용할 수 있습니다.
  • 이 파일에서 early_exit: true로 설정하면 현재 반복이 완료된 후 스크립트가 일찍 종료됩니다.
  • 이는 스크립트를 일찍 중지하고 싶지만 현재 반복의 결과를 저장하고 싶은 경우에 유용합니다.

10. 클래스 파일

  • 클래스 파일은 객체 감지 모델에 대한 클래스 레이블 세트로 사용됩니다.

  • 이는 "오픈-보카블러리-성"을 일부 희생하면서 더 안정적인 감지를 위해 타협하는 것입니다.

  • 두 개의 클래스 파일을 사용할 수 있습니다:

  • concept-graphs/conceptgraph/scannet200_classes.txt

  • concept-graphs/conceptgraph/ram_classes_4500.txt

  • scannet 클래스는 scannet200 데이터셋의 레이블입니다. ram 클래스는 RAM 모델의 태그입니다.

11. 문제 해결

  • 때때로 X11 또는 Qt 관련 오류가 발생할 경우, bashrc 파일에 다음을 추가하여 해결할 수 있습니다:
export XKB_CONFIG_ROOT=/usr/share/X11/xkb

지금은 여기까지이며, 앞으로 더 많은 정보를 추가할 예정입니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글