SEAM Studio
Guide 06 · SEAM Studio docs

ML 데이터셋과 내보내기

SEAM Studio는 뷰어로 끝나지 않습니다 — 시뮬레이션한 모든 것을 파일로 꺼낼 수 있습니다: ML 모델 학습용 NumPy .npz 그라운드트루스 데이터셋, AODT 뷰어 호환 RFData 번들, 보이는 그대로(WYSIWYG)의 뷰포트 캡처, 차트별 CSV/PNG/SVG 내보내기까지. 이 가이드에서 각 내보내기 경로를 하나씩 살펴봅니다.

여기 나오는 모든 기능은 Mock 백엔드만으로도 동작합니다 — Sionna RT가 설치되어 있지 않아도 데이터셋 생성과 모든 내보내기가 끝까지 실행됩니다(값은 mock 솔버가 만들지만, 파이프라인 테스트에는 충분합니다).

1. ML dataset 패널

데이터셋 생성기는 ML dataset 패널에 있습니다(헤더에는 ML DATASET으로 표시됩니다). 두 가지 방법으로 열 수 있습니다:

라디오맵 히트맵 위에 플로팅된 ML DATASET 패널 — 샘플링 컨트롤, 영역 필드, Generate dataset 버튼, npz/json 링크가 있는 기존 데이터셋 행이 보입니다
계산된 라디오맵 위에 띄운 ML DATASET 패널 — 위쪽에 샘플링 컨트롤, 가운데에 영역 픽커, 아래에 npz / json 다운로드가 있는 데이터셋 목록이 있습니다.

데이터셋 생성 단계별 안내

  1. Name — 데이터셋 표시 이름입니다(아래 목록에도 나타납니다).
  2. Sampling mode — UE 위치를 고르는 방식:
    • random — 영역 안 균일 랜덤 위치,
    • grid — 영역 위 정규 격자(Grid spacing 필드가 추가됩니다, 단위 m),
    • trajectory — 직선 start→end 구간 위의 점들.
  3. Actor flight path — 씬 액터(웨이포인트를 가진 차량·보행자·UAV)의 저작된 궤적을 따라 샘플링하는 옵션입니다. 여기서 액터를 고르면 아래의 영역 / start-end 를 덮어씁니다; — none — 으로 두면 샘플링 모드 자체의 기하를 사용합니다. 궤적이 있는 액터가 없으면 패널이 알려 주니 먼저 Visual 모드에서 지정하세요. 필드 아래 힌트에 우선순위가 그대로 나옵니다: waypoints > actor flight path > start/end (or region).
  4. dt (s) — 백엔드가 이동 샘플에 붙이는 속도/도플러 라벨의 유한차분(finite-difference) 시간 간격입니다.
  5. Num samples — 풀 UE 위치 수(1–20000). CFR points — 위치당 주파수 응답 표본 수(2–4096). Height (m) — UE 샘플링 높이.
  6. 영역을 설정합니다(random / grid 모드):
    • ⌖ Pick region in viewport — 버튼이 Click 2 corners… (Esc) 로 바뀌면, 씬 표면에서 영역의 마주 보는 두 모서리를 클릭하세요. XY 필드가 채워집니다(Esc 취소).
    • Fit to scene — 영역과 높이를 씬 전체를 덮도록 설정합니다(프로젝트를 열 때 패널이 실제 씬 경계로 자동 시드되므로, 엉뚱한 값에서 시작하는 일은 드뭅니다).
    • Region min / Region max — XY 모서리를 숫자로 직접 입력.
    • 힌트 줄을 눈여겨보세요. 예: "Scene spans [-40.0, -40.0]…[40.0, 40.0] m — samples outside it get zero paths." 기하 밖을 샘플링하는 것이 쓸모없는 데이터셋이 나오는 1순위 원인입니다.

    trajectory 모드에서는 대신 ⌖ Pick path in viewport 버튼과 Start / End XYZ 필드가 나타납니다.

  7. Seed — 랜덤 샘플링을 재현 가능하게 만듭니다. 논문에는 함께 기록하세요.
  8. Include paths — 각 샘플의 전체 레이 경로(정점 + 상호작용)를 paths.jsonl 로 추가 덤프합니다. 용량이 크므로 기본은 꺼져 있습니다.
  9. Follow terrain — 각 샘플의 높이를 그 아래 표면에 스냅한 뒤 높이 오프셋을 더합니다. 경사 실외 씬에서 쓰고, 실내에서는 끄세요(지붕에 스냅됩니다).
  10. Generate dataset 을 누릅니다. 솔버가 위치들을 도는 동안 버튼에 Generating… 이 표시됩니다.

데이터셋 목록

생성이 끝난 데이터셋은 버튼 아래 표에 한 행씩 나타납니다:

디스크에서는 프로젝트 폴더의 export/datasets/<dataset_id>/ 아래에 쌓입니다.

라벨에는 무엇이 들어 있나

.npz 에는 샘플별 위치, 복소 CFR, 경로별 CIR 이득·지연, LOS 플래그, RSS, 분산 지표가 들어 있습니다 — 정확한 배열 스키마, AODT 필드 매핑, 바로 실행할 수 있는 학습 예제(examples/ml/train_channel_estimator.py)는 ML 그라운드트루스 데이터셋 문서에 정리되어 있습니다.

2. RFData 내보내기 (AODT 뷰어 번들)

결과를 외부 AODT 스타일 뷰어나 자체 파이프라인에 넘기려면 툴바의 Actions ▾ → Export RFData 를 사용하세요. 프로젝트 폴더 안 export/rfdata/ 에 번들이 기록됩니다:

파일내용
scenario_meta.json단위, 주파수, 좌표 변환, 시간 창
devices.json송신기 + 수신기(위치, m 단위)
paths.json시간 인덱스가 붙은 레이 경로
trajectory.csv웨이포인트별 UE 지표(time_s, ue_id, x_m, y_m, z_m, rss_dbm, sinr_db, path_gain_db)
radio_map.csv평면 히트맵 샘플
calibration_points.json좌표 검증용 기준점 3개

scenario_meta.json과 devices.json의 주파수는 프로젝트의 첫 번째 저장 구성이 아니라, 저장된 결과를 실제로 푼 구성(가장 최근 paths 결과의 구성 스냅샷)을 따릅니다. API(POST /api/projects/{project_id}/export/rfdata)에서는 config_id나 인라인 config로 바꿀 수 있습니다.

내보내기가 끝나면 Results 에 닫을 수 있는 행이 나타납니다 — "Exported RFData to export/rfdata" — 파일별 다운로드 링크가 붙어 있어 프로젝트 폴더를 뒤질 필요가 없습니다.

AODT 결과 스키마 내보내기

위 번들은 뷰어 계약입니다. NVIDIA AODT 자체 결과 스키마에 맞춰 만들어진 도구에 넘기려면, 해당 테이블들을 Parquet 으로 쓰는 두 번째 내보내기를 사용하세요. UI 에서는 Actions ▾ → AODT export (parquet) 입니다(소스와, 필요하면 결과 id 를 고릅니다. 비우면 가장 최근 결과). API 로는 다음과 같습니다:

POST /api/projects/{project_id}/export/aodt
     {"source": "paths", "result_id": null, "fft_size": 64,
      "subcarrier_spacing_hz": 30000}

export/aodt/ 안에 AODT 테이블별로 <table>.parquet 하나씩 기록됩니다: ues, scatterers, rus, dus, panels, patterns, time_info, cfrs, cirs, raypaths — 컬럼 이름과 타입은 AODT 문서 그대로입니다. source: "paths" 는 저장된 paths 결과에서 스냅숏 하나(time_idx 0)를 쓰고, source: "playback" 은 저장된 playback 팩의 프레임마다 time_idx 를 하나씩 써서 time_info·raypaths·cirs·cfrs 가 주행 구간 전체를 덮고 UE 의 route_* 컬럼에 프레임 위치가 담깁니다. source: "sensing" 은 저장된 센싱 결과를 스냅숏 하나로 씁니다(sensing.ko.md). 반송파 주파수, 대역폭(따라서 cfrs의 톤 격자)과 패널 간격은 내보내는 결과를 푼 구성을 따르며, 요청에 config_id를 주면 그 구성으로 바뀝니다.

AODT 테이블 중 telemetry 와 ran_config 는 쓰지 않습니다. 둘 다 RAN 시뮬레이션 산출물(스케줄러/PHY KPI, gNB 설정)이라 레이 트레이싱 파이프라인이 만들어내지 않으며, 빈 파일을 쓰면 SEAM 이 제공하지 않는 범위를 제공하는 것처럼 보이게 됩니다.

테이블과 함께 id_map.json 이 기록됩니다 — Parquet 행이 담을 수 없는 문자열 ↔ 정수 id 매핑입니다: 디바이스 id → ru_id/ue_id, prim id → prim_ids 인덱스, 액터 id → scatterer ID, 디바이스 → panel 인덱스.

테이블을 쓰기 전에 알아둘 제약:

이 내보내기는 pyarrow 가 필요합니다(pip install "seam-studio[parquet]", 즉 parquet extra. backend[dev,parquet] 로 설치한 소스 체크아웃에는 들어 있습니다). 없으면 엔드포인트가 그 명령을 담아 409 를, 요청한 source 종류의 결과가 프로젝트에 없으면 404 를 돌려줍니다. 기록된 raypaths.parquet 는 SEAM 자체 AODT 임포터(POST /results/import-aodt, 또는 SEAM 이 돌아가는 기기의 폴더 경로를 주는 Actions ▾ → AODT import (parquet))로 다시 읽어들일 수 있고, 임포터는 내부 지점마다 상호작용을 하나씩 되살립니다(diffuse 는 scattering 으로).

3. 채널 데이터셋(.npz) — AODT/HYRAY 링크별 레이아웃

1절의 ML 데이터셋은 위치별 데이터셋(CFR, 집계 KPI)입니다. NVIDIA AODT / HYRAY 참조 파일이 쓰는 레이아웃 그대로, 즉 링크별 다중경로를 UE 한 행 × TRP 한 열 × 경로 한 항목으로 받고 싶다면 툴바에서 Actions ▾ → Channel dataset (.npz) 를 쓰세요. export/channel_npz/channel_dataset.npz 와 metadata.json 사이드카를 씁니다.

UE 격자는 자동으로 정해집니다. 프로젝트에 저장된 trajectory 결과가 있으면 그중 최신 것(UE 행이 많음), 없으면 씬의 수신기 디바이스 — 즉 POST /import/devices 로 임포트한 UE 목록이 들어가는 바로 그 자리입니다. 어느 격자를 썼는지와 링크 수는 알림과 Results 의 닫을 수 있는 행에 모두 표시됩니다. UE 하나당 paths 솔브 한 번을 돌리므로 진행률 카드에 진행 상황이 뜨고, 취소도 됩니다.

npz 에는 13개 정규 키만 들어갑니다.

키shapedtype
num_TRP, num_trajectory, batch스칼라int64
dataset_TRP_pos(T, 3)float32
dataset_TRP_ori_angle(T, 2)float32
dataset_UE_pos(U, 3)float32
sorted_dataset_ampl(U, T, P)complex128
sorted_dataset_azimuth / _elevation(U, T, P)float32
sorted_dataset_toa(U, T, P)float32
is_nlos(U, T)bool
ue_id, time_idx(U,)int32

T 는 송신기 수, U 는 UE 위치 수, P 는 max_paths(기본 500)입니다. 링크마다 경로 축은 |진폭| 기준 강한 순으로 정렬해 P 까지 0으로 패딩합니다. 솔버가 경로를 하나도 못 찾은 링크는 전부 0인 채로 is_nlos = True 가 됩니다.

배열을 쓰기 전에 알아야 할 규약:

스크립트로 돌릴 수 있게 HTTP 로도 전부 열려 있습니다.

POST /api/projects/{project_id}/export/channel-npz
     {"ue_source": "explicit",
      "ue_positions": [[25, 5, 1.5], [40, -12, 1.5]],
      "tx_ids": null,          // null = 씬 순서대로 모든 tx 디바이스
      "max_paths": 500,
      "normalization_db": 0.0,
      "ue_ids": null, "time_idx": null, "batch": 0}

ue_source 는 "explicit"(ue_positions 목록), "devices"(모든 rx 디바이스, id 순), "trajectory"(저장된 trajectory 결과의 샘플별 위치 — ue_result_id 로 지정하거나 null 이면 최신) 중 하나입니다. ue_ids / time_idx 는 선택적 패스스루 열이고(기본값 arange(U), zeros(U)), 주는 경우 길이가 정확히 U 여야 합니다. 한 번의 내보내기는 UE 5000개로 제한됩니다.

이 내보내기는 씬을 건드리지 않습니다. UE 마다 메모리 상 사본에서 임시 프로브 수신기 하나만 두고 풀며, 결과 세트도 저장하지 않습니다 — export/channel_npz/ 와 export_channel_npz 프로버넌스 이벤트 한 건만 남습니다.

솔버 자체도 내보내기가 유지하는 경로 수에서 멈추게 하려면 Paths 솔버 패널의 Max paths / TX 필드(max_num_paths_per_src)와 함께 쓰세요.

4. 뷰포트 캡처 — Snapshot 과 Render

뷰포트 우측 하단 버튼 묶음의 아이콘 버튼 두 개가 씬 이미지를 저장합니다:

디바이스/액터 시점의 실시간 1인칭 뷰인 POV 인셋에도 자체 카메라 버튼이 있어, POV 프레임을 전체 해상도 PNG로 저장할 수 있습니다.

5. 대시보드의 CSV·그림 내보내기

관련 문서