File size: 2,705 Bytes
168618a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
"""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())