| 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() |
|
|