From 26d4f5f0ab2ae14e264f98816fb6451dd9da7397 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 18 Dec 2025 15:43:36 -0600 Subject: [PATCH] remove decorator and specifically suppress TFLite delegate creation messages --- frigate/data_processing/real_time/bird.py | 15 +++++----- .../real_time/custom_classification.py | 28 ++++++++++--------- frigate/detectors/plugins/cpu_tfl.py | 13 +++++---- frigate/embeddings/onnx/face_embedding.py | 15 +++++----- frigate/events/audio.py | 16 +++++------ 5 files changed, 46 insertions(+), 41 deletions(-) diff --git a/frigate/data_processing/real_time/bird.py b/frigate/data_processing/real_time/bird.py index e599ab0fb..7851c0997 100644 --- a/frigate/data_processing/real_time/bird.py +++ b/frigate/data_processing/real_time/bird.py @@ -13,7 +13,7 @@ from frigate.comms.event_metadata_updater import ( ) from frigate.config import FrigateConfig from frigate.const import MODEL_CACHE_DIR -from frigate.log import redirect_output_to_logger +from frigate.log import suppress_stderr_during from frigate.util.object import calculate_region from ..types import DataProcessorMetrics @@ -80,13 +80,14 @@ class BirdRealTimeProcessor(RealTimeProcessorApi): except Exception as e: logger.error(f"Failed to download {path}: {e}") - @redirect_output_to_logger(logger, logging.DEBUG) def __build_detector(self) -> None: - self.interpreter = Interpreter( - model_path=os.path.join(MODEL_CACHE_DIR, "bird/bird.tflite"), - num_threads=2, - ) - self.interpreter.allocate_tensors() + # Suppress TFLite delegate creation messages that bypass Python logging + with suppress_stderr_during("tflite_interpreter_init"): + self.interpreter = Interpreter( + model_path=os.path.join(MODEL_CACHE_DIR, "bird/bird.tflite"), + num_threads=2, + ) + self.interpreter.allocate_tensors() self.tensor_input_details = self.interpreter.get_input_details() self.tensor_output_details = self.interpreter.get_output_details() diff --git a/frigate/data_processing/real_time/custom_classification.py b/frigate/data_processing/real_time/custom_classification.py index ee72e145c..fac0ecc3d 100644 --- a/frigate/data_processing/real_time/custom_classification.py +++ b/frigate/data_processing/real_time/custom_classification.py @@ -21,7 +21,7 @@ from frigate.config.classification import ( ObjectClassificationType, ) from frigate.const import CLIPS_DIR, MODEL_CACHE_DIR -from frigate.log import redirect_output_to_logger +from frigate.log import suppress_stderr_during from frigate.types import TrackedObjectUpdateTypesEnum from frigate.util.builtin import EventsPerSecond, InferenceSpeed, load_labels from frigate.util.object import box_overlaps, calculate_region @@ -72,7 +72,6 @@ class CustomStateClassificationProcessor(RealTimeProcessorApi): self.last_run = datetime.datetime.now().timestamp() self.__build_detector() - @redirect_output_to_logger(logger, logging.DEBUG) def __build_detector(self) -> None: try: from tflite_runtime.interpreter import Interpreter @@ -89,11 +88,13 @@ class CustomStateClassificationProcessor(RealTimeProcessorApi): self.labelmap = {} return - self.interpreter = Interpreter( - model_path=model_path, - num_threads=2, - ) - self.interpreter.allocate_tensors() + # Suppress TFLite delegate creation messages that bypass Python logging + with suppress_stderr_during("tflite_interpreter_init"): + self.interpreter = Interpreter( + model_path=model_path, + num_threads=2, + ) + self.interpreter.allocate_tensors() self.tensor_input_details = self.interpreter.get_input_details() self.tensor_output_details = self.interpreter.get_output_details() self.labelmap = load_labels(labelmap_path, prefill=0) @@ -377,7 +378,6 @@ class CustomObjectClassificationProcessor(RealTimeProcessorApi): self.__build_detector() - @redirect_output_to_logger(logger, logging.DEBUG) def __build_detector(self) -> None: model_path = os.path.join(self.model_dir, "model.tflite") labelmap_path = os.path.join(self.model_dir, "labelmap.txt") @@ -389,11 +389,13 @@ class CustomObjectClassificationProcessor(RealTimeProcessorApi): self.labelmap = {} return - self.interpreter = Interpreter( - model_path=model_path, - num_threads=2, - ) - self.interpreter.allocate_tensors() + # Suppress TFLite delegate creation messages that bypass Python logging + with suppress_stderr_during("tflite_interpreter_init"): + self.interpreter = Interpreter( + model_path=model_path, + num_threads=2, + ) + self.interpreter.allocate_tensors() self.tensor_input_details = self.interpreter.get_input_details() self.tensor_output_details = self.interpreter.get_output_details() self.labelmap = load_labels(labelmap_path, prefill=0) diff --git a/frigate/detectors/plugins/cpu_tfl.py b/frigate/detectors/plugins/cpu_tfl.py index 37cc10777..00351f519 100644 --- a/frigate/detectors/plugins/cpu_tfl.py +++ b/frigate/detectors/plugins/cpu_tfl.py @@ -5,7 +5,7 @@ from typing_extensions import Literal from frigate.detectors.detection_api import DetectionApi from frigate.detectors.detector_config import BaseDetectorConfig -from frigate.log import redirect_output_to_logger +from frigate.log import suppress_stderr_during from ..detector_utils import tflite_detect_raw, tflite_init @@ -28,12 +28,13 @@ class CpuDetectorConfig(BaseDetectorConfig): class CpuTfl(DetectionApi): type_key = DETECTOR_KEY - @redirect_output_to_logger(logger, logging.DEBUG) def __init__(self, detector_config: CpuDetectorConfig): - interpreter = Interpreter( - model_path=detector_config.model.path, - num_threads=detector_config.num_threads or 3, - ) + # Suppress TFLite delegate creation messages that bypass Python logging + with suppress_stderr_during("tflite_interpreter_init"): + interpreter = Interpreter( + model_path=detector_config.model.path, + num_threads=detector_config.num_threads or 3, + ) tflite_init(self, interpreter) diff --git a/frigate/embeddings/onnx/face_embedding.py b/frigate/embeddings/onnx/face_embedding.py index e661f8d37..04d756897 100644 --- a/frigate/embeddings/onnx/face_embedding.py +++ b/frigate/embeddings/onnx/face_embedding.py @@ -8,7 +8,7 @@ import numpy as np from frigate.const import MODEL_CACHE_DIR from frigate.detectors.detection_runners import get_optimized_runner from frigate.embeddings.types import EnrichmentModelTypeEnum -from frigate.log import redirect_output_to_logger +from frigate.log import suppress_stderr_during from frigate.util.downloader import ModelDownloader from ...config import FaceRecognitionConfig @@ -57,17 +57,18 @@ class FaceNetEmbedding(BaseEmbedding): self._load_model_and_utils() logger.debug(f"models are already downloaded for {self.model_name}") - @redirect_output_to_logger(logger, logging.DEBUG) def _load_model_and_utils(self): if self.runner is None: if self.downloader: self.downloader.wait_for_download() - self.runner = Interpreter( - model_path=os.path.join(MODEL_CACHE_DIR, "facedet/facenet.tflite"), - num_threads=2, - ) - self.runner.allocate_tensors() + # Suppress TFLite delegate creation messages that bypass Python logging + with suppress_stderr_during("tflite_interpreter_init"): + self.runner = Interpreter( + model_path=os.path.join(MODEL_CACHE_DIR, "facedet/facenet.tflite"), + num_threads=2, + ) + self.runner.allocate_tensors() self.tensor_input_details = self.runner.get_input_details() self.tensor_output_details = self.runner.get_output_details() diff --git a/frigate/events/audio.py b/frigate/events/audio.py index 1aa227719..e88f2ae71 100644 --- a/frigate/events/audio.py +++ b/frigate/events/audio.py @@ -34,7 +34,7 @@ from frigate.data_processing.real_time.audio_transcription import ( AudioTranscriptionRealTimeProcessor, ) from frigate.ffmpeg_presets import parse_preset_input -from frigate.log import LogPipe, redirect_output_to_logger +from frigate.log import LogPipe, suppress_stderr_during from frigate.object_detection.base import load_labels from frigate.util.builtin import get_ffmpeg_arg_list from frigate.util.process import FrigateProcess @@ -367,17 +367,17 @@ class AudioEventMaintainer(threading.Thread): class AudioTfl: - @redirect_output_to_logger(logger, logging.DEBUG) def __init__(self, stop_event: threading.Event, num_threads=2): self.stop_event = stop_event self.num_threads = num_threads self.labels = load_labels("/audio-labelmap.txt", prefill=521) - self.interpreter = Interpreter( - model_path="/cpu_audio_model.tflite", - num_threads=self.num_threads, - ) - - self.interpreter.allocate_tensors() + # Suppress TFLite delegate creation messages that bypass Python logging + with suppress_stderr_during("tflite_interpreter_init"): + self.interpreter = Interpreter( + model_path="/cpu_audio_model.tflite", + num_threads=self.num_threads, + ) + self.interpreter.allocate_tensors() self.tensor_input_details = self.interpreter.get_input_details() self.tensor_output_details = self.interpreter.get_output_details()