truthlens-backend / tests /debug_ml_models.py
daksh15's picture
deploy: FastAPI backend with PostgreSQL (Neon) cache
168618a
"""Print each individual model's prediction for the user's AI image and a real photo."""
from __future__ import annotations
import io
import sys
from pathlib import Path
import numpy as np
import requests
from PIL import Image
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[attr-defined]
except Exception:
pass
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
from app.pipeline.layer4_ml import _load_image_pipes, _load_clip, _interpret_predictions
AI_IMAGE = Path(
r"C:/Users/DK/.cursor/projects/d-Slop-Detector/assets/"
r"c__Users_DK_AppData_Roaming_Cursor_User_workspaceStorage_"
r"89f2837b043bf2aad9629a2fad021998_images_image-49bca521-7683-43db-bea7-3d81417b832f.png"
)
def _print_each(name: str, pil: Image.Image) -> None:
print(f"\n{'=' * 60}\n=== {name}\n{'=' * 60}")
for mid, pipe in _load_image_pipes():
try:
preds = pipe(pil)
p_ai, table = _interpret_predictions(preds)
print(f" {mid:50s} p(AI)={p_ai:.3f}")
for label, score in sorted(table.items(), key=lambda kv: -kv[1])[:4]:
print(f" {label:25s} {score:.3f}")
except Exception as e:
print(f" {mid:50s} FAILED: {e}")
state = _load_clip()
if state is not None:
import torch # type: ignore
with torch.no_grad():
inputs = state["processor"](images=pil, return_tensors="pt").to(state["device"])
vision_out = state["model"].vision_model(pixel_values=inputs["pixel_values"])
pooled = vision_out.pooler_output
feat = state["model"].visual_projection(pooled)
feat = feat / feat.norm(dim=-1, keepdim=True)
sim_real = float((feat @ state["real_proto"].T).squeeze().item())
sim_ai = float((feat @ state["ai_proto"].T).squeeze().item())
margin = sim_ai - sim_real
print(f" CLIP "
f" sim_real={sim_real:.4f} sim_ai={sim_ai:.4f} margin={margin:+.4f}")
def main() -> int:
if AI_IMAGE.exists():
_print_each("user-ai-portrait.png (AI)", Image.open(AI_IMAGE).convert("RGB"))
try:
r = requests.get(
"https://images.unsplash.com/photo-1494790108377-be9c29b29330"
"?w=800&q=80&auto=format",
timeout=8,
)
if r.status_code == 200:
_print_each("real-unsplash.jpg (REAL)",
Image.open(io.BytesIO(r.content)).convert("RGB"))
except Exception as e:
print(f"unsplash fetch failed: {e}")
return 0
if __name__ == "__main__":
raise SystemExit(main())