Reuse constants (#16874)

This commit is contained in:
Martin Weinelt 2025-03-01 05:35:09 +01:00 committed by GitHub
parent 06d6e21de8
commit 458134de5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 55 additions and 30 deletions

View File

@ -31,6 +31,7 @@ from frigate.config import FrigateConfig
from frigate.const import ( from frigate.const import (
CACHE_DIR, CACHE_DIR,
CLIPS_DIR, CLIPS_DIR,
INSTALL_DIR,
MAX_SEGMENT_DURATION, MAX_SEGMENT_DURATION,
PREVIEW_FRAME_TYPE, PREVIEW_FRAME_TYPE,
RECORD_DIR, RECORD_DIR,
@ -155,7 +156,9 @@ def latest_frame(
frame_processor.get_current_frame_time(camera_name) + retry_interval frame_processor.get_current_frame_time(camera_name) + retry_interval
): ):
if request.app.camera_error_image is None: if request.app.camera_error_image is None:
error_image = glob.glob("/opt/frigate/frigate/images/camera-error.jpg") error_image = glob.glob(
os.path.join(INSTALL_DIR, "frigate/images/camera-error.jpg")
)
if len(error_image) > 0: if len(error_image) > 0:
request.app.camera_error_image = cv2.imread( request.app.camera_error_image = cv2.imread(
@ -550,7 +553,7 @@ def recording_clip(
) )
file_name = sanitize_filename(f"playlist_{camera_name}_{start_ts}-{end_ts}.txt") file_name = sanitize_filename(f"playlist_{camera_name}_{start_ts}-{end_ts}.txt")
file_path = f"/tmp/cache/{file_name}" file_path = os.path.join(CACHE_DIR, file_name)
with open(file_path, "w") as file: with open(file_path, "w") as file:
clip: Recordings clip: Recordings
for clip in recordings: for clip in recordings:

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from frigate.api.defs.tags import Tags from frigate.api.defs.tags import Tags
from frigate.const import CACHE_DIR, PREVIEW_FRAME_TYPE from frigate.const import BASE_DIR, CACHE_DIR, PREVIEW_FRAME_TYPE
from frigate.models import Previews from frigate.models import Previews
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -52,7 +52,7 @@ def preview_ts(camera_name: str, start_ts: float, end_ts: float):
clips.append( clips.append(
{ {
"camera": preview["camera"], "camera": preview["camera"],
"src": preview["path"].replace("/media/frigate", ""), "src": preview["path"].replace(BASE_DIR, ""),
"type": "video/mp4", "type": "video/mp4",
"start": preview["start_time"], "start": preview["start_time"],
"end": preview["end_time"], "end": preview["end_time"],

View File

@ -1,6 +1,7 @@
import os import os
import re import re
INSTALL_DIR = "/opt/frigate"
CONFIG_DIR = "/config" CONFIG_DIR = "/config"
DEFAULT_DB_PATH = f"{CONFIG_DIR}/frigate.db" DEFAULT_DB_PATH = f"{CONFIG_DIR}/frigate.db"
MODEL_CACHE_DIR = f"{CONFIG_DIR}/model_cache" MODEL_CACHE_DIR = f"{CONFIG_DIR}/model_cache"

View File

@ -76,14 +76,16 @@ class FaceRealTimeProcessor(RealTimeProcessorApi):
def __build_detector(self) -> None: def __build_detector(self) -> None:
self.face_detector = cv2.FaceDetectorYN.create( self.face_detector = cv2.FaceDetectorYN.create(
"/config/model_cache/facedet/facedet.onnx", os.path.join(MODEL_CACHE_DIR, "facedet/facedet.onnx"),
config="", config="",
input_size=(320, 320), input_size=(320, 320),
score_threshold=0.8, score_threshold=0.8,
nms_threshold=0.3, nms_threshold=0.3,
) )
self.landmark_detector = cv2.face.createFacemarkLBF() self.landmark_detector = cv2.face.createFacemarkLBF()
self.landmark_detector.loadModel("/config/model_cache/facedet/landmarkdet.yaml") self.landmark_detector.loadModel(
os.path.join(MODEL_CACHE_DIR, "facedet/landmarkdet.yaml")
)
def __build_classifier(self) -> None: def __build_classifier(self) -> None:
if not self.landmark_detector: if not self.landmark_detector:

View File

@ -9,7 +9,7 @@ import requests
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from pydantic.fields import PrivateAttr from pydantic.fields import PrivateAttr
from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP, MODEL_CACHE_DIR
from frigate.plus import PlusApi from frigate.plus import PlusApi
from frigate.util.builtin import generate_color_palette, load_labels from frigate.util.builtin import generate_color_palette, load_labels
@ -123,7 +123,7 @@ class ModelConfig(BaseModel):
return return
model_id = self.path[7:] model_id = self.path[7:]
self.path = f"/config/model_cache/{model_id}" self.path = os.path.join(MODEL_CACHE_DIR, model_id)
model_info_path = f"{self.path}.json" model_info_path = f"{self.path}.json"
# download the model if it doesn't exist # download the model if it doesn't exist

View File

@ -22,6 +22,7 @@ except ModuleNotFoundError:
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing_extensions import Literal from typing_extensions import Literal
from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig from frigate.detectors.detector_config import BaseDetectorConfig
@ -57,7 +58,7 @@ class HailoDetector(DetectionApi):
self.h8l_tensor_format = detector_config.model.input_tensor self.h8l_tensor_format = detector_config.model.input_tensor
self.h8l_pixel_format = detector_config.model.input_pixel_format self.h8l_pixel_format = detector_config.model.input_pixel_format
self.model_url = "https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8l/ssd_mobilenet_v1.hef" self.model_url = "https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8l/ssd_mobilenet_v1.hef"
self.cache_dir = "/config/model_cache/h8l_cache" self.cache_dir = os.path.join(MODEL_CACHE_DIR, "h8l_cache")
self.expected_model_filename = "ssd_mobilenet_v1.hef" self.expected_model_filename = "ssd_mobilenet_v1.hef"
output_type = "FLOAT32" output_type = "FLOAT32"

View File

@ -7,6 +7,7 @@ import openvino.properties as props
from pydantic import Field from pydantic import Field
from typing_extensions import Literal from typing_extensions import Literal
from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum
from frigate.util.model import post_process_yolov9 from frigate.util.model import post_process_yolov9
@ -41,8 +42,10 @@ class OvDetector(DetectionApi):
logger.error(f"OpenVino model file {detector_config.model.path} not found.") logger.error(f"OpenVino model file {detector_config.model.path} not found.")
raise FileNotFoundError raise FileNotFoundError
os.makedirs("/config/model_cache/openvino", exist_ok=True) os.makedirs(os.path.join(MODEL_CACHE_DIR, "openvino"), exist_ok=True)
self.ov_core.set_property({props.cache_dir: "/config/model_cache/openvino"}) self.ov_core.set_property(
{props.cache_dir: os.path.join(MODEL_CACHE_DIR, "openvino")}
)
self.interpreter = self.ov_core.compile_model( self.interpreter = self.ov_core.compile_model(
model=detector_config.model.path, device_name=detector_config.device model=detector_config.model.path, device_name=detector_config.device
) )

View File

@ -6,6 +6,7 @@ from typing import Literal
from pydantic import Field from pydantic import Field
from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum
@ -17,7 +18,7 @@ supported_socs = ["rk3562", "rk3566", "rk3568", "rk3576", "rk3588"]
supported_models = {ModelTypeEnum.yolonas: "^deci-fp16-yolonas_[sml]$"} supported_models = {ModelTypeEnum.yolonas: "^deci-fp16-yolonas_[sml]$"}
model_cache_dir = "/config/model_cache/rknn_cache/" model_cache_dir = os.path.join(MODEL_CACHE_DIR, "rknn_cache/")
class RknnDetectorConfig(BaseDetectorConfig): class RknnDetectorConfig(BaseDetectorConfig):

View File

@ -9,6 +9,7 @@ import numpy as np
from pydantic import Field from pydantic import Field
from typing_extensions import Literal from typing_extensions import Literal
from frigate.const import MODEL_CACHE_DIR
from frigate.detectors.detection_api import DetectionApi from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import ( from frigate.detectors.detector_config import (
BaseDetectorConfig, BaseDetectorConfig,
@ -116,7 +117,7 @@ class ROCmDetector(DetectionApi):
logger.info(f"AMD/ROCm: saving parsed model into {mxr_path}") logger.info(f"AMD/ROCm: saving parsed model into {mxr_path}")
os.makedirs("/config/model_cache/rocm", exist_ok=True) os.makedirs(os.path.join(MODEL_CACHE_DIR, "rocm"), exist_ok=True)
migraphx.save(self.model, mxr_path) migraphx.save(self.model, mxr_path)
logger.info("AMD/ROCm: model loaded") logger.info("AMD/ROCm: model loaded")

View File

@ -1,10 +1,12 @@
"""Convenience runner for onnx models.""" """Convenience runner for onnx models."""
import logging import logging
import os.path
from typing import Any from typing import Any
import onnxruntime as ort import onnxruntime as ort
from frigate.const import MODEL_CACHE_DIR
from frigate.util.model import get_ort_providers from frigate.util.model import get_ort_providers
try: try:
@ -32,7 +34,7 @@ class ONNXModelRunner:
self.type = "ov" self.type = "ov"
self.ov = ov.Core() self.ov = ov.Core()
self.ov.set_property( self.ov.set_property(
{ov.properties.cache_dir: "/config/model_cache/openvino"} {ov.properties.cache_dir: os.path.join(MODEL_CACHE_DIR, "openvino")}
) )
self.interpreter = self.ov.compile_model( self.interpreter = self.ov.compile_model(
model=model_path, device_name=device model=model_path, device_name=device

View File

@ -16,7 +16,7 @@ import numpy as np
from frigate.comms.config_updater import ConfigSubscriber from frigate.comms.config_updater import ConfigSubscriber
from frigate.config import BirdseyeModeEnum, FfmpegConfig, FrigateConfig from frigate.config import BirdseyeModeEnum, FfmpegConfig, FrigateConfig
from frigate.const import BASE_DIR, BIRDSEYE_PIPE from frigate.const import BASE_DIR, BIRDSEYE_PIPE, INSTALL_DIR
from frigate.util.image import ( from frigate.util.image import (
SharedMemoryFrameManager, SharedMemoryFrameManager,
copy_yuv_to_position, copy_yuv_to_position,
@ -297,7 +297,9 @@ class BirdsEyeFrameManager:
birdseye_logo = cv2.imread(custom_logo_files[0], cv2.IMREAD_UNCHANGED) birdseye_logo = cv2.imread(custom_logo_files[0], cv2.IMREAD_UNCHANGED)
if birdseye_logo is None: if birdseye_logo is None:
logo_files = glob.glob("/opt/frigate/frigate/images/birdseye.png") logo_files = glob.glob(
os.path.join(INSTALL_DIR, "frigate/images/birdseye.png")
)
if len(logo_files) > 0: if len(logo_files) > 0:
birdseye_logo = cv2.imread(logo_files[0], cv2.IMREAD_UNCHANGED) birdseye_logo = cv2.imread(logo_files[0], cv2.IMREAD_UNCHANGED)

View File

@ -10,6 +10,7 @@ from pydantic import Json
from frigate.api.fastapi_app import create_fastapi_app from frigate.api.fastapi_app import create_fastapi_app
from frigate.config import FrigateConfig from frigate.config import FrigateConfig
from frigate.const import BASE_DIR, CACHE_DIR
from frigate.models import Event, Recordings, ReviewSegment from frigate.models import Event, Recordings, ReviewSegment
from frigate.review.types import SeverityEnum from frigate.review.types import SeverityEnum
from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS
@ -73,19 +74,19 @@ class BaseTestHttp(unittest.TestCase):
"total": 67.1, "total": 67.1,
"used": 16.6, "used": 16.6,
}, },
"/media/frigate/clips": { os.path.join(BASE_DIR, "clips"): {
"free": 42429.9, "free": 42429.9,
"mount_type": "ext4", "mount_type": "ext4",
"total": 244529.7, "total": 244529.7,
"used": 189607.0, "used": 189607.0,
}, },
"/media/frigate/recordings": { os.path.join(BASE_DIR, "recordings"): {
"free": 0.2, "free": 0.2,
"mount_type": "ext4", "mount_type": "ext4",
"total": 8.0, "total": 8.0,
"used": 7.8, "used": 7.8,
}, },
"/tmp/cache": { CACHE_DIR: {
"free": 976.8, "free": 976.8,
"mount_type": "tmpfs", "mount_type": "tmpfs",
"total": 1000.0, "total": 1000.0,

View File

@ -854,9 +854,9 @@ class TestConfig(unittest.TestCase):
assert frigate_config.model.merged_labelmap[0] == "person" assert frigate_config.model.merged_labelmap[0] == "person"
def test_plus_labelmap(self): def test_plus_labelmap(self):
with open("/config/model_cache/test", "w") as f: with open(os.path.join(MODEL_CACHE_DIR, "test"), "w") as f:
json.dump(self.plus_model_info, f) json.dump(self.plus_model_info, f)
with open("/config/model_cache/test.json", "w") as f: with open(os.path.join(MODEL_CACHE_DIR, "test.json"), "w") as f:
json.dump(self.plus_model_info, f) json.dump(self.plus_model_info, f)
config = { config = {

View File

@ -11,6 +11,7 @@ from playhouse.sqliteq import SqliteQueueDatabase
from frigate.api.fastapi_app import create_fastapi_app from frigate.api.fastapi_app import create_fastapi_app
from frigate.config import FrigateConfig from frigate.config import FrigateConfig
from frigate.const import BASE_DIR, CACHE_DIR
from frigate.models import Event, Recordings, Timeline from frigate.models import Event, Recordings, Timeline
from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS
@ -74,19 +75,19 @@ class TestHttp(unittest.TestCase):
"total": 67.1, "total": 67.1,
"used": 16.6, "used": 16.6,
}, },
"/media/frigate/clips": { os.path.join(BASE_DIR, "clips"): {
"free": 42429.9, "free": 42429.9,
"mount_type": "ext4", "mount_type": "ext4",
"total": 244529.7, "total": 244529.7,
"used": 189607.0, "used": 189607.0,
}, },
"/media/frigate/recordings": { os.path.join(BASE_DIR, "recordings"): {
"free": 0.2, "free": 0.2,
"mount_type": "ext4", "mount_type": "ext4",
"total": 8.0, "total": 8.0,
"used": 7.8, "used": 7.8,
}, },
"/tmp/cache": { CACHE_DIR: {
"free": 976.8, "free": 976.8,
"mount_type": "tmpfs", "mount_type": "tmpfs",
"total": 1000.0, "total": 1000.0,

View File

@ -14,7 +14,7 @@ from frigate.util.services import get_video_properties
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
CURRENT_CONFIG_VERSION = "0.16-0" CURRENT_CONFIG_VERSION = "0.16-0"
DEFAULT_CONFIG_FILE = "/config/config.yml" DEFAULT_CONFIG_FILE = os.path.join(CONFIG_DIR, "config.yml")
def find_config_file() -> str: def find_config_file() -> str:

View File

@ -7,6 +7,8 @@ import cv2
import numpy as np import numpy as np
import onnxruntime as ort import onnxruntime as ort
from frigate.const import MODEL_CACHE_DIR
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -105,7 +107,8 @@ def get_ort_providers(
# so it is not enabled by default # so it is not enabled by default
if device == "Tensorrt": if device == "Tensorrt":
os.makedirs( os.makedirs(
"/config/model_cache/tensorrt/ort/trt-engines", exist_ok=True os.path.join(MODEL_CACHE_DIR, "tensorrt/ort/trt-engines"),
exist_ok=True,
) )
device_id = 0 if not device.isdigit() else int(device) device_id = 0 if not device.isdigit() else int(device)
providers.append(provider) providers.append(provider)
@ -116,19 +119,23 @@ def get_ort_providers(
and os.environ.get("USE_FP_16", "True") != "False", and os.environ.get("USE_FP_16", "True") != "False",
"trt_timing_cache_enable": True, "trt_timing_cache_enable": True,
"trt_engine_cache_enable": True, "trt_engine_cache_enable": True,
"trt_timing_cache_path": "/config/model_cache/tensorrt/ort", "trt_timing_cache_path": os.path.join(
"trt_engine_cache_path": "/config/model_cache/tensorrt/ort/trt-engines", MODEL_CACHE_DIR, "tensorrt/ort"
),
"trt_engine_cache_path": os.path.join(
MODEL_CACHE_DIR, "tensorrt/ort/trt-engines"
),
} }
) )
else: else:
continue continue
elif provider == "OpenVINOExecutionProvider": elif provider == "OpenVINOExecutionProvider":
os.makedirs("/config/model_cache/openvino/ort", exist_ok=True) os.makedirs(os.path.join(MODEL_CACHE_DIR, "openvino/ort"), exist_ok=True)
providers.append(provider) providers.append(provider)
options.append( options.append(
{ {
"arena_extend_strategy": "kSameAsRequested", "arena_extend_strategy": "kSameAsRequested",
"cache_dir": "/config/model_cache/openvino/ort", "cache_dir": os.path.join(MODEL_CACHE_DIR, "openvino/ort"),
"device_type": device, "device_type": device,
} }
) )