diff --git a/AGENTS.md b/AGENTS.md index d078c2fdb..41d4b6460 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -38,6 +38,7 @@ When reviewing code, do NOT comment on: - **Type Checking**: Use type hints consistently - **Testing**: unittest framework - use `python3 -u -m unittest` to run tests - **Language**: American English for all code, comments, and documentation +- **Punctuation**: Do not use em dashes in documentation, comments, or strings; reword with standard punctuation (commas, colons, parentheses, or separate sentences) ### Logging Standards diff --git a/docs/data/object_detectors_models.yaml b/docs/data/object_detectors_models.yaml index 84bfef243..a4458c309 100644 --- a/docs/data/object_detectors_models.yaml +++ b/docs/data/object_detectors_models.yaml @@ -20,11 +20,14 @@ edgeTPU: | Field | Value | | ---------------------------------------- | ----------------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | - | **Object detection model input width** | `320` (should match the imgsize of the model) | - | **Object detection model input height** | `320` (should match the imgsize of the model) | | **Custom object detector model path** | `/config/model_cache/yolov9-s-relu6-best_320_int8_edgetpu.tflite` | | **Label map for custom object detector** | `/config/labels-coco17.txt` | + | **Object detection model input width** | `320` (should match the imgsize of the model) | + | **Object detection model input height** | `320` (should match the imgsize of the model) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | + | **Model Input Tensor Shape** | `nhwc` (Frigate's default value) | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: coral: @@ -49,13 +52,13 @@ hailo8l: | Field | Value | | ---------------------------------------- | ----------------------- | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | - | **Model Input Tensor Shape** | `nhwc` | | **Model Input Pixel Color Format** | `rgb` | + | **Model Input Tensor Shape** | `nhwc` | | **Model Input D Type** | `int` | | **Object Detection Model Type** | `yolo-generic` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | The detector automatically selects the default model based on your hardware. Optionally, specify a local model path or URL to override. yaml: |- @@ -96,8 +99,9 @@ hailo8l: | --------------------------------------- | ------ | | **Object detection model input width** | `300` | | **Object detection model input height** | `300` | - | **Model Input Tensor Shape** | `nhwc` | | **Model Input Pixel Color Format** | `rgb` | + | **Model Input Tensor Shape** | `nhwc` | + | **Model Input D Type** | `int` (Frigate's default value) | | **Object Detection Model Type** | `ssd` | Specify the local model path or URL for SSD MobileNet v1. @@ -153,13 +157,14 @@ openvino: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Custom object detector model path** | `/config/model_cache/yolo.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match the imgsize set during model export) | | **Object detection model input height** | `320` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/yolo.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: ov: @@ -172,7 +177,7 @@ openvino: height: 320 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float - path: /config/model_cache/yolo.onnx + path: /config/model_cache/yolo.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: ssd label: SSDLite MobileNet v2 @@ -183,12 +188,14 @@ openvino: | Field | Value | | ---------------------------------------- | ------------------------------------------ | - | **Object detection model input width** | `300` | - | **Object detection model input height** | `300` | - | **Model Input Tensor Shape** | `nhwc` | - | **Model Input Pixel Color Format** | `bgr` | | **Custom object detector model path** | `/openvino-model/ssdlite_mobilenet_v2.xml` | | **Label map for custom object detector** | `/openvino-model/coco_91cl_bkgr.txt` | + | **Object detection model input width** | `300` | + | **Object detection model input height** | `300` | + | **Model Input Pixel Color Format** | `bgr` | + | **Model Input Tensor Shape** | `nhwc` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `ssd` (Frigate's default value) | yaml: |- detectors: ov: @@ -219,13 +226,14 @@ openvino: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Custom object detector model path** | `/config/model_cache/yolo.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match the imgsize set during model export) | | **Object detection model input height** | `320` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/yolo.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: ov: @@ -238,7 +246,7 @@ openvino: height: 320 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float - path: /config/model_cache/yolo.onnx + path: /config/model_cache/yolo.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: yolonas label: YOLO-NAS @@ -258,13 +266,14 @@ openvino: | Field | Value | | ---------------------------------------- | ------------------------------------------------- | - | **Object Detection Model Type** | `yolonas` | - | **Object detection model input width** | `320` (should match whatever was set in notebook) | - | **Object detection model input height** | `320` (should match whatever was set in notebook) | - | **Model Input Tensor Shape** | `nchw` | - | **Model Input Pixel Color Format** | `bgr` | | **Custom object detector model path** | `/config/yolo_nas_s.onnx` | | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object detection model input width** | `320` (should match whatever was set in notebook) | + | **Object detection model input height** | `320` (should match whatever was set in notebook) | + | **Model Input Pixel Color Format** | `bgr` | + | **Model Input Tensor Shape** | `nchw` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `yolonas` | yaml: |- detectors: ov: @@ -288,8 +297,11 @@ openvino: | Field | Value | | ------------------------------------- | -------------------------------- | + | **Custom object detector model path** | `/config/yolox.onnx` (use the filename you generated above) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | + | **Model Input Tensor Shape** | `nhwc` (Frigate's default value) | + | **Model Input D Type** | `int` (Frigate's default value) | | **Object Detection Model Type** | `yolox` | - | **Custom object detector model path** | path to your YOLOX ONNX model | yaml: |- detectors: ov: @@ -298,7 +310,7 @@ openvino: model: model_type: yolox - path: /config/model_cache/yolox.onnx + path: /config/model_cache/yolox.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: rfdetr label: RF-DETR @@ -325,12 +337,13 @@ openvino: | Field | Value | | --------------------------------------- | --------------------------------- | - | **Object Detection Model Type** | `rfdetr` | + | **Custom object detector model path** | `/config/model_cache/rfdetr.onnx` (use the filename you generated above) | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/rfdetr.onnx` | + | **Object Detection Model Type** | `rfdetr` | yaml: |- detectors: ov: @@ -343,7 +356,7 @@ openvino: height: 320 input_tensor: nchw input_dtype: float - path: /config/model_cache/rfdetr.onnx + path: /config/model_cache/rfdetr.onnx # use the filename you generated above - key: dfine label: D-FINE / DEIMv2 recommended: false @@ -421,13 +434,14 @@ openvino: | Field | Value | | ---------------------------------------- | ---------------------------------- | - | **Object Detection Model Type** | `dfine` | + | **Custom object detector model path** | `/config/model_cache/dfine-s.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `640` | | **Object detection model input height** | `640` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/dfine-s.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `dfine` | yaml: |- detectors: ov: @@ -440,7 +454,7 @@ openvino: height: 640 input_tensor: nchw input_dtype: float - path: /config/model_cache/dfine-s.onnx + path: /config/model_cache/dfine-s.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt appleSilicon: title: Apple Silicon @@ -476,13 +490,14 @@ appleSilicon: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Custom object detector model path** | `/config/model_cache/yolo.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match the imgsize set during model export) | | **Object detection model input height** | `320` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/yolo.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: apple-silicon: @@ -495,7 +510,7 @@ appleSilicon: height: 320 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float - path: /config/model_cache/yolo.onnx + path: /config/model_cache/yolo.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: yolo-legacy label: YOLO (v3, v4, v7) @@ -514,13 +529,14 @@ appleSilicon: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Custom object detector model path** | `/config/model_cache/yolo.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match the imgsize set during model export) | | **Object detection model input height** | `320` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/yolo.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: apple-silicon: @@ -533,7 +549,7 @@ appleSilicon: height: 320 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float - path: /config/model_cache/yolo.onnx + path: /config/model_cache/yolo.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt onnx: title: ONNX @@ -569,13 +585,14 @@ onnx: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Custom object detector model path** | `/config/model_cache/yolo.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match the imgsize set during model export) | | **Object detection model input height** | `320` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/yolo.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: onnx: @@ -587,7 +604,7 @@ onnx: height: 320 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float - path: /config/model_cache/yolo.onnx + path: /config/model_cache/yolo.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: rfdetr label: RF-DETR @@ -614,12 +631,13 @@ onnx: | Field | Value | | --------------------------------------- | --------------------------------- | - | **Object Detection Model Type** | `rfdetr` | + | **Custom object detector model path** | `/config/model_cache/rfdetr.onnx` (use the filename you generated above) | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/rfdetr.onnx` | + | **Object Detection Model Type** | `rfdetr` | yaml: |- detectors: onnx: @@ -631,7 +649,7 @@ onnx: height: 320 input_tensor: nchw input_dtype: float - path: /config/model_cache/rfdetr.onnx + path: /config/model_cache/rfdetr.onnx # use the filename you generated above - key: yolonas label: YOLO-NAS recommended: false @@ -650,13 +668,14 @@ onnx: | Field | Value | | ---------------------------------------- | ------------------------------------------------- | - | **Object Detection Model Type** | `yolonas` | + | **Custom object detector model path** | `/config/yolo_nas_s.onnx` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match whatever was set in notebook) | | **Object detection model input height** | `320` (should match whatever was set in notebook) | | **Model Input Pixel Color Format** | `bgr` | | **Model Input Tensor Shape** | `nchw` | - | **Custom object detector model path** | `/config/yolo_nas_s.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `yolonas` | yaml: |- detectors: onnx: @@ -679,13 +698,14 @@ onnx: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolox` | + | **Custom object detector model path** | `/config/model_cache/yolox_tiny.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `416` (should match the imgsize set during model export) | | **Object detection model input height** | `416` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float_denorm` | - | **Custom object detector model path** | `/config/model_cache/yolox_tiny.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolox` | yaml: |- detectors: onnx: @@ -697,7 +717,7 @@ onnx: height: 416 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float_denorm - path: /config/model_cache/yolox_tiny.onnx + path: /config/model_cache/yolox_tiny.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: dfine label: D-FINE / DEIMv2 @@ -776,13 +796,14 @@ onnx: | Field | Value | | ---------------------------------------- | ------------------------------------------- | - | **Object Detection Model Type** | `dfine` | + | **Custom object detector model path** | `/config/model_cache/dfine_m_obj2coco.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `640` | | **Object detection model input height** | `640` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/dfine_m_obj2coco.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `dfine` | yaml: |- detectors: onnx: @@ -794,7 +815,7 @@ onnx: height: 640 input_tensor: nchw input_dtype: float - path: /config/model_cache/dfine_m_obj2coco.onnx + path: /config/model_cache/dfine_m_obj2coco.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt - key: yolo-legacy label: YOLO (v3, v4, v7) @@ -813,13 +834,14 @@ onnx: | Field | Value | | ---------------------------------------- | -------------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Custom object detector model path** | `/config/model_cache/yolo.onnx` (use the filename you generated above) | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (should match the imgsize set during model export) | | **Object detection model input height** | `320` (should match the imgsize set during model export) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Custom object detector model path** | `/config/model_cache/yolo.onnx` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: onnx: @@ -831,7 +853,7 @@ onnx: height: 320 # <--- should match the imgsize set during model export input_tensor: nchw input_dtype: float - path: /config/model_cache/yolo.onnx + path: /config/model_cache/yolo.onnx # use the filename you generated above labelmap_path: /labelmap/coco-80.txt cpu: title: CPU @@ -893,12 +915,13 @@ memryx: | Field | Value | | ---------------------------------------- | ------------------------------------------------- | - | **Object Detection Model Type** | `yolonas` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (can be set to `640` for higher resolution) | | **Object detection model input height** | `320` (can be set to `640` for higher resolution) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolonas` | yaml: |- detectors: memx0: @@ -929,12 +952,13 @@ memryx: | Field | Value | | ---------------------------------------- | ------------------------------------------------- | - | **Object Detection Model Type** | `yolo-generic` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` (can be set to `640` for higher resolution) | | **Object detection model input height** | `320` (can be set to `640` for higher resolution) | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: memx0: @@ -964,12 +988,13 @@ memryx: | Field | Value | | ---------------------------------------- | ----------------------- | - | **Object Detection Model Type** | `yolox` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `640` | | **Object detection model input height** | `640` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float_denorm` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `yolox` | yaml: |- detectors: memx0: @@ -999,12 +1024,13 @@ memryx: | Field | Value | | ---------------------------------------- | ----------------------- | - | **Object Detection Model Type** | `ssd` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nchw` | | **Model Input D Type** | `float` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Object Detection Model Type** | `ssd` | yaml: |- detectors: memx0: @@ -1047,12 +1073,14 @@ tensorrt: | Field | Value | | ---------------------------------------- | ------------------------------------------------------------ | - | **Custom object detector model path** | `/config/model_cache/tensorrt/yolov7-320.trt` | + | **Custom object detector model path** | `/config/model_cache/tensorrt/yolov7-320.trt` (use the filename you generated above) | | **Label map for custom object detector** | `/labelmap/coco-80.txt` | - | **Model Input Tensor Shape** | `nchw` | - | **Model Input Pixel Color Format** | `rgb` | | **Object detection model input width** | `320` (MUST match the chosen model, e.g., yolov7-320 -> 320) | | **Object detection model input height** | `320` (MUST match the chosen model, e.g., yolov7-320 -> 320) | + | **Model Input Pixel Color Format** | `rgb` | + | **Model Input Tensor Shape** | `nchw` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `ssd` (Frigate's default value) | yaml: |- detectors: tensorrt: @@ -1060,7 +1088,7 @@ tensorrt: device: 0 #This is the default, select the first GPU model: - path: /config/model_cache/tensorrt/yolov7-320.trt + path: /config/model_cache/tensorrt/yolov7-320.trt # use the filename you generated above labelmap_path: /labelmap/coco-80.txt input_tensor: nchw input_pixel_format: rgb @@ -1079,10 +1107,13 @@ synaptics: | Field | Value | | ---------------------------------------- | ---------------------------- | | **Custom object detector model path** | `/synaptics/mobilenet.synap` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `224` | | **Object detection model input height** | `224` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nhwc` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `ssd` (Frigate's default value) | yaml: |- detectors: # required synap_npu: # required @@ -1110,11 +1141,13 @@ rknn: | Field | Value | | ---------------------------------------- | -------------------------------------------------- | | **Custom object detector model path** | `frigate-fp16-yolov9-t` (or other yolov9 variants) | - | **Object Detection Model Type** | `yolo-generic` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nhwc` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- model: # required # name of model (will be automatically downloaded) or path to your own .rknn model file @@ -1146,12 +1179,13 @@ rknn: | Field | Value | | ---------------------------------------- | ----------------------------------------------------------------------- | | **Custom object detector model path** | `deci-fp16-yolonas_s` (or `deci-fp16-yolonas_m`, `deci-fp16-yolonas_l`) | - | **Object Detection Model Type** | `yolonas` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | | **Model Input Pixel Color Format** | `bgr` | | **Model Input Tensor Shape** | `nhwc` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `yolonas` | yaml: |- model: # required # name of model (will be automatically downloaded) or path to your own .rknn model file @@ -1180,11 +1214,13 @@ rknn: | Field | Value | | ---------------------------------------- | ---------------------------------------------- | | **Custom object detector model path** | `rock-i8-yolox_nano` (or other yolox variants) | - | **Object Detection Model Type** | `yolox` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `416` | | **Object detection model input height** | `416` | + | **Model Input Pixel Color Format** | `rgb` (Frigate's default value) | | **Model Input Tensor Shape** | `nhwc` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Model Input D Type** | `int` (Frigate's default value) | + | **Object Detection Model Type** | `yolox` | yaml: |- model: # required # name of model (will be automatically downloaded) or path to your own .rknn model file @@ -1213,12 +1249,13 @@ axengine: | Field | Value | | ---------------------------------------- | ----------------------- | | **Custom object detector model path** | `frigate-yolov9-tiny` | - | **Object Detection Model Type** | `yolo-generic` | + | **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Object detection model input width** | `320` | | **Object detection model input height** | `320` | - | **Model Input D Type** | `int` | | **Model Input Pixel Color Format** | `bgr` | - | **Label map for custom object detector** | `/labelmap/coco-80.txt` | + | **Model Input Tensor Shape** | `nhwc` (Frigate's default value) | + | **Model Input D Type** | `int` | + | **Object Detection Model Type** | `yolo-generic` | yaml: |- detectors: axengine: diff --git a/docs/docs/configuration/advanced/system.md b/docs/docs/configuration/advanced/system.md index 71ef01234..3766d2bee 100644 --- a/docs/docs/configuration/advanced/system.md +++ b/docs/docs/configuration/advanced/system.md @@ -237,7 +237,7 @@ Frigate exposes a few networking options. IPv6 and the listen ports are set in t ### Enabling IPv6 -By default Frigate listens on IPv4 only. To also listen on IPv6 — on port `5000`, and on `8971` when TLS is configured — enable it in the `networking` configuration. +By default Frigate listens on IPv4 only. To also listen on IPv6 (on port `5000`, and on `8971` when TLS is configured), enable it in the `networking` configuration. diff --git a/docs/docs/configuration/audio_detectors.md b/docs/docs/configuration/audio_detectors.md index e5a03e5b8..c5a300cda 100644 --- a/docs/docs/configuration/audio_detectors.md +++ b/docs/docs/configuration/audio_detectors.md @@ -174,13 +174,13 @@ Some labels cover several related sounds: `yell` is triggered by shouting, yelli :::tip -Frequently-heard labels like `speech` can generate a lot of events, and each event could save a snapshot and recording based on your configuration, so start with a focused set — the defaults (`bark`, `fire_alarm`, `speech`, `yell`) plus a few of the safety labels above cover most needs — and expand from there. See the [full audio labelmap](https://github.com/blakeblackshear/frigate/blob/dev/audio-labelmap.txt) or the Frigate UI for every available type. +Frequently-heard labels like `speech` can generate a lot of events, and each event could save a snapshot and recording based on your configuration, so start with a focused set and expand from there. The defaults (`bark`, `fire_alarm`, `speech`, `yell`) plus a few of the safety labels above cover most needs. See the [full audio labelmap](https://github.com/blakeblackshear/frigate/blob/dev/audio-labelmap.txt) or the Frigate UI for every available type. ::: ### Audio Transcription -Frigate supports fully local audio transcription using either `sherpa-onnx` or OpenAI's open-source Whisper models via `faster-whisper`. The goal of this feature is to support Semantic Search for `speech` audio events. Frigate is not intended to act as a continuous, fully-automatic speech transcription service — automatically transcribing all speech (or queuing many audio events for transcription) requires substantial CPU (or GPU) resources and is impractical on most systems. For this reason, transcriptions for events are initiated manually from the UI or the API rather than being run continuously in the background. +Frigate supports fully local audio transcription using either `sherpa-onnx` or OpenAI's open-source Whisper models via `faster-whisper`. The goal of this feature is to support Semantic Search for `speech` audio events. Frigate is not intended to act as a continuous, fully-automatic speech transcription service. Automatically transcribing all speech (or queuing many audio events for transcription) requires substantial CPU (or GPU) resources and is impractical on most systems. For this reason, transcriptions for events are initiated manually from the UI or the API rather than being run continuously in the background. :::info diff --git a/docs/docs/configuration/authentication.md b/docs/docs/configuration/authentication.md index 0d7339e01..a56539877 100644 --- a/docs/docs/configuration/authentication.md +++ b/docs/docs/configuration/authentication.md @@ -91,7 +91,7 @@ auth: ## Session Length -The default session length for user authentication in Frigate is 24 hours. This setting determines how long a user's authenticated session remains active before a token refresh is required — otherwise, the user will need to log in again. +The default session length for user authentication in Frigate is 24 hours. This setting determines how long a user's authenticated session remains active before a token refresh is required. Otherwise, the user will need to log in again. While the default provides a balance of security and convenience, you can customize this duration to suit your specific security requirements and user experience preferences. The session length is configured in seconds. diff --git a/docs/docs/configuration/camera_specific.md b/docs/docs/configuration/camera_specific.md index ebe0f858c..b3945cf82 100644 --- a/docs/docs/configuration/camera_specific.md +++ b/docs/docs/configuration/camera_specific.md @@ -165,7 +165,7 @@ If available, recommended settings are: #### Setup via the Add Camera Wizard -The Add Camera Wizard is the recommended way to add a standard Reolink camera. Before starting, make sure HTTP is enabled in the camera's advanced network settings — the wizard uses the camera's HTTP API to determine its resolution and choose the recommended stream type from the table above. +The Add Camera Wizard is the recommended way to add a standard Reolink camera. Before starting, make sure HTTP is enabled in the camera's advanced network settings. The wizard uses the camera's HTTP API to determine its resolution and choose the recommended stream type from the table above. 1. Click **Add Camera** in . 2. Choose **Manual selection** as the stream detection method and select **Reolink** as the camera brand. diff --git a/docs/docs/configuration/config.md b/docs/docs/configuration/config.md index 44b67e4f4..edb6d0cd7 100644 --- a/docs/docs/configuration/config.md +++ b/docs/docs/configuration/config.md @@ -7,7 +7,7 @@ import ConfigTabs from "@site/src/components/ConfigTabs"; import TabItem from "@theme/TabItem"; import NavPath from "@site/src/components/NavPath"; -Frigate can be configured through the **Settings UI** or by editing the YAML configuration file directly. The Settings UI is the recommended approach — it provides validation and a guided experience for all configuration options. +Frigate can be configured through the **Settings UI** or by editing the YAML configuration file directly. The Settings UI is the recommended approach. It provides validation and a guided experience for all configuration options. ## Using the Settings UI @@ -17,10 +17,10 @@ The Settings UI groups every configuration option into sections that are listed Settings are organized into two scopes: -- **Global configuration** — values under apply to every camera by default. This is where you set the baseline behavior for object detection, recording, snapshots, motion, and so on. -- **Camera configuration** — values under apply to a single camera. Use the camera selector button at the top of these pages to choose which camera you are editing. +- **Global configuration**: values under apply to every camera by default. This is where you set the baseline behavior for object detection, recording, snapshots, motion, and so on. +- **Camera configuration**: values under apply to a single camera. Use the camera selector button at the top of these pages to choose which camera you are editing. -When a camera-level section is left untouched, the camera simply inherits the global values. Changing a value on a camera page **overrides** the global value for that camera only — the global setting and every other camera are unaffected. This mirrors how the YAML works, where a value set under `cameras.` takes precedence over the same value set at the top level. +When a camera-level section is left untouched, the camera simply inherits the global values. Changing a value on a camera page **overrides** the global value for that camera only: the global setting and every other camera are unaffected. This mirrors how the YAML works, where a value set under `cameras.` takes precedence over the same value set at the top level. To undo an override and go back to inheriting from the parent scope, use the reset button at the bottom of the section: @@ -36,7 +36,7 @@ Edits are not applied until you save them. As soon as you change a value, the UI - The edited section shows a **Modified** badge, and the changed fields are highlighted. - A **You have unsaved changes** notice appears above the section's **Save** and **Undo** buttons. **Save** commits just that section; **Undo** discards its pending edits. -Because pending changes can span multiple sections — and multiple cameras — the header provides a **Save All** button that writes every pending change at once. Next to it, **Review pending changes** opens a summary that lists each pending edit with its scope (Global or a specific camera), the affected field, and the new value, so you can confirm exactly what will be written before committing. **Undo All** discards every pending change across all sections. +Because pending changes can span multiple sections (and multiple cameras), the header provides a **Save All** button that writes every pending change at once. Next to it, **Review pending changes** opens a summary that lists each pending edit with its scope (Global or a specific camera), the affected field, and the new value, so you can confirm exactly what will be written before committing. **Undo All** discards every pending change across all sections. ### Restart-required indicators @@ -48,17 +48,17 @@ When you save a change that touches one of these fields, Frigate confirms the sa When you are working under , small colored dots can appear next to a section's name in the menu. They give you an at-a-glance summary of that section's state for the selected camera: -- **Blue dot** — this section **overrides the global configuration**. One or more values in the section have been set specifically for this camera and differ from the global defaults. -- **Profile-colored dot** — when you are viewing a [camera profile](./profiles.md), a dot in that profile's assigned color indicates the section is **overridden by that profile**. Each profile is given its own distinct color so you can tell at a glance which sections it changes. -- **Amber dot** — this section has **unsaved changes**. It appears alongside the **Modified** badge whenever you have pending edits in the section that haven't been saved yet. +- **Blue dot**: this section **overrides the global configuration**. One or more values in the section have been set specifically for this camera and differ from the global defaults. +- **Profile-colored dot**: when you are viewing a [camera profile](./profiles.md), a dot in that profile's assigned color indicates the section is **overridden by that profile**. Each profile is given its own distinct color so you can tell at a glance which sections it changes. +- **Amber dot**: this section has **unsaved changes**. It appears alongside the **Modified** badge whenever you have pending edits in the section that haven't been saved yet. -Hover over any dot to see a tooltip describing what it means. Open a section to see exactly which fields are overridden — the section header indicates how many fields differ from the global (or base) configuration. +Hover over any dot to see a tooltip describing what it means. Open a section to see exactly which fields are overridden: the section header indicates how many fields differ from the global (or base) configuration. ## Configuration File Location For users who prefer to edit the YAML configuration file directly, it is recommended to start with a minimal configuration and add to it as described in [the getting started guide](../guides/getting_started.md). -- **Home Assistant App:** `/addon_configs//config.yml` — see [directory list](#accessing-app-config-dir) +- **Home Assistant App:** `/addon_configs//config.yml` (see [directory list](#accessing-app-config-dir)) - **All other installations:** Map to `/config/config.yml` inside the container It can be named `config.yml` or `config.yaml`, but if both files exist `config.yml` will be preferred and `config.yaml` will be ignored. diff --git a/docs/docs/configuration/custom_classification/object_classification.md b/docs/docs/configuration/custom_classification/object_classification.md index 05b110bda..2bfe2c31c 100644 --- a/docs/docs/configuration/custom_classification/object_classification.md +++ b/docs/docs/configuration/custom_classification/object_classification.md @@ -137,7 +137,7 @@ If examples for some of your classes do not appear in the grid, you can continue :::tip Diversity matters far more than volume -Selecting dozens of nearly identical images is one of the fastest ways to degrade model performance. MobileNetV2 can overfit quickly when trained on homogeneous data — the model learns what _that exact moment_ looked like rather than what actually defines the class. **This is why Frigate does not implement bulk training in the UI.** +Selecting dozens of nearly identical images is one of the fastest ways to degrade model performance. MobileNetV2 can overfit quickly when trained on homogeneous data. The model learns what _that exact moment_ looked like rather than what actually defines the class. **This is why Frigate does not implement bulk training in the UI.** For more detail, see [Frigate Tip: Best Practices for Training Face and Custom Classification Models](https://github.com/blakeblackshear/frigate/discussions/21374). @@ -155,7 +155,7 @@ For more detail, see [Frigate Tip: Best Practices for Training Face and Custom C :::tip `none` works differently from named classes -Named classes work best with visually uniform examples — every Buddy photo should look like Buddy. The `none` class needs the opposite: visual diversity across sizes, framings, and qualities, because at inference it has to absorb everything that isn't one of your named classes. Don't apply the same "only keep large, well-framed images" rule to `none` that you would to a named class. Mix in small crops, partial views, and false positives deliberately - otherwise the model has no signal for "small/ambiguous thing = not one of my known classes" and will force those crops into a named class by default. +Named classes work best with visually uniform examples. Every Buddy photo should look like Buddy. The `none` class needs the opposite: visual diversity across sizes, framings, and qualities, because at inference it has to absorb everything that isn't one of your named classes. Don't apply the same "only keep large, well-framed images" rule to `none` that you would to a named class. Mix in small crops, partial views, and false positives deliberately - otherwise the model has no signal for "small/ambiguous thing = not one of my known classes" and will force those crops into a named class by default. ::: diff --git a/docs/docs/configuration/custom_classification/state_classification.md b/docs/docs/configuration/custom_classification/state_classification.md index 8b32857d0..7d479946b 100644 --- a/docs/docs/configuration/custom_classification/state_classification.md +++ b/docs/docs/configuration/custom_classification/state_classification.md @@ -103,7 +103,7 @@ Once some images are assigned, training will begin automatically. :::tip Diversity matters far more than volume -Selecting dozens of nearly identical images is one of the fastest ways to degrade model performance. MobileNetV2 can overfit quickly when trained on homogeneous data — the model learns what _that exact moment_ looked like rather than what actually defines the state. This often leads to models that work perfectly under the original conditions but become unstable when day turns to night, weather changes, or seasonal lighting shifts. **This is why Frigate does not implement bulk training in the UI.** +Selecting dozens of nearly identical images is one of the fastest ways to degrade model performance. MobileNetV2 can overfit quickly when trained on homogeneous data. The model learns what _that exact moment_ looked like rather than what actually defines the state. This often leads to models that work perfectly under the original conditions but become unstable when day turns to night, weather changes, or seasonal lighting shifts. **This is why Frigate does not implement bulk training in the UI.** For more detail, see [Frigate Tip: Best Practices for Training Face and Custom Classification Models](https://github.com/blakeblackshear/frigate/discussions/21374). diff --git a/docs/docs/configuration/face_recognition.md b/docs/docs/configuration/face_recognition.md index 55c620dca..2039374bf 100644 --- a/docs/docs/configuration/face_recognition.md +++ b/docs/docs/configuration/face_recognition.md @@ -241,7 +241,7 @@ This can happen for a few different reasons, but this is usually an indicator th Review your face collections and remove most of the unclear or low-quality images. Then, use the **Reprocess** button on each face in the **Train** tab to evaluate how the changes affect recognition scores. -Avoid training on images that already score highly, as this can lead to over-fitting. Instead, focus on relatively clear images that score lower - ideally with different lighting, angles, and conditions—to help the model generalize more effectively. +Avoid training on images that already score highly, as this can lead to over-fitting. Instead, focus on relatively clear images that score lower (ideally with different lighting, angles, and conditions) to help the model generalize more effectively. ### Frigate misidentified a face. Can I tell it that a face is "not" a specific person? diff --git a/docs/docs/configuration/ffmpeg_presets.md b/docs/docs/configuration/ffmpeg_presets.md index d330aab06..5c1d0fc3b 100644 --- a/docs/docs/configuration/ffmpeg_presets.md +++ b/docs/docs/configuration/ffmpeg_presets.md @@ -9,11 +9,11 @@ import NavPath from "@site/src/components/NavPath"; Frigate ships with a set of FFmpeg presets to keep your configuration short and readable. Each preset expands to a longer list of FFmpeg arguments at runtime. You can see exactly what every preset expands to in [this file](https://github.com/blakeblackshear/frigate/blob/master/frigate/ffmpeg_presets.py). -In the config file you reference a preset by its name (for example, `preset-vaapi`). In the UI, the same preset is shown with a friendly label (for example, **VAAPI (Intel/AMD GPU)**). Both refer to the same thing — the tables below list the config name alongside the label you'll see in the UI. +In the config file you reference a preset by its name (for example, `preset-vaapi`). In the UI, the same preset is shown with a friendly label (for example, **VAAPI (Intel/AMD GPU)**). Both refer to the same thing: the tables below list the config name alongside the label you'll see in the UI. ### Hwaccel (Hardware Acceleration) Presets {#hwaccel-presets} -Hardware acceleration arguments tell FFmpeg to decode your camera's video stream on a GPU or integrated graphics chip instead of the CPU, which dramatically lowers CPU usage. Using a preset is highly recommended. Beyond replacing a long list of arguments, each preset also tells Frigate what hardware is available so it can offload additional work to the GPU — for example, encoding the Birdseye restream or scaling a stream whose resolution differs from the camera's native size. +Hardware acceleration arguments tell FFmpeg to decode your camera's video stream on a GPU or integrated graphics chip instead of the CPU, which dramatically lowers CPU usage. Using a preset is highly recommended. Beyond replacing a long list of arguments, each preset also tells Frigate what hardware is available so it can offload additional work to the GPU, for example, encoding the Birdseye restream or scaling a stream whose resolution differs from the camera's native size. See [the hardware acceleration docs](/configuration/hardware_acceleration_video.md) for details on setting up hardware acceleration for your GPU / iGPU, then select the preset that matches your hardware. @@ -53,7 +53,7 @@ cameras: ### Input Args Presets -Input arguments are passed to FFmpeg before your camera source and control how Frigate connects to and reads the stream — the transport protocol, timeouts, reconnection behavior, and how the stream is probed. The right input args ensure a reliable connection and maximum compatibility for each type of stream. +Input arguments are passed to FFmpeg before your camera source and control how Frigate connects to and reads the stream: the transport protocol, timeouts, reconnection behavior, and how the stream is probed. The right input args ensure a reliable connection and maximum compatibility for each type of stream. See [the camera-specific docs](/configuration/camera_specific.md) for more on non-standard cameras and recommendations for using them in Frigate. @@ -96,7 +96,7 @@ cameras: ### Output Args Presets -Output arguments are passed to FFmpeg after your camera source and control how recordings are written — which codecs are used and whether audio and video are copied as-is or re-encoded. The right output args ensure consistent, playable recordings for each type of stream. +Output arguments are passed to FFmpeg after your camera source and control how recordings are written: which codecs are used and whether audio and video are copied as-is or re-encoded. The right output args ensure consistent, playable recordings for each type of stream. | Preset (config) | UI Label | Usage | Notes | | -------------------------------- | ------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/docs/docs/configuration/genai/config.md b/docs/docs/configuration/genai/config.md index 60415ed1a..738eb5db3 100644 --- a/docs/docs/configuration/genai/config.md +++ b/docs/docs/configuration/genai/config.md @@ -55,7 +55,7 @@ Frigate manages reasoning per task automatically: - **Description tasks** (object descriptions, review descriptions, review summaries) are synthesis-only and benefit from concise, direct output, so Frigate disables thinking for these calls when the model exposes a per-request toggle. - **Chat** lets you toggle thinking on or off from the composer when the configured model supports it. -You can use a pure instruct, hybrid, or thinking-capable model with Frigate — no extra configuration is required to disable thinking for descriptions. +You can use a pure instruct, hybrid, or thinking-capable model with Frigate. No extra configuration is required to disable thinking for descriptions. ### llama.cpp diff --git a/docs/docs/configuration/go2rtc.md b/docs/docs/configuration/go2rtc.md index 08cc944a6..1f0c08fe0 100644 --- a/docs/docs/configuration/go2rtc.md +++ b/docs/docs/configuration/go2rtc.md @@ -15,7 +15,7 @@ Frigate uses the bundled go2rtc to power a number of key features: :::tip[Most users no longer need to configure go2rtc by hand] -The **camera setup wizard** is the recommended way to add cameras. Click **Add Camera** in , and the wizard probes your camera and writes its configuration for you — including the go2rtc restream and the live stream mapping — so go2rtc is set up automatically. +The **camera setup wizard** is the recommended way to add cameras. Click **Add Camera** in , and the wizard probes your camera and writes its configuration for you, including the go2rtc restream and the live stream mapping, so go2rtc is set up automatically. This guide is mainly useful if you are **upgrading from an older version and have existing cameras that don't yet use go2rtc**, or if you want to fine-tune a stream by hand (for example, to transcode a codec your browser can't play). The [go2rtc troubleshooting guide](/troubleshooting/go2rtc) applies regardless of how your cameras were added. @@ -23,7 +23,7 @@ This guide is mainly useful if you are **upgrading from an older version and hav ## Adding a go2rtc stream manually -If you added your cameras with the wizard, go2rtc is already configured — you can skip straight to [troubleshooting](/troubleshooting/go2rtc). The steps below are for upgrading users with existing cameras that aren't using go2rtc yet, or for anyone who prefers to configure a stream by hand. +If you added your cameras with the wizard, go2rtc is already configured. You can skip straight to [troubleshooting](/troubleshooting/go2rtc). The steps below are for upgrading users with existing cameras that aren't using go2rtc yet, or for anyone who prefers to configure a stream by hand. Configure go2rtc to connect to your camera by adding the stream you want to use for live view. Avoid changing any other parts of your config at this step. Note that go2rtc supports [many different stream types](https://github.com/AlexxIT/go2rtc/tree/v1.9.13#module-streams), not just rtsp. @@ -63,7 +63,7 @@ After adding this to the config, restart Frigate and try to watch the live strea ## Troubleshooting -If your stream won't play, has no audio, uses excessive CPU, or otherwise misbehaves, see the dedicated [go2rtc troubleshooting guide](/troubleshooting/go2rtc). It walks through how to isolate where the problem is and covers the most common issues — unsupported codecs, H.265/HEVC, audio, WebRTC and two-way talk, hardware-accelerated transcoding with FFmpeg 8, and camera-specific quirks. +If your stream won't play, has no audio, uses excessive CPU, or otherwise misbehaves, see the dedicated [go2rtc troubleshooting guide](/troubleshooting/go2rtc). It walks through how to isolate where the problem is and covers the most common issues: unsupported codecs, H.265/HEVC, audio, WebRTC and two-way talk, hardware-accelerated transcoding with FFmpeg 8, and camera-specific quirks. ## Homekit Configuration diff --git a/docs/docs/configuration/license_plate_recognition.md b/docs/docs/configuration/license_plate_recognition.md index 02c0e75a0..acd81c633 100644 --- a/docs/docs/configuration/license_plate_recognition.md +++ b/docs/docs/configuration/license_plate_recognition.md @@ -283,8 +283,8 @@ Navigate to Wife's Car** | `ABC-1234`, `ABC-I234` (accounts for potential confusion between the number one and capital letter I) | | **Known plates > Johnny** | `J*N-*234` (matches JHN-1234 and JMN-I234; `*` matches any number of characters) | | **Known plates > Sally** | `[S5]LL 1234` (matches both SLL 1234 and 5LL 1234) | @@ -473,7 +473,7 @@ Navigate to Camera configuration > Streams (FFmpeg)" /> and add your camera streams. @@ -481,7 +481,7 @@ Navigate to . | Field | Description | | -------------------- | -------------------------------------------------------------------------------------- | -| **Objects to track** | Set to an empty list — required when not using a Frigate+ model for dedicated LPR mode | +| **Objects to track** | Set to an empty list, required when not using a Frigate+ model for dedicated LPR mode | Navigate to . diff --git a/docs/docs/configuration/live.md b/docs/docs/configuration/live.md index 6dd379a92..a47c9285e 100644 --- a/docs/docs/configuration/live.md +++ b/docs/docs/configuration/live.md @@ -271,9 +271,9 @@ cameras: Each camera has three possible states, surfaced as a status selector in **Settings → Global configuration → Camera management**: -- **On** — streams are processed normally. Object detection, recording, and Live view are active. -- **Off** — Frigate's ffmpeg processes are paused. Recording stops, object detection is paused, and the Live dashboard displays a blank image with a "Camera is off" message. The camera is still visible in the Live dashboard and its past review items, tracked objects, and historical footage remain accessible via the UI. The Off state persists across Frigate restarts via a `.runtime_state.json` file alongside `config.yml` (see [Runtime toggle persistence](#runtime-toggle-persistence)). -- **Disabled** — the change is saved to your configuration file (`enabled: False`). The camera stops immediately, Frigate stops ffmpeg processes, and all live and historical UI elements for the camera are no longer visible but remains retained on disk. The camera is still listed in **Settings → Global configuration → Camera management** so it can be re-enabled. **A restart of Frigate is required to bring a disabled camera back to On.** +- **On**: streams are processed normally. Object detection, recording, and Live view are active. +- **Off**: Frigate's ffmpeg processes are paused. Recording stops, object detection is paused, and the Live dashboard displays a blank image with a "Camera is off" message. The camera is still visible in the Live dashboard and its past review items, tracked objects, and historical footage remain accessible via the UI. The Off state persists across Frigate restarts via a `.runtime_state.json` file alongside `config.yml` (see [Runtime toggle persistence](#runtime-toggle-persistence)). +- **Disabled**: the change is saved to your configuration file (`enabled: False`). The camera stops immediately, Frigate stops ffmpeg processes, and all live and historical UI elements for the camera are no longer visible but remains retained on disk. The camera is still listed in **Settings → Global configuration → Camera management** so it can be re-enabled. **A restart of Frigate is required to bring a disabled camera back to On.** #### Turning a camera on or off @@ -302,7 +302,7 @@ If you want a camera's historical data (review items, tracked objects, footage) #### Runtime toggle persistence -The Live view toggles for **camera on/off**, **detect**, **recordings**, **snapshots**, and **audio detection** — along with the equivalent MQTT `/set` topics — write the new state to `.runtime_state.json` next to your `config.yml`. The file is replayed on Frigate startup so your last-known toggle states survive a restart. Two interactions worth knowing: +The Live view toggles for **camera on/off**, **detect**, **recordings**, **snapshots**, and **audio detection** (along with the equivalent MQTT `/set` topics) write the new state to `.runtime_state.json` next to your `config.yml`. The file is replayed on Frigate startup so your last-known toggle states survive a restart. Two interactions worth knowing: - **Settings UI saves win.** When you save a field through **Settings → Global configuration**, the matching entry is cleared from `.runtime_state.json` so the new value in your config file is the durable source. - **Switching profiles clears all runtime overrides.** Activating or deactivating a [profile](/configuration/profiles) is treated as a deliberate state change, so the file is wiped to avoid stale overrides replaying on top of the new profile. @@ -333,7 +333,7 @@ When your browser runs into problems playing back your camera streams, it will l - **stalled** - What it means: Playback has stalled because the player has fallen too far behind live (extended buffering or no data arriving). - - What to try: This is usually indicative of the browser struggling to decode too many high-resolution streams at once. Try selecting a lower-bandwidth stream (substream), reduce the number of live streams open, improve the network connection, or lower the camera resolution. Also check your camera's keyframe (I-frame) interval — shorter intervals make playback start and recover faster. You can also try increasing the timeout value in the UI pane of Frigate's settings. + - What to try: This is usually indicative of the browser struggling to decode too many high-resolution streams at once. Try selecting a lower-bandwidth stream (substream), reduce the number of live streams open, improve the network connection, or lower the camera resolution. Also check your camera's keyframe (I-frame) interval: shorter intervals make playback start and recover faster. You can also try increasing the timeout value in the UI pane of Frigate's settings. - Possible console messages from the player code: - `Buffer time (10 seconds) exceeded, browser may not be playing media correctly.` diff --git a/docs/docs/configuration/motion_detection.md b/docs/docs/configuration/motion_detection.md index fbd90c621..9cd8629ab 100644 --- a/docs/docs/configuration/motion_detection.md +++ b/docs/docs/configuration/motion_detection.md @@ -151,7 +151,7 @@ motion: Large changes in motion like PTZ moves and camera switches between Color and IR mode should result in a pause in object detection. `lightning_threshold` defines the percentage of the image used to detect these substantial changes. Increasing this value makes motion detection more likely to treat large changes (like IR mode switches) as valid motion. Decreasing it makes motion detection more likely to ignore large amounts of motion, such as a person approaching a doorbell camera. -Note that `lightning_threshold` does **not** stop motion-based recordings from being saved — it only prevents additional motion analysis after the threshold is exceeded, reducing false positive object detections during high-motion periods (e.g. storms or PTZ sweeps) without interfering with recordings. +Note that `lightning_threshold` does **not** stop motion-based recordings from being saved. It only prevents additional motion analysis after the threshold is exceeded, reducing false positive object detections during high-motion periods (e.g. storms or PTZ sweeps) without interfering with recordings. :::warning @@ -194,10 +194,10 @@ This option is handy when you want to prevent large transient changes from trigg :::warning -When the skip threshold is exceeded, **no motion is reported** for that frame, meaning **nothing is recorded** for that frame. That means you can miss something important, like a PTZ camera auto-tracking an object or activity while the camera is moving. If you prefer to guarantee that every frame is saved, leave this unset and accept occasional recordings containing scene noise — they typically only take up a few megabytes and are quick to scan in the timeline UI. +When the skip threshold is exceeded, **no motion is reported** for that frame, meaning **nothing is recorded** for that frame. That means you can miss something important, like a PTZ camera auto-tracking an object or activity while the camera is moving. If you prefer to guarantee that every frame is saved, leave this unset and accept occasional recordings containing scene noise. They typically only take up a few megabytes and are quick to scan in the timeline UI. ::: ## Reviewing Detected Motion -To review what the detector picked up — or to search past recordings for motion in a specific region — see [Reviewing Motion](/usage/review#reviewing-motion) on the Review page. +To review what the detector picked up, or to search past recordings for motion in a specific region, see [Reviewing Motion](/usage/review#reviewing-motion) on the Review page. diff --git a/docs/docs/configuration/object_detectors.md b/docs/docs/configuration/object_detectors.md index e9887e3dd..1c6e0e269 100644 --- a/docs/docs/configuration/object_detectors.md +++ b/docs/docs/configuration/object_detectors.md @@ -12,7 +12,7 @@ import objectDetectorsModels from '@site/data/object_detectors_models.yaml'; ### Supported hardware -Object detection is what allows Frigate to identify _what_ is in your camera's view — people, cars, animals, and more — rather than just reacting to pixel changes. When Frigate's motion detection finds activity in a frame, that region is sent to an **object detector**, which returns the objects it recognizes along with their location and a confidence score. These detections are what drive tracked objects, alerts, detections, and notifications. +Object detection is what allows Frigate to identify _what_ is in your camera's view (people, cars, animals, and more) rather than just reacting to pixel changes. When Frigate's motion detection finds activity in a frame, that region is sent to an **object detector**, which returns the objects it recognizes along with their location and a confidence score. These detections are what drive tracked objects, alerts, detections, and notifications. Object detection is computationally intensive, so Frigate is designed to run it on a dedicated AI accelerator or GPU rather than the CPU. A **detector** is the specific hardware-and-model backend Frigate uses to run inference. Choosing a detector that matches your hardware is one of the most important steps in getting good performance, and the right choice depends on what device Frigate is running on. @@ -79,15 +79,15 @@ This does not affect using hardware for accelerating other tasks such as [semant Along with picking a detector for your hardware, you will choose a model's **input resolution** (such as `320x320` or `640x640`) and, for model families like YOLOv9, a **variant size** (`tiny`, `small`, etc.). Both affect the balance between accuracy and the inference time your hardware can sustain. -**Resolution (320x320 vs 640x640):** Frigate is optimized for `320x320` models, and `320x320` is the best choice for the vast majority of setups. Frigate is specifically designed to compensate for the smaller model by cropping a region of motion from the full frame and zooming into it before running detection, so a `320x320` model is actually _better_ at small and distant objects — not worse. A `640x640` model is slower and uses more resources, and its main benefit is fitting more objects into a single inference when many objects are spread across a large area. Recent versions of Frigate have improved support for `640x640` models, but `320x320` remains the recommended starting point for nearly all setups. +**Resolution (320x320 vs 640x640):** Frigate is optimized for `320x320` models, and `320x320` is the best choice for the vast majority of setups. Frigate is specifically designed to compensate for the smaller model by cropping a region of motion from the full frame and zooming into it before running detection, so a `320x320` model is actually _better_ at small and distant objects, not worse. A `640x640` model is slower and uses more resources, and its main benefit is fitting more objects into a single inference when many objects are spread across a large area. Recent versions of Frigate have improved support for `640x640` models, but `320x320` remains the recommended starting point for nearly all setups. -**Variant size (tiny/small/medium):** Larger variants are gradually more accurate but slower. Whether the difference is noticeable depends on your specific cameras and scenes. A good rule of thumb is to use the largest model your hardware can run without skipping detections, which you can monitor on the page in the UI — better accuracy only helps if your detector keeps up with the detection load across all cameras. +**Variant size (tiny/small/medium):** Larger variants are gradually more accurate but slower. Whether the difference is noticeable depends on your specific cameras and scenes. A good rule of thumb is to use the largest model your hardware can run without skipping detections, which you can monitor on the page in the UI. Better accuracy only helps if your detector keeps up with the detection load across all cameras. **Acceptable inference time depends on your hardware.** Inference time alone does not tell the whole story, because different hardware has different capacity. A GPU can run multiple instances of the same model concurrently, so an inference time around 30ms can still keep up with several cameras. A Google Coral runs only a single instance of the model, so it needs a much lower inference time (around 10ms) to keep up. :::tip -The best detection accuracy comes from a model trained on images that look like what Frigate actually sees — security camera footage cropped to regions of interest. You can train or fine-tune your own model on images like this and run it as a custom model (see the per-detector sections below), but [Frigate+](/plus) makes this much easier by handling the training for you on images submitted from your own cameras. For YOLOv9, the `s` (small) variant at `320x320` resolution is a good place to start. +The best detection accuracy comes from a model trained on images that look like what Frigate actually sees: security camera footage cropped to regions of interest. You can train or fine-tune your own model on images like this and run it as a custom model (see the per-detector sections below), but [Frigate+](/plus) makes this much easier by handling the training for you on images submitted from your own cameras. For YOLOv9, the `s` (small) variant at `320x320` resolution is a good place to start. ::: diff --git a/docs/docs/configuration/object_filters.md b/docs/docs/configuration/object_filters.md index 8c95c1174..94a8a887a 100644 --- a/docs/docs/configuration/object_filters.md +++ b/docs/docs/configuration/object_filters.md @@ -26,9 +26,9 @@ In frame 2, the score is below the `min_score` value, so Frigate ignores it and The **top score** is the highest computed score the tracked object has ever reached during its lifetime. Because the computed score rises and falls as new frames come in, the top score can be thought of as the peak confidence Frigate had in the object. In Frigate's UI (such as the Tracking Details pane in Explore), you may see all three values: -- **Score** — the raw detector score for that single frame. -- **Computed Score** — the median of the most recent score history at that moment. This is the value compared against `threshold`. -- **Top Score** — the highest computed score reached so far for the tracked object. +- **Score**: the raw detector score for that single frame. +- **Computed Score**: the median of the most recent score history at that moment. This is the value compared against `threshold`. +- **Top Score**: the highest computed score reached so far for the tracked object. ### Minimum Score diff --git a/docs/docs/configuration/profiles.md b/docs/docs/configuration/profiles.md index 80648458c..3eab2bd13 100644 --- a/docs/docs/configuration/profiles.md +++ b/docs/docs/configuration/profiles.md @@ -14,13 +14,13 @@ Profiles allow you to define named sets of camera configuration overrides that c Profiles operate as a two-level system: 1. **Profile definitions** are declared at the top level of your config under `profiles`. Each definition has a machine name (the key) and a `friendly_name` for display in the UI. -2. **Camera profile overrides** are declared under each camera's `profiles` section, keyed by the profile name. Only the settings you want to change need to be specified — everything else is inherited from the camera's base configuration. +2. **Camera profile overrides** are declared under each camera's `profiles` section, keyed by the profile name. Only the settings you want to change need to be specified. Everything else is inherited from the camera's base configuration. When a profile is activated, Frigate merges each camera's profile overrides on top of its base config. When the profile is deactivated, all cameras revert to their original settings. Only one profile can be active at a time. :::info -Profile changes are applied in-memory and take effect immediately — no restart is required. The active profile is persisted across Frigate restarts (stored in the `/config/.profiles` file). +Profile changes are applied in-memory and take effect immediately. No restart is required. The active profile is persisted across Frigate restarts (stored in the `/config/.profiles` file). ::: @@ -33,10 +33,10 @@ The easiest way to define profiles is to use the Frigate UI. Profiles can also b -1. **Create a profile** — Navigate to . Click the **Add Profile** button, enter a name (and optionally a profile ID). -2. **Configure overrides** — Navigate to a camera configuration section (e.g. Motion detection, Record, Notifications). In the top right, two buttons will appear - choose a camera and a profile from the profile selector to edit overrides for that camera and section. Only the fields you change will be stored as overrides — fields that require a restart are hidden since profiles are applied at runtime. You can click the **Remove Profile Override** button to clear overrides. -3. **Activate a profile** — Use the **Profiles** option in Frigate's main menu to choose a profile. Alternatively, in Settings, navigate to , then choose a profile in the Active Profile dropdown to activate it. The active profile is also shown in the status bar at the bottom of the screen on desktop browsers. -4. **Delete a profile** — Navigate to , then click the trash icon for a profile. This removes the profile definition and all camera overrides associated with it. +1. **Create a profile**: Navigate to . Click the **Add Profile** button, enter a name (and optionally a profile ID). +2. **Configure overrides**: Navigate to a camera configuration section (e.g. Motion detection, Record, Notifications). In the top right, two buttons will appear - choose a camera and a profile from the profile selector to edit overrides for that camera and section. Only the fields you change will be stored as overrides. Fields that require a restart are hidden since profiles are applied at runtime. You can click the **Remove Profile Override** button to clear overrides. +3. **Activate a profile**: Use the **Profiles** option in Frigate's main menu to choose a profile. Alternatively, in Settings, navigate to , then choose a profile in the Active Profile dropdown to activate it. The active profile is also shown in the status bar at the bottom of the screen on desktop browsers. +4. **Delete a profile**: Navigate to , then click the trash icon for a profile. This removes the profile definition and all camera overrides associated with it. diff --git a/docs/docs/configuration/record.md b/docs/docs/configuration/record.md index 833e218df..87a24d3d6 100644 --- a/docs/docs/configuration/record.md +++ b/docs/docs/configuration/record.md @@ -170,9 +170,9 @@ record: The `pre_capture` and `post_capture` values define the **time window** around a review item, but only recording segments that also match the configured **retention mode** are actually kept on disk. -- **`mode: all`** — Retains every segment within the capture window, regardless of whether motion was detected. -- **`mode: motion`** (default) — Only retains segments within the capture window that contain motion. This includes segments with active tracked objects, since object motion implies motion. Segments without any motion are discarded even if they fall within the pre/post capture range. -- **`mode: active_objects`** — Only retains segments within the capture window where tracked objects were actively moving. Segments with general motion but no active objects are discarded. +- **`mode: all`**: Retains every segment within the capture window, regardless of whether motion was detected. +- **`mode: motion`** (default): Only retains segments within the capture window that contain motion. This includes segments with active tracked objects, since object motion implies motion. Segments without any motion are discarded even if they fall within the pre/post capture range. +- **`mode: active_objects`**: Only retains segments within the capture window where tracked objects were actively moving. Segments with general motion but no active objects are discarded. This means that with the default `motion` mode, you may see less footage than the configured pre/post capture duration if parts of the capture window had no motion. @@ -197,7 +197,7 @@ Because recording segments are written in 10 second chunks, pre-capture timing d ### Where to view pre/post capture footage -Pre and post capture footage is included in the **recording timeline**, visible in the History view. Note that pre/post capture settings only affect which recording segments are **retained on disk** — they do not change the start and end points shown in the UI. The History view will still center on the review item's actual time range, but you can scrub backward and forward through the retained pre/post capture footage on the timeline. The Explore view shows object-specific clips that are trimmed to when the tracked object was actually visible, so pre/post capture time will not be reflected there. +Pre and post capture footage is included in the **recording timeline**, visible in the History view. Note that pre/post capture settings only affect which recording segments are **retained on disk**. They do not change the start and end points shown in the UI. The History view will still center on the review item's actual time range, but you can scrub backward and forward through the retained pre/post capture footage on the timeline. The Explore view shows object-specific clips that are trimmed to when the tracked object was actually visible, so pre/post capture time will not be reflected there. ## Configuring Recording Retention @@ -358,31 +358,31 @@ The storage usage Frigate reports will not exactly match what the operating syst ### How Frigate measures recording usage -The **Recordings** value on the Storage Metrics page () — and the per-camera **Camera Storage** breakdown — is the sum of the recording segment sizes Frigate has written, taken from Frigate's database. It is **not** computed by a scan of the disk. Frigate tracks usage this way by design: repeatedly walking the entire drive to total its size would keep hard drives spun up and add unnecessary I/O. +The **Recordings** value on the Storage Metrics page (), and the per-camera **Camera Storage** breakdown, is the sum of the recording segment sizes Frigate has written, taken from Frigate's database. It is **not** computed by a scan of the disk. Frigate tracks usage this way by design: repeatedly walking the entire drive to total its size would keep hard drives spun up and add unnecessary I/O. -The disk **total** shown beside it, and the free-space figure Frigate uses to decide when to delete recordings, instead come from the operating system's report for the whole filesystem mounted at `/media/frigate`. As a result, the **Unused** value on the page is _total disk capacity minus Frigate's recordings_ — not the drive's real free space, which will be lower whenever anything else is stored on the disk. +The disk **total** shown beside it, and the free-space figure Frigate uses to decide when to delete recordings, instead come from the operating system's report for the whole filesystem mounted at `/media/frigate`. As a result, the **Unused** value on the page is _total disk capacity minus Frigate's recordings_, not the drive's real free space, which will be lower whenever anything else is stored on the disk. -### What counts toward usage — and why it won't match `df` +### What counts toward usage, and why it won't match `df` Only **recording segments** (`/media/frigate/recordings`) are included in the recordings storage total. Plenty of other things consume real disk space but are **not** part of that number: -- **Snapshots and thumbnails** (`/media/frigate/clips`) — see [Snapshots](/configuration/snapshots). These are retained independently of recordings. +- **Snapshots and thumbnails** (`/media/frigate/clips`): see [Snapshots](/configuration/snapshots). These are retained independently of recordings. - **Preview videos** and **review thumbnails** (also under `/media/frigate/clips`). -- **Exports** (`/media/frigate/exports`) — exports are never removed by retention. +- **Exports** (`/media/frigate/exports`): exports are never removed by retention. - **The database, downloaded detection models, and face / license plate training images** (stored under `/config`). -- **Debug images from enrichments** (`/media/frigate/clips`) — when enabled, License Plate Recognition's `debug_save_plates` and GenAI's `debug_save_thumbnails` save plate crops and request images for troubleshooting. +- **Debug images from enrichments** (`/media/frigate/clips`): when enabled, License Plate Recognition's `debug_save_plates` and GenAI's `debug_save_thumbnails` save plate crops and request images for troubleshooting. -These files are the usual explanation for an "other" or seemingly unaccounted bucket of space — it is real, it is Frigate's, and it simply isn't part of the _recordings_ total. They are also why comparing the **Recordings** figure to `df -h` always shows a gap: `df` additionally counts any non-Frigate data on the disk, filesystem overhead and reserved blocks (ext4 reserves ~5% for root by default, so a disk can read "full" before recordings approach the total), and recently deleted recordings whose space has not yet been reclaimed. +These files are the usual explanation for an "other" or seemingly unaccounted bucket of space: it is real, it is Frigate's, and it simply isn't part of the _recordings_ total. They are also why comparing the **Recordings** figure to `df -h` always shows a gap: `df` additionally counts any non-Frigate data on the disk, filesystem overhead and reserved blocks (ext4 reserves ~5% for root by default, so a disk can read "full" before recordings approach the total), and recently deleted recordings whose space has not yet been reclaimed. :::tip -The Storage page is not intended to be a system-wide disk monitor — it shows how much space _Frigate's recordings_ use. To see true disk usage, use `df -h` (free space) and `du -sh` (per-directory usage) on the host. +The Storage page is not intended to be a system-wide disk monitor: it shows how much space _Frigate's recordings_ use. To see true disk usage, use `df -h` (free space) and `du -sh` (per-directory usage) on the host. ::: ### Free space and the `/media/frigate` mount -Frigate reports the capacity and free space of whatever filesystem is actually mounted at `/media/frigate` **inside the container**. If an external drive or network share isn't truly mounted there — a missing `/etc/fstab` entry, a share that was offline when the container started, or a host that doesn't pass the path through — the container falls back to the host's OS disk, and Frigate will correctly report that smaller disk instead of the drive you intended. +Frigate reports the capacity and free space of whatever filesystem is actually mounted at `/media/frigate` **inside the container**. If an external drive or network share isn't truly mounted there (a missing `/etc/fstab` entry, a share that was offline when the container started, or a host that doesn't pass the path through), the container falls back to the host's OS disk, and Frigate will correctly report that smaller disk instead of the drive you intended. If the reported capacity doesn't match your drive, the mount is the place to look, not Frigate. Verify what is actually mounted from inside the container: @@ -395,19 +395,19 @@ See the [storage mount layout](/frigate/installation#storage) for how the volume ### The `/tmp/cache` area is separate -Recording segments are first written to `/tmp/cache` — a small, in-memory (`tmpfs`) area — before being checked and moved to `/media/frigate/recordings`. Because it is separate and small, `/tmp/cache` can fill up and produce `No space left on device` errors even when the recordings disk has plenty of room — they are different storage areas. See [Recordings troubleshooting](/troubleshooting/recordings) for diagnosing cache and slow-storage issues. +Recording segments are first written to `/tmp/cache`, a small, in-memory (`tmpfs`) area, before being checked and moved to `/media/frigate/recordings`. Because it is separate and small, `/tmp/cache` can fill up and produce `No space left on device` errors even when the recordings disk has plenty of room. They are different storage areas. See [Recordings troubleshooting](/troubleshooting/recordings) for diagnosing cache and slow-storage issues. ### When the metrics don't match what's on disk -Because usage is tracked in the database, deleting recording files directly on disk — or files left behind after an upgrade — will not update the reported usage, and can even push it above 100%. Frigate is unaware of files it didn't record and won't count or remove them automatically. Use [Syncing Media Files With Disk](#syncing-media-files-with-disk) to reconcile the database with what is actually on disk. +Because usage is tracked in the database, deleting recording files directly on disk, or files left behind after an upgrade, will not update the reported usage, and can even push it above 100%. Frigate is unaware of files it didn't record and won't count or remove them automatically. Use [Syncing Media Files With Disk](#syncing-media-files-with-disk) to reconcile the database with what is actually on disk. ## Will Frigate delete old recordings if my storage runs out? -Yes. Frigate continuously checks the **free space of the disk** holding `/media/frigate/recordings`. This is different from adding up the size of every recording: free space is a single number the operating system already tracks, so Frigate can ask for it instantly without reading through your files or spinning up the disk — which is exactly why it relies on this check rather than scanning the drive. When less than roughly one hour of recording space remains — estimated from the current recording bitrate, **not** a fixed percentage — Frigate deletes the oldest recordings to reclaim space and logs a message. This emergency cleanup removes the oldest recordings first **regardless of retention settings**. +Yes. Frigate continuously checks the **free space of the disk** holding `/media/frigate/recordings`. This is different from adding up the size of every recording: free space is a single number the operating system already tracks, so Frigate can ask for it instantly without reading through your files or spinning up the disk, which is exactly why it relies on this check rather than scanning the drive. When less than roughly one hour of recording space remains (estimated from the current recording bitrate, **not** a fixed percentage), Frigate deletes the oldest recordings to reclaim space and logs a message. This emergency cleanup removes the oldest recordings first **regardless of retention settings**. Two consequences follow from this being based on whole-disk free space: -- Because the check uses the disk's real free space, **anything** filling the drive — including non-Frigate files — can trigger deletion of your oldest recordings. +- Because the check uses the disk's real free space, **anything** filling the drive, including non-Frigate files, can trigger deletion of your oldest recordings. - Cleanup can run while a meaningful percentage of the disk is still free (for example, with high bitrates or many cameras), because the threshold is "less than ~1 hour of recording headroom," not "X% full." Frequent emergency cleanups usually mean your configured retention exceeds what the disk can hold. Reduce your retention days so the normal retention cleanup keeps up and the emergency path rarely triggers. diff --git a/docs/docs/configuration/restream.md b/docs/docs/configuration/restream.md index b307154bc..4a637742f 100644 --- a/docs/docs/configuration/restream.md +++ b/docs/docs/configuration/restream.md @@ -61,7 +61,7 @@ Configure the go2rtc stream and point the camera inputs at the local restream. -Navigate to and add stream entries for each camera. Then navigate to for each camera. For each input, choose **Restream (go2rtc)** and pick the matching stream from the dropdown — Frigate uses the local restream URL (`rtsp://127.0.0.1:8554/`) and the `preset-rtsp-restream` input args for that input automatically. (Choose **Manual input path** instead to type a URL directly.) +Navigate to and add stream entries for each camera. Then navigate to for each camera. For each input, choose **Restream (go2rtc)** and pick the matching stream from the dropdown. Frigate uses the local restream URL (`rtsp://127.0.0.1:8554/`) and the `preset-rtsp-restream` input args for that input automatically. (Choose **Manual input path** instead to type a URL directly.) @@ -111,7 +111,7 @@ Two connections are made to the camera. One for the sub stream, one for the rest -Navigate to and add stream entries for each camera and its sub stream. Then navigate to for each camera and add separate inputs for the main and sub streams. Set each input's source to **Restream (go2rtc)** and pick the matching stream from the dropdown — Frigate uses the local restream URL and the `preset-rtsp-restream` input args for that input automatically. +Navigate to and add stream entries for each camera and its sub stream. Then navigate to for each camera and add separate inputs for the main and sub streams. Set each input's source to **Restream (go2rtc)** and pick the matching stream from the dropdown. Frigate uses the local restream URL and the `preset-rtsp-restream` input args for that input automatically. diff --git a/docs/docs/configuration/semantic_search.md b/docs/docs/configuration/semantic_search.md index dc7c3a4d0..a16cae347 100644 --- a/docs/docs/configuration/semantic_search.md +++ b/docs/docs/configuration/semantic_search.md @@ -7,7 +7,7 @@ import ConfigTabs from "@site/src/components/ConfigTabs"; import TabItem from "@theme/TabItem"; import NavPath from "@site/src/components/NavPath"; -Semantic Search in Frigate allows you to find tracked objects within your review items using either the image itself, a user-defined text description, or an automatically generated one. This feature works by creating _embeddings_ — numerical vector representations — for both the images and text descriptions of your tracked objects. By comparing these embeddings, Frigate assesses their similarities to deliver relevant search results. +Semantic Search in Frigate allows you to find tracked objects within your review items using either the image itself, a user-defined text description, or an automatically generated one. This feature works by creating _embeddings_, numerical vector representations, for both the images and text descriptions of your tracked objects. By comparing these embeddings, Frigate assesses their similarities to deliver relevant search results. Frigate uses models from [Jina AI](https://huggingface.co/jinaai) to create and save embeddings to Frigate's database. All of this runs locally. @@ -222,7 +222,7 @@ See the [Hardware Accelerated Enrichments](/configuration/hardware_acceleration_ ## Usage and Best Practices -For tips on getting the best results from Semantic Search — choosing between thumbnail and description search, phrasing queries effectively, and combining search with the other Explore filters — see [Usage and best practices](/usage/explore#usage-and-best-practices) in the Usage docs. +For tips on getting the best results from Semantic Search (choosing between thumbnail and description search, phrasing queries effectively, and combining search with the other Explore filters), see [Usage and best practices](/usage/explore#usage-and-best-practices) in the Usage docs. ## Triggers diff --git a/docs/docs/configuration/snapshots.md b/docs/docs/configuration/snapshots.md index 0d674b61a..b2aba9463 100644 --- a/docs/docs/configuration/snapshots.md +++ b/docs/docs/configuration/snapshots.md @@ -7,14 +7,14 @@ import ConfigTabs from "@site/src/components/ConfigTabs"; import TabItem from "@theme/TabItem"; import NavPath from "@site/src/components/NavPath"; -A snapshot is a single still image that captures a tracked object at its best moment — the clearest frame Frigate saw while following that object across the scene. Unlike a [recording](./record.md), which is continuous video, a snapshot is one representative image saved per tracked object once tracking ends. +A snapshot is a single still image that captures a tracked object at its best moment: the clearest frame Frigate saw while following that object across the scene. Unlike a [recording](./record.md), which is continuous video, a snapshot is one representative image saved per tracked object once tracking ends. -When snapshots are enabled, Frigate saves one image to `/media/frigate/clips` for each tracked object, named `--clean.webp`. A clean image is always stored without any annotations (no timestamp, bounding boxes, or cropping) so you have an unmodified copy of the original frame. Annotations like bounding boxes and timestamps are applied on demand when a snapshot is requested [via the HTTP API](../integrations/api/event-snapshot-events-event-id-snapshot-jpg-get.api.mdx) — see [Rendering](#rendering) below. +When snapshots are enabled, Frigate saves one image to `/media/frigate/clips` for each tracked object, named `--clean.webp`. A clean image is always stored without any annotations (no timestamp, bounding boxes, or cropping) so you have an unmodified copy of the original frame. Annotations like bounding boxes and timestamps are applied on demand when a snapshot is requested [via the HTTP API](../integrations/api/event-snapshot-events-event-id-snapshot-jpg-get.api.mdx). See [Rendering](#rendering) below. A few things to keep in mind: - Snapshots are saved per tracked object, so a camera with no detected objects produces no snapshots even if recording is enabled. -- Snapshots and recordings are configured and retained independently — enabling one does not enable the other. +- Snapshots and recordings are configured and retained independently. Enabling one does not enable the other. - Snapshots are accessible in the UI in the Explore pane, which allows for quick submission to the Frigate+ service. - To only save snapshots for objects that enter a specific zone, [see the zone docs](./zones.md#restricting-snapshots-to-specific-zones). - Snapshots sent via MQTT are configured separately under the camera MQTT settings, not here. @@ -132,7 +132,7 @@ snapshots: Frigate does not save every frame. It picks a single "best" frame for each tracked object based on detection confidence, object size, and the presence of key attributes like faces or license plates. Frames where the object touches the edge of the frame are deprioritized. That best frame is written to disk once tracking ends. -MQTT snapshots are published more frequently — each time a better thumbnail frame is found during tracking, or when the current best image is older than `best_image_timeout` (default: 60s). These use their own annotation settings configured under the camera MQTT settings. +MQTT snapshots are published more frequently: each time a better thumbnail frame is found during tracking, or when the current best image is older than `best_image_timeout` (default: 60s). These use their own annotation settings configured under the camera MQTT settings. ## Rendering diff --git a/docs/docs/frigate/camera_setup.md b/docs/docs/frigate/camera_setup.md index 4958c35df..0299a9aab 100644 --- a/docs/docs/frigate/camera_setup.md +++ b/docs/docs/frigate/camera_setup.md @@ -27,7 +27,7 @@ Larger resolutions **do** improve performance if the objects are very small in t ### Choosing a detect frame rate -`detect.fps` controls how many times per second Frigate runs object detection — it does **not** need to match your camera's frame rate. The default of **5** is correct for the vast majority of cameras. +`detect.fps` controls how many times per second Frigate runs object detection. It does **not** need to match your camera's frame rate. The default of **5** is correct for the vast majority of cameras. :::warning @@ -47,7 +47,7 @@ Estimate how long an object is visible as it crosses the area of interest, aimin > **`detect.fps` ≈ 10 ÷ (seconds the object is in view)** -Most objects — people walking or running, pets, and vehicles in a yard, driveway, or walkway — stay in view for two seconds or more, so the default of 5 fps is correct. Slowly try raising it to 10 (the recommended maximum) in increments only when objects routinely cross the entire frame in about a second, such as a camera aimed at a street or sidewalk with fast cross-traffic. Objects that transit in under a second cannot be tracked reliably at any practical rate, so reposition the camera instead. +Most objects (people walking or running, pets, and vehicles in a yard, driveway, or walkway) stay in view for two seconds or more, so the default of 5 fps is correct. Slowly try raising it to 10 (the recommended maximum) in increments only when objects routinely cross the entire frame in about a second, such as a camera aimed at a street or sidewalk with fast cross-traffic. Objects that transit in under a second cannot be tracked reliably at any practical rate, so reposition the camera instead. :::tip diff --git a/docs/docs/frigate/glossary.md b/docs/docs/frigate/glossary.md index 92ad03273..d55001567 100644 --- a/docs/docs/frigate/glossary.md +++ b/docs/docs/frigate/glossary.md @@ -11,7 +11,7 @@ The higher-priority of the two [review item](#review-item) severities, the other ## Attribute -A property detected on an [object](#object) that exists alongside its [label](#label). Unlike a [sub label](#sub-label), an object can carry several attributes at once. Some attributes come directly from the object detection [model](#model) — for example `face`, `license_plate`, or delivery carrier logos such as `amazon`, `ups`, and `fedex` — while others come from a [custom object classification model](/configuration/custom_classification/object_classification) configured with the `attribute` type. Attributes are visible in the Tracked Object Details pane in Explore, in `frigate/events` MQTT messages, and through the HTTP API. +A property detected on an [object](#object) that exists alongside its [label](#label). Unlike a [sub label](#sub-label), an object can carry several attributes at once. Some attributes come directly from the object detection [model](#model) (for example `face`, `license_plate`, or delivery carrier logos such as `amazon`, `ups`, and `fedex`), while others come from a [custom object classification model](/configuration/custom_classification/object_classification) configured with the `attribute` type. Attributes are visible in the Tracked Object Details pane in Explore, in `frigate/events` MQTT messages, and through the HTTP API. ## Bounding Box @@ -30,15 +30,15 @@ The categories a classification [model](#model) is trained to distinguish betwee ## Detection -The lower-priority of the two [review item](#review-item) severities, the other being an [alert](#alert). By default, any review item that does not qualify as an alert is a detection; the qualifying [labels](#label) and [zones](#zone) can be configured. Despite the name, a detection is a category of review item — not the same as the object detection performed by the [model](#model). [See the review docs for more info](/configuration/review) +The lower-priority of the two [review item](#review-item) severities, the other being an [alert](#alert). By default, any review item that does not qualify as an alert is a detection; the qualifying [labels](#label) and [zones](#zone) can be configured. Despite the name, a detection is a category of review item, not the same as the object detection performed by the [model](#model). [See the review docs for more info](/configuration/review) ## False Positive -An incorrect result from the object detection [model](#model), where it assigns the wrong [label](#label) to something in the frame — for example a dog identified as a person, or a chair identified as a dog. A person correctly identified in an area you want to ignore is not a false positive. +An incorrect result from the object detection [model](#model), where it assigns the wrong [label](#label) to something in the frame, for example a dog identified as a person, or a chair identified as a dog. A person correctly identified in an area you want to ignore is not a false positive. ## Label -The type assigned to a detected [object](#object) by the object detection [model](#model), drawn from the model's labelmap — for example `person`, `car`, or `dog`. Frigate tracks `person` by default; additional labels are tracked by adding them to the objects configuration. [See the available objects docs for the full list](/configuration/objects) +The type assigned to a detected [object](#object) by the object detection [model](#model), drawn from the model's labelmap, for example `person`, `car`, or `dog`. Frigate tracks `person` by default; additional labels are tracked by adding them to the objects configuration. [See the available objects docs for the full list](/configuration/objects) ## Mask @@ -46,7 +46,7 @@ There are two types of masks in Frigate. [See the mask docs for more info](/conf ### Motion Mask -A motion mask stops [motion](#motion) in the masked area from triggering object detection. It does not stop an object from being detected when object detection runs because of motion in a nearby area. Use motion masks for parts of the frame that change constantly but never contain objects you care about — camera timestamps, the sky, the tops of trees, and so on. +A motion mask stops [motion](#motion) in the masked area from triggering object detection. It does not stop an object from being detected when object detection runs because of motion in a nearby area. Use motion masks for parts of the frame that change constantly but never contain objects you care about: camera timestamps, the sky, the tops of trees, and so on. ### Object Mask diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index 2f8fd0081..1df3bb836 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -111,14 +111,14 @@ Frigate supports multiple different detectors that work on different types of ha ### Hailo-8 -Frigate supports both the Hailo-8 and Hailo-8L AI Acceleration Modules on compatible hardware platforms—including the Raspberry Pi 5 with the PCIe hat from the AI kit. The Hailo detector integration in Frigate automatically identifies your hardware type and selects the appropriate default model when a custom model isn’t provided. +Frigate supports both the Hailo-8 and Hailo-8L AI Acceleration Modules on compatible hardware platforms, including the Raspberry Pi 5 with the PCIe hat from the AI kit. The Hailo detector integration in Frigate automatically identifies your hardware type and selects the appropriate default model when a custom model isn’t provided. **Default Model Configuration:** - **Hailo-8L:** Default model is **YOLOv6n**. - **Hailo-8:** Default model is **YOLOv6n**. -In real-world deployments, even with multiple cameras running concurrently, Frigate has demonstrated consistent performance. Testing on x86 platforms—with dual PCIe lanes—yields further improvements in FPS, throughput, and latency compared to the Raspberry Pi setup. +In real-world deployments, even with multiple cameras running concurrently, Frigate has demonstrated consistent performance. Testing on x86 platforms, with dual PCIe lanes, yields further improvements in FPS, throughput, and latency compared to the Raspberry Pi setup. | Name | Hailo‑8 Inference Time | Hailo‑8L Inference Time | | ---------------- | ---------------------- | ----------------------- | diff --git a/docs/docs/frigate/network_requirements.md b/docs/docs/frigate/network_requirements.md index 2d26afbf6..f74cd6547 100644 --- a/docs/docs/frigate/network_requirements.md +++ b/docs/docs/frigate/network_requirements.md @@ -11,9 +11,9 @@ Frigate is designed to run locally and does not require a persistent internet co Frigate's internet usage falls into three categories: -1. **One-time model downloads** — ML models are downloaded the first time a feature is enabled, then cached locally. No internet is needed on subsequent startups. -2. **Optional cloud services** — Features like Frigate+ and Generative AI connect to external APIs only when explicitly configured. -3. **Build-time dependencies** — Components bundled into the Docker image during the build process. These require no internet at runtime. +1. **One-time model downloads**: ML models are downloaded the first time a feature is enabled, then cached locally. No internet is needed on subsequent startups. +2. **Optional cloud services**: Features like Frigate+ and Generative AI connect to external APIs only when explicitly configured. +3. **Build-time dependencies**: Components bundled into the Docker image during the build process. These require no internet at runtime. :::tip @@ -93,11 +93,11 @@ When a Generative AI provider is configured, Frigate sends images and prompts to | Provider | Internet Required | | ------------- | ---------------------------------------------------------------- | -| OpenAI | Yes — connects to OpenAI API (or custom base URL) | -| Google Gemini | Yes — connects to Google Generative AI API | -| Azure OpenAI | Yes — connects to your Azure endpoint | -| Ollama | Depends — typically local (`localhost:11434`), but can be remote | -| llama.cpp | No — runs entirely locally | +| OpenAI | Yes, connects to OpenAI API (or custom base URL) | +| Google Gemini | Yes, connects to Google Generative AI API | +| Azure OpenAI | Yes, connects to your Azure endpoint | +| Ollama | Depends: typically local (`localhost:11434`), but can be remote | +| llama.cpp | No, runs entirely locally | Disable Generative AI by removing the `genai` configuration from your cameras. See [Generative AI](/configuration/genai/genai_config) for details. @@ -126,7 +126,7 @@ When using the [DeepStack detector plugin](/configuration/object_detectors), Fri For [WebRTC live streaming](/configuration/live), Frigate uses STUN for NAT traversal: -- **go2rtc** defaults to a local STUN listener (`stun:8555`) — no internet required. +- **go2rtc** defaults to a local STUN listener (`stun:8555`), no internet required. - **The web UI's WebRTC player** includes a fallback to Google's public STUN server (`stun:stun.l.google.com:19302`), which requires internet. ## Home Assistant Supervisor @@ -135,21 +135,21 @@ When running as a Home Assistant add-on, the go2rtc startup script queries the l ## What Does NOT Require Internet -- **Object detection** — CPU, EdgeTPU, OpenVINO, and other bundled detector models are included in the Docker image. -- **Recording and playback** — All video is stored and served locally. -- **Live streaming** — Camera streams are pulled over your local network. MSE and HLS streaming work without any external connections. -- **The web interface** — Fully self-contained with no external fonts, scripts, analytics, or CDN dependencies. All translations are bundled locally. -- **Custom classification inference** — After training, custom models run entirely locally. -- **Audio detection** — The YAMNet audio classification model is bundled in the Docker image. +- **Object detection**: CPU, EdgeTPU, OpenVINO, and other bundled detector models are included in the Docker image. +- **Recording and playback**: All video is stored and served locally. +- **Live streaming**: Camera streams are pulled over your local network. MSE and HLS streaming work without any external connections. +- **The web interface**: Fully self-contained with no external fonts, scripts, analytics, or CDN dependencies. All translations are bundled locally. +- **Custom classification inference**: After training, custom models run entirely locally. +- **Audio detection**: The YAMNet audio classification model is bundled in the Docker image. ## Running Frigate Offline To run Frigate in an air-gapped or offline environment: -1. **Pre-download models** — Start Frigate with internet access once with all desired features enabled. Models will be cached in `/config/model_cache/`. -2. **Disable version check** — Set `telemetry.version_check: false` in your configuration. -3. **Block outbound model requests** — Set the `HF_HUB_OFFLINE=1` and `TRANSFORMERS_OFFLINE=1` environment variables to prevent HuggingFace and Transformers from attempting any network requests. -4. **Avoid cloud features** — Do not configure Frigate+, Generative AI providers that require internet, or cloud MQTT brokers. -5. **Use local model mirrors** — If limited internet is available, set the `HF_ENDPOINT`, `GITHUB_ENDPOINT`, and `GITHUB_RAW_ENDPOINT` environment variables to point to local mirrors. +1. **Pre-download models**: Start Frigate with internet access once with all desired features enabled. Models will be cached in `/config/model_cache/`. +2. **Disable version check**: Set `telemetry.version_check: false` in your configuration. +3. **Block outbound model requests**: Set the `HF_HUB_OFFLINE=1` and `TRANSFORMERS_OFFLINE=1` environment variables to prevent HuggingFace and Transformers from attempting any network requests. +4. **Avoid cloud features**: Do not configure Frigate+, Generative AI providers that require internet, or cloud MQTT brokers. +5. **Use local model mirrors**: If limited internet is available, set the `HF_ENDPOINT`, `GITHUB_ENDPOINT`, and `GITHUB_RAW_ENDPOINT` environment variables to point to local mirrors. After these steps, Frigate will operate with no outbound internet connections. diff --git a/docs/docs/frigate/planning_setup.md b/docs/docs/frigate/planning_setup.md index cb301bacf..4e0d82ffb 100644 --- a/docs/docs/frigate/planning_setup.md +++ b/docs/docs/frigate/planning_setup.md @@ -42,7 +42,7 @@ Frigate requires a CPU with AVX + AVX2 instructions. Most modern CPUs (post-2011 Storage is an important consideration when planning a new installation. To get a more precise estimate of your storage requirements, you can use an IP camera storage calculator. Websites like [IPConfigure Storage Calculator](https://calculator.ipconfigure.com/) can help you determine the necessary disk space based on your camera settings. -Once running, see [Understanding storage usage](/configuration/record#understanding-storage-usage) for how Frigate measures and reports disk usage — and why its numbers won't exactly match `df` or `du`. +Once running, see [Understanding storage usage](/configuration/record#understanding-storage-usage) for how Frigate measures and reports disk usage, and why its numbers won't exactly match `df` or `du`. #### SSDs (Solid State Drives) diff --git a/docs/docs/guides/reverse_proxy.md b/docs/docs/guides/reverse_proxy.md index 0425ee1aa..bf33bcc27 100644 --- a/docs/docs/guides/reverse_proxy.md +++ b/docs/docs/guides/reverse_proxy.md @@ -35,7 +35,7 @@ Frigate relies on WebSockets for real-time communication between the browser and Your reverse proxy must be configured to forward the `Upgrade` and `Connection` headers so that WebSocket connections can be established. Each proxy example below already includes the directives needed to do this, but if you are adapting your own configuration, ensure these headers are passed through. -Note that some proxies disable WebSocket support by default — for example, Nginx Proxy Manager has a "Websockets Support" toggle that must be enabled. +Note that some proxies disable WebSocket support by default. For example, Nginx Proxy Manager has a "Websockets Support" toggle that must be enabled. ## Proxies diff --git a/docs/docs/troubleshooting/dummy-camera.md b/docs/docs/troubleshooting/dummy-camera.md index a34294436..cba864b1d 100644 --- a/docs/docs/troubleshooting/dummy-camera.md +++ b/docs/docs/troubleshooting/dummy-camera.md @@ -57,11 +57,11 @@ Only one replay session can be active at a time. If a session is already running Debug Replay can be started from several places in the UI. The starting point determines the time range that gets replayed. -- **History — Actions menu.** Navigate to , open the **Actions** menu in the toolbar, and choose **Debug Replay**. From here you can pick a preset (**Last 1 Minute**, **Last 5 Minutes**), select a range directly on the timeline with **From Timeline**, or enter exact start and end times with **Custom**. This is the most flexible option and the best choice when you want to add padding around a detection. On mobile, the same options appear in the Actions drawer. -- **History — Detail Stream event menu.** While viewing a review item in the Detail Stream, open the menu on a tracked object's event card and choose **Debug Replay**. The replay range is set automatically to that object's start and end times. -- **Explore — search result menu.** From an Explore card, open the kebab menu and choose **Debug Replay**. The range is taken from the tracked object's lifecycle. -- **Explore — Tracking Details Actions menu.** Open a tracked object's **Tracking Details** dialog, then choose **Debug Replay** from the Actions menu. Same automatic range as the search result menu. -- **Exports — export card menu.** From , open the menu on an export and choose **Debug Replay** to loop the exported clip through the detection pipeline for the camera it was exported from. +- **History: Actions menu.** Navigate to , open the **Actions** menu in the toolbar, and choose **Debug Replay**. From here you can pick a preset (**Last 1 Minute**, **Last 5 Minutes**), select a range directly on the timeline with **From Timeline**, or enter exact start and end times with **Custom**. This is the most flexible option and the best choice when you want to add padding around a detection. On mobile, the same options appear in the Actions drawer. +- **History: Detail Stream event menu.** While viewing a review item in the Detail Stream, open the menu on a tracked object's event card and choose **Debug Replay**. The replay range is set automatically to that object's start and end times. +- **Explore: search result menu.** From an Explore card, open the kebab menu and choose **Debug Replay**. The range is taken from the tracked object's lifecycle. +- **Explore: Tracking Details Actions menu.** Open a tracked object's **Tracking Details** dialog, then choose **Debug Replay** from the Actions menu. Same automatic range as the search result menu. +- **Exports: export card menu.** From , open the menu on an export and choose **Debug Replay** to loop the exported clip through the detection pipeline for the camera it was exported from. The Detail Stream, Explore, and Exports entry points use the underlying recording or export's bounds with a small amount of padding. This can be convenient for quick checks, but if a detection is short or you want extra "settle" time for motion and the detector, start the replay from the History Actions menu instead and widen the range manually. @@ -77,7 +77,7 @@ Treat the replay as a close approximation rather than an exact reproduction. Run ## Manual Dummy Camera -For advanced scenarios — such as testing with a clip from a different source, debugging ffmpeg behavior, or running a clip through a completely custom configuration — you can set up a dummy camera manually. +For advanced scenarios (such as testing with a clip from a different source, debugging ffmpeg behavior, or running a clip through a completely custom configuration), you can set up a dummy camera manually. ### Example config diff --git a/docs/docs/troubleshooting/edgetpu.md b/docs/docs/troubleshooting/edgetpu.md index 4ee25afd0..aba235dfe 100644 --- a/docs/docs/troubleshooting/edgetpu.md +++ b/docs/docs/troubleshooting/edgetpu.md @@ -48,7 +48,7 @@ Some users have reported that this older device runs an older kernel causing iss ### QNAP NAS -QNAP NAS devices, such as the TS-253A, may use connected Coral TPU devices if [QuMagie](https://www.qnap.com/en/software/qumagie) is installed along with its QNAP AI Core extension. If any of the features—`facial recognition`, `object recognition`, or `similar photo recognition`—are enabled, Container Station applications such as `Frigate` or `CodeProject.AI Server` will be unable to initialize the TPU device in use. +QNAP NAS devices, such as the TS-253A, may use connected Coral TPU devices if [QuMagie](https://www.qnap.com/en/software/qumagie) is installed along with its QNAP AI Core extension. If any of the features (`facial recognition`, `object recognition`, or `similar photo recognition`) are enabled, Container Station applications such as `Frigate` or `CodeProject.AI Server` will be unable to initialize the TPU device in use. To allow the Coral TPU device to be discovered, the you must either: 1. [Disable the AI recognition features in QuMagie](https://docs.qnap.com/application/qumagie/2.x/en-us/configuring-qnap-ai-core-settings-FB13CE03.html), diff --git a/docs/docs/troubleshooting/faqs.md b/docs/docs/troubleshooting/faqs.md index c8676b247..94912230b 100644 --- a/docs/docs/troubleshooting/faqs.md +++ b/docs/docs/troubleshooting/faqs.md @@ -127,19 +127,19 @@ cameras: ### Why does Frigate keep creating new tracked objects for my parked car? -Stationary tracking is designed to _prevent_ this — a parked car should remain a single tracked object rather than generating new ones. If you're repeatedly getting new tracked objects for the same car, it's likely that Frigate is losing the object and re-detecting it as a new one. +Stationary tracking is designed to _prevent_ this: a parked car should remain a single tracked object rather than generating new ones. If you're repeatedly getting new tracked objects for the same car, it's likely that Frigate is losing the object and re-detecting it as a new one. Open one of the tracked objects in Explore → **Tracking Details**. If the detection scores are low (< 70% or so), the model isn't confident the parked car is a car. This is common with the free [COCO-trained](https://cocodataset.org/#explore) object detection models on steep/top-down angles, partially occluded cars, foliage, or low-light footage. When detections fall below `min_score` for too many frames the tracker loses the object, and the next confident frame creates a brand new one. What helps: -- **Improve the view** — even a small angle change that gets more of the car visible could lift scores enough to stabilize tracking. -- **Use a more accurate model** — switching from `mobiledet` to `yolov9`, or stepping up to a larger variant like `yolov9-s` over `yolov9-t`, can help (at the cost of inference time, and still on the COCO dataset). The biggest gains usually come from fine-tuning a model on images from your own cameras so it learns your specific scene. [Frigate+](https://frigate.video/plus) is a paid option that does this - models are trained on security-camera footage and can be fine-tuned on images you submit from your own setup. -- **Don't set `detect -> stationary -> max_frames` for `car`** — it artificially ends tracking and forces re-detection as a new object. See [Stationary Objects](../configuration/stationary_objects.md). -- **Restrict alerts to the areas you care about** with `required_zones` — see [Zones](../configuration/zones.md#restricting-alerts-and-detections-to-specific-zones). Make sure those zones use the default `loitering_time: 0` unless you specifically want the review item to stay open until the car leaves. +- **Improve the view**: even a small angle change that gets more of the car visible could lift scores enough to stabilize tracking. +- **Use a more accurate model**: switching from `mobiledet` to `yolov9`, or stepping up to a larger variant like `yolov9-s` over `yolov9-t`, can help (at the cost of inference time, and still on the COCO dataset). The biggest gains usually come from fine-tuning a model on images from your own cameras so it learns your specific scene. [Frigate+](https://frigate.video/plus) is a paid option that does this - models are trained on security-camera footage and can be fine-tuned on images you submit from your own setup. +- **Don't set `detect -> stationary -> max_frames` for `car`**: it artificially ends tracking and forces re-detection as a new object. See [Stationary Objects](../configuration/stationary_objects.md). +- **Restrict alerts to the areas you care about** with `required_zones`. See [Zones](../configuration/zones.md#restricting-alerts-and-detections-to-specific-zones). Make sure those zones use the default `loitering_time: 0` unless you specifically want the review item to stay open until the car leaves. - **Filter impossible locations** with [object filter masks](../configuration/masks.md#object-filter-masks) if cars are being detected on rooftops, treetops, etc. -See [Object Filters](../configuration/object_filters.md) for more on tuning `min_score` and `threshold` — note that raising them too high will make this exact problem worse. +See [Object Filters](../configuration/object_filters.md) for more on tuning `min_score` and `threshold`. Note that raising them too high will make this exact problem worse. ### How do I correct Frigate when it detects something as the wrong object? @@ -149,7 +149,7 @@ Frigate's object detection relies on a machine learning [model](../frigate/gloss **Suppress the misidentification with filters.** You can use filters to stop a specific false positive from being tracked: -- Tune `min_score` / `threshold`, or add `min_area` / `max_area` / `min_ratio` / `max_ratio` filters — see [Object Filters](../configuration/object_filters.md). +- Tune `min_score` / `threshold`, or add `min_area` / `max_area` / `min_ratio` / `max_ratio` filters. See [Object Filters](../configuration/object_filters.md). - If the false positive is always in the same fixed spot (like a statue or mailbox that reads as a person), add an [object filter mask](../configuration/masks.md#object-filter-masks) over that location. Filters and masks only hide the incorrect result - they don't teach Frigate what the object actually is. For that, fine-tune your own model or use Frigate+. diff --git a/docs/docs/troubleshooting/go2rtc.md b/docs/docs/troubleshooting/go2rtc.md index 4a9a151aa..a688c2332 100644 --- a/docs/docs/troubleshooting/go2rtc.md +++ b/docs/docs/troubleshooting/go2rtc.md @@ -9,29 +9,29 @@ import NavPath from "@site/src/components/NavPath"; This page covers common problems with the bundled [go2rtc](/configuration/go2rtc) and how to resolve them, whether your cameras were added with the setup wizard or configured by hand. -When a stream won't play or behaves oddly, the most important first step is to figure out **where** in the pipeline it breaks. Frigate's live view is a chain — _camera → go2rtc → your browser_ — and each stage fails for different reasons. Work through the checks below in order, then jump to the matching problem category. +When a stream won't play or behaves oddly, the most important first step is to figure out **where** in the pipeline it breaks. Frigate's live view is a chain (_camera → go2rtc → your browser_), and each stage fails for different reasons. Work through the checks below in order, then jump to the matching problem category. ## Start by isolating the problem ### 1. Read the go2rtc logs -Access the go2rtc logs in the Frigate UI under in the sidebar (select the **go2rtc** tab). If go2rtc cannot connect to your camera you will usually see a clear error here — `401 Unauthorized` (bad or incorrectly encoded credentials), `Connection refused` / `timeout` (wrong IP, port, or the camera is at its connection limit), or `404 Not Found` (wrong RTSP path, or the referenced stream name does not exist). +Access the go2rtc logs in the Frigate UI under in the sidebar (select the **go2rtc** tab). If go2rtc cannot connect to your camera you will usually see a clear error here: `401 Unauthorized` (bad or incorrectly encoded credentials), `Connection refused` / `timeout` (wrong IP, port, or the camera is at its connection limit), or `404 Not Found` (wrong RTSP path, or the referenced stream name does not exist). ### 2. Test the stream in the go2rtc web interface If the logs look clean, open go2rtc's own web interface on port `1984`. This is the single most useful diagnostic, because it takes Frigate's UI out of the equation entirely. -- If using Frigate through Home Assistant, enable the web interface at port `1984` (it is disabled by default — see [Home Assistant ports](#home-assistant-and-port-access)). +- If using Frigate through Home Assistant, enable the web interface at port `1984` (it is disabled by default, see [Home Assistant ports](#home-assistant-and-port-access)). - If using Docker, forward port `1984` before accessing the web interface. Open the stream page for your camera (`http://:1984/stream.html?src=back`) and try each player link: - **If nothing plays here**, the problem is between the camera and go2rtc (codec, credentials, or transport), _not_ your browser. Fix it at the source before touching anything in Frigate. -- **If a player works here but Frigate's live view does not**, the problem is browser/codec related — compare the **MSE** and **WebRTC** links. Frigate prefers MSE and only attempts WebRTC when MSE fails (or for two-way talk). If `mode=mse` plays but `mode=webrtc` does not, you have a [WebRTC codec problem](#webrtc-and-two-way-talk); if neither plays, your browser cannot decode the codec (commonly H.265 — see [H.265 / HEVC cameras](#h265--hevc-cameras)). +- **If a player works here but Frigate's live view does not**, the problem is browser/codec related. Compare the **MSE** and **WebRTC** links. Frigate prefers MSE and only attempts WebRTC when MSE fails (or for two-way talk). If `mode=mse` plays but `mode=webrtc` does not, you have a [WebRTC codec problem](#webrtc-and-two-way-talk); if neither plays, your browser cannot decode the codec (commonly H.265, see [H.265 / HEVC cameras](#h265--hevc-cameras)). ### 3. Inspect the negotiated codecs -You can view detailed stream info — including the exact video and audio codecs go2rtc negotiated with the camera — at `http://frigate_ip:5000/api/go2rtc/streams` (or `http://frigate_ip:5000/api/go2rtc/streams/back` for a single camera). This is the authoritative answer to "what is my camera actually sending?" and is far more reliable than guessing from the camera's web UI. It also shows whether the audio track is `sendonly`/`recvonly`, which matters for [two-way talk](#webrtc-and-two-way-talk). +You can view detailed stream info, including the exact video and audio codecs go2rtc negotiated with the camera, at `http://frigate_ip:5000/api/go2rtc/streams` (or `http://frigate_ip:5000/api/go2rtc/streams/back` for a single camera). This is the authoritative answer to "what is my camera actually sending?" and is far more reliable than guessing from the camera's web UI. It also shows whether the audio track is `sendonly`/`recvonly`, which matters for [two-way talk](#webrtc-and-two-way-talk). ### 4. Fix the codec with the FFmpeg module @@ -44,7 +44,7 @@ In the Frigate UI this is the **Use compatibility mode (ffmpeg)** toggle on a st 1. Navigate to and expand your camera's stream. 2. On the source you want to convert, click the **Use compatibility mode (ffmpeg)** button (the sliders icon next to the URL). This routes the source through go2rtc's FFmpeg module and reveals the transcoding options. -3. Set **Video** to **Transcode to H.264** if your browser can't play the camera's video codec (e.g. H.265). Leave it on **Copy** to pass the video through untouched — this is much cheaper and should be your default whenever only the audio needs converting. +3. Set **Video** to **Transcode to H.264** if your browser can't play the camera's video codec (e.g. H.265). Leave it on **Copy** to pass the video through untouched. This is much cheaper and should be your default whenever only the audio needs converting. 4. Set **Audio** to **Transcode to AAC** (for MSE) or **Transcode to Opus** (for WebRTC) if the camera's audio codec is unsupported. Leave it on **Copy** to keep the original, or **Exclude** to drop audio entirely. 5. When transcoding **video**, set **Hardware acceleration** to **Automatic (recommended)** so the encode runs on your GPU instead of the CPU. See [hardware-accelerated transcoding](#hardware-accelerated-transcoding-with-ffmpeg-8) for an important FFmpeg 8 caveat. 6. **Save** the section, then reload the live view. @@ -68,7 +68,7 @@ go2rtc: streams: back: - rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2 - - "ffmpeg:back#audio=aac" # audio only — preferred when the video already plays + - "ffmpeg:back#audio=aac" # audio only, preferred when the video already plays # or, to convert both video and audio: # - "ffmpeg:back#video=h264#audio=aac#hardware" ``` @@ -78,7 +78,7 @@ go2rtc: :::warning -The `#`-modifiers (`#video=`, `#audio=`, `#hardware`, `#backchannel=0`, …) **only take effect on a source that is prefixed with `ffmpeg:`**. Adding them to a bare `rtsp://…#audio=opus` source does nothing — go2rtc ignores them. Likewise, when a source references another stream by name (e.g. `ffmpeg:back#audio=aac`), the name must match the stream key **exactly** (it is case sensitive), or the transcode is silently never produced. This is the single most common configuration mistake. In the Frigate UI, the **Use compatibility mode (ffmpeg)** toggle adds the `ffmpeg:` prefix for you. +The `#`-modifiers (`#video=`, `#audio=`, `#hardware`, `#backchannel=0`, …) **only take effect on a source that is prefixed with `ffmpeg:`**. Adding them to a bare `rtsp://…#audio=opus` source does nothing: go2rtc ignores them. Likewise, when a source references another stream by name (e.g. `ffmpeg:back#audio=aac`), the name must match the stream key **exactly** (it is case sensitive), or the transcode is silently never produced. This is the single most common configuration mistake. In the Frigate UI, the **Use compatibility mode (ffmpeg)** toggle adds the `ffmpeg:` prefix for you. ::: @@ -86,13 +86,13 @@ Transcoding video is resource intensive. Always prefer `#video=copy` (the **Copy ## Live view is black, buffering, or stuck in "low-bandwidth mode" -When the live view shows a black screen, spins forever, or repeatedly drops to the lower-quality jsmpeg player ("low-bandwidth mode"), the stream almost always contains something the browser cannot decode over MSE — usually H.265 video or a non-AAC audio track. Confirm this in the go2rtc web UI (port `1984`): if MSE won't play there, Frigate can't play it either, since it uses the same pipeline. +When the live view shows a black screen, spins forever, or repeatedly drops to the lower-quality jsmpeg player ("low-bandwidth mode"), the stream almost always contains something the browser cannot decode over MSE, usually H.265 video or a non-AAC audio track. Confirm this in the go2rtc web UI (port `1984`): if MSE won't play there, Frigate can't play it either, since it uses the same pipeline. The fix is to produce an **H.264 + AAC** stream, either by changing your camera's firmware codecs or by transcoding in go2rtc (see [Fix the codec with the FFmpeg module](#4-fix-the-codec-with-the-ffmpeg-module)). A few other things worth checking: - **Set the camera's I-frame (keyframe) interval to match its frame rate** (or "1x" on Reolink), and avoid "smart"/"+" codecs like _H.264+_ or _H.265+_. A long keyframe interval delays the first decodable frame past Frigate's startup timeout, which forces the fallback to jsmpeg. See [camera settings recommendations](/configuration/live#camera-settings-recommendations). - **A spinner that never clears, even though video plays in VLC**, is often an unplayable _audio_ track stalling playback. Drop or transcode the audio (see below). -- **Remote/VPN viewing that buffers** while the LAN is fine is usually latency/jitter exceeding MSE's startup buffer — set up [WebRTC](/configuration/live#webrtc-extra-configuration), which drops late frames instead of buffering. +- **Remote/VPN viewing that buffers** while the LAN is fine is usually latency/jitter exceeding MSE's startup buffer. Set up [WebRTC](/configuration/live#webrtc-extra-configuration), which drops late frames instead of buffering. The general live-view behavior (smart streaming, the MSE → WebRTC → jsmpeg fallback chain, and how to read browser console errors) is documented in detail in the [Live view FAQ](/configuration/live#live-view-faq). @@ -151,25 +151,25 @@ Setting the camera firmware to AAC (and H.264) avoids transcoding entirely and i WebRTC is only attempted when MSE fails or when using a camera's two-way talk feature; the "All Cameras" dashboard never uses it. When it doesn't work, the cause is almost always one of: -- **Codec mismatch** — WebRTC cannot carry H.265 or AAC. The stream backing the WebRTC view must provide Opus (or PCMA/PCMU) audio and H.264 video. Add an `ffmpeg:back#audio=opus` source as shown above. -- **Port `8555` not reachable, or no candidates set** — WebRTC needs port `8555` (both TCP and UDP) open and a reachable candidate advertised. On Docker installs running on a custom/overlay network, go2rtc may advertise unreachable container IPs as ICE candidates; setting `webrtc.filters.candidates: []` and supplying only your host's LAN IP resolves this. See [WebRTC extra configuration](/configuration/live#webrtc-extra-configuration). -- **Two-way talk** additionally requires a secure context (HTTPS or the authenticated port `8971`, because browsers block microphone access on plain HTTP). The camera's RTSP backchannel must also be handled correctly — go2rtc seizes the backchannel by default, which blocks two-way audio for other consumers and can inject static. Disable it on the primary stream with `#backchannel=0` and use a separate dedicated stream for talk, as documented in [preventing go2rtc from blocking two-way audio](/configuration/restream#two-way-talk-restream). +- **Codec mismatch**: WebRTC cannot carry H.265 or AAC. The stream backing the WebRTC view must provide Opus (or PCMA/PCMU) audio and H.264 video. Add an `ffmpeg:back#audio=opus` source as shown above. +- **Port `8555` not reachable, or no candidates set**: WebRTC needs port `8555` (both TCP and UDP) open and a reachable candidate advertised. On Docker installs running on a custom/overlay network, go2rtc may advertise unreachable container IPs as ICE candidates; setting `webrtc.filters.candidates: []` and supplying only your host's LAN IP resolves this. See [WebRTC extra configuration](/configuration/live#webrtc-extra-configuration). +- **Two-way talk** additionally requires a secure context (HTTPS or the authenticated port `8971`, because browsers block microphone access on plain HTTP). The camera's RTSP backchannel must also be handled correctly: go2rtc seizes the backchannel by default, which blocks two-way audio for other consumers and can inject static. Disable it on the primary stream with `#backchannel=0` and use a separate dedicated stream for talk, as documented in [preventing go2rtc from blocking two-way audio](/configuration/restream#two-way-talk-restream). ## High CPU usage -If go2rtc is using a lot of CPU, it is almost always transcoding in software. An FFmpeg source with a codec modifier like `#video=h264` or `#audio=aac` but **no** `#hardware` re-encodes on the CPU. (Frigate's `ffmpeg.hwaccel_args` only applies to Frigate's own detect/record processes — it does _not_ accelerate go2rtc's transcodes.) +If go2rtc is using a lot of CPU, it is almost always transcoding in software. An FFmpeg source with a codec modifier like `#video=h264` or `#audio=aac` but **no** `#hardware` re-encodes on the CPU. (Frigate's `ffmpeg.hwaccel_args` only applies to Frigate's own detect/record processes. It does _not_ accelerate go2rtc's transcodes.) To keep CPU usage down: - Only transcode the track that is genuinely unsupported, and use `#video=copy` to pass video through untouched whenever possible. - When you must transcode video, always add `#hardware` (the **Automatic** hardware option in the UI) so the encode runs on the GPU. Note the [FFmpeg 8 device requirement](#hardware-accelerated-transcoding-with-ffmpeg-8) below. -- Don't restream a high-resolution main stream just to feed the live view — even with `#video=copy`, muxing a 4K/8MP+ stream is inherently expensive. Use the camera's lower-resolution substream for live and detect, and let Frigate pull the main stream directly for recording. +- Don't restream a high-resolution main stream just to feed the live view: even with `#video=copy`, muxing a 4K/8MP+ stream is inherently expensive. Use the camera's lower-resolution substream for live and detect, and let Frigate pull the main stream directly for recording. ## Connection, authentication, and complex passwords -If go2rtc logs `401 Unauthorized` for a URL that works in VLC, the password almost certainly contains reserved URL characters. **Frigate URL-encodes passwords for its own `cameras.ffmpeg.inputs`, but it does not touch what you write under `go2rtc.streams`** — go2rtc parses that URL itself. You must URL-encode special characters yourself in the `go2rtc.streams` section (`@` → `%40`, `#` → `%23`, `?` → `%3F`, `%` → `%25`, etc.). +If go2rtc logs `401 Unauthorized` for a URL that works in VLC, the password almost certainly contains reserved URL characters. **Frigate URL-encodes passwords for its own `cameras.ffmpeg.inputs`, but it does not touch what you write under `go2rtc.streams`**: go2rtc parses that URL itself. You must URL-encode special characters yourself in the `go2rtc.streams` section (`@` → `%40`, `#` → `%23`, `?` → `%3F`, `%` → `%25`, etc.). -Note the asymmetry: under `cameras.ffmpeg.inputs` you should use the **raw** password (Frigate encodes it for you) — pre-encoding it there causes a double-encode and fails. See [Handling Complex Passwords](/configuration/restream#handling-complex-passwords). +Note the asymmetry: under `cameras.ffmpeg.inputs` you should use the **raw** password (Frigate encodes it for you). Pre-encoding it there causes a double-encode and fails. See [Handling Complex Passwords](/configuration/restream#handling-complex-passwords). Repeated `401`/`Connection refused` errors can also mean the camera hit its **concurrent connection limit** or triggered a login lockout. Routing all roles through a single [RTSP restream](/configuration/restream#reduce-connections-to-camera) means the camera only ever sees one connection from go2rtc. @@ -180,26 +180,26 @@ A surprising number of "the better live options aren't available" or `404 Not Fo - the **go2rtc stream key** (`go2rtc.streams.`), - any `ffmpeg:#…` source that references it, - the camera's restream input path (`rtsp://127.0.0.1:8554/`), and -- the camera name itself (so Frigate auto-maps it for MSE/WebRTC) — or an explicit `live -> streams` mapping pointing at the go2rtc stream **name** (never a path). +- the camera name itself (so Frigate auto-maps it for MSE/WebRTC), or an explicit `live -> streams` mapping pointing at the go2rtc stream **name** (never a path). -If you rename or remove a go2rtc stream while experimenting and the live stream selector then shows a blank entry, clear your browser's site data for the Frigate URL — the selected stream is cached per-device in local storage. +If you rename or remove a go2rtc stream while experimenting and the live stream selector then shows a blank entry, clear your browser's site data for the Frigate URL. The selected stream is cached per-device in local storage. ## Camera-specific behavior Several camera brands have well-known quirks with go2rtc. Rather than repeat them here, see the [camera-specific configuration](/configuration/camera_specific) page, which covers them in detail. The highlights: -- **Reolink** — RTSP is unreliable on many models; the **http-flv** stream through the FFmpeg module is recommended, and you must enable HTTP/RTMP in the camera and **reboot** it. 6MP+ models stream H.265 over http-flv-enhanced, which requires FFmpeg 8.0. See [Reolink Cameras](/configuration/camera_specific#reolink-cameras). -- **TP-Link Tapo** — use go2rtc's native `tapo://` source for stability and two-way audio; a stale RTSP credential can often be revived by clicking play once in the go2rtc web UI. -- **Ubiquiti/UniFi Protect** — use the `rtspx://` scheme (not `rtsps://…?enableSrtp`). -- **Amcrest/Dahua** — use the `/cam/realmonitor?channel=1&subtype=N` scheme, where `subtype=0` is the main stream. See [Amcrest & Dahua](/configuration/camera_specific#amcrest--dahua). +- **Reolink**: RTSP is unreliable on many models; the **http-flv** stream through the FFmpeg module is recommended, and you must enable HTTP/RTMP in the camera and **reboot** it. 6MP+ models stream H.265 over http-flv-enhanced, which requires FFmpeg 8.0. See [Reolink Cameras](/configuration/camera_specific#reolink-cameras). +- **TP-Link Tapo**: use go2rtc's native `tapo://` source for stability and two-way audio; a stale RTSP credential can often be revived by clicking play once in the go2rtc web UI. +- **Ubiquiti/UniFi Protect**: use the `rtspx://` scheme (not `rtsps://…?enableSrtp`). +- **Amcrest/Dahua**: use the `/cam/realmonitor?channel=1&subtype=N` scheme, where `subtype=0` is the main stream. See [Amcrest & Dahua](/configuration/camera_specific#amcrest--dahua). ## Non-RTSP sources and the FFmpeg module -go2rtc's native zero-copy handling only supports well-formed RTSP H.264/H.265. Anything else — MJPEG, HTTP/HTTP-FLV, RTMP, or unusual codecs — must be handed to the FFmpeg module by prefixing the source with `ffmpeg:`. This is also necessary for some camera streams to be parsed at all, at the cost of slightly slower startup. MJPEG and other non-H.264 sources additionally need `#video=h264` (with `#hardware`) before they can be used for the `record`, `detect`, or restream roles. See [MJPEG Cameras](/configuration/camera_specific#mjpeg-cameras) for a complete example. +go2rtc's native zero-copy handling only supports well-formed RTSP H.264/H.265. Anything else (MJPEG, HTTP/HTTP-FLV, RTMP, or unusual codecs) must be handed to the FFmpeg module by prefixing the source with `ffmpeg:`. This is also necessary for some camera streams to be parsed at all, at the cost of slightly slower startup. MJPEG and other non-H.264 sources additionally need `#video=h264` (with `#hardware`) before they can be used for the `record`, `detect`, or restream roles. See [MJPEG Cameras](/configuration/camera_specific#mjpeg-cameras) for a complete example. ## Hardware-accelerated transcoding with FFmpeg 8 -Frigate 0.18 ships **FFmpeg 8.0** as the default, and FFmpeg 8 is stricter about hardware-accelerated filtering than earlier versions. Whenever go2rtc transcodes video with hardware acceleration (any source using `#hardware`, `#hardware=vaapi`, or the **Automatic** hardware option in the UI), it builds a filter chain that uploads frames to the GPU with the `hwupload` filter. FFmpeg 8 now refuses to do this unless it is told **which device** to use — earlier versions selected one automatically. The result is that an otherwise-working transcode fails to start, the live view never loads, and go2rtc logs: +Frigate 0.18 ships **FFmpeg 8.0** as the default, and FFmpeg 8 is stricter about hardware-accelerated filtering than earlier versions. Whenever go2rtc transcodes video with hardware acceleration (any source using `#hardware`, `#hardware=vaapi`, or the **Automatic** hardware option in the UI), it builds a filter chain that uploads frames to the GPU with the `hwupload` filter. FFmpeg 8 now refuses to do this unless it is told **which device** to use. Earlier versions selected one automatically. The result is that an otherwise-working transcode fails to start, the live view never loads, and go2rtc logs: ``` [hwupload] A hardware device reference is required to upload frames to. @@ -207,7 +207,7 @@ Frigate 0.18 ships **FFmpeg 8.0** as the default, and FFmpeg 8 is stricter about Error opening output files: Invalid argument ``` -The fix is to tell go2rtc's bundled FFmpeg which hardware device to use via the `go2rtc -> ffmpeg -> global` option. For **VAAPI**-based acceleration — which covers most Intel and AMD GPUs, and is what go2rtc selects automatically on that hardware — point it at your render device: +The fix is to tell go2rtc's bundled FFmpeg which hardware device to use via the `go2rtc -> ffmpeg -> global` option. For **VAAPI**-based acceleration (which covers most Intel and AMD GPUs, and is what go2rtc selects automatically on that hardware), point it at your render device: ```yaml go2rtc: @@ -230,6 +230,6 @@ If you don't transcode in go2rtc with hardware acceleration, this does not affec ## Home Assistant and port access -When running Frigate as a Home Assistant add-on, the go2rtc API (port `1984`), the RTSP restream (port `8554`), and WebRTC (port `8555`) are **disabled and hidden by default**. To use them — for example to reach the go2rtc web interface for troubleshooting, or to open a go2rtc stream externally in an app like VLC — go to , click **Show disabled ports**, enable the port you need, and save. Use the host's IP address rather than an mDNS name like `homeassistant.local`. +When running Frigate as a Home Assistant add-on, the go2rtc API (port `1984`), the RTSP restream (port `8554`), and WebRTC (port `8555`) are **disabled and hidden by default**. To use them (for example to reach the go2rtc web interface for troubleshooting, or to open a go2rtc stream externally in an app like VLC), go to , click **Show disabled ports**, enable the port you need, and save. Use the host's IP address rather than an mDNS name like `homeassistant.local`. -If live view works in the Frigate UI but not in Home Assistant, the most common cause is the go2rtc stream name not matching the camera name — name the primary go2rtc stream exactly like the camera, or add a `live -> streams` mapping, so the integration can resolve the restream. +If live view works in the Frigate UI but not in Home Assistant, the most common cause is the go2rtc stream name not matching the camera name: name the primary go2rtc stream exactly like the camera, or add a `live -> streams` mapping, so the integration can resolve the restream. diff --git a/docs/docs/troubleshooting/gpu.md b/docs/docs/troubleshooting/gpu.md index fc352fd53..a39386bfa 100644 --- a/docs/docs/troubleshooting/gpu.md +++ b/docs/docs/troubleshooting/gpu.md @@ -16,7 +16,7 @@ Some users have reported issues using some Intel iGPUs with OpenVINO, where the ### Hardware acceleration is not being used -For VAAPI or QSV to work, the GPU's render device must be passed through to the Frigate container. Intel and AMD GPUs expose this as a render node under `/dev/dri`, usually `/dev/dri/renderD128`. If it is not passed through, hardware acceleration is unavailable — ffmpeg fails to initialize it (for example `Failed to open the drm device` or `No VA display found for device`) and GPU usage stays at zero while CPU usage remains high. +For VAAPI or QSV to work, the GPU's render device must be passed through to the Frigate container. Intel and AMD GPUs expose this as a render node under `/dev/dri`, usually `/dev/dri/renderD128`. If it is not passed through, hardware acceleration is unavailable: ffmpeg fails to initialize it (for example `Failed to open the drm device` or `No VA display found for device`) and GPU usage stays at zero while CPU usage remains high. Pass the render device through when starting the container. With `docker compose`: @@ -31,8 +31,8 @@ Or with `docker run`, add `--device /dev/dri/renderD128`. See the [installation If it still isn't working after passing the device through: -- **Confirm the render node exists and is the correct one.** Run `ls /dev/dri` on the host — you should see one or more `renderD12X` entries. Systems with more than one GPU (an Intel iGPU plus a discrete GPU) can expose both `/dev/dri/renderD128` and `/dev/dri/renderD129`, and the numbering is not guaranteed. Pass through the correct node, or map the entire directory (`/dev/dri:/dev/dri`, or `--device /dev/dri`) so all render nodes are available. -- **Check device permissions.** The Frigate process must be able to access the render node. This is usually automatic when the container runs as root (the default), but nested setups such as an unprivileged Proxmox/LXC container often require making the device accessible on the host (for example, a world-readable render node) or running the container privileged. Note that running Frigate inside an LXC is not officially supported — see the [installation docs](/frigate/installation#proxmox) for details. +- **Confirm the render node exists and is the correct one.** Run `ls /dev/dri` on the host. You should see one or more `renderD12X` entries. Systems with more than one GPU (an Intel iGPU plus a discrete GPU) can expose both `/dev/dri/renderD128` and `/dev/dri/renderD129`, and the numbering is not guaranteed. Pass through the correct node, or map the entire directory (`/dev/dri:/dev/dri`, or `--device /dev/dri`) so all render nodes are available. +- **Check device permissions.** The Frigate process must be able to access the render node. This is usually automatic when the container runs as root (the default), but nested setups such as an unprivileged Proxmox/LXC container often require making the device accessible on the host (for example, a world-readable render node) or running the container privileged. Note that running Frigate inside an LXC is not officially supported. See the [installation docs](/frigate/installation#proxmox) for details. ### Failed to download frame: -5 @@ -53,4 +53,4 @@ This is a hardware frame synchronization failure between ffmpeg and the GPU driv - **Use a codec that decodes more reliably.** H.265/HEVC streams may trigger this error far more often than H.264 depending on your CPU generation. If your camera exposes a separate sub-stream, assign an H.264 stream to the `detect` role. Cameras that output full-range YUV (for example some Hikvision models) are especially prone to it. - **Match the detect resolution to the stream resolution.** When the `detect` resolution differs from the stream, Frigate inserts a GPU scaling filter (`scale_vaapi`), which is where these surface-sync failures can often originate. Set the `detect` `width` and `height` to match the exact resolution of the stream assigned the `detect` role. - **Match the detect `fps` to the camera stream.** Aggressively dropping frames (for example `detect` `fps: 1` on a stream that runs at 15 fps) can cause timing mismatches in the GPU's frame buffer. Lower the sub-stream's frame rate on the camera itself instead of dropping most frames in Frigate. -- **Fall back to software decoding.** If none of the above resolve it, remove the preset for that camera (`hwaccel_args: []`). Hardware decoding is only an optimization — on a capable CPU, software-decoding a low-resolution sub-stream is inexpensive and gives a stable detect pipeline. +- **Fall back to software decoding.** If none of the above resolve it, remove the preset for that camera (`hwaccel_args: []`). Hardware decoding is only an optimization. On a capable CPU, software-decoding a low-resolution sub-stream is inexpensive and gives a stable detect pipeline. diff --git a/docs/docs/troubleshooting/recordings.md b/docs/docs/troubleshooting/recordings.md index 60e4ca029..8acf0f5db 100644 --- a/docs/docs/troubleshooting/recordings.md +++ b/docs/docs/troubleshooting/recordings.md @@ -5,7 +5,7 @@ title: Recordings Errors ## Why are my recordings not working? (empty Recordings, "No recordings found for this time") -If Frigate shows live video but the History view is empty, or you see "No recordings found for this time", the cause is almost always in one of the three categories below. Segments are first written to the RAM cache and are only moved to disk if they match a retention policy _and_ the camera's `record` stream is producing valid, storable video. Work through the categories in order — retention configuration is by far the most common cause. +If Frigate shows live video but the History view is empty, or you see "No recordings found for this time", the cause is almost always in one of the three categories below. Segments are first written to the RAM cache and are only moved to disk if they match a retention policy _and_ the camera's `record` stream is producing valid, storable video. Work through the categories in order: retention configuration is by far the most common cause. Before diving in, enable debug logging for the recording maintainer so you can see whether segments are being written to disk at all: @@ -21,7 +21,7 @@ A healthy camera logs lines like `Copied /media/frigate/recordings/{segment_path #### Recording is enabled, but nothing is saved -This is the single most common cause. Setting `record.enabled: True` on its own does **not** keep any footage — **continuous recording is disabled by default**, and segments in the cache are only moved to disk if they match a configured retention policy. You must configure at least one of `continuous`, `motion`, `alerts`, or `detections` retention. +This is the single most common cause. Setting `record.enabled: True` on its own does **not** keep any footage: **continuous recording is disabled by default**, and segments in the cache are only moved to disk if they match a configured retention policy. You must configure at least one of `continuous`, `motion`, `alerts`, or `detections` retention. To store all video (the most conservative option), configure continuous retention: @@ -59,7 +59,7 @@ Configuration keys change between major versions. The old `clips` config, for ex #### Incompatible audio codec (recordings silently fail to save) -Frigate stores recordings in an MP4 container, and some camera audio codecs — most commonly `pcm_alaw`, `pcm_mulaw`, or other G.711 variants — **cannot be placed in an MP4 container**. When this happens, ffmpeg fails to write the segment and no recording is saved, even though the live view works fine. This is a frequent cause on Tapo, TP-Link VIGI, and some Reolink cameras. +Frigate stores recordings in an MP4 container, and some camera audio codecs (most commonly `pcm_alaw`, `pcm_mulaw`, or other G.711 variants) **cannot be placed in an MP4 container**. When this happens, ffmpeg fails to write the segment and no recording is saved, even though the live view works fine. This is a frequent cause on Tapo, TP-Link VIGI, and some Reolink cameras. Transcode the audio to AAC (or drop it entirely) using the appropriate [ffmpeg preset](/configuration/ffmpeg_presets): @@ -79,21 +79,21 @@ A message like `No new recording segments were created for in the last - Confirm a stream is actually assigned the `record` role in your camera's `ffmpeg.inputs`. - Open the go2rtc web interface on port `1984` and click each stream to confirm it plays. go2rtc errors such as `wrong response on DESCRIBE` or `start from CONN state` indicate the camera connection is failing. - Test the exact RTSP URL (with the correct path, port, and credentials) in VLC or `ffplay`. -- If you restream through go2rtc, make sure the `record` input path points at the correct go2rtc stream name — copying a config between cameras without updating the stream name is a common mistake. +- If you restream through go2rtc, make sure the `record` input path points at the correct go2rtc stream name. Copying a config between cameras without updating the stream name is a common mistake. #### Recordings play back with no video (or won't play at all) -Frigate copies the `record` stream directly without re-encoding, so playback depends on your browser supporting the camera's codec. H265/HEVC recordings may not be playable in some browsers. If recordings appear as audio-only or a black screen, your camera is likely sending a codec your browser can't decode — configure the camera to output **H264** for maximum compatibility. +Frigate copies the `record` stream directly without re-encoding, so playback depends on your browser supporting the camera's codec. H265/HEVC recordings may not be playable in some browsers. If recordings appear as audio-only or a black screen, your camera is likely sending a codec your browser can't decode. Configure the camera to output **H264** for maximum compatibility. #### Segments are only ~1 second long -If the record stream uses a "Smart Codec"/H.264+ mode or changes encoding parameters mid-stream, corrupt timestamps cause segments to be split far too frequently and fill the cache. This produces the "Too many unprocessed recording segments" warning — see [that section below](#i-see-the-message-warning--too-many-unprocessed-recording-segments-in-cache-for-camera-this-likely-indicates-an-issue-with-the-detect-stream) for the full diagnosis. +If the record stream uses a "Smart Codec"/H.264+ mode or changes encoding parameters mid-stream, corrupt timestamps cause segments to be split far too frequently and fill the cache. This produces the "Too many unprocessed recording segments" warning. See [that section below](#i-see-the-message-warning--too-many-unprocessed-recording-segments-in-cache-for-camera-this-likely-indicates-an-issue-with-the-detect-stream) for the full diagnosis. ### Storage and mounting issues #### The storage volume isn't mounted correctly -If the recordings volume (`/media/frigate`) points at the wrong location, isn't writable, or a network/encrypted mount failed to mount at boot, Frigate cannot save recordings — or it silently writes to the boot drive and then purges aggressively because the drive appears far smaller than expected. +If the recordings volume (`/media/frigate`) points at the wrong location, isn't writable, or a network/encrypted mount failed to mount at boot, Frigate cannot save recordings, or it silently writes to the boot drive and then purges aggressively because the drive appears far smaller than expected. - Compare the host's real capacity (`df -h`) against what the **Storage** page in the Frigate UI reports. A mismatch (for example Frigate reporting ~220 GB when your storage drive is 4 TB) means the bind mount is resolving to the wrong filesystem. - Verify the host path in your Docker `volumes` mapping (`- /your/storage:/media/frigate`) exists and is writable by the container. @@ -112,7 +112,7 @@ You'll want to: ## I see the message: WARNING : Unable to keep up with recording segments in cache for camera. Keeping the 5 most recent segments out of 6 and discarding the rest... -This warning means the recording maintainer cannot move recording segments from the RAM cache to disk fast enough. When the cache fills up, Frigate discards the oldest segments to avoid running out of memory and crashing — so you lose recorded footage. This is almost always a storage throughput or system resource problem. Work through the steps below to identify which. +This warning means the recording maintainer cannot move recording segments from the RAM cache to disk fast enough. When the cache fills up, Frigate discards the oldest segments to avoid running out of memory and crashing, so you lose recorded footage. This is almost always a storage throughput or system resource problem. Work through the steps below to identify which. ### Step 1: Enable recording debug logging @@ -136,8 +136,8 @@ Let this run until the warnings begin to appear, so you can confirm whether the The copy duration tells you which direction to investigate: -- **Consistently longer than ~1 second** — your storage cannot keep up with the incoming recordings. Continue with Steps 3–5 to diagnose the slow storage. -- **Consistently well under 1 second** — storage is fast enough, and the problem is more likely CPU or resource contention. Skip to Step 6. +- **Consistently longer than ~1 second**: your storage cannot keep up with the incoming recordings. Continue with Steps 3–5 to diagnose the slow storage. +- **Consistently well under 1 second**: storage is fast enough, and the problem is more likely CPU or resource contention. Skip to Step 6. ### Step 3: Check RAM, swap, cache, and disk utilization @@ -177,7 +177,7 @@ NOTE: These are hard limits for the container, so be sure there is enough headro ### Step 4: Check your storage type -Mounting a network share is a popular option for storing recordings, but it can lead to reduced copy times and cause problems. Some users have found that using `NFS` instead of `SMB` considerably decreased copy times and fixed the issue. It is also important to ensure that the network connection between the device running Frigate and the network share is stable and fast — a saturated or unreliable link will stall copies. +Mounting a network share is a popular option for storing recordings, but it can lead to reduced copy times and cause problems. Some users have found that using `NFS` instead of `SMB` considerably decreased copy times and fixed the issue. It is also important to ensure that the network connection between the device running Frigate and the network share is stable and fast. A saturated or unreliable link will stall copies. ### Step 5: Check your mount options @@ -185,11 +185,11 @@ Some users found that mounting a drive via `fstab` with the `sync` option dramat ### Step 6: Rule out CPU load -If the copy times are consistently under 1 second but you still see the warning, the machine's CPU load is likely too high for Frigate to have the resources to keep up. Try temporarily shutting down other services — and any resource-intensive Frigate features — to see if the issue improves. +If the copy times are consistently under 1 second but you still see the warning, the machine's CPU load is likely too high for Frigate to have the resources to keep up. Try temporarily shutting down other services, and any resource-intensive Frigate features, to see if the issue improves. ## I see the message: WARNING : Too many unprocessed recording segments in cache for camera. This likely indicates an issue with the detect stream... -This warning means that the detect stream for the affected camera has fallen behind or stopped processing frames. Frigate's recording cache holds segments waiting to be analyzed by the detector — when more than 6 segments pile up without being processed, Frigate discards the oldest ones to prevent the cache from filling up. +This warning means that the detect stream for the affected camera has fallen behind or stopped processing frames. Frigate's recording cache holds segments waiting to be analyzed by the detector. When more than 6 segments pile up without being processed, Frigate discards the oldest ones to prevent the cache from filling up. :::warning @@ -199,7 +199,7 @@ This error is a **symptom**, not the root cause. The actual cause is always logg ### Step 1: Get the full logs -Collect complete Frigate logs from startup through the first occurrence of the error. Look for errors or warnings that appear **before** the "Too many unprocessed" messages begin — that is where the root cause will be found. +Collect complete Frigate logs from startup through the first occurrence of the error. Look for errors or warnings that appear **before** the "Too many unprocessed" messages begin. That is where the root cause will be found. ### Step 2: Check the cache directory @@ -223,9 +223,9 @@ If segments are only ~1 second instead of ~10 seconds, the camera is sending cor **Common causes of short segments:** -- **"Smart Codec" or "Smart+" enabled on the camera** — These features dynamically change encoding parameters mid-stream, which corrupts timestamps. Disable them in your camera's settings. -- **Changing codec, bitrate, or resolution mid-stream** — Any encoding changes during an active stream can cause unpredictable segment splitting. -- **Camera firmware bugs** — Check for firmware updates from your camera manufacturer. +- **"Smart Codec" or "Smart+" enabled on the camera**: These features dynamically change encoding parameters mid-stream, which corrupts timestamps. Disable them in your camera's settings. +- **Changing codec, bitrate, or resolution mid-stream**: Any encoding changes during an active stream can cause unpredictable segment splitting. +- **Camera firmware bugs**: Check for firmware updates from your camera manufacturer. :::tip @@ -237,10 +237,10 @@ You don't have to run `ffprobe` by hand to catch this. Open a camera's **Camera If the detect stream is not processing frames, segments will accumulate. Common causes: -- **Detection resolution too high** — Use a substream for detection, not the full resolution main stream. -- **Detection FPS too high** — 5 fps is the recommended maximum for detection. -- **Model too large** — Use smaller model variants (e.g., YOLO `s` or `t` size, not `e` or `x`). Use 320x320 input size rather than 640x640 unless you have a powerful dedicated detector. -- **Virtualization** — Running Frigate in a VM (especially Proxmox) can cause the detector to hang or stall. This is a known issue with GPU/TPU passthrough in virtualized environments and is not something Frigate can fix. Running Frigate in Docker on bare metal is recommended. +- **Detection resolution too high**: Use a substream for detection, not the full resolution main stream. +- **Detection FPS too high**: 5 fps is the recommended maximum for detection. +- **Model too large**: Use smaller model variants (e.g., YOLO `s` or `t` size, not `e` or `x`). Use 320x320 input size rather than 640x640 unless you have a powerful dedicated detector. +- **Virtualization**: Running Frigate in a VM (especially Proxmox) can cause the detector to hang or stall. This is a known issue with GPU/TPU passthrough in virtualized environments and is not something Frigate can fix. Running Frigate in Docker on bare metal is recommended. ### Step 5: Check for GPU hangs @@ -258,7 +258,7 @@ An incorrect `hwaccel_args` preset can cause ffmpeg to fail silently or consume - After upgrading Frigate, verify your preset matches your hardware (e.g., `preset-intel-qsv-h264` instead of the deprecated `preset-vaapi`). - For h265 cameras, use the corresponding h265 preset (e.g., `preset-intel-qsv-h265`). -- Note that `hwaccel_args` are only relevant for the detect stream — Frigate does not decode the record stream. +- Note that `hwaccel_args` are only relevant for the detect stream. Frigate does not decode the record stream. ### Step 7: Verify go2rtc stream configuration @@ -268,20 +268,20 @@ Ensure that the ffmpeg source names in your go2rtc configuration match the corre If none of the above apply, the issue may be a general resource constraint. Monitor the following on your host: -- **CPU usage** — An overloaded CPU can prevent the detector from keeping up. -- **RAM and swap** — Excessive swapping dramatically slows all I/O operations. -- **Disk I/O** — Use `iotop` or `iostat` to check for saturation. -- **Storage space** — Verify you have free space on the Frigate storage volume (check the Storage page in the Frigate UI). +- **CPU usage**: An overloaded CPU can prevent the detector from keeping up. +- **RAM and swap**: Excessive swapping dramatically slows all I/O operations. +- **Disk I/O**: Use `iotop` or `iostat` to check for saturation. +- **Storage space**: Verify you have free space on the Frigate storage volume (check the Storage page in the Frigate UI). Try temporarily disabling resource-intensive features like `genai` and `face_recognition` to see if the issue resolves. This can help isolate whether the detector is being starved of resources. ## I see the message: ERROR : Error occurred when attempting to maintain recording cache -This message means the recording maintainer hit an error while moving segments from the cache to disk. It is a **generic wrapper** — the actual cause is always logged on the **very next line**. Frigate usually recovers and keeps running, but any affected segments are lost, so it is worth resolving. +This message means the recording maintainer hit an error while moving segments from the cache to disk. It is a **generic wrapper**: the actual cause is always logged on the **very next line**. Frigate usually recovers and keeps running, but any affected segments are lost, so it is worth resolving. :::warning -Always read the line immediately following this message. `Error occurred when attempting to maintain recording cache` on its own tells you nothing; the exception on the next line — for example `[Errno 28] No space left on device` or `[Errno 17] File exists` — is the real problem. +Always read the line immediately following this message. `Error occurred when attempting to maintain recording cache` on its own tells you nothing; the exception on the next line (for example `[Errno 28] No space left on device` or `[Errno 17] File exists`) is the real problem. ::: @@ -292,7 +292,7 @@ Because these are operating-system-level errors, they must be resolved on the ** The filesystem Frigate is writing to is full. Things to check: - **The recordings volume is genuinely full.** Check free space on the host with `df -h` for the path mapped to `/media/frigate`, and review the **Storage** page in the Frigate UI. -- **The disk shows free space but is still "full".** This usually means the filesystem has run out of **inodes** (check with `df -i`), or recordings are landing on a different, smaller filesystem than you expect because of an incorrect bind mount — see [The storage volume isn't mounted correctly](#the-storage-volume-isnt-mounted-correctly) above. +- **The disk shows free space but is still "full".** This usually means the filesystem has run out of **inodes** (check with `df -i`), or recordings are landing on a different, smaller filesystem than you expect because of an incorrect bind mount. See [The storage volume isn't mounted correctly](#the-storage-volume-isnt-mounted-correctly) above. - **`/tmp/cache` is full.** If you mounted `/tmp/cache` as a small `tmpfs`, a backlog of segments can fill it. Increase the tmpfs size, or address whatever is causing segments to pile up (see the [Too many unprocessed recording segments](#i-see-the-message-warning--too-many-unprocessed-recording-segments-in-cache-for-camera-this-likely-indicates-an-issue-with-the-detect-stream) section above). - **The host blocks writes before Frigate can purge.** On some systems (for example Unraid with a fill-up threshold), the host stops writes before Frigate's emergency cleanup can run. Leave more headroom on the volume, or lower your retention so Frigate purges sooner. @@ -300,7 +300,7 @@ The filesystem Frigate is writing to is full. Things to check: Errors like `[Errno 17] File exists: '/media/frigate/recordings/.../'`, often alongside ffmpeg errors such as `Unable to re-open ... output file for shifting data` or `Error writing trailer: No such file or directory`, are a hallmark of an **unreliable network share** (NFS or SMB). The mount is dropping, serving stale directory entries, or mishandling file locking. -- Confirm the network connection to the NAS is stable and fast — an intermittent link produces these errors sporadically. +- Confirm the network connection to the NAS is stable and fast. An intermittent link produces these errors sporadically. - Prefer **NFS over SMB** for the recordings mount; several users have found NFS more reliable and faster. - Review your `fstab`/mount options for settings that hurt consistency or performance (see the `sync` vs `async` note in the [Unable to keep up with recording segments](#i-see-the-message-warning--unable-to-keep-up-with-recording-segments-in-cache-for-camera-keeping-the-5-most-recent-segments-out-of-6-and-discarding-the-rest) section above). - Enable `frigate.record.maintainer` debug logging to confirm whether the errors line up with the share becoming unavailable. diff --git a/docs/docs/usage/explore.md b/docs/docs/usage/explore.md index 8fe530b1c..0966f9793 100644 --- a/docs/docs/usage/explore.md +++ b/docs/docs/usage/explore.md @@ -11,13 +11,13 @@ This page describes how to _use_ the Explore view. For how the underlying featur :::tip -If you just want to quickly see what happened on your cameras, it's recommended to use [Review](/usage/review) rather than Explore. Review groups overlapping and adjacent activity on a camera into **review items** and sorts them into Alerts, Detections, and Motion, so you can scan and play back footage in a few clicks instead of sifting through individual objects. Reach for Explore when you need to find a _specific_ tracked object after the fact — by label, time, zone, or description. +If you just want to quickly see what happened on your cameras, it's recommended to use [Review](/usage/review) rather than Explore. Review groups overlapping and adjacent activity on a camera into **review items** and sorts them into Alerts, Detections, and Motion, so you can scan and play back footage in a few clicks instead of sifting through individual objects. Reach for Explore when you need to find a _specific_ tracked object after the fact: by label, time, zone, or description. ::: ## Browsing tracked objects -The default view shows your most recent tracked objects grouped into rows by label — _Person_, _Car_, _Dog_, and so on — each row labeled with the object type and a count. The arrow at the end of a row opens the full, filterable grid for that label. +The default view shows your most recent tracked objects grouped into rows by label (_Person_, _Car_, _Dog_, and so on), each row labeled with the object type and a count. The arrow at the end of a row opens the full, filterable grid for that label. Clicking a thumbnail opens its [detail dialog](#tracked-object-details); right-clicking or long-pressing a thumbnail opens an [actions menu](#actions-and-bulk-selection). You can switch to a denser grid layout and adjust the number of columns from the view's settings. @@ -25,8 +25,8 @@ Clicking a thumbnail opens its [detail dialog](#tracked-object-details); right-c When [Semantic Search](/configuration/semantic_search) is enabled, a search bar appears that combines two things in one input: -- **Natural-language search** — type a free-text query and press Enter to run a semantic search over your tracked objects. -- **Filter tokens** — type a `key:` to get suggestions, then a value, to add a structured filter. Each filter becomes a removable chip, and you can chain several together. +- **Natural-language search**: type a free-text query and press Enter to run a semantic search over your tracked objects. +- **Filter tokens**: type a `key:` to get suggestions, then a value, to add a structured filter. Each filter becomes a removable chip, and you can chain several together. You can save a search with the star icon and reload it later, and clear everything with the clear-search icon. A help popover explains the token syntax, for example: @@ -68,12 +68,12 @@ Natural-language search, thumbnail search, and description search all require [S Selecting an object opens the **Tracked Object Details** dialog. Use the arrows (or the left/right keys) to step to the previous or next object. The dialog has two tabs: -- **Snapshot** or **Thumbnail** — the saved snapshot (or thumbnail). -- **Tracking Details** — the object's lifecycle, available when the object has a recording. It lists each significant moment (detected, entered a zone, became active or stationary, left, and so on); clicking a moment plays that part of the recording with the bounding box overlaid. A settings popover lets you show all zones and adjust the annotation offset. +- **Snapshot** or **Thumbnail**: the saved snapshot (or thumbnail). +- **Tracking Details**: the object's lifecycle, available when the object has a recording. It lists each significant moment (detected, entered a zone, became active or stationary, left, and so on); clicking a moment plays that part of the recording with the bounding box overlaid. A settings popover lets you show all zones and adjust the annotation offset. The details pane shows the object's **label**, **scores**, **camera**, **timestamp**, estimated **speed**, any **recognized license plate** and **classification attributes**, and its **description**. Admins can edit the sub label, license plate, and attributes inline. -The **description** can be edited by hand, and — when [Generative AI descriptions](/configuration/genai/genai_objects) are enabled and the object's lifecycle has ended — regenerated from the snapshot or from thumbnails. For `speech` objects, a **Transcribe** action is available when audio transcription is enabled. When [Frigate+](/integrations/plus) is enabled, admins can submit a snapshot to improve their model directly from this pane. +The **description** can be edited by hand, and, when [Generative AI descriptions](/configuration/genai/genai_objects) are enabled and the object's lifecycle has ended, regenerated from the snapshot or from thumbnails. For `speech` objects, a **Transcribe** action is available when audio transcription is enabled. When [Frigate+](/integrations/plus) is enabled, admins can submit a snapshot to improve their model directly from this pane. ## Actions and bulk selection diff --git a/docs/docs/usage/exports.md b/docs/docs/usage/exports.md index 91b901c78..a593374b3 100644 --- a/docs/docs/usage/exports.md +++ b/docs/docs/usage/exports.md @@ -5,7 +5,7 @@ title: Exports **Exports** are how you keep a specific piece of footage permanently. -Frigate's recordings are governed by your [retention settings](/configuration/record): once footage ages past its retention window — or, depending on your configuration, once it is only kept where motion, alerts, or detections occurred — it is deleted to free up disk space. An **export** saves a copy of a chosen time range to a separate location that is **never removed by retention**, so it stays available until you delete it yourself. +Frigate's recordings are governed by your [retention settings](/configuration/record): once footage ages past its retention window (or, depending on your configuration, once it is only kept where motion, alerts, or detections occurred), it is deleted to free up disk space. An **export** saves a copy of a chosen time range to a separate location that is **never removed by retention**, so it stays available until you delete it yourself. This is the answer to the common question _"how do I stop Frigate from deleting an important clip?"_ Instead of increasing retention for an entire camera (which uses far more storage to protect a single moment), export just the footage you want to keep. @@ -19,8 +19,8 @@ Exports are stored under `/media/frigate/exports`, separate from your recordings There are a few ways to create an export: -- **From Review** — select (right click or long-press) an individual review item directly, and choose Export from the header menu. You can also select multiple review items and export them all at once, optionally grouping them into a [case](#cases). -- **From History** — open the **Actions** menu and choose **Export**. You can export a preset duration (the last 1, 4, 8, 12, or 24 hours), enter a custom start and end time, or select a range directly on the timeline. A **multi-camera** option lets you export the same time range across several cameras at once. +- **From Review**: select (right click or long-press) an individual review item directly, and choose Export from the header menu. You can also select multiple review items and export them all at once, optionally grouping them into a [case](#cases). +- **From History**: open the **Actions** menu and choose **Export**. You can export a preset duration (the last 1, 4, 8, 12, or 24 hours), enter a custom start and end time, or select a range directly on the timeline. A **multi-camera** option lets you export the same time range across several cameras at once. In every case you can give the export a name. Frigate then saves the footage from your recordings as a single video file. Larger ranges take time to process; the export is marked _in progress_ until it finishes, and you can keep using Frigate while it runs. @@ -30,14 +30,14 @@ All of your exports live on the **Exports** page, reachable from the main naviga - **Play** it in the browser, - **Download** it to save the footage outside of Frigate, -- **Share** it — copies a direct link to the export (or uses your device's share sheet), +- **Share** it: copies a direct link to the export (or uses your device's share sheet), - **Rename** it, and -- **Delete** it — deleting is the only way an export is removed. +- **Delete** it: deleting is the only way an export is removed. You can also select multiple exports at once to **delete** them in bulk, or to **add them to** (or **remove them from**) a [case](#cases). ## Cases -A **case** groups related exports together — for example, all the clips from a single incident across multiple cameras. On the **Exports** page you can create a case with a name and description, add existing exports to it (or create a new case while exporting), and **download the entire case as a single archive** to hand off as one package. +A **case** groups related exports together: for example, all the clips from a single incident across multiple cameras. On the **Exports** page you can create a case with a name and description, add existing exports to it (or create a new case while exporting), and **download the entire case as a single archive** to hand off as one package. Exports that don't belong to a case appear under **Uncategorized Exports**. Deleting a case lets you either keep its exports (they move back to uncategorized) or delete them along with the case. diff --git a/docs/docs/usage/history.md b/docs/docs/usage/history.md index a978a3c45..5ed99f440 100644 --- a/docs/docs/usage/history.md +++ b/docs/docs/usage/history.md @@ -5,7 +5,7 @@ title: History import NavPath from "@site/src/components/NavPath"; -**History** is Frigate's full-resolution recording viewer. Unlike Live, Review, and Explore, there is no menu item for it — you reach it from within another view, then scrub the timeline, switch cameras, inspect a tracked object's lifecycle, and export or share any moment. +**History** is Frigate's full-resolution recording viewer. Unlike Live, Review, and Explore, there is no menu item for it. You reach it from within another view, then scrub the timeline, switch cameras, inspect a tracked object's lifecycle, and export or share any moment. This page describes how to _use_ the History view. For how recordings are _configured_ (retention, pre/post capture), see [Recording](/configuration/record). @@ -29,9 +29,9 @@ If you see **"No recordings found for this time"**, the most common causes are: A toggle (a drawer on mobile) switches the side panel between three modes: -- **Timeline** — a scrubbable vertical timeline of the selected camera. Horizontal lines down the center represent motion, with longer lines indicating more motion at that moment. Review items are marked as shaded areas (**red** for alerts, **orange** for detections), and sections with no colored background are times when no recording exists. -- **Events** — a scrollable list of the camera's review items for the time range; clicking one seeks the player to it. -- **Detail** — the [tracking details inspector](#the-detail-view) for the objects in view. +- **Timeline**: a scrubbable vertical timeline of the selected camera. Horizontal lines down the center represent motion, with longer lines indicating more motion at that moment. Review items are marked as shaded areas (**red** for alerts, **orange** for detections), and sections with no colored background are times when no recording exists. +- **Events**: a scrollable list of the camera's review items for the time range; clicking one seeks the player to it. +- **Detail**: the [tracking details inspector](#the-detail-view) for the objects in view. While you are selecting a range to export, the panel temporarily switches to Timeline. @@ -49,18 +49,18 @@ You can filter History by **cameras** and **date**. The calendar behaves the sam The **Detail** mode turns the side panel into a tracking details inspector. It lists one card per review item, each showing the item's severity, start time, the object labels involved, a count of tracked objects, and the duration. The active card is highlighted as the video plays, and clicking a card seeks to it. -Expanding a card reveals the **lifecycle** of each tracked object — a row for each significant moment (detected, entered a zone, became active, became stationary, left, and so on), with a progress line that follows the current playback position. Hovering a row shows that moment's score, ratio, and area, and clicking a row seeks the video to that exact timestamp. +Expanding a card reveals the **lifecycle** of each tracked object: a row for each significant moment (detected, entered a zone, became active, became stationary, left, and so on), with a progress line that follows the current playback position. Hovering a row shows that moment's score, ratio, and area, and clicking a row seeks the video to that exact timestamp. -The **Detail View Settings** at the bottom let you toggle whether the active item's objects expand automatically, and adjust the **annotation offset** — a fine timing correction that aligns the bounding-box overlays with the recorded video when your camera's snapshot and recording timestamps drift. Admins can save the offset to the camera's configuration. +The **Detail View Settings** at the bottom let you toggle whether the active item's objects expand automatically, and adjust the **annotation offset**: a fine timing correction that aligns the bounding-box overlays with the recorded video when your camera's snapshot and recording timestamps drift. Admins can save the offset to the camera's configuration. ## The Actions menu On desktop, the **Actions** menu (the film icon) collects the things you can do with the footage you are viewing: -- **Export** — save a clip of a chosen time range so it is never removed by retention. The dialog pre-selects the last hour; adjust the range or drag the timeline handles, then export. See [Exports](/usage/exports) for managing and downloading exports. -- **Share Timestamp** — generate a link to the current moment (or a custom timestamp) to share with another Frigate user. This is an internal link, not a public share URL. -- **Motion Search** — scan this camera's recordings for changes in a region you draw. This is the same tool documented under [Reviewing Motion](/usage/review#motion-search). -- **Debug Replay** (admins) — replay a recorded range back through Frigate's detection pipeline to see how it would be processed. +- **Export**: save a clip of a chosen time range so it is never removed by retention. The dialog pre-selects the last hour; adjust the range or drag the timeline handles, then export. See [Exports](/usage/exports) for managing and downloading exports. +- **Share Timestamp**: generate a link to the current moment (or a custom timestamp) to share with another Frigate user. This is an internal link, not a public share URL. +- **Motion Search**: scan this camera's recordings for changes in a region you draw. This is the same tool documented under [Reviewing Motion](/usage/review#motion-search). +- **Debug Replay** (admins): replay a recorded range back through Frigate's detection pipeline to see how it would be processed. You can also capture an instant snapshot of the current frame, and submit a frame to [Frigate+](/integrations/plus) directly from the player (admins only). @@ -68,8 +68,8 @@ You can also capture an instant snapshot of the current frame, and submit a fram When [Generative AI review](/configuration/genai/genai_review) is configured, Frigate can generate a title, description, and threat classification for review items and surface them as you scrub through History. A review item that has an AI summary exposes its details in a few places: -- **Over the video** — when the item is on screen, a popup appears over the player. -- **In the Events side panel** — items with a summary show the title below the thumbnail. -- **In the Detail side panel** — the item's card shows the title alongside its tracking details. +- **Over the video**: when the item is on screen, a popup appears over the player. +- **In the Events side panel**: items with a summary show the title below the thumbnail. +- **In the Detail side panel**: the item's card shows the title alongside its tracking details. Clicking any of these opens the **AI Analysis** dialog with the generated detail and any flagged concerns for that item. diff --git a/docs/docs/usage/live.md b/docs/docs/usage/live.md index 0fd96cdab..95aba0f54 100644 --- a/docs/docs/usage/live.md +++ b/docs/docs/usage/live.md @@ -7,11 +7,11 @@ import NavPath from "@site/src/components/NavPath"; **Live view** is Frigate's real-time dashboard and the page you land on by default. It shows all of your cameras at a glance, streams your most recent alerts across the top, and lets you open any camera in a full-resolution single-camera view with audio, two-way talk, PTZ, and on-demand recording controls. -This page describes how to _use_ the Live view. For how to _configure_ live streaming — go2rtc, stream selection, smart streaming, WebRTC, and audio — see the [Live View configuration](/configuration/live) docs. +This page describes how to _use_ the Live view. For how to _configure_ live streaming (go2rtc, stream selection, smart streaming, WebRTC, and audio), see the [Live View configuration](/configuration/live) docs. ## The dashboard at a glance -The default **All Cameras** dashboard shows every camera, with a filmstrip of recent **alerts** scrolling across the top. Clicking an alert opens it in [Review](/usage/review); each card also has a check button to mark it reviewed without leaving the dashboard. Only **alerts** appear in the filmstrip — to suppress a label or zone from showing there, configure it as a detection instead (see [Alerts and Detections](/configuration/review#alerts-and-detections)). +The default **All Cameras** dashboard shows every camera, with a filmstrip of recent **alerts** scrolling across the top. Clicking an alert opens it in [Review](/usage/review); each card also has a check button to mark it reviewed without leaving the dashboard. Only **alerts** appear in the filmstrip. To suppress a label or zone from showing there, configure it as a detection instead (see [Alerts and Detections](/configuration/review#alerts-and-detections)). By default Frigate uses **smart streaming**: a camera's image updates roughly once per minute while nothing is happening, and switches to a full live stream the moment activity is detected. This conserves bandwidth and resources. You can change this for each camera when using a camera group (see [Streaming settings](#streaming-settings-and-the-right-click-menu) below), and the behavior is explained in detail under [Live view technologies](/configuration/live#live-view-technologies). @@ -33,7 +33,7 @@ You can also view [Birdseye](/configuration/birdseye) on the dashboard, or open Admins can manage groups from the pencil icon next to the group rail, which opens the **Camera Groups** dialog. From there you can add a group, or edit and delete existing ones. When creating a group you choose: - a **Name** (spaces are converted to underscores), -- the **cameras** to include — each camera has a toggle and a gear that opens its [streaming settings](#streaming-settings-and-the-right-click-menu), and +- the **cameras** to include (each camera has a toggle and a gear that opens its [streaming settings](#streaming-settings-and-the-right-click-menu)), and - an **icon** used for the group's button in the rail. Deleting a group also clears any custom layout you saved for it. @@ -42,7 +42,7 @@ Deleting a group also clears any custom layout you saved for it. On desktop and tablet, each camera group has its own freely-arrangeable grid. Enter **Edit Layout** mode from the layout button in the lower-right corner: camera tiles gain a drag handle and corner resize handles. Drag a tile to reposition it and drag a corner to resize it (the aspect ratio is preserved). Exit edit mode to save. The layout is stored in your browser per device, so each device can have its own arrangement. -The default **All Cameras** dashboard is not manually arrangeable — it automatically sizes tiles based on each camera's aspect ratio (wide cameras span two columns, tall cameras span two rows). +The default **All Cameras** dashboard is not manually arrangeable. It automatically sizes tiles based on each camera's aspect ratio (wide cameras span two columns, tall cameras span two rows). ## Reading the tile indicators @@ -58,14 +58,14 @@ You can optionally overlay live streaming statistics (stream type, bandwidth, la ## Streaming settings and the right-click menu -Right-clicking (or long-pressing) a camera tile opens a context menu with quick controls: an **audio volume** control for streams that support audio, **Mute / Unmute all cameras**, **show or hide streaming statistics**, the **debug view**, **notification** options, and — for admins — turning the camera on or off. If the audio control doesn't appear, see [Audio Support](/configuration/live#audio-support) — audio requires go2rtc configured with a compatible codec. +Right-clicking (or long-pressing) a camera tile opens a context menu with quick controls: an **audio volume** control for streams that support audio, **Mute / Unmute all cameras**, **show or hide streaming statistics**, the **debug view**, **notification** options, and, for admins, turning the camera on or off. If the audio control doesn't appear, see [Audio Support](/configuration/live#audio-support). Audio requires go2rtc configured with a compatible codec. -A **Low-bandwidth mode** notice may also appear in the context menu with a **Reset** option appears when Frigate has fallen back to the lower-quality jsmpeg stream — see the [Live view FAQ](/configuration/live#live-view-faq) for why this happens. +A **Low-bandwidth mode** notice may also appear in the context menu with a **Reset** option appears when Frigate has fallen back to the lower-quality jsmpeg stream. See the [Live view FAQ](/configuration/live#live-view-faq) for why this happens. For non-default groups, the context menu also exposes **Streaming Settings** for that camera, which let you choose: - the **stream** to display (the dropdown lists the streams you configured under [`live -> streams`](/configuration/live#setting-streams-for-live-ui), and indicates whether audio is available), -- the **streaming method** — **No Streaming**, **Smart Streaming** (recommended), or **Continuous Streaming** (higher bandwidth), and +- the **streaming method**: **No Streaming**, **Smart Streaming** (recommended), or **Continuous Streaming** (higher bandwidth), and - **compatibility mode**, for devices that have trouble rendering the default player. These settings are saved per group and per device in your browser, not in your config file. @@ -77,7 +77,7 @@ Clicking a camera tile opens its full-resolution single-camera view. The top bar - **Back** (also the `Esc` key) to return to the dashboard, - **History** to jump to the [recordings](/usage/history) for this camera, starting about 30 seconds in the past, - **Fullscreen** and **Picture-in-Picture** (if supported by your browser), -- **Two-way talk** (the microphone button — requires a supported camera and WebRTC; keyboard shortcut `t`), and +- **Two-way talk** (the microphone button, which requires a supported camera and WebRTC; keyboard shortcut `t`), and - **Camera audio muting** (the speaker button; keyboard shortcut `m`). You can pinch or scroll to zoom into the feed. A **settings** gear provides a **stream** selector (with audio and two-way-talk availability indicators), **Play in background**, **Show stats**, and a **Debug view** that overlays Frigate's detection regions and bounding boxes. @@ -100,7 +100,7 @@ Admins get a row of toggles in the single-camera view (a settings drawer on mobi - **Live audio transcription** (when audio detection is enabled), and - **Autotracking** (for [autotracking-capable PTZ cameras](/configuration/autotracking)). -These toggles change runtime behavior immediately. Whether a change persists across a restart depends on the feature — see the relevant configuration page. +These toggles change runtime behavior immediately. Whether a change persists across a restart depends on the feature. See the relevant configuration page. ## On-demand recording and snapshots diff --git a/docs/docs/usage/review.md b/docs/docs/usage/review.md index b57803886..6416b500e 100644 --- a/docs/docs/usage/review.md +++ b/docs/docs/usage/review.md @@ -5,7 +5,7 @@ title: Review import NavPath from "@site/src/components/NavPath"; -**Review** is where you triage what happened on your cameras. It groups activity into **review items** — segments of time on a single camera that bundle together the objects and audio that were active at once — and sorts them into **Alerts**, **Detections**, and **Motion**. From here you can scrub through activity, mark items as reviewed, filter, export, and jump to the full recording in [History](/usage/history). +**Review** is where you triage what happened on your cameras. It groups activity into **review items**, segments of time on a single camera that bundle together the objects and audio that were active at once, and sorts them into **Alerts**, **Detections**, and **Motion**. From here you can scrub through activity, mark items as reviewed, filter, export, and jump to the full recording in [History](/usage/history). This page describes how to _use_ the Review view. For how alerts and detections are _configured_ (labels, zones, required zones, retention), see the [Review configuration](/configuration/review) docs. @@ -27,7 +27,7 @@ The toggle at the top of the page switches between these three severities. One i | **Detections** | orange | Everything else Frigate tracked that wasn't promoted to an alert. | | **Motion** | yellow | Periods of significant motion, with the ability to filter to periods which did **not** produce a tracked object. | -This same color coding is used for the ring around a selected item and the dots on the calendar. How an object is categorized as an alert vs. a detection — and how required zones refine that — is covered in [Alerts and Detections](/configuration/review#alerts-and-detections). +This same color coding is used for the ring around a selected item and the dots on the calendar. How an object is categorized as an alert vs. a detection, and how required zones refine that, is covered in [Alerts and Detections](/configuration/review#alerts-and-detections). The **Alerts** and **Detections** tabs show a count next to their label. With **Show Reviewed** turned off (the default), this is the number of items still left to review; with it on, the count reflects every item in the selected time range. @@ -39,7 +39,7 @@ Review items are shown as a grid of thumbnail cards next to a vertical activity - The object chip on each card is **gray** when the item is unreviewed and turns **green** once it has been reviewed. - The **Mark these items as reviewed** button marks everything currently shown as reviewed at once. -Reviewed state is tracked per user, so marking an item reviewed does not hide it for other users. Marking an item reviewed does not delete anything — the footage and the review item itself remain until they expire via retention. +Reviewed state is tracked per user, so marking an item reviewed does not hide it for other users. Marking an item reviewed does not delete anything: the footage and the review item itself remain until they expire via retention. ## Selecting and acting on multiple items @@ -58,13 +58,13 @@ Use the filter controls in the header to narrow what's shown. The available filt The **calendar** filter lets you jump to a specific day (it shows **Last 24 Hours** until you pick one). On each day: - An **underline** under the day number means **recordings exist** for that day. Days without recordings are dimmed. -- A **colored dot** under the day number means there is **unreviewed activity** that day — a **red dot** for unreviewed alerts, or an **orange dot** for unreviewed detections when there are no unreviewed alerts. Motion is not represented by a dot. +- A **colored dot** under the day number means there is **unreviewed activity** that day: a **red dot** for unreviewed alerts, or an **orange dot** for unreviewed detections when there are no unreviewed alerts. Motion is not represented by a dot. Future dates are disabled, and the week start and time zone follow your configuration. ## Reviewing Motion -The Review page also can show periods of motion that didn't produce a tracked object, and provides a way to search past recordings for motion in a specific region. These tools complement the alerts and detections workflow above — see [Tuning Motion Detection](/configuration/motion_detection) for how the underlying motion detector is configured. +The Review page also can show periods of motion that didn't produce a tracked object, and provides a way to search past recordings for motion in a specific region. These tools complement the alerts and detections workflow above. See [Tuning Motion Detection](/configuration/motion_detection) for how the underlying motion detector is configured. The **Motion** tab itself shows a multi-camera grid scrubbed to a shared point in time, with a draggable timeline and a playback-speed selector. A camera tile gains a colored ring when a review item or significant motion overlaps the current time, and clicking a tile opens that camera's recording at that moment. Each camera's options menu (the kebab in the corner of its tile) is where you open **Motion Previews** and **Motion Search**, described below. @@ -76,9 +76,9 @@ On the page, click the kebab menu on a camera The pane provides a few controls: -- **Speed** — speeds up or slows down all of the preview clips at once. -- **Dim** — controls how strongly non-motion areas are darkened by the heatmap overlay. Higher values increase motion area visibility. -- **Filter** — opens a 16×16 grid overlaid on a snapshot of the camera. Select one or more cells to only show clips with motion in those regions. This is helpful for filtering out motion in areas like a busy street while keeping motion in your driveway. +- **Speed**: speeds up or slows down all of the preview clips at once. +- **Dim**: controls how strongly non-motion areas are darkened by the heatmap overlay. Higher values increase motion area visibility. +- **Filter**: opens a 16×16 grid overlaid on a snapshot of the camera. Select one or more cells to only show clips with motion in those regions. This is helpful for filtering out motion in areas like a busy street while keeping motion in your driveway. Clicking a preview clip seeks the recording player to that timestamp so you can review the full footage. @@ -107,20 +107,20 @@ The results panel shows the time range being scanned, a live progress bar with t #### Common use cases -Frigate's main use case is to record and surface tracked objects, so Motion Search is most useful for the cases where object detection produced nothing — there is no object to find in Explore, but you suspect something happened. +Frigate's main use case is to record and surface tracked objects, so Motion Search is most useful for the cases where object detection produced nothing: there is no object to find in Explore, but you suspect something happened. -- **Locating an unattributed change.** You know something appeared, disappeared, or moved in a window of footage — a package now gone, a gate left open — but no detection points to it. A search returns the candidate timestamps instead of scrubbing the timeline by hand. +- **Locating an unattributed change.** You know something appeared, disappeared, or moved in a window of footage (a package now gone, a gate left open), but no detection points to it. A search returns the candidate timestamps instead of scrubbing the timeline by hand. - **An object that was never detected.** Something Frigate doesn't have a model label for, an object too small or distant to be detected, or movement in a region where detection isn't running. The activity left no tracked object but did change the pixels, so a search can still find it. - **Activity while detection was effectively paused.** Changes that occurred while object detection was disabled, motion was suppressed by `skip_motion_threshold`, or inside an area covered by a motion mask, won't appear as review items or tracked objects but can be recovered by searching the recordings directly. #### Examples -These show how to choose the ROI and **Minimum Change Area** for two common goals. Minimum Change Area is the size of a single moving region as a percentage of the ROI you draw, so the right value depends on how much of the ROI your subject — and its movement between samples — covers. +These show how to choose the ROI and **Minimum Change Area** for two common goals. Minimum Change Area is the size of a single moving region as a percentage of the ROI you draw, so the right value depends on how much of the ROI your subject, and its movement between samples, covers. Because samples are a second or more apart, a moving subject usually appears in two places at once in the comparison, so even ordinary motion often scores tens of percent and a low threshold lets in almost everything. The most reliable approach is to **run a search, look at the percentage each result scored, and set Minimum Change Area just below the values for the events you care about.** The default is 20%; the suggestions below are starting points. -- **When did this item first appear (or disappear)?** A package was dropped off, a car parked, or a trash can was moved, and you want the exact moment. Draw a **tight ROI** around the spot the item occupies and **raise Minimum Change Area** (start around 40–60%). Because the item fills most of a tight ROI, its arrival or removal is a large change, while smaller nearby motion (shadows, a passing pedestrian) stays below the threshold. The **earliest result** is when it appeared; if you only care about that moment, a low Maximum Results finishes faster. If you get no hits, the ROI is probably looser than the item — lower the threshold or tighten the ROI. -- **What's been getting into the garden?** Something has been trampling a flower bed overnight and no object was ever tracked. Draw a **looser ROI** covering the whole bed and use a **lower Minimum Change Area than the case above** — start near the 20% default and lower it (toward 5–10%) only if a small or distant subject is missed, since it covers just a slice of a large region. Expect more results to scan through — step through the timestamps and jump to each to see what triggered it. If wind-blown plants add noise, raise Minimum Change Area or the Sensitivity Threshold. +- **When did this item first appear (or disappear)?** A package was dropped off, a car parked, or a trash can was moved, and you want the exact moment. Draw a **tight ROI** around the spot the item occupies and **raise Minimum Change Area** (start around 40–60%). Because the item fills most of a tight ROI, its arrival or removal is a large change, while smaller nearby motion (shadows, a passing pedestrian) stays below the threshold. The **earliest result** is when it appeared; if you only care about that moment, a low Maximum Results finishes faster. If you get no hits, the ROI is probably looser than the item: lower the threshold or tighten the ROI. +- **What's been getting into the garden?** Something has been trampling a flower bed overnight and no object was ever tracked. Draw a **looser ROI** covering the whole bed and use a **lower Minimum Change Area than the case above**: start near the 20% default and lower it (toward 5–10%) only if a small or distant subject is missed, since it covers just a slice of a large region. Expect more results to scan through: step through the timestamps and jump to each to see what triggered it. If wind-blown plants add noise, raise Minimum Change Area or the Sensitivity Threshold. #### Expected performance @@ -128,7 +128,7 @@ Motion Search analyzes the saved recordings on demand rather than reading a pre- To increase the speed of searches: -- Draw a tight ROI. Because **Minimum Change Area** is measured as a percentage of the region you draw, a tight ROI around where you expect the change makes the object fill a larger share of the area, so it clears the threshold more easily. A loose ROI makes the same object a small fraction of the region, so it can fall below the threshold and be missed — forcing you to lower Minimum Change Area, which lets in more noise. +- Draw a tight ROI. Because **Minimum Change Area** is measured as a percentage of the region you draw, a tight ROI around where you expect the change makes the object fill a larger share of the area, so it clears the threshold more easily. A loose ROI makes the same object a small fraction of the region, so it can fall below the threshold and be missed, forcing you to lower Minimum Change Area, which lets in more noise. - Narrow the time range to the window you care about, so there is less footage to examine. - Lower **Maximum Results** when you only need the first few hits. Because the search stops once it reaches that many results, a smaller value lets a busy range finish early instead of scanning the whole window. - Use Parallel mode to shorten wall-clock time on multi-core systems, at the cost of higher decoding and CPU usage while it runs. diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index 089da5df3..f83a11751 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -105,6 +105,8 @@ class Dispatcher: self.web_push_client = next( (comm for comm in communicators if isinstance(comm, WebPushClient)), None ) + if self.web_push_client is not None: + self.web_push_client.set_suspension_broadcaster(self.publish) def _receive(self, topic: str, payload: Any) -> Any | None: """Handle receiving of payload from communicators.""" diff --git a/frigate/comms/webpush.py b/frigate/comms/webpush.py index b548446c2..6f2d9ab8d 100644 --- a/frigate/comms/webpush.py +++ b/frigate/comms/webpush.py @@ -55,6 +55,7 @@ class WebPushClient(Communicator): c.name: 0 # type: ignore[misc] for c in self.config.cameras.values() } + self.suspension_broadcaster: Callable[[str, Any, bool], None] | None = None self.last_camera_notification_time: dict[str, float] = { c.name: 0 # type: ignore[misc] for c in self.config.cameras.values() @@ -66,6 +67,10 @@ class WebPushClient(Communicator): target=self._process_notifications, daemon=True ) self.notification_thread.start() + self.suspension_thread = threading.Thread( + target=self._process_suspensions, daemon=True + ) + self.suspension_thread.start() if not self.config.notifications.email: logger.warning("Email must be provided for push notifications to be sent.") @@ -164,6 +169,27 @@ class WebPushClient(Communicator): def is_camera_suspended(self, camera: str) -> bool: return datetime.datetime.now().timestamp() <= self.suspended_cameras[camera] + def set_suspension_broadcaster( + self, broadcaster: Callable[[str, Any, bool], None] + ) -> None: + """Register the callback used to broadcast suspension state changes.""" + self.suspension_broadcaster = broadcaster + + def _process_suspensions(self) -> None: + while not self.stop_event.wait(1): + self._clear_expired_suspensions() + + def _clear_expired_suspensions(self) -> None: + """Reset and broadcast cameras whose suspension window has elapsed.""" + now = datetime.datetime.now().timestamp() + for camera, suspended_until in list(self.suspended_cameras.items()): + if suspended_until and now > suspended_until: + self.unsuspend_notifications(camera) + if self.suspension_broadcaster is not None: + self.suspension_broadcaster( + f"{camera}/notifications/suspended", "0", True + ) + def publish(self, topic: str, payload: Any, retain: bool = False) -> None: """Wrapper for publishing when client is in valid state.""" # check for updated global config (notifications, auth) diff --git a/frigate/test/test_webpush_suspend.py b/frigate/test/test_webpush_suspend.py new file mode 100644 index 000000000..1442bad21 --- /dev/null +++ b/frigate/test/test_webpush_suspend.py @@ -0,0 +1,64 @@ +"""Tests for notification suspension expiry handling.""" + +import datetime +import unittest +from unittest.mock import MagicMock + +from frigate.comms.webpush import WebPushClient + + +class TestSuspensionExpiry(unittest.TestCase): + def _make_client(self, suspended_cameras: dict[str, int]) -> WebPushClient: + client = WebPushClient.__new__(WebPushClient) + client.suspended_cameras = suspended_cameras + client.suspension_broadcaster = MagicMock() + return client + + def test_clears_and_broadcasts_expired_suspension(self): + now = datetime.datetime.now().timestamp() + client = self._make_client({"front_door": int(now - 60)}) + + client._clear_expired_suspensions() + + self.assertEqual(client.suspended_cameras["front_door"], 0) + client.suspension_broadcaster.assert_called_once_with( + "front_door/notifications/suspended", "0", True + ) + + def test_leaves_active_suspension_untouched(self): + now = datetime.datetime.now().timestamp() + suspend_until = int(now + 3600) + client = self._make_client({"front_door": suspend_until}) + + client._clear_expired_suspensions() + + self.assertEqual(client.suspended_cameras["front_door"], suspend_until) + client.suspension_broadcaster.assert_not_called() + + def test_ignores_unsuspended_camera(self): + client = self._make_client({"front_door": 0}) + + client._clear_expired_suspensions() + + self.assertEqual(client.suspended_cameras["front_door"], 0) + client.suspension_broadcaster.assert_not_called() + + def test_only_expired_cameras_are_cleared(self): + now = datetime.datetime.now().timestamp() + active_until = int(now + 3600) + client = self._make_client( + { + "expired": int(now - 5), + "active": active_until, + "idle": 0, + } + ) + + client._clear_expired_suspensions() + + self.assertEqual(client.suspended_cameras["expired"], 0) + self.assertEqual(client.suspended_cameras["active"], active_until) + self.assertEqual(client.suspended_cameras["idle"], 0) + client.suspension_broadcaster.assert_called_once_with( + "expired/notifications/suspended", "0", True + )