diff --git a/frigate/data_processing/common/face/model.py b/frigate/data_processing/common/face/model.py index 2c01142886..2af55c908c 100644 --- a/frigate/data_processing/common/face/model.py +++ b/frigate/data_processing/common/face/model.py @@ -243,6 +243,30 @@ class FaceNetRecognizer(FaceRecognizer): for name, embs in face_embeddings_map.items(): self.mean_embs[name] = stats.trim_mean(embs, 0.15) + def similarity_to_confidence( + self, cosine_similarity: float, median=0.3, range_width=0.6, slope_factor=12 + ): + """ + Default sigmoid function to map cosine similarity to confidence. + + Args: + cosine_similarity (float): The input cosine similarity. + median (float): Assumed median of cosine similarity distribution. + range_width (float): Assumed range of cosine similarity distribution (90th percentile - 10th percentile). + slope_factor (float): Adjusts the steepness of the curve. + + Returns: + float: The confidence score. + """ + + # Calculate slope and bias + slope = slope_factor / range_width + bias = median + + # Calculate confidence + confidence = 1 / (1 + np.exp(-slope * (cosine_similarity - bias))) + return confidence + def classify(self, face_image): if not self.landmark_detector: return None @@ -272,9 +296,10 @@ class FaceNetRecognizer(FaceRecognizer): magnitude_B = np.linalg.norm(mean_emb) cosine_similarity = dot_product / (magnitude_A * magnitude_B) + confidence = self.similarity_to_confidence(cosine_similarity) if cosine_similarity > score: - score = cosine_similarity + score = confidence label = name if score < self.config.face_recognition.min_score: diff --git a/frigate/data_processing/real_time/face.py b/frigate/data_processing/real_time/face.py index 348309f22a..93de32a68d 100644 --- a/frigate/data_processing/real_time/face.py +++ b/frigate/data_processing/real_time/face.py @@ -266,6 +266,7 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): res = self.recognizer.classify(face_frame) if not res: + self.__update_metrics(datetime.datetime.now().timestamp() - start) return sub_label, score = res diff --git a/frigate/embeddings/onnx/base_embedding.py b/frigate/embeddings/onnx/base_embedding.py index 84f68cf429..7403f0ac1e 100644 --- a/frigate/embeddings/onnx/base_embedding.py +++ b/frigate/embeddings/onnx/base_embedding.py @@ -85,7 +85,6 @@ class BaseEmbedding(ABC): input_names = self.runner.get_input_names() onnx_inputs = {name: [] for name in input_names} input: dict[str, any] - print(f"onnx inputs are {input_names}") for input in processed: for key, value in input.items(): if key in input_names: