From c54704067b56ddc4a2d270e742caac439e86b331 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Mon, 28 Apr 2025 11:43:18 -0600 Subject: [PATCH] Send tracked object updates for face and license_plate objects --- .../common/license_plate/mixin.py | 13 +++++++++++ frigate/data_processing/post/license_plate.py | 3 +++ frigate/data_processing/real_time/face.py | 22 +++++++++++++++++-- .../real_time/license_plate.py | 3 +++ frigate/embeddings/maintainer.py | 2 ++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/frigate/data_processing/common/license_plate/mixin.py b/frigate/data_processing/common/license_plate/mixin.py index e471aa304..a49b7b50e 100644 --- a/frigate/data_processing/common/license_plate/mixin.py +++ b/frigate/data_processing/common/license_plate/mixin.py @@ -2,6 +2,7 @@ import base64 import datetime +import json import logging import math import os @@ -1510,6 +1511,18 @@ class LicensePlateProcessingMixin: ) # always publish to recognized_license_plate field + self.requestor.send_data( + "tracked_object_update", + json.dumps({ + "type": "lpr", + "name": sub_label, + "plate": top_plate, + "score": avg_confidence, + "id": id, + "camera": camera, + "timestamp": start, + }), + ) self.sub_label_publisher.publish( EventMetadataTypeEnum.recognized_license_plate, (id, top_plate, avg_confidence), diff --git a/frigate/data_processing/post/license_plate.py b/frigate/data_processing/post/license_plate.py index e439fb763..e7d4ca6e5 100644 --- a/frigate/data_processing/post/license_plate.py +++ b/frigate/data_processing/post/license_plate.py @@ -9,6 +9,7 @@ from peewee import DoesNotExist from frigate.comms.embeddings_updater import EmbeddingsRequestEnum from frigate.comms.event_metadata_updater import EventMetadataPublisher +from frigate.comms.inter_process import InterProcessRequestor from frigate.config import FrigateConfig from frigate.data_processing.common.license_plate.mixin import ( WRITE_DEBUG_IMAGES, @@ -31,11 +32,13 @@ class LicensePlatePostProcessor(LicensePlateProcessingMixin, PostProcessorApi): def __init__( self, config: FrigateConfig, + requestor: InterProcessRequestor, sub_label_publisher: EventMetadataPublisher, metrics: DataProcessorMetrics, model_runner: LicensePlateModelRunner, detected_license_plates: dict[str, dict[str, any]], ): + self.requestor = self.requestor self.detected_license_plates = detected_license_plates self.model_runner = model_runner self.lpr_config = config.lpr diff --git a/frigate/data_processing/real_time/face.py b/frigate/data_processing/real_time/face.py index fb55bb7d2..eb85c5336 100644 --- a/frigate/data_processing/real_time/face.py +++ b/frigate/data_processing/real_time/face.py @@ -2,6 +2,7 @@ import base64 import datetime +import json import logging import os import random @@ -17,6 +18,7 @@ from frigate.comms.event_metadata_updater import ( EventMetadataPublisher, EventMetadataTypeEnum, ) +from frigate.comms.inter_process import InterProcessRequestor from frigate.config import FrigateConfig from frigate.const import FACE_DIR, MODEL_CACHE_DIR from frigate.data_processing.common.face.model import ( @@ -42,11 +44,13 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): def __init__( self, config: FrigateConfig, + requestor: InterProcessRequestor, sub_label_publisher: EventMetadataPublisher, metrics: DataProcessorMetrics, ): super().__init__(config, metrics) self.face_config = config.face_recognition + self.requestor = requestor self.sub_label_publisher = sub_label_publisher self.face_detector: cv2.FaceDetectorYN = None self.requires_face_detection = "face" not in self.config.objects.all_objects @@ -157,8 +161,10 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): def process_frame(self, obj_data: dict[str, any], frame: np.ndarray): """Look for faces in image.""" self.metrics.face_rec_fps.value = self.faces_per_second.eps() + camera = obj_data["camera"] - if not self.config.cameras[obj_data["camera"]].face_recognition.enabled: + + if not self.config.cameras[camera].face_recognition.enabled: return start = datetime.datetime.now().timestamp() @@ -245,7 +251,7 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): if ( not face_box or area(face_box) - < self.config.cameras[obj_data["camera"]].face_recognition.min_area + < self.config.cameras[camera].face_recognition.min_area ): logger.debug(f"Invalid face box {face}") return @@ -286,6 +292,18 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): self.person_face_history[id] ) + self.requestor.send_data( + "tracked_object_update", + json.dumps({ + "type": "face", + "name": weighted_sub_label, + "score": weighted_score, + "id": id, + "camera": camera, + "timestamp": start, + }), + ) + if weighted_score >= self.face_config.recognition_threshold: self.sub_label_publisher.publish( EventMetadataTypeEnum.sub_label, diff --git a/frigate/data_processing/real_time/license_plate.py b/frigate/data_processing/real_time/license_plate.py index 95d53a343..864968073 100644 --- a/frigate/data_processing/real_time/license_plate.py +++ b/frigate/data_processing/real_time/license_plate.py @@ -5,6 +5,7 @@ import logging import numpy as np from frigate.comms.event_metadata_updater import EventMetadataPublisher +from frigate.comms.inter_process import InterProcessRequestor from frigate.config import FrigateConfig from frigate.data_processing.common.license_plate.mixin import ( LicensePlateProcessingMixin, @@ -23,11 +24,13 @@ class LicensePlateRealTimeProcessor(LicensePlateProcessingMixin, RealTimeProcess def __init__( self, config: FrigateConfig, + requestor: InterProcessRequestor, sub_label_publisher: EventMetadataPublisher, metrics: DataProcessorMetrics, model_runner: LicensePlateModelRunner, detected_license_plates: dict[str, dict[str, any]], ): + self.requestor = requestor self.detected_license_plates = detected_license_plates self.model_runner = model_runner self.lpr_config = config.lpr diff --git a/frigate/embeddings/maintainer.py b/frigate/embeddings/maintainer.py index ba9b42f77..9bb2b54cd 100644 --- a/frigate/embeddings/maintainer.py +++ b/frigate/embeddings/maintainer.py @@ -135,6 +135,7 @@ class EmbeddingMaintainer(threading.Thread): self.realtime_processors.append( LicensePlateRealTimeProcessor( self.config, + self.requestor, self.event_metadata_publisher, metrics, lpr_model_runner, @@ -149,6 +150,7 @@ class EmbeddingMaintainer(threading.Thread): self.post_processors.append( LicensePlatePostProcessor( self.config, + self.requestor, self.event_metadata_publisher, metrics, lpr_model_runner,