Add face recognitions per second

This commit is contained in:
Nicolas Mowen 2025-03-28 15:40:19 -06:00
parent 68eb0d1fb4
commit 378f830152
5 changed files with 32 additions and 12 deletions

View File

@ -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."""

View File

@ -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:

View File

@ -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)

View File

@ -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:

View File

@ -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) => (
<div className="rounded-lg bg-background_alt p-2.5 md:rounded-2xl">
<div className="mb-5 capitalize">{series.name}</div>
<ThresholdBarGraph
key={series.name}
graphId={`${series.name}-inference`}
name={series.name}
unit="ms"
threshold={EmbeddingThreshold}
updateTimes={updateTimes}
data={[series]}
/>
{series.name.endsWith("Speed") ? (
<ThresholdBarGraph
key={series.name}
graphId={`${series.name}-inference`}
name={series.name}
unit="ms"
threshold={EmbeddingThreshold}
updateTimes={updateTimes}
data={[series]}
/>
) : (
<CameraLineGraph
key={series.name}
graphId={`${series.name}-fps`}
dataLabels={["Recognitions Per Second"]}
unit=""
updateTimes={updateTimes}
data={[series]}
/>
)}
</div>
))}
</>