Download utils/visualization.py from harshinde/spacenet: direct link, hf CLI and curl.
- Browser
- Download file 2.41 kB
-
https://huggingface.co/spaces/harshinde/spacenet/resolve/main/utils/visualization.py
- Command line
-
hf download hf://spaces/harshinde/spacenet/utils/visualization.py
-
curl -L -o visualization.py https://huggingface.co/spaces/harshinde/spacenet/resolve/main/utils/visualization.py
2.41 kB
| from __future__ import annotations | |
| import numpy as np | |
| import cv2 | |
| # Colour palette for up to 10 classes (BGR → RGB) | |
| DEFAULT_PALETTE = [ | |
| [0, 0, 0], # 0 — background (black) | |
| [255, 50, 50], # 1 — building (red) | |
| [50, 255, 50], # 2 | |
| [50, 50, 255], # 3 | |
| [255, 255, 50], # 4 | |
| [255, 50, 255], # 5 | |
| [50, 255, 255], # 6 | |
| [200, 200, 200], # 7 | |
| [128, 0, 255], # 8 | |
| [0, 128, 255], # 9 | |
| ] | |
| def overlay_mask( | |
| image: np.ndarray, | |
| mask: np.ndarray, | |
| alpha: float = 0.45, | |
| colour: tuple[int, int, int] = (255, 50, 50), | |
| ) -> np.ndarray: | |
| """Overlay a binary mask on an RGB image. | |
| Args: | |
| image: HWC uint8 RGB image. | |
| mask: HW boolean or int array (True / >0 = foreground). | |
| alpha: Opacity of the overlay. | |
| colour: RGB colour for foreground pixels. | |
| Returns: | |
| Blended HWC uint8 RGB image. | |
| """ | |
| overlay = image.copy() | |
| bool_mask = mask.astype(bool) | |
| overlay[bool_mask] = np.array(colour, dtype=np.uint8) | |
| output = image.copy() | |
| cv2.addWeighted(overlay, alpha, output, 1.0 - alpha, 0, output) | |
| return output | |
| def colourize_labels( | |
| label: np.ndarray, | |
| palette: list[list[int]] | None = None, | |
| ) -> np.ndarray: | |
| """Convert an integer label map to an RGB colour image. | |
| Args: | |
| label: HW int array of class IDs. | |
| palette: list of [R, G, B] per class index. | |
| Returns: | |
| HWC uint8 RGB image. | |
| """ | |
| if palette is None: | |
| palette = DEFAULT_PALETTE | |
| h, w = label.shape | |
| rgb = np.zeros((h, w, 3), dtype=np.uint8) | |
| for cls_id, colour in enumerate(palette): | |
| rgb[label == cls_id] = colour | |
| return rgb | |
| def plot_predictions( | |
| image: np.ndarray, | |
| gt_label: np.ndarray, | |
| pred_label: np.ndarray, | |
| save_path: str | None = None, | |
| ) -> np.ndarray: | |
| """Create a side-by-side comparison: image | GT overlay | prediction overlay. | |
| Returns: | |
| Concatenated HWC uint8 RGB image (width = 3 × original). | |
| """ | |
| gt_overlay = overlay_mask(image, gt_label > 0, alpha=0.4, colour=(50, 255, 50)) | |
| pred_overlay = overlay_mask(image, pred_label > 0, alpha=0.4, colour=(255, 50, 50)) | |
| combined = np.concatenate([image, gt_overlay, pred_overlay], axis=1) | |
| if save_path is not None: | |
| bgr = cv2.cvtColor(combined, cv2.COLOR_RGB2BGR) | |
| cv2.imwrite(save_path, bgr) | |
| return combined | |