feat(simulator): add image saving utilities for verification

This commit is contained in:
2026-03-30 21:49:32 +08:00
parent 26b00e556a
commit cb93d83868
5 changed files with 105 additions and 20 deletions

View File

@@ -3,16 +3,19 @@ from .habitat import (
close_habitat_simulator,
create_habitat_simulator,
)
from .image_save import save_object_image, save_room_view
from .topdown import TopDownRenderStyle, TopDownSceneElements, render_topdown_scene_map
from .views import RoomViewsByRoom, collect_room_views_by_room
__all__ = [
"HabitatSimulatorConfig",
"RoomViewsByRoom",
"TopDownRenderStyle",
"TopDownSceneElements",
"RoomViewsByRoom",
"close_habitat_simulator",
"collect_room_views_by_room",
"create_habitat_simulator",
"render_topdown_scene_map",
"save_object_image",
"save_room_view",
]

View File

@@ -0,0 +1,59 @@
"""Image saving utilities for simulation verification output."""
from __future__ import annotations
from pathlib import Path
from PIL import Image
def save_room_view(
output_dir: Path,
room_id: str,
view_idx: int,
image: Image.Image,
) -> Path:
"""Save a single room view image to disk.
Args:
output_dir: Base output directory.
room_id: Room identifier string.
view_idx: Zero-based view index within the room.
image: PIL Image to save.
Returns:
Path where the image was saved.
"""
room_dir = output_dir / room_id
room_dir.mkdir(parents=True, exist_ok=True)
path = room_dir / f"view_{view_idx:03d}.png"
image.convert("RGB").save(path, format="PNG")
return path
def save_object_image(
output_dir: Path,
room_id: str,
obj_id: str,
view_idx: int,
mask_idx: int,
image: Image.Image,
) -> Path:
"""Save a masked object image to disk.
Args:
output_dir: Base output directory.
room_id: Room identifier string.
obj_id: Object identifier string.
view_idx: Zero-based view index.
mask_idx: Zero-based mask index within the view.
image: PIL Image to save.
Returns:
Path where the image was saved.
"""
room_dir = output_dir / room_id
room_dir.mkdir(parents=True, exist_ok=True)
path = room_dir / f"{obj_id}_view{view_idx:03d}_mask{mask_idx:02d}.png"
image.convert("RGB").save(path, format="PNG")
return path

View File

@@ -4,6 +4,7 @@ from .feature_extractor import (
extract_single_image_feature,
infer_vector_dim,
)
from .image import numpy_to_pil
__all__ = [
"get_device",
@@ -11,4 +12,5 @@ __all__ = [
"infer_vector_dim",
"extract_single_image_feature",
"extract_batch_features",
"numpy_to_pil",
]

21
mini-nav/utils/image.py Normal file
View File

@@ -0,0 +1,21 @@
"""Image conversion utilities."""
from __future__ import annotations
import numpy as np
from PIL import Image
def numpy_to_pil(rgb: np.ndarray) -> Image.Image:
"""Convert an RGB numpy array to a PIL Image.
Handles arrays with 4 channels (RGBA) by dropping the alpha channel.
Args:
rgb: Numpy array of shape (H, W, C) with dtype uint8 or compatible.
Returns:
PIL Image in RGB mode.
"""
rgb3 = rgb[..., :3] if rgb.shape[-1] > 3 else rgb
return Image.fromarray(rgb3.astype(np.uint8))