diff --git a/frigate/data_processing/common/license_plate/mixin.py b/frigate/data_processing/common/license_plate/mixin.py index 3d24d48d5..84e432891 100644 --- a/frigate/data_processing/common/license_plate/mixin.py +++ b/frigate/data_processing/common/license_plate/mixin.py @@ -955,7 +955,7 @@ class LicensePlateProcessingMixin: """ Update inference metrics. """ - self.metrics.alpr_pps.value = (self.metrics.alpr_pps.value * 9 + duration) / 10 + self.metrics.alpr_speed.value = (self.metrics.alpr_speed.value * 9 + duration) / 10 def _generate_plate_event(self, camera: str, plate: str, plate_score: float) -> str: """Generate a unique ID for a plate event based on camera and text.""" diff --git a/frigate/data_processing/real_time/face.py b/frigate/data_processing/real_time/face.py index cc4023228..7fdad04be 100644 --- a/frigate/data_processing/real_time/face.py +++ b/frigate/data_processing/real_time/face.py @@ -24,6 +24,7 @@ from frigate.data_processing.common.face.model import ( FaceNetRecognizer, FaceRecognizer, ) +from frigate.util.builtin import EventsPerSecond from frigate.util.image import area from ..types import DataProcessorMetrics @@ -51,6 +52,7 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): self.requires_face_detection = "face" not in self.config.objects.all_objects self.person_face_history: dict[str, list[tuple[str, float, int]]] = {} self.recognizer: FaceRecognizer | None = None + self.faces_per_second = EventsPerSecond() download_path = os.path.join(MODEL_CACHE_DIR, "facedet") self.model_files = { @@ -103,6 +105,7 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): score_threshold=0.5, nms_threshold=0.3, ) + self.faces_per_second.start() def __detect_face( self, input: np.ndarray, threshold: float @@ -152,6 +155,8 @@ 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() + if not self.config.cameras[obj_data["camera"]].face_recognition.enabled: return @@ -251,6 +256,7 @@ class FaceRealTimeProcessor(RealTimeProcessorApi): max(0, face_box[0]) : min(frame.shape[1], face_box[2]), ] + self.faces_per_second.update() res = self.recognizer.classify(face_frame) if not res: diff --git a/frigate/data_processing/types.py b/frigate/data_processing/types.py index 855f22299..9fd2e72ea 100644 --- a/frigate/data_processing/types.py +++ b/frigate/data_processing/types.py @@ -9,6 +9,7 @@ class DataProcessorMetrics: image_embeddings_speed: Synchronized text_embeddings_speed: Synchronized face_rec_speed: Synchronized + face_rec_fps: Synchronized alpr_speed: Synchronized yolov9_lpr_speed: Synchronized @@ -16,6 +17,7 @@ class DataProcessorMetrics: self.image_embeddings_speed = mp.Value("d", 0.01) self.text_embeddings_speed = mp.Value("d", 0.01) self.face_rec_speed = mp.Value("d", 0.01) + self.face_rec_fps = mp.Value("d", 0.0) self.alpr_speed = mp.Value("d", 0.01) self.yolov9_lpr_speed = mp.Value("d", 0.01) diff --git a/frigate/stats/util.py b/frigate/stats/util.py index ba2920cc8..72c84f0c0 100644 --- a/frigate/stats/util.py +++ b/frigate/stats/util.py @@ -305,8 +305,8 @@ def stats_snapshot( stats["embeddings"]["face_recognition_speed"] = round( embeddings_metrics.face_rec_speed.value * 1000, 2 ) - stats["embeddings"]["face_recognition_rps"] = round( - embeddings_metrics.face_rec_rps, 2 + stats["embeddings"]["face_recognition_fps"] = round( + embeddings_metrics.face_rec_speed.value, 2 ) if config.lpr.enabled: diff --git a/web/src/views/system/FeatureMetrics.tsx b/web/src/views/system/FeatureMetrics.tsx index c5b6e1454..5ea5b9933 100644 --- a/web/src/views/system/FeatureMetrics.tsx +++ b/web/src/views/system/FeatureMetrics.tsx @@ -7,6 +7,7 @@ import { Skeleton } from "@/components/ui/skeleton"; import { ThresholdBarGraph } from "@/components/graph/SystemGraph"; import { cn } from "@/lib/utils"; import { useTranslation } from "react-i18next"; +import { CameraLineGraph } from "@/components/graph/CameraGraph"; type FeatureMetricsProps = { lastUpdated: number; @@ -102,15 +103,26 @@ export default function FeatureMetrics({ {embeddingInferenceTimeSeries.map((series) => (
{series.name}
- + {series.name.endsWith("Speed") ? ( + + ) : ( + + )}
))}