63 lines
2.5 KiB
Python
63 lines
2.5 KiB
Python
from typing import Union
|
|
import numpy as np
|
|
|
|
|
|
def findCosineDistance(
|
|
source_representation: Union[np.ndarray, list], test_representation: Union[np.ndarray, list]
|
|
) -> np.float64:
|
|
if isinstance(source_representation, list):
|
|
source_representation = np.array(source_representation)
|
|
|
|
if isinstance(test_representation, list):
|
|
test_representation = np.array(test_representation)
|
|
|
|
a = np.matmul(np.transpose(source_representation), test_representation)
|
|
b = np.sum(np.multiply(source_representation, source_representation))
|
|
c = np.sum(np.multiply(test_representation, test_representation))
|
|
return 1 - (a / (np.sqrt(b) * np.sqrt(c)))
|
|
|
|
|
|
def findEuclideanDistance(
|
|
source_representation: Union[np.ndarray, list], test_representation: Union[np.ndarray, list]
|
|
) -> np.float64:
|
|
if isinstance(source_representation, list):
|
|
source_representation = np.array(source_representation)
|
|
|
|
if isinstance(test_representation, list):
|
|
test_representation = np.array(test_representation)
|
|
|
|
euclidean_distance = source_representation - test_representation
|
|
euclidean_distance = np.sum(np.multiply(euclidean_distance, euclidean_distance))
|
|
euclidean_distance = np.sqrt(euclidean_distance)
|
|
return euclidean_distance
|
|
|
|
|
|
def l2_normalize(x: np.ndarray) -> np.ndarray:
|
|
return x / np.sqrt(np.sum(np.multiply(x, x)))
|
|
|
|
|
|
def findThreshold(model_name: str, distance_metric: str) -> float:
|
|
|
|
base_threshold = {"cosine": 0.40, "euclidean": 0.55, "euclidean_l2": 0.75}
|
|
|
|
thresholds = {
|
|
# "VGG-Face": {"cosine": 0.40, "euclidean": 0.60, "euclidean_l2": 0.86}, # 2622d
|
|
"VGG-Face": {
|
|
"cosine": 0.68,
|
|
"euclidean": 1.17,
|
|
"euclidean_l2": 1.17,
|
|
}, # 4096d - tuned with LFW
|
|
"Facenet": {"cosine": 0.40, "euclidean": 10, "euclidean_l2": 0.80},
|
|
"Facenet512": {"cosine": 0.30, "euclidean": 23.56, "euclidean_l2": 1.04},
|
|
"ArcFace": {"cosine": 0.68, "euclidean": 4.15, "euclidean_l2": 1.13},
|
|
"Dlib": {"cosine": 0.07, "euclidean": 0.6, "euclidean_l2": 0.4},
|
|
"SFace": {"cosine": 0.593, "euclidean": 10.734, "euclidean_l2": 1.055},
|
|
"OpenFace": {"cosine": 0.10, "euclidean": 0.55, "euclidean_l2": 0.55},
|
|
"DeepFace": {"cosine": 0.23, "euclidean": 64, "euclidean_l2": 0.64},
|
|
"DeepID": {"cosine": 0.015, "euclidean": 45, "euclidean_l2": 0.17},
|
|
}
|
|
|
|
threshold = thresholds.get(model_name, base_threshold).get(distance_metric, 0.4)
|
|
|
|
return threshold
|