diff --git a/frigate/app.py b/frigate/app.py index f89a0c12f..436a8b115 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -70,7 +70,6 @@ class FrigateApp: self.feature_metrics: dict[str, FeatureMetricsTypes] = {} self.ptz_metrics: dict[str, PTZMetricsTypes] = {} self.processes: dict[str, int] = {} - self.region_grids: dict[str, list[list[dict[str, int]]]] = {} def set_environment_vars(self) -> None: for key, value in self.config.environment_vars.items(): @@ -454,10 +453,6 @@ class FrigateApp: output_processor.start() logger.info(f"Output process started: {output_processor.pid}") - def init_historical_regions(self) -> None: - for camera in self.config.cameras.values(): - self.region_grids[camera.name] = get_camera_regions_grid(camera) - def start_camera_processors(self) -> None: for name, config in self.config.cameras.items(): if not self.config.cameras[name].enabled: @@ -477,7 +472,6 @@ class FrigateApp: self.detected_frames_queue, self.camera_metrics[name], self.ptz_metrics[name], - self.region_grids[name], ), ) camera_process.daemon = True @@ -618,7 +612,6 @@ class FrigateApp: self.start_detectors() self.start_video_output_processor() self.start_ptz_autotracker() - self.init_historical_regions() self.start_detected_frames_processor() self.start_camera_processors() self.start_camera_capture_processes() diff --git a/frigate/util/builtin.py b/frigate/util/builtin.py index 5cb01e1c5..e502d7a81 100644 --- a/frigate/util/builtin.py +++ b/frigate/util/builtin.py @@ -262,3 +262,10 @@ def find_by_key(dictionary, target_key): if result is not None: return result return None + + +def get_tomorrow_at_2() -> datetime.datetime: + tomorrow = datetime.datetime.now() + datetime.timedelta(days=1) + tomorrow.hour = 2 + return tomorrow + diff --git a/frigate/util/object.py b/frigate/util/object.py index d1736f662..b9b3b9628 100644 --- a/frigate/util/object.py +++ b/frigate/util/object.py @@ -8,7 +8,7 @@ import cv2 import numpy as np from peewee import DoesNotExist -from frigate.config import CameraConfig, ModelConfig +from frigate.config import DetectConfig, ModelConfig from frigate.detectors.detector_config import PixelFormatEnum from frigate.models import Event, Regions, Timeline from frigate.util.image import ( @@ -26,11 +26,11 @@ logger = logging.getLogger(__name__) GRID_SIZE = 8 -def get_camera_regions_grid(camera: CameraConfig) -> list[list[dict[str, any]]]: +def get_camera_regions_grid(name: str, detect: DetectConfig) -> list[list[dict[str, any]]]: """Build a grid of expected region sizes for a camera.""" # get grid from db if available try: - regions: Regions = Regions.select().where(Regions.camera == camera.name).get() + regions: Regions = Regions.select().where(Regions.camera == name).get() grid = regions.grid last_update = regions.last_update except DoesNotExist: @@ -45,7 +45,7 @@ def get_camera_regions_grid(camera: CameraConfig) -> list[list[dict[str, any]]]: # get events for timeline entries events = ( Event.select(Event.id) - .where(Event.camera == camera.name) + .where(Event.camera == name) .where(Event.false_positive != True) .where(Event.start_time > last_update) ) @@ -69,8 +69,8 @@ def get_camera_regions_grid(camera: CameraConfig) -> list[list[dict[str, any]]]: .dicts() ) - width = camera.detect.width - height = camera.detect.height + width = detect.width + height = detect.height grid_coef = 1.0 / GRID_SIZE @@ -119,7 +119,7 @@ def get_camera_regions_grid(camera: CameraConfig) -> list[list[dict[str, any]]]: # update db with new grid region = { - Regions.camera: camera.name, + Regions.camera: name, Regions.grid: grid, Regions.last_update: new_update, } diff --git a/frigate/video.py b/frigate/video.py index 93b7019e9..39eb0d8fb 100755 --- a/frigate/video.py +++ b/frigate/video.py @@ -22,7 +22,7 @@ from frigate.object_detection import RemoteObjectDetector from frigate.track import ObjectTracker from frigate.track.norfair_tracker import NorfairTracker from frigate.types import PTZMetricsTypes -from frigate.util.builtin import EventsPerSecond +from frigate.util.builtin import EventsPerSecond, get_tomorrow_at_2 from frigate.util.image import ( FrameManager, SharedMemoryFrameManager, @@ -32,6 +32,7 @@ from frigate.util.image import ( from frigate.util.object import ( box_inside, create_tensor_input, + get_camera_regions_grid, get_cluster_candidates, get_cluster_region, get_cluster_region_from_grid, @@ -382,7 +383,6 @@ def track_camera( detected_objects_queue, process_info, ptz_metrics, - region_grid, ): stop_event = mp.Event() @@ -441,7 +441,6 @@ def track_camera( motion_enabled, stop_event, ptz_metrics, - region_grid, ) logger.info(f"{name}: exiting subprocess") @@ -509,12 +508,13 @@ def process_frames( motion_enabled: mp.Value, stop_event, ptz_metrics: PTZMetricsTypes, - region_grid: list[list[dict[str, any]]], exit_on_empty: bool = False, ): fps = process_info["process_fps"] detection_fps = process_info["detection_fps"] current_frame_time = process_info["detection_frame"] + region_grid = None + next_region_update = None fps_tracker = EventsPerSecond() fps_tracker.start() @@ -524,6 +524,10 @@ def process_frames( region_min_size = get_min_region_size(model_config) while not stop_event.is_set(): + if not region_grid or datetime.datetime.now() > next_region_update: + region_grid = get_camera_regions_grid(camera_name, detect_config) + next_region_update = get_tomorrow_at_2() + try: if exit_on_empty: frame_time = frame_queue.get(False)