Update the region daily at 2

This commit is contained in:
Nick Mowen 2023-10-17 07:52:37 -06:00
parent f66d93a996
commit b07f93a2cb
4 changed files with 22 additions and 18 deletions

View File

@ -70,7 +70,6 @@ class FrigateApp:
self.feature_metrics: dict[str, FeatureMetricsTypes] = {} self.feature_metrics: dict[str, FeatureMetricsTypes] = {}
self.ptz_metrics: dict[str, PTZMetricsTypes] = {} self.ptz_metrics: dict[str, PTZMetricsTypes] = {}
self.processes: dict[str, int] = {} self.processes: dict[str, int] = {}
self.region_grids: dict[str, list[list[dict[str, int]]]] = {}
def set_environment_vars(self) -> None: def set_environment_vars(self) -> None:
for key, value in self.config.environment_vars.items(): for key, value in self.config.environment_vars.items():
@ -454,10 +453,6 @@ class FrigateApp:
output_processor.start() output_processor.start()
logger.info(f"Output process started: {output_processor.pid}") 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: def start_camera_processors(self) -> None:
for name, config in self.config.cameras.items(): for name, config in self.config.cameras.items():
if not self.config.cameras[name].enabled: if not self.config.cameras[name].enabled:
@ -477,7 +472,6 @@ class FrigateApp:
self.detected_frames_queue, self.detected_frames_queue,
self.camera_metrics[name], self.camera_metrics[name],
self.ptz_metrics[name], self.ptz_metrics[name],
self.region_grids[name],
), ),
) )
camera_process.daemon = True camera_process.daemon = True
@ -618,7 +612,6 @@ class FrigateApp:
self.start_detectors() self.start_detectors()
self.start_video_output_processor() self.start_video_output_processor()
self.start_ptz_autotracker() self.start_ptz_autotracker()
self.init_historical_regions()
self.start_detected_frames_processor() self.start_detected_frames_processor()
self.start_camera_processors() self.start_camera_processors()
self.start_camera_capture_processes() self.start_camera_capture_processes()

View File

@ -262,3 +262,10 @@ def find_by_key(dictionary, target_key):
if result is not None: if result is not None:
return result return result
return None return None
def get_tomorrow_at_2() -> datetime.datetime:
tomorrow = datetime.datetime.now() + datetime.timedelta(days=1)
tomorrow.hour = 2
return tomorrow

View File

@ -8,7 +8,7 @@ import cv2
import numpy as np import numpy as np
from peewee import DoesNotExist 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.detectors.detector_config import PixelFormatEnum
from frigate.models import Event, Regions, Timeline from frigate.models import Event, Regions, Timeline
from frigate.util.image import ( from frigate.util.image import (
@ -26,11 +26,11 @@ logger = logging.getLogger(__name__)
GRID_SIZE = 8 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.""" """Build a grid of expected region sizes for a camera."""
# get grid from db if available # get grid from db if available
try: try:
regions: Regions = Regions.select().where(Regions.camera == camera.name).get() regions: Regions = Regions.select().where(Regions.camera == name).get()
grid = regions.grid grid = regions.grid
last_update = regions.last_update last_update = regions.last_update
except DoesNotExist: except DoesNotExist:
@ -45,7 +45,7 @@ def get_camera_regions_grid(camera: CameraConfig) -> list[list[dict[str, any]]]:
# get events for timeline entries # get events for timeline entries
events = ( events = (
Event.select(Event.id) Event.select(Event.id)
.where(Event.camera == camera.name) .where(Event.camera == name)
.where(Event.false_positive != True) .where(Event.false_positive != True)
.where(Event.start_time > last_update) .where(Event.start_time > last_update)
) )
@ -69,8 +69,8 @@ def get_camera_regions_grid(camera: CameraConfig) -> list[list[dict[str, any]]]:
.dicts() .dicts()
) )
width = camera.detect.width width = detect.width
height = camera.detect.height height = detect.height
grid_coef = 1.0 / GRID_SIZE 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 # update db with new grid
region = { region = {
Regions.camera: camera.name, Regions.camera: name,
Regions.grid: grid, Regions.grid: grid,
Regions.last_update: new_update, Regions.last_update: new_update,
} }

View File

@ -22,7 +22,7 @@ from frigate.object_detection import RemoteObjectDetector
from frigate.track import ObjectTracker from frigate.track import ObjectTracker
from frigate.track.norfair_tracker import NorfairTracker from frigate.track.norfair_tracker import NorfairTracker
from frigate.types import PTZMetricsTypes 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 ( from frigate.util.image import (
FrameManager, FrameManager,
SharedMemoryFrameManager, SharedMemoryFrameManager,
@ -32,6 +32,7 @@ from frigate.util.image import (
from frigate.util.object import ( from frigate.util.object import (
box_inside, box_inside,
create_tensor_input, create_tensor_input,
get_camera_regions_grid,
get_cluster_candidates, get_cluster_candidates,
get_cluster_region, get_cluster_region,
get_cluster_region_from_grid, get_cluster_region_from_grid,
@ -382,7 +383,6 @@ def track_camera(
detected_objects_queue, detected_objects_queue,
process_info, process_info,
ptz_metrics, ptz_metrics,
region_grid,
): ):
stop_event = mp.Event() stop_event = mp.Event()
@ -441,7 +441,6 @@ def track_camera(
motion_enabled, motion_enabled,
stop_event, stop_event,
ptz_metrics, ptz_metrics,
region_grid,
) )
logger.info(f"{name}: exiting subprocess") logger.info(f"{name}: exiting subprocess")
@ -509,12 +508,13 @@ def process_frames(
motion_enabled: mp.Value, motion_enabled: mp.Value,
stop_event, stop_event,
ptz_metrics: PTZMetricsTypes, ptz_metrics: PTZMetricsTypes,
region_grid: list[list[dict[str, any]]],
exit_on_empty: bool = False, exit_on_empty: bool = False,
): ):
fps = process_info["process_fps"] fps = process_info["process_fps"]
detection_fps = process_info["detection_fps"] detection_fps = process_info["detection_fps"]
current_frame_time = process_info["detection_frame"] current_frame_time = process_info["detection_frame"]
region_grid = None
next_region_update = None
fps_tracker = EventsPerSecond() fps_tracker = EventsPerSecond()
fps_tracker.start() fps_tracker.start()
@ -524,6 +524,10 @@ def process_frames(
region_min_size = get_min_region_size(model_config) region_min_size = get_min_region_size(model_config)
while not stop_event.is_set(): 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: try:
if exit_on_empty: if exit_on_empty:
frame_time = frame_queue.get(False) frame_time = frame_queue.get(False)