File size: 3,114 Bytes
fba30db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
80
81
82
83
84
85
86
87
"""G1/G2 smoke test — EfficientNetAutoAttB4 + BlazeFace load and basic inference.

Gate G1: model loads on cold start without crash.
Gate G2: BlazeFace detects ≥1 face on a synthetic face image.

Run from backend/:
    .venv/Scripts/python.exe scripts/test_efficientnet_load.py
"""
from __future__ import annotations

import sys
import time
import urllib.request
from pathlib import Path

import numpy as np
import psutil

sys.path.insert(0, str(Path(__file__).resolve().parent.parent))


def main() -> int:
    proc = psutil.Process()
    ram_before = proc.memory_info().rss / 1024 / 1024

    print("=== G1: EfficientNetAutoAttB4 load ===")
    t0 = time.perf_counter()
    try:
        from services.efficientnet_service import EfficientNetDetector
        det = EfficientNetDetector()
        elapsed = time.perf_counter() - t0
        print(f"  [PASS] model loaded in {elapsed:.1f}s")
    except Exception as e:
        print(f"  [FAIL] {e}")
        return 1

    ram_after = proc.memory_info().rss / 1024 / 1024
    print(f"  RAM delta: +{ram_after - ram_before:.0f} MB  (total: {ram_after:.0f} MB)")

    print("\n=== G2: BlazeFace face detection ===")
    # Download a small real portrait image for face detection test.
    url = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Gatto_europeo4.jpg/320px-Gatto_europeo4.jpg"
    face_url = "https://thispersondoesnotexist.com/"
    print(f"  fetching test face from: {face_url}")
    try:
        from PIL import Image
        import io
        req = urllib.request.Request(face_url, headers={"User-Agent": "DeepShield/1.0"})
        with urllib.request.urlopen(req, timeout=15) as r:
            data = r.read()
        pil = Image.open(io.BytesIO(data)).convert("RGB")
        img_np = np.array(pil)
        frame_data = det.face_extractor.process_image(img=img_np)
        faces = frame_data.get("faces", [])
        if faces:
            print(f"  [PASS] BlazeFace detected {len(faces)} face(s)")
        else:
            print("  [WARN] BlazeFace detected 0 faces on test image — G2 inconclusive (network or image issue)")
    except Exception as e:
        print(f"  [WARN] face detection test skipped: {e}")

    print("\n=== G1b: detect_image on synthetic noise (no-face path) ===")
    try:
        from PIL import Image as PILImage
        noise = PILImage.fromarray(np.random.randint(0, 255, (224, 224, 3), dtype=np.uint8))
        result = det.detect_image(noise)
        if result.get("error") == "no_face":
            print("  [PASS] no-face path returns gracefully")
        else:
            print(f"  [INFO] unexpected result on noise image: {result}")
    except Exception as e:
        print(f"  [FAIL] detect_image raised: {e}")
        return 1

    print("\n=== Memory gate (G8 check) ===")
    ram_final = proc.memory_info().rss / 1024 / 1024
    threshold_mb = 2500
    status = "PASS" if ram_final < threshold_mb else "WARN"
    print(f"  [{status}] RSS={ram_final:.0f} MB (threshold {threshold_mb} MB)")

    print("\nAll G1 gates passed.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())