# built-in dependencies from typing import List, Union, Optional, cast # third-party dependencies from lightphe import LightPHE from lightphe.models.Tensor import EncryptedTensor import numpy as np # project dependencies from deepface.commons.embed_utils import is_flat_embedding from deepface.commons.logger import Logger logger = Logger() # pylint: disable=no-else-return def encrypt_embeddings( embeddings: Union[List[float], List[List[float]]], cryptosystem: Optional[LightPHE] = None ) -> Union[EncryptedTensor, List[EncryptedTensor], None]: """ Encrypt embeddings using a provided cryptosystem. Args: embeddings (List[float] or List[List[float]]): Embeddings to encrypt. cryptosystem (LightPHE): Cryptosystem to use for encryption. Returns: EncryptedTensor or List[EncryptedTensor] or None: Encrypted embeddings or None if no cryptosystem is provided. """ if cryptosystem is None: return None if is_flat_embedding(embeddings): embedding = cast(List[float], embeddings) # let type checker know encrypted_embedding = encrypt_embedding(embedding, cryptosystem) return encrypted_embedding else: encrypted_embeddings: List[EncryptedTensor] = [] embeddings = cast(List[List[float]], embeddings) for embedding in embeddings: encrypted_embedding = encrypt_embedding(embedding, cryptosystem) encrypted_embeddings.append(encrypted_embedding) if all(item is None for item in encrypted_embeddings): return None return encrypted_embeddings def encrypt_embedding(embeddings: List[float], cryptosystem: LightPHE) -> Optional[EncryptedTensor]: """ Encrypt an embedding using a provided cryptosystem. Args: embeddings (List[float]): Embedding to encrypt. cryptosystem (LightPHE): Cryptosystem to use for encryption. Returns: EncryptedTensor or None: Encrypted embedding or None if encryption is skipped. """ if any(x < 0 for x in embeddings): logger.warn( "Skipping encryption because it contains negative values." "Consider to set minmax_normalize=True in DeepFace.represent method." ) return None norm = np.linalg.norm(embeddings) if not np.isclose(norm, 1.0): logger.warn( "Skipping encryption because given embedding is not l_2 normalized." "Consider to set l2_normalize=True in DeepFace.represent method." ) return None encrypted_embeddings = cryptosystem.encrypt(embeddings, silent=True) return encrypted_embeddings