ZAuth / client /services /preprocess.py
Martin Natale
Migrate background image to LFS
b1fb35d
Raw
History Blame Contribute Delete
2.87 kB
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()