hydra 코드 분석 - overview

About_work·2024년 10월 10일
0

lifelong scene graph

목록 보기
1/56

2. hydra python binding 분석

2.1. Hydra/python/src/hydra_python/commands/habitat.py

  • 이 코드는 Hydra라는 라이브러리를 사용하여 Habitat 시뮬레이터와 상호작용하는 CLI(Command Line Interface) 명령어들을 정의한 것
  • 코드의 주요 역할은 Habitat의 3D 씬(scene)을 처리하고, 경로를 생성하거나 데이터를 기록하며, 필요한 시각화를 수행하는 것
  • 이 코드는 주로 Habitat 시뮬레이터에서 Hydra 파이프라인을 실행하는 다양한 명령어를 제공

2.2. 전체적인 흐름

  1. 경로 생성 및 시뮬레이션 실행:
  • 주요 기능은 경로를 생성하고, 해당 경로에 따라 시뮬레이션을 실행하며, TSDF와 메시에 대한 공간 정보를 복원하는 것
  • 이를 통해 에이전트가 3D 공간에서 작업을 수행할 수 있도록 환경을 제공
  1. 카메라 정보:
  • 시뮬레이션에서 카메라의 설정 정보도 출력할 수 있으며,
  • 이를 통해 에이전트의 시각적 인식 기능을 설정할 수 있습니다.

2.3. 주요 함수 및 로직 설명

1. _get_trajectory(data, prev_dsg, seed, use_full_scene=False)

  • 이 함수는 시뮬레이션 내에서 에이전트가 따라갈 경로(trajectory)를 생성
  • 이전의 DSG(Scene Graph)가 주어지면 그 정보로부터 경로를 복원하고, 그렇지 않다면 주어진 설정에 따라 경로를 랜덤으로 생성
  • use_full_scene 플래그가 설정된 경우 전체 씬을 대상으로 경로를 생성하고, 그렇지 않다면 랜덤 경로를 생성합니다.
  • 반환된 경로는 hydra.Trajectory 객체로, 경로의 길이는 메트릭 단위로 출력됩니다.

세부 사항:

  • prev_dsg:
    • 이전의 DSG 파일에서 경로를 복원할 때 사용
  • use_full_scene:
    • 만약 이 플래그가 참이라면 전체 씬의 경로를 생성합니다.
    • 그렇지 않으면 임의의 경로를 선택합니다.
  • 경로 출력:
    • 생성된 경로의 길이를 출력하여 확인합니다.

2. @cli.command(name="run")

hydra habitat run /path/to/habitat/mp3d/17DRP5sb8fy/17DRP5sb8fy.glb -v
  • 이 명령어는 주어진 scene_path에서 Hydra를 실행하는 명령어
  • 주요 작업:
    • 시뮬레이션 씬을 불러오고,
    • 경로를 생성하며,
    • 필요한 설정을 로드한 뒤 Hydra 파이프라인을 초기화하고 실행
    • 시각화 옵션을 사용하면 시뮬레이터와 그래프의 동작을 볼 수 있음

2.1. 주요 옵션들:

  • scene_path: 시뮬레이션에 사용할 씬 파일의 경로
  • output_path: 시뮬레이션 결과를 저장할 경로
  • label_space: 세멘틱 레이블을 정의하는 공간
    • 예를 들어, 'ade20k_mp3d'는 유명한 세멘틱 레이블 데이터셋 중 하나입니다.
  • prev_dsg:
    • 이전의 DSG 파일을 입력으로 받아들여 경로를 복원할 때 사용합니다.
  • seed: 랜덤 경로를 생성할 때 사용할 시드 값입니다.
  • visualize: 시각화를 활성화할지 여부를 설정합니다.
  • glog_levelverbosity: 로깅과 출력의 수준을 조절하는 옵션입니다.
  • use_full_scene:
    • 전체 씬을 사용할지, 일부만 사용할지를 설정하는 플래그입니다.
  • 이 함수의 흐름은 scene_path로부터 데이터를 읽어오고, 경로를 생성하며, 해당 경로에 따라 시뮬레이션을 실행하는 구조로 되어 있습니다.

3. @cli.command(name="reconstruction")

  • 이 명령어는 Habitat 씬(scene)에서 메시TSDF를 복원하는 역할을 합니다.
  • 이때 복원된 3D 공간을 기반으로 에이전트가 작업을 수행할 수 있게 됩니다.

주요 옵션들:

  • scene_path: 사용할 씬의 경로입니다.
  • voxel_size: TSDF에서 사용할 볼셀 크기를 지정합니다. 볼셀은 3D 공간을 나누는 작은 단위입니다.
  • 이 명령어는 주어진 씬에서 3D 메시와 TSDF 데이터를 복원하여, 해당 공간의 정보를 제공합니다.

4. @cli.command(name="record")

  • 이 명령어는 시뮬레이션을 실행하여 MP3D 데이터셋에서 데이터를 기록하는 역할
    • 데이터를 기록하는 동안, 시뮬레이터에서 생성된 경로와 관련된 정보를 함께 기록

주요 옵션들:

  • scene_path: 사용할 씬 파일 경로입니다.
  • output_path: 기록된 데이터를 저장할 경로입니다.

5. @cli.command(name="camera-info")

  • 이 명령어는 카메라 정보를 출력하는 역할을 합니다.
  • 주어진 scene_path에 대응하는 카메라의 정보(예: 해상도, 시야각 등)를 출력합니다.

2.2. python/src/hydra_python/run.py

  • 이 코드는 Hydra 프로젝트에서 이미지를 시각화하고, 시뮬레이션을 실행하며, 데이터를 처리하는 로직을 담고 있어.

2.2.0. 전체적인 흐름 요약

  1. 이미지 시각화 준비:
  • ImageVisualizer 클래스를 통해 이미지 시각화 환경을 준비하고, 시각화를 진행할 수 있도록 함.
  1. 단계별 처리:
  • _take_step 함수가 각 단계별로 포즈, 이미지, 세그먼트 데이터를 처리하고, 파이프라인에 넘겨서 실행함.
  1. 파이프라인 실행:
  • run 함수는 pose_source에서 포즈 데이터를 순차적으로 가져오며,
    • 각 포즈마다 _take_step을 호출하여 데이터를 처리하고 시뮬레이션을 진행함.
  1. 진행 상태 및 콜백:
  • 각 단계가 완료될 때마다 step_callback을 호출하여 결과를 시각화하거나 파이프라인을 업데이트함.

2.2.1. ImageVisualizer 클래스

class ImageVisualizer:
    """GUI for showing images."""
    def __init__(self):
        """Initialize pyqtgraph."""
        # TODO(nathan) make a grid layout
        import pyqtgraph.multiprocess as mp

        proc = mp.QtProcess(processRequests=False)
        self._pg = proc._import("pyqtgraph")
        self._pg.setConfigOptions(imageAxisOrder="row-major")
        self._view = None
  • 목적: 이 클래스는 이미지를 시각적으로 표시하는 GUI를 담당해.
  • pyqtgraph: Python용 고성능 시각화 도구인 pyqtgraph를 사용해 GUI를 구성하고, 이미지를 보여주기 위한 초기화 과정을 진행해.
  • self._view: self._view는 이미지가 처음 표시될 때 초기화되며, 이후에는 업데이트될 때마다 이 뷰에 이미지를 갱신하게 됨.
    def show(self, image, is_depth=False):
        """Show an image."""
        kwargs = {"autoLevels": False, "levels": (0, 255)} if not is_depth else {}
        if self._view is None:
            self._view = self._pg.image(image, **kwargs)
            if is_depth:
                self._view.setPredefinedGradient("viridis")
        else:
            self._view.setImage(image, **kwargs)
  • 이미지 표시:
    • show() 메서드는 주어진 이미지를 화면에 표시해.
    • 깊이 이미지 (is_depth):
      • 깊이 이미지를 표시할 경우에는 viridis라는 색상 그라디언트를 설정하여 깊이 값을 시각적으로 표현해.
    • 업데이트:
      • 이미 뷰가 존재하는 경우(self._viewNone이 아님), 새로운 이미지를 갱신하는 방식으로 동작해.

2.2.2. hydra_output_callback 함수

def hydra_output_callback(pipeline, visualizer):
    """Show graph."""
    if visualizer:
        visualizer.update_graph(pipeline.graph)
  • 목적:
    • 이 함수는 Hydra의 파이프라인시각화 도구(visualizer)를 업데이트하는 콜백 함수야.
    • 주어진 파이프라인의 그래프 구조를 시각화 도구에 업데이트해서 표시

2.2.3. _take_step 함수

def _take_step(pipeline, data, pose, segmenter, image_viz):
    timestamp, world_t_body, q_wxyz = pose
    q_xyzw = np.roll(q_wxyz, -1)

    world_T_body = np.eye(4)
    world_T_body[:3, 3] = world_t_body
    world_T_body[:3, :3] = R.from_quat(q_xyzw).as_matrix()
    data.set_pose(timestamp, world_T_body)

    labels = segmenter(data.rgb) if segmenter else data.labels
    if image_viz:
        image_viz.show(data.colormap(labels))

    pipeline.step(timestamp, world_t_body, q_wxyz, data.depth, labels, data.rgb)
  • 목적:
    • _take_step 함수는 시뮬레이션이나 데이터 처리에서 한 단계를 실행하는 역할
    • 파이프라인에 입력 데이터와 포즈 정보를 제공하고, 각 데이터를 처리한 후 결과를 시각화
  • 데이터 처리:
    • RGB 이미지에서 세그먼트 라벨을 생성하거나 이미 저장된 라벨을 사용해 처리함.
  • 이미지 시각화:
    • image_viz가 활성화된 경우(show_images=True), 세그먼트 라벨을 기반으로 이미지를 시각화함.
  • 파이프라인 실행:

reconstruction

frontend

backend

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

0개의 댓글