datn-face-ai / deepface /modules /encryption.py
DaoManhDuc2004
Deploy DATN face AI server
b5d3a91
# 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