Skip to content

clip.visualize_marsclip

visualize_marsclip

Preview helpers for MarsCLIP samples and batches.

save_sample_preview

save_sample_preview(samples: list[dict[str, Any]], out_path: Path | str, *, max_items: int = 4) -> pathlib.Path

Save a quick-look preview of MarsCLIP samples.

Source code in src/clip/visualize_marsclip.py
def save_sample_preview(
    samples: list[dict[str, Any]],
    out_path: pathlib.Path | str,
    *,
    max_items: int = 4,
) -> pathlib.Path:
    """Save a quick-look preview of MarsCLIP samples."""
    items = samples[:max_items]
    if not items:
        raise ValueError("No samples provided.")

    rows = len(items)
    fig, axes = plt.subplots(rows, 2, figsize=(10, 3.8 * rows))
    if rows == 1:
        axes = np.array([axes])

    for row_idx, sample in enumerate(items):
        ax_img, ax_mask = axes[row_idx]
        img = _to_display_rgb(sample["image"])
        valid_mask = sample["valid_mask"].detach().cpu().numpy()

        ax_img.imshow(img, interpolation="nearest")
        ax_img.axis("off")

        md = sample["metadata"]
        title = (
            f"{md['obs_id']}  valid={md['overall_valid_fraction']:.0%}\n"
            f"{sample['rationale_raw'][:70]}"
        )
        if "is_patch_valid" in md:
            title = (
                f"{md['obs_id']}  valid={md['overall_valid_fraction']:.0%}"
                f"  keep={'yes' if md['is_patch_valid'] else 'no'}\n"
                f"{sample['rationale_raw'][:70]}"
            )
        if sample.get("rationale_expanded"):
            title += "\nexpanded"
        ax_img.set_title(title, fontsize=9)

        mask_overlay = _build_mask_overlay(sample["image"], sample["valid_mask"])
        ax_mask.imshow(mask_overlay, interpolation="nearest")
        ax_mask.axis("off")
        ax_mask.set_title(
            f"valid mask overlay ({md['overall_valid_fraction']:.0%} valid)",
            fontsize=9,
        )

    fig.suptitle("MarsCLIP sample preview", fontsize=12)
    fig.tight_layout()
    out = pathlib.Path(out_path)
    out.parent.mkdir(parents=True, exist_ok=True)
    fig.savefig(out, dpi=160)
    plt.close(fig)
    return out