facecloak / tests /test_integration.py
a-01a's picture
Deploy FaceCloak
0faa034 verified
"""Integration tests exercising the real FaceNet models on portrait fixtures."""
from __future__ import annotations
from pathlib import Path
from PIL import Image
import pytest
from facecloak.cloaking import CloakHyperparameters, cloak_face_tensor
from facecloak.pipeline import (
cosine_similarity,
detect_primary_face,
extract_embedding_numpy,
verify_cloak,
)
FIXTURE_DIR = Path("tests/fixtures/faces")
@pytest.mark.integration
def test_real_face_similarity_pipeline_matches_expected_ranges() -> None:
obama_a = Image.open(FIXTURE_DIR / "obama_a.jpg").convert("RGB")
obama_b = Image.open(FIXTURE_DIR / "obama_b.jpg").convert("RGB")
george_a = Image.open(FIXTURE_DIR / "george_a.jpg").convert("RGB")
obama_a_embedding = extract_embedding_numpy(detect_primary_face(obama_a).tensor)
obama_b_embedding = extract_embedding_numpy(detect_primary_face(obama_b).tensor)
george_embedding = extract_embedding_numpy(detect_primary_face(george_a).tensor)
same_score = cosine_similarity(obama_a_embedding, obama_b_embedding)
different_score = cosine_similarity(obama_a_embedding, george_embedding)
assert same_score > 0.8
assert different_score < 0.3
@pytest.mark.integration
def test_real_face_cloaking_substantially_lowers_similarity() -> None:
obama_a = Image.open(FIXTURE_DIR / "obama_a.jpg").convert("RGB")
detected = detect_primary_face(obama_a)
result = cloak_face_tensor(
detected.tensor,
parameters=CloakHyperparameters(
epsilon=0.03,
alpha_fraction=0.1,
num_steps=50,
l2_lambda=0.01,
),
)
assert result.final_similarity < 0.35
assert result.delta_l_inf <= 0.03 + 1e-6
@pytest.mark.integration
def test_verify_cloak_uses_fresh_mtcnn_pass_on_real_image() -> None:
"""Post-cloak verification must independently re-detect the cloaked image."""
obama_a = Image.open(FIXTURE_DIR / "obama_a.jpg").convert("RGB")
detected = detect_primary_face(obama_a)
original_embedding = extract_embedding_numpy(detected.tensor)
result = cloak_face_tensor(
detected.tensor,
parameters=CloakHyperparameters(epsilon=0.05, num_steps=80),
)
verification = verify_cloak(result.cloaked_face_image, original_embedding)
# Similarity should be lower after cloaking
assert verification.similarity < 0.9
# The result must contain a human-readable label
assert len(verification.label) > 0
# A strong cloak can push cosine similarity negative (anti-correlated vectors).
# pct = similarity * 100 and is NOT clamped — that is intentional.
assert verification.pct == pytest.approx(verification.similarity * 100.0, abs=0.01)