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
|