|
import numpy as np |
|
from tqdm import tqdm |
|
from glob import glob |
|
import os |
|
|
|
|
|
def load_image_folder(folder_path: str, max_nb_images: int) -> list[str]: |
|
image_path = f"{folder_path}/*" |
|
image_paths = glob(image_path) |
|
images = [image_path for image_path in image_paths[:max_nb_images]] |
|
return images |
|
|
|
|
|
def compute_embeddings_and_labels(images: list[str], label: int) -> np.ndarray: |
|
from deepface import DeepFace |
|
|
|
embeddings = [] |
|
labels = [] |
|
for image in tqdm(images): |
|
try: |
|
embedding_obj = DeepFace.represent( |
|
img_path=image, |
|
model_name="Facenet", |
|
) |
|
embedding = embedding_obj[0]["embedding"] |
|
embeddings.append(embedding) |
|
labels.append(label) |
|
except Exception as e: |
|
print(f"Erreur lors du traitement de {image}: {e}") |
|
return np.vstack(embeddings), np.array(labels) |
|
|
|
|
|
def load_embeddings_and_labels( |
|
folder_path: str, label: int, max_nb_images: int, cache: bool |
|
) -> tuple[np.ndarray, np.ndarray]: |
|
if ( |
|
not os.path.exists(f"{folder_path}/embeddings.npy") |
|
or not os.path.exists(f"{folder_path}/labels.npy") |
|
or (not cache) |
|
): |
|
images = load_image_folder(folder_path, max_nb_images) |
|
embeddings, labels = compute_embeddings_and_labels(images, label) |
|
np.save(f"{folder_path}/embeddings.npy", embeddings) |
|
np.save(f"{folder_path}/labels.npy", labels) |
|
embeddings = np.load(f"{folder_path}/embeddings.npy") |
|
labels = np.load(f"{folder_path}/labels.npy") |
|
return embeddings, labels |
|
|
|
|
|
def load_dataset( |
|
target_folder: str, |
|
max_nb_images=500, |
|
cache=True, |
|
deep_fake_folder: str = "./data/deepfake", |
|
) -> tuple[np.ndarray, np.ndarray]: |
|
deep_fake_images_embeddings, deep_fake_labels = load_embeddings_and_labels( |
|
deep_fake_folder, max_nb_images=max_nb_images, label=0, cache=cache |
|
) |
|
target_images_embeddings, target_images_labels = load_embeddings_and_labels( |
|
target_folder, max_nb_images=max_nb_images, label=1, cache=cache |
|
) |
|
embeddings = np.vstack([target_images_embeddings, deep_fake_images_embeddings]) |
|
labels = np.hstack([target_images_labels, deep_fake_labels]) |
|
return embeddings, labels |
|
|
|
|
|
def featurisation(embeddings: np.ndarray) -> np.ndarray: |
|
rms = np.sqrt(np.mean(embeddings**2, axis=1)) |
|
mean = np.mean(embeddings, axis=1) |
|
median = np.median(embeddings, axis=1) |
|
features = np.stack([rms, mean, median], axis=1) |
|
return features |
|
|
|
|
|
from concrete.ml.torch.compile import compile_torch_model |
|
import torch |
|
import torch.nn as nn |
|
|
|
|
|
class RegNet(nn.Module): |
|
def __init__(self, b): |
|
super().__init__() |
|
self.b = nn.Parameter(torch.ones(1) * b) |
|
|
|
def forward(self, x): |
|
X = x[:, :128] |
|
W = x[:, 128:] |
|
return ((X @ W.T + self.b) > 0).float() |
|
|