mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-07 11:45:24 +03:00
Fix new grid requests
This commit is contained in:
parent
f2a538d6c4
commit
1955aa1c04
@ -163,6 +163,7 @@ class FrigateApp:
|
|||||||
# issue https://github.com/python/typeshed/issues/8799
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
# from mypy 0.981 onwards
|
# from mypy 0.981 onwards
|
||||||
"frame_queue": mp.Queue(maxsize=2),
|
"frame_queue": mp.Queue(maxsize=2),
|
||||||
|
"region_grid_queue": mp.Queue(maxsize=1),
|
||||||
"capture_process": None,
|
"capture_process": None,
|
||||||
"process": None,
|
"process": None,
|
||||||
"audio_rms": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
"audio_rms": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
@ -477,6 +478,7 @@ class FrigateApp:
|
|||||||
self.detection_queue,
|
self.detection_queue,
|
||||||
self.detection_out_events[name],
|
self.detection_out_events[name],
|
||||||
self.detected_frames_queue,
|
self.detected_frames_queue,
|
||||||
|
self.inter_process_queue,
|
||||||
self.camera_metrics[name],
|
self.camera_metrics[name],
|
||||||
self.ptz_metrics[name],
|
self.ptz_metrics[name],
|
||||||
self.region_grids[name],
|
self.region_grids[name],
|
||||||
|
|||||||
@ -5,10 +5,11 @@ from abc import ABC, abstractmethod
|
|||||||
from typing import Any, Callable
|
from typing import Any, Callable
|
||||||
|
|
||||||
from frigate.config import FrigateConfig
|
from frigate.config import FrigateConfig
|
||||||
from frigate.const import INSERT_MANY_RECORDINGS
|
from frigate.const import INSERT_MANY_RECORDINGS, REQUEST_REGION_GRID
|
||||||
from frigate.models import Recordings
|
from frigate.models import Recordings
|
||||||
from frigate.ptz.onvif import OnvifCommandEnum, OnvifController
|
from frigate.ptz.onvif import OnvifCommandEnum, OnvifController
|
||||||
from frigate.types import CameraMetricsTypes, FeatureMetricsTypes, PTZMetricsTypes
|
from frigate.types import CameraMetricsTypes, FeatureMetricsTypes, PTZMetricsTypes
|
||||||
|
from frigate.util.object import get_camera_regions_grid
|
||||||
from frigate.util.services import restart_frigate
|
from frigate.util.services import restart_frigate
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -90,6 +91,11 @@ class Dispatcher:
|
|||||||
restart_frigate()
|
restart_frigate()
|
||||||
elif topic == INSERT_MANY_RECORDINGS:
|
elif topic == INSERT_MANY_RECORDINGS:
|
||||||
Recordings.insert_many(payload).execute()
|
Recordings.insert_many(payload).execute()
|
||||||
|
elif topic == REQUEST_REGION_GRID:
|
||||||
|
camera = payload
|
||||||
|
self.camera_metrics[camera]["region_grid_queue"].put(
|
||||||
|
get_camera_regions_grid(camera, self.config.cameras[camera].detect)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.publish(topic, payload, retain=False)
|
self.publish(topic, payload, retain=False)
|
||||||
|
|
||||||
|
|||||||
@ -51,3 +51,4 @@ MAX_PLAYLIST_SECONDS = 7200 # support 2 hour segments for a single playlist to
|
|||||||
# Internal Comms Topics
|
# Internal Comms Topics
|
||||||
|
|
||||||
INSERT_MANY_RECORDINGS = "insert_many_recordings"
|
INSERT_MANY_RECORDINGS = "insert_many_recordings"
|
||||||
|
REQUEST_REGION_GRID = "request_region_grid"
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import numpy as np
|
|||||||
import pytz
|
import pytz
|
||||||
import yaml
|
import yaml
|
||||||
from ruamel.yaml import YAML
|
from ruamel.yaml import YAML
|
||||||
|
from tzlocal import get_localzone
|
||||||
|
|
||||||
from frigate.const import REGEX_HTTP_CAMERA_USER_PASS, REGEX_RTSP_CAMERA_USER_PASS
|
from frigate.const import REGEX_HTTP_CAMERA_USER_PASS, REGEX_RTSP_CAMERA_USER_PASS
|
||||||
|
|
||||||
@ -265,5 +266,7 @@ def find_by_key(dictionary, target_key):
|
|||||||
|
|
||||||
|
|
||||||
def get_tomorrow_at_2() -> datetime.datetime:
|
def get_tomorrow_at_2() -> datetime.datetime:
|
||||||
tomorrow = datetime.datetime.now() + datetime.timedelta(days=1)
|
tomorrow = datetime.datetime.now(get_localzone()) + datetime.timedelta(days=1)
|
||||||
return tomorrow.replace(hour=2, minute=0, second=0)
|
return tomorrow.replace(hour=2, minute=0, second=0).astimezone(
|
||||||
|
datetime.timezone.utc
|
||||||
|
)
|
||||||
|
|||||||
@ -447,7 +447,11 @@ def get_consolidated_object_detections(detected_object_groups):
|
|||||||
return consolidated_detections
|
return consolidated_detections
|
||||||
|
|
||||||
|
|
||||||
def get_startup_regions(frame_shape: tuple[int], region_min_size: int, region_grid: list[list[dict[str, any]]]) -> list[list[int]]:
|
def get_startup_regions(
|
||||||
|
frame_shape: tuple[int],
|
||||||
|
region_min_size: int,
|
||||||
|
region_grid: list[list[dict[str, any]]],
|
||||||
|
) -> list[list[int]]:
|
||||||
"""Get a list of regions to run on startup."""
|
"""Get a list of regions to run on startup."""
|
||||||
# return 8 most popular regions for the camera
|
# return 8 most popular regions for the camera
|
||||||
all_cells = np.concatenate(region_grid).flat
|
all_cells = np.concatenate(region_grid).flat
|
||||||
@ -462,14 +466,16 @@ def get_startup_regions(frame_shape: tuple[int], region_min_size: int, region_gr
|
|||||||
x = frame_shape[1] / GRID_SIZE * (0.5 + cell["x"])
|
x = frame_shape[1] / GRID_SIZE * (0.5 + cell["x"])
|
||||||
y = frame_shape[0] / GRID_SIZE * (0.5 + cell["y"])
|
y = frame_shape[0] / GRID_SIZE * (0.5 + cell["y"])
|
||||||
size = cell["mean"] * frame_shape[1]
|
size = cell["mean"] * frame_shape[1]
|
||||||
regions.append(calculate_region(
|
regions.append(
|
||||||
frame_shape,
|
calculate_region(
|
||||||
x - size / 2,
|
frame_shape,
|
||||||
y - size / 2,
|
x - size / 2,
|
||||||
x + size / 2,
|
y - size / 2,
|
||||||
y + size / 2,
|
x + size / 2,
|
||||||
region_min_size,
|
y + size / 2,
|
||||||
multiplier=1,
|
region_min_size,
|
||||||
))
|
multiplier=1,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return regions
|
return regions
|
||||||
|
|||||||
@ -14,7 +14,12 @@ import numpy as np
|
|||||||
from setproctitle import setproctitle
|
from setproctitle import setproctitle
|
||||||
|
|
||||||
from frigate.config import CameraConfig, DetectConfig, ModelConfig
|
from frigate.config import CameraConfig, DetectConfig, ModelConfig
|
||||||
from frigate.const import ALL_ATTRIBUTE_LABELS, ATTRIBUTE_LABEL_MAP, CACHE_DIR
|
from frigate.const import (
|
||||||
|
ALL_ATTRIBUTE_LABELS,
|
||||||
|
ATTRIBUTE_LABEL_MAP,
|
||||||
|
CACHE_DIR,
|
||||||
|
REQUEST_REGION_GRID,
|
||||||
|
)
|
||||||
from frigate.log import LogPipe
|
from frigate.log import LogPipe
|
||||||
from frigate.motion import MotionDetector
|
from frigate.motion import MotionDetector
|
||||||
from frigate.motion.improved_motion import ImprovedMotionDetector
|
from frigate.motion.improved_motion import ImprovedMotionDetector
|
||||||
@ -380,6 +385,7 @@ def track_camera(
|
|||||||
detection_queue,
|
detection_queue,
|
||||||
result_connection,
|
result_connection,
|
||||||
detected_objects_queue,
|
detected_objects_queue,
|
||||||
|
inter_process_queue,
|
||||||
process_info,
|
process_info,
|
||||||
ptz_metrics,
|
ptz_metrics,
|
||||||
region_grid,
|
region_grid,
|
||||||
@ -397,6 +403,7 @@ def track_camera(
|
|||||||
listen()
|
listen()
|
||||||
|
|
||||||
frame_queue = process_info["frame_queue"]
|
frame_queue = process_info["frame_queue"]
|
||||||
|
region_grid_queue = process_info["region_grid_queue"]
|
||||||
detection_enabled = process_info["detection_enabled"]
|
detection_enabled = process_info["detection_enabled"]
|
||||||
motion_enabled = process_info["motion_enabled"]
|
motion_enabled = process_info["motion_enabled"]
|
||||||
improve_contrast_enabled = process_info["improve_contrast_enabled"]
|
improve_contrast_enabled = process_info["improve_contrast_enabled"]
|
||||||
@ -425,7 +432,9 @@ def track_camera(
|
|||||||
|
|
||||||
process_frames(
|
process_frames(
|
||||||
name,
|
name,
|
||||||
|
inter_process_queue,
|
||||||
frame_queue,
|
frame_queue,
|
||||||
|
region_grid_queue,
|
||||||
frame_shape,
|
frame_shape,
|
||||||
model_config,
|
model_config,
|
||||||
config.detect,
|
config.detect,
|
||||||
@ -493,7 +502,9 @@ def detect(
|
|||||||
|
|
||||||
def process_frames(
|
def process_frames(
|
||||||
camera_name: str,
|
camera_name: str,
|
||||||
|
inter_process_queue: mp.Queue,
|
||||||
frame_queue: mp.Queue,
|
frame_queue: mp.Queue,
|
||||||
|
region_grid_queue: mp.Queue,
|
||||||
frame_shape,
|
frame_shape,
|
||||||
model_config: ModelConfig,
|
model_config: ModelConfig,
|
||||||
detect_config: DetectConfig,
|
detect_config: DetectConfig,
|
||||||
@ -525,8 +536,17 @@ 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 datetime.datetime.now() > next_region_update:
|
if (
|
||||||
# TODO signal update
|
datetime.datetime.now().astimezone(datetime.timezone.utc)
|
||||||
|
> next_region_update
|
||||||
|
):
|
||||||
|
inter_process_queue.put((REQUEST_REGION_GRID, camera_name))
|
||||||
|
|
||||||
|
try:
|
||||||
|
region_grid = region_grid_queue.get(True, 10)
|
||||||
|
except queue.Empty:
|
||||||
|
logger.error(f"Unable to get updated region grid for {camera_name}")
|
||||||
|
|
||||||
next_region_update = get_tomorrow_at_2()
|
next_region_update = get_tomorrow_at_2()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -627,7 +647,9 @@ def process_frames(
|
|||||||
|
|
||||||
# if starting up, get the next startup scan region
|
# if starting up, get the next startup scan region
|
||||||
if startup_scan:
|
if startup_scan:
|
||||||
for region in get_startup_regions(frame_shape, region_min_size, region_grid):
|
for region in get_startup_regions(
|
||||||
|
frame_shape, region_min_size, region_grid
|
||||||
|
):
|
||||||
regions.append(region)
|
regions.append(region)
|
||||||
startup_scan = False
|
startup_scan = False
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user