81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
# 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
|