seed detector inference speed from the first inference

The average started at 0 so idle detectors read 0, but that made every detector's speed climb from 0 for its first couple dozen inferences after a start. Detectors now use the same InferenceSpeed helper as enrichments, so the first inference seeds the average and idle detectors still read 0.
This commit is contained in:
Josh Hawkins
2026-11-02 08:47:57 -06:00
parent 52e40b06e2
commit 5163308a8a
2 changed files with 19 additions and 6 deletions
+5 -5
View File
@@ -24,7 +24,7 @@ from frigate.detectors.detector_config import (
InputDTypeEnum, InputDTypeEnum,
ModelConfig, ModelConfig,
) )
from frigate.util.builtin import EventsPerSecond, load_labels from frigate.util.builtin import EventsPerSecond, InferenceSpeed, load_labels
from frigate.util.image import SharedMemoryFrameManager, UntrackedSharedMemory from frigate.util.image import SharedMemoryFrameManager, UntrackedSharedMemory
from frigate.util.process import FrigateProcess from frigate.util.process import FrigateProcess
@@ -129,7 +129,7 @@ class DetectorRunner(FrigateProcess):
super().__init__(stop_event, PROCESS_PRIORITY_HIGH, name=name, daemon=True) super().__init__(stop_event, PROCESS_PRIORITY_HIGH, name=name, daemon=True)
self.detection_queue = detection_queue self.detection_queue = detection_queue
self.cameras = cameras self.cameras = cameras
self.avg_speed = avg_speed self.avg_speed = InferenceSpeed(avg_speed)
self.start_time = start_time self.start_time = start_time
self.config = config self.config = config
self.detector_config = detector_config self.detector_config = detector_config
@@ -182,7 +182,7 @@ class DetectorRunner(FrigateProcess):
detector_publisher.publish(connection_id) detector_publisher.publish(connection_id)
self.start_time.value = 0.0 self.start_time.value = 0.0
self.avg_speed.value = (self.avg_speed.value * 9 + duration) / 10 self.avg_speed.update(duration)
detector_publisher.stop() detector_publisher.stop()
logger.info("Exited detection process...") logger.info("Exited detection process...")
@@ -203,7 +203,7 @@ class AsyncDetectorRunner(FrigateProcess):
super().__init__(stop_event, PROCESS_PRIORITY_HIGH, name=name, daemon=True) super().__init__(stop_event, PROCESS_PRIORITY_HIGH, name=name, daemon=True)
self.detection_queue = detection_queue self.detection_queue = detection_queue
self.cameras = cameras self.cameras = cameras
self.avg_speed = avg_speed self.avg_speed = InferenceSpeed(avg_speed)
self.start_time = start_time self.start_time = start_time
self.config = config self.config = config
self.detector_config = detector_config self.detector_config = detector_config
@@ -272,7 +272,7 @@ class AsyncDetectorRunner(FrigateProcess):
self._publisher.publish(connection_id) self._publisher.publish(connection_id)
# update timers # update timers
self.avg_speed.value = (self.avg_speed.value * 9 + duration) / 10 self.avg_speed.update(duration)
self.start_time.value = 0.0 self.start_time.value = 0.0
def run(self) -> None: def run(self) -> None:
+14 -1
View File
@@ -1,9 +1,10 @@
"""Tests for frigate.util.builtin helpers.""" """Tests for frigate.util.builtin helpers."""
import unittest import unittest
from multiprocessing import Value
from unittest.mock import patch from unittest.mock import patch
from frigate.util.builtin import EventsPerSecond from frigate.util.builtin import EventsPerSecond, InferenceSpeed
class TestEventsPerSecond(unittest.TestCase): class TestEventsPerSecond(unittest.TestCase):
@@ -62,5 +63,17 @@ class TestEventsPerSecond(unittest.TestCase):
self.assertAlmostEqual(eps.eps(), 20.0) self.assertAlmostEqual(eps.eps(), 20.0)
class TestInferenceSpeed(unittest.TestCase):
def test_first_inference_seeds_the_average(self) -> None:
metric = Value("d", 0.0)
speed = InferenceSpeed(metric)
speed.update(0.02)
self.assertEqual(metric.value, 0.02)
speed.update(0.12)
self.assertAlmostEqual(metric.value, 0.03)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()