# built-in dependencies from typing import List, Union, cast # third-party dependencies import numpy as np # project dependencies from deepface.config.minmax import get_minmax_values from deepface.commons.embed_utils import is_flat_embedding def normalize_embedding_minmax( model_name: str, embeddings: Union[List[float], List[List[float]]] ) -> Union[List[float], List[List[float]]]: """ Normalize embeddings using min-max normalization based on model-specific min-max values. Args: model_name (str): Name of the model to get min-max values for. embeddings (List[float] or List[List[float]]): Embeddings to normalize. Returns: List[float] or List[List[float]]: Normalized embeddings. """ dim_min, dim_max = get_minmax_values(model_name) if dim_max - dim_min == 0: return embeddings if is_flat_embedding(embeddings): embeddings = cast(List[float], embeddings) # let type checker know # Clamp vals to [dim_min, dim_max] to ensure the norm-embedding stays in [0, 1] embeddings = [max(x, dim_min) for x in embeddings] # lower-bound clamp embeddings = [min(x, dim_max) for x in embeddings] # upper-bound clamp embeddings = [(x - dim_min) / (dim_max - dim_min) for x in embeddings] else: normalized_embeddings = [] for emb in embeddings: emb = cast(List[float], emb) # let type checker know # Clamp vals to [dim_min, dim_max] to ensure the norm-embedding stays in [0, 1] emb = [max(x, dim_min) for x in emb] # lower-bound clamp emb = [min(x, dim_max) for x in emb] # upper-bound clamp emb = [(min(max(x, dim_min), dim_max) - dim_min) / (dim_max - dim_min) for x in emb] normalized_embeddings.append(emb) embeddings = normalized_embeddings return embeddings def normalize_embedding_l2( embeddings: Union[List[float], List[List[float]]], ) -> Union[List[float], List[List[float]]]: """ Normalize embeddings using L2 normalization. Args: embeddings (List[float] or List[List[float]]): Embeddings to normalize. Returns: List[float] or List[List[float]]: L2-normalized embeddings. """ if is_flat_embedding(embeddings): norm = float(np.linalg.norm(embeddings)) if norm > 0: embeddings = cast(List[float], embeddings) # let type checker know embeddings = (np.array(embeddings) / norm).tolist() else: normalized_embeddings = [] for emb in embeddings: emb = cast(List[float], emb) # let type checker know norm = float(np.linalg.norm(emb)) if norm > 0: normalized_emb = (np.array(emb) / norm).tolist() else: normalized_emb = emb normalized_embeddings.append(normalized_emb) embeddings = normalized_embeddings return embeddings