| 항목 | get_map_mask() | render_map_patch() | render_layers() |
|---|---|---|---|
| 출력 타입 | NumPy 배열 | (Figure, List[Axes]) | (Figure, Axes) |
| 출력 Shape / 캔버스 크기 | (C, H, W): C = 선택한 layer 수, H×W = canvas_size 예: (2, 1000, 1000) | 각 Axes에 (H, W) 형태의 이미지 예: (1000, 1000) | 전체 지도 영역을 커버하는 Axes 예: [0, map_edge_x]×[0, map_edge_y] |
| 데이터 타입 | uint8 (binary) | uint8 (RGB) | uint8 (RGB) |
| 색상 지정 | 별도 채널로 사용자 정의 필요 | 기본 색상 자동 적용 | 사용자 정의 색상 가능 |
| 좌표계 | 패치 중심 상대 좌표계 | 글로벌 맵 좌표계 | 글로벌 맵 좌표계 |
| 렌더링 방식 | 프로그래매틱 마스크 생성 | Matplotlib 기반 래스터화 | Matplotlib 기반 계층 합성 |
| 성능 | 100×100m @500px → 약 15ms | 100×100m @500px → 약 450ms | 전체 맵 렌더링 → 약 1200ms |
| 사용 목적 / 주요 활용 사례 | 레이어별 이진 마스크 생성 (ML 모델 입력 등 학습용) | patch_box와 patch_angle에 따른 지도 영역 시각화 (결과 리포트용) | 여러 지도 layer를 전역 지도 위에 오버레이하여 전체 BEV 맵 시각화 (연구/실험용) |
['drivable_area', 'walkway'] → 2 채널) # get_map_mask 예시
patch_box = (300, 1700, 100, 100) # [x_center, y_center, height, width]
patch_angle = 0 # North-up
layer_names = ['drivable_area', 'walkway']
canvas_size = (1000, 1000)
# get_map_mask는 binary mask들을 채널별로 쌓은 numpy 배열을 반환합니다.
map_mask = nusc_map.get_map_mask(patch_box, patch_angle, layer_names, canvas_size)
print("get_map_mask output shape:", map_mask.shape)
# 예: (2, 1000, 1000)
# render_map_patch 예시
fig_patch, axes_patch = nusc_map.render_map_patch(patch_box, patch_angle, layer_names,
canvas_size=canvas_size, figsize=(12, 4), n_row=1)
# 내부적으로 각 축(subplot)은 (1000, 1000) 이미지(하나의 mask 채널)를 표시합니다.
print("Each rendered map patch channel shape:", map_mask[0].shape)
# 예: (1000, 1000)
render_map_patch() 함수는 지정된 patch 영역에 대해, 각 layer의 mask 이미지를 matplotlib의 서브플롯으로 시각화합니다.
fig_patch: 전체 그림(figure) 객체입니다.
matplotlib.figure.Figure axes_patch: 개별 subplot에 해당하는 축(axes)들의 리스트입니다.
list (각 원소의 타입은 matplotlib.axes.Axes) 여기에는 각 layer별 mask 이미지가 표시됩니다.반환된 figure를 PNG 파일로 저장하려면 fig_patch.savefig() 메서드를 사용하면 됩니다.
# 예: PNG 파일로 저장
fig_patch.savefig('map_patch.png', dpi=300, bbox_inches='tight')
figure 전체를 numpy 배열로 변환하는 두 가지 방법이 있습니다.
# 먼저 canvas에 그리기
fig_patch.canvas.draw()
# 캔버스의 RGB 데이터를 가져오기
import numpy as np
img_array = np.frombuffer(fig_patch.canvas.tostring_rgb(), dtype=np.uint8)
width, height = fig_patch.canvas.get_width_height()
img_array = img_array.reshape((height, width, 3))
import io
from PIL import Image
buf = io.BytesIO()
fig_patch.savefig(buf, format='png', dpi=300, bbox_inches='tight')
buf.seek(0)
img = Image.open(buf)
img_array = np.array(img)
# render_layers 예시
fig_layers, ax_layers = nusc_map.render_layers(['lane', 'road_segment'], alpha=0.5, figsize=(15, 15))
# 예: ax_layers의 x축, y축 범위는 지도 전체 (예: singapore-onenorth의 경우)
print("render_layers canvas x-range:", ax_layers.get_xlim())
print("render_layers canvas y-range:", ax_layers.get_ylim())