Bitcheck-image / app /services /explainability.py
BitCheck Codex
feat: add Grad-CAM explainability output
fb6f7e3
raw
history blame contribute delete
997 Bytes
from __future__ import annotations
from pathlib import Path
from PIL import Image
from app.services.image_detector import ImageDetector
from app.services.gradcam_service import generate_gradcam as _generate_gradcam
def generate_gradcam(
detector: ImageDetector,
image: Image.Image,
verification_id: str,
outputs_dir: Path,
) -> dict[str, Any]:
if not detector.is_loaded or detector.model is None:
return {
"checked": False,
"status": "not_available",
"method": "Grad-CAM",
"heatmap_url": None,
"overlay_url": None,
"boxed_image_url": None,
"hotspots": [],
"warning": "Classifier is not loaded; Grad-CAM was skipped.",
}
tmp = outputs_dir / f"{verification_id}_gradcam_input.jpg"
image.convert("RGB").save(tmp, quality=95)
return _generate_gradcam(detector.model, str(tmp), detector.transform, detector.device, 1, str(outputs_dir), verification_id)