From 653636846711a762d30459cd2e0de395c8643c28 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sun, 9 Feb 2025 07:06:44 -0600 Subject: [PATCH 01/27] Add Inkeep chatbot to docs (#16405) * Add inkeep chatbot to docs * install inkeep to docs dir --- docs/docusaurus.config.ts | 169 +++++++++++++++++++++++--------------- docs/package-lock.json | 7 ++ docs/package.json | 3 +- 3 files changed, 110 insertions(+), 69 deletions(-) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 865cb53d2..7664a1d9b 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -1,56 +1,88 @@ -import type * as Preset from '@docusaurus/preset-classic'; -import * as path from 'node:path'; -import type { Config, PluginConfig } from '@docusaurus/types'; -import type * as OpenApiPlugin from 'docusaurus-plugin-openapi-docs'; +import type * as Preset from "@docusaurus/preset-classic"; +import * as path from "node:path"; +import type { Config, PluginConfig } from "@docusaurus/types"; +import type * as OpenApiPlugin from "docusaurus-plugin-openapi-docs"; const config: Config = { - title: 'Frigate', - tagline: 'NVR With Realtime Object Detection for IP Cameras', - url: 'https://docs.frigate.video', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', - organizationName: 'blakeblackshear', - projectName: 'frigate', - themes: ['@docusaurus/theme-mermaid', 'docusaurus-theme-openapi-docs'], + title: "Frigate", + tagline: "NVR With Realtime Object Detection for IP Cameras", + url: "https://docs.frigate.video", + baseUrl: "/", + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", + favicon: "img/favicon.ico", + organizationName: "blakeblackshear", + projectName: "frigate", + themes: [ + "@docusaurus/theme-mermaid", + "docusaurus-theme-openapi-docs", + "@inkeep/docusaurus/chatButton", + ], markdown: { mermaid: true, }, themeConfig: { algolia: { - appId: 'WIURGBNBPY', - apiKey: 'd02cc0a6a61178b25da550212925226b', - indexName: 'frigate', + appId: "WIURGBNBPY", + apiKey: "d02cc0a6a61178b25da550212925226b", + indexName: "frigate", }, docs: { sidebar: { hideable: true, }, }, + inkeepConfig: { + baseSettings: { + apiKey: "b1a4c4d73c9b48aa5b3cdae6e4c81f0bb3d1134eeb5a7100", + integrationId: "cm6xmhn9h000gs601495fkkdx", + organizationId: "org_map2JQEOco8U1ZYY", + primaryBrandColor: "#010101", + }, + aiChatSettings: { + chatSubjectName: "Frigate", + botAvatarSrcUrl: "https://frigate.video/images/favicon.png", + getHelpCallToActions: [ + { + name: "GitHub", + url: "https://github.com/blakeblackshear/frigate", + icon: { + builtIn: "FaGithub", + }, + }, + ], + quickQuestions: [ + "How to configure and setup camera settings?", + "How to setup notifications?", + "Supported builtin detectors?", + "How to restream video feed?", + "How can I get sound or audio in my recordings?", + ], + }, + }, prism: { - additionalLanguages: ['bash', 'json'], + additionalLanguages: ["bash", "json"], }, languageTabs: [ { - highlight: 'python', - language: 'python', - logoClass: 'python', + highlight: "python", + language: "python", + logoClass: "python", }, { - highlight: 'javascript', - language: 'nodejs', - logoClass: 'nodejs', + highlight: "javascript", + language: "nodejs", + logoClass: "nodejs", }, { - highlight: 'javascript', - language: 'javascript', - logoClass: 'javascript', + highlight: "javascript", + language: "javascript", + logoClass: "javascript", }, { - highlight: 'bash', - language: 'curl', - logoClass: 'curl', + highlight: "bash", + language: "curl", + logoClass: "curl", }, { highlight: "rust", @@ -59,49 +91,49 @@ const config: Config = { }, ], navbar: { - title: 'Frigate', + title: "Frigate", logo: { - alt: 'Frigate', - src: 'img/logo.svg', - srcDark: 'img/logo-dark.svg', + alt: "Frigate", + src: "img/logo.svg", + srcDark: "img/logo-dark.svg", }, items: [ { - to: '/', - activeBasePath: 'docs', - label: 'Docs', - position: 'left', + to: "/", + activeBasePath: "docs", + label: "Docs", + position: "left", }, { - href: 'https://frigate.video', - label: 'Website', - position: 'right', + href: "https://frigate.video", + label: "Website", + position: "right", }, { - href: 'http://demo.frigate.video', - label: 'Demo', - position: 'right', + href: "http://demo.frigate.video", + label: "Demo", + position: "right", }, { - href: 'https://github.com/blakeblackshear/frigate', - label: 'GitHub', - position: 'right', + href: "https://github.com/blakeblackshear/frigate", + label: "GitHub", + position: "right", }, ], }, footer: { - style: 'dark', + style: "dark", links: [ { - title: 'Community', + title: "Community", items: [ { - label: 'GitHub', - href: 'https://github.com/blakeblackshear/frigate', + label: "GitHub", + href: "https://github.com/blakeblackshear/frigate", }, { - label: 'Discussions', - href: 'https://github.com/blakeblackshear/frigate/discussions', + label: "Discussions", + href: "https://github.com/blakeblackshear/frigate/discussions", }, ], }, @@ -110,19 +142,19 @@ const config: Config = { }, }, plugins: [ - path.resolve(__dirname, 'plugins', 'raw-loader'), + path.resolve(__dirname, "plugins", "raw-loader"), [ - 'docusaurus-plugin-openapi-docs', + "docusaurus-plugin-openapi-docs", { - id: 'openapi', - docsPluginId: 'classic', // configured for preset-classic + id: "openapi", + docsPluginId: "classic", // configured for preset-classic config: { frigateApi: { - specPath: 'static/frigate-api.yaml', - outputDir: 'docs/integrations/api', + specPath: "static/frigate-api.yaml", + outputDir: "docs/integrations/api", sidebarOptions: { - groupPathsBy: 'tag', - categoryLinkSource: 'tag', + groupPathsBy: "tag", + categoryLinkSource: "tag", sidebarCollapsible: true, sidebarCollapsed: true, }, @@ -130,23 +162,24 @@ const config: Config = { } satisfies OpenApiPlugin.Options, }, }, - ] + ], ] as PluginConfig[], presets: [ [ - 'classic', + "classic", { docs: { - routeBasePath: '/', - sidebarPath: './sidebars.ts', + routeBasePath: "/", + sidebarPath: "./sidebars.ts", // Please change this to your repo. - editUrl: 'https://github.com/blakeblackshear/frigate/edit/master/docs/', + editUrl: + "https://github.com/blakeblackshear/frigate/edit/master/docs/", sidebarCollapsible: false, - docItemComponent: '@theme/ApiItem', // Derived from docusaurus-theme-openapi + docItemComponent: "@theme/ApiItem", // Derived from docusaurus-theme-openapi }, theme: { - customCss: './src/css/custom.css', + customCss: "./src/css/custom.css", }, } satisfies Preset.Options, ], diff --git a/docs/package-lock.json b/docs/package-lock.json index ce3f0649e..89de28af4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -12,6 +12,7 @@ "@docusaurus/plugin-content-docs": "^3.6.3", "@docusaurus/preset-classic": "^3.6.3", "@docusaurus/theme-mermaid": "^3.6.3", + "@inkeep/docusaurus": "^2.0.16", "@mdx-js/react": "^3.1.0", "clsx": "^2.1.1", "docusaurus-plugin-openapi-docs": "^4.3.1", @@ -4056,6 +4057,12 @@ "react-hook-form": "^7.0.0" } }, + "node_modules/@inkeep/docusaurus": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@inkeep/docusaurus/-/docusaurus-2.0.16.tgz", + "integrity": "sha512-dQhjlvFnl3CVr0gWeJ/V/qLnDy1XYrCfkdVSa2D3gJTxI9/vOf9639Y1aPxTxO88DiXuW9CertLrZLB6SoJ2yg==", + "license": "MIT" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", diff --git a/docs/package.json b/docs/package.json index f1849f6d9..82b4230d1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,9 +18,10 @@ }, "dependencies": { "@docusaurus/core": "^3.6.3", + "@docusaurus/plugin-content-docs": "^3.6.3", "@docusaurus/preset-classic": "^3.6.3", "@docusaurus/theme-mermaid": "^3.6.3", - "@docusaurus/plugin-content-docs": "^3.6.3", + "@inkeep/docusaurus": "^2.0.16", "@mdx-js/react": "^3.1.0", "clsx": "^2.1.1", "docusaurus-plugin-openapi-docs": "^4.3.1", From 5a5a54fc66f6052ba075eb96438db3f8d1f77509 Mon Sep 17 00:00:00 2001 From: Landor Date: Sun, 9 Feb 2025 12:04:24 -0500 Subject: [PATCH 02/27] add tip about disabling TLS to use auth with HA integration (#16413) * add tip about disabling TLS to use auth with HA integration * spacing --------- Co-authored-by: Nicolas Mowen --- docs/docs/integrations/home-assistant.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/integrations/home-assistant.md b/docs/docs/integrations/home-assistant.md index 19330b6b8..07f907f11 100644 --- a/docs/docs/integrations/home-assistant.md +++ b/docs/docs/integrations/home-assistant.md @@ -113,6 +113,14 @@ If you run Frigate on a separate device within your local network, Home Assistan Use `http://:8971` as the URL for the integration so that authentication is required. +:::tip + +The above URL assumes you have [disabled TLS](../configuration/tls). +By default, TLS is enabled and Frigate will be using a self-signed certificate. HomeAssistant will fail to connect HTTPS to port 8971 since it fails to verify the self-signed certificate. +Either disable TLS and use HTTP from HomeAssistant, or configure Frigate to be acessible with a valid certificate. + +::: + ```yaml services: frigate: From 22cc698b4e8e1d80b8513a4fcd515a833355c5aa Mon Sep 17 00:00:00 2001 From: dansharpy Date: Sun, 9 Feb 2025 18:43:43 +0000 Subject: [PATCH 03/27] Moved cmamera specific options from custom prompts to configuration section (#16421) --- docs/docs/configuration/genai.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/docs/configuration/genai.md b/docs/docs/configuration/genai.md index 23f1c06be..90e463df4 100644 --- a/docs/docs/configuration/genai.md +++ b/docs/docs/configuration/genai.md @@ -27,12 +27,23 @@ genai: model: gemini-1.5-flash cameras: - front_camera: ... + front_camera: + genai: + enabled: True # <- enable GenAI for your front camera + use_snapshot: True + objects: + - person + required_zones: + - steps indoor_camera: - genai: # <- disable GenAI for your indoor camera - enabled: False + genai: + enabled: False # <- disable GenAI for your indoor camera ``` +By default, descriptions will be generated for all tracked objects and all zones. But you can also optionally specify `objects` and `required_zones` to only generate descriptions for certain tracked objects or zones. + +Optionally, you can generate the description using a snapshot (if enabled) by setting `use_snapshot` to `True`. By default, this is set to `False`, which sends the uncompressed images from the `detect` stream collected over the object's lifetime to the model. Once the object lifecycle ends, only a single compressed and cropped thumbnail is saved with the tracked object. Using a snapshot might be useful when you want to _regenerate_ a tracked object's description as it will provide the AI with a higher-quality image (typically downscaled by the AI itself) than the cropped/compressed thumbnail. Using a snapshot otherwise has a trade-off in that only a single image is sent to your provider, which will limit the model's ability to determine object movement or direction. + ## Ollama :::warning @@ -182,9 +193,7 @@ genai: car: "Observe the primary vehicle in these images. Focus on its movement, direction, or purpose (e.g., parking, approaching, circling). If it's a delivery vehicle, mention the company." ``` -Prompts can also be overriden at the camera level to provide a more detailed prompt to the model about your specific camera, if you desire. By default, descriptions will be generated for all tracked objects and all zones. But you can also optionally specify `objects` and `required_zones` to only generate descriptions for certain tracked objects or zones. - -Optionally, you can generate the description using a snapshot (if enabled) by setting `use_snapshot` to `True`. By default, this is set to `False`, which sends the uncompressed images from the `detect` stream collected over the object's lifetime to the model. Once the object lifecycle ends, only a single compressed and cropped thumbnail is saved with the tracked object. Using a snapshot might be useful when you want to _regenerate_ a tracked object's description as it will provide the AI with a higher-quality image (typically downscaled by the AI itself) than the cropped/compressed thumbnail. Using a snapshot otherwise has a trade-off in that only a single image is sent to your provider, which will limit the model's ability to determine object movement or direction. +Prompts can also be overriden at the camera level to provide a more detailed prompt to the model about your specific camera, if you desire. ```yaml cameras: From 2d281855fcee0b89cb30f3eb65e59e0159a7021e Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 11 Feb 2025 16:29:48 -0700 Subject: [PATCH 04/27] Enable search for inkeep (#16510) --- docs/docusaurus.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 7664a1d9b..6c6e2be66 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -17,6 +17,7 @@ const config: Config = { "@docusaurus/theme-mermaid", "docusaurus-theme-openapi-docs", "@inkeep/docusaurus/chatButton", + "@inkeep/docusaurus/searchBar", ], markdown: { mermaid: true, From 7e6a241e039bbd5f02547364d3ab0cede050ea1f Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sat, 15 Feb 2025 07:48:34 -0600 Subject: [PATCH 05/27] Bugfix: use np.copy for current frame in object processing (#16594) --- frigate/object_processing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frigate/object_processing.py b/frigate/object_processing.py index b5196e686..bdc6d8d72 100644 --- a/frigate/object_processing.py +++ b/frigate/object_processing.py @@ -473,7 +473,7 @@ class CameraState: if current_frame is not None: self.current_frame_time = frame_time - self._current_frame = current_frame + self._current_frame = np.copy(current_frame) if self.previous_frame_id is not None: self.frame_manager.close(self.previous_frame_id) From cc9933006305c385275da423cd3e5d9291eff406 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sun, 16 Feb 2025 12:22:55 -0700 Subject: [PATCH 06/27] Add more hardware stats (#16613) --- docs/docs/frigate/hardware.md | 45 ++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index dcfc91072..4bbd270f1 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -55,21 +55,22 @@ Inference speeds vary greatly depending on the CPU or GPU used, some known examp | Name | MobileNetV2 Inference Time | YOLO-NAS Inference Time | Notes | | -------------------- | -------------------------- | ------------------------- | -------------------------------------- | -| Intel Celeron J4105 | ~ 25 ms | | Can only run one detector instance | -| Intel Celeron N3060 | 130 - 150 ms | | Can only run one detector instance | -| Intel Celeron N3205U | ~ 120 ms | | Can only run one detector instance | -| Intel Celeron N4020 | 50 - 200 ms | | Inference speed depends on other loads | -| Intel i3 6100T | 15 - 35 ms | | Can only run one detector instance | -| Intel i3 8100 | ~ 15 ms | | | -| Intel i5 4590 | ~ 20 ms | | | -| Intel i5 6500 | ~ 15 ms | | | -| Intel i5 7200u | 15 - 25 ms | | | -| Intel i5 7500 | ~ 15 ms | | | -| Intel i5 1135G7 | 10 - 15 ms | | | -| Intel i3 12000 | | 320: ~ 19 ms 640: ~ 54 ms | | -| Intel i5 12600K | ~ 15 ms | 320: ~ 20 ms 640: ~ 46 ms | | -| Intel Arc A380 | ~ 6 ms | 320: ~ 10 ms | | -| Intel Arc A750 | ~ 4 ms | 320: ~ 8 ms | | +| Intel Arc A750       | ~ 4 ms                     | 320: ~ 8 ms               |                                        | +| Intel Arc A380       | ~ 6 ms                     | 320: ~ 10 ms              |                                        | +| Intel Ultra 5 125H | | 320: ~ 10 ms 640: ~ 22 ms | | +| Intel i5 12600K      | ~ 15 ms                    | 320: ~ 20 ms 640: ~ 46 ms |                                        | +| Intel i3 12000       |                            | 320: ~ 19 ms 640: ~ 54 ms |                                        | +| Intel i5 1135G7      | 10 - 15 ms                 |                           |                                        | +| Intel i5 7500        | ~ 15 ms                    |                           |                                        | +| Intel i5 7200u       | 15 - 25 ms                 |                           |                                        | +| Intel i5 6500        | ~ 15 ms                    |                           |                                        | +| Intel i5 4590        | ~ 20 ms                    |                           |                                        | +| Intel i3 8100        | ~ 15 ms                    |                           |                                        | +| Intel i3 6100T       | 15 - 35 ms                 |                           | Can only run one detector instance     | +| Intel Celeron N4020  | 50 - 200 ms                |                           | Inference speed depends on other loads | +| Intel Celeron N3205U | ~ 120 ms                   |                           | Can only run one detector instance     | +| Intel Celeron N3060  | 130 - 150 ms               |                           | Can only run one detector instance     | +| Intel Celeron J4105  | ~ 25 ms                    |                           | Can only run one | ### TensorRT - Nvidia GPU @@ -80,13 +81,13 @@ Inference speeds will vary greatly depending on the GPU and the model used. | Name | YoloV7 Inference Time | YOLO-NAS Inference Time | | --------------- | --------------------- | ------------------------- | -| GTX 1060 6GB | ~ 7 ms | | -| GTX 1070 | ~ 6 ms | | -| GTX 1660 SUPER | ~ 4 ms | | -| RTX 3050 | 5 - 7 ms | 320: ~ 10 ms 640: ~ 16 ms | -| RTX 3070 Mobile | ~ 5 ms | | -| Quadro P400 2GB | 20 - 25 ms | | -| Quadro P2000 | ~ 12 ms | | +| Quadro P2000    | ~ 12 ms               |                           | +| Quadro P400 2GB | 20 - 25 ms            |                           | +| RTX 3070 Mobile | ~ 5 ms                |                           | +| RTX 3050        | 5 - 7 ms              | 320: ~ 10 ms 640: ~ 16 ms | +| GTX 1660 SUPER  | ~ 4 ms                |                           | +| GTX 1070        | ~ 6 ms                |                           | +| GTX 1060 6GB    | ~ 7 ms                |                           | ### AMD GPUs From 9a54c8ca497ea35cce3e9eb4d762241d38da6298 Mon Sep 17 00:00:00 2001 From: Vivek Gani Date: Fri, 21 Feb 2025 18:12:37 -0600 Subject: [PATCH 07/27] Add USB Camera guidance to camera_specific.md (#16729) --- docs/docs/configuration/camera_specific.md | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/docs/configuration/camera_specific.md b/docs/docs/configuration/camera_specific.md index 212e2f3d0..9add6015c 100644 --- a/docs/docs/configuration/camera_specific.md +++ b/docs/docs/configuration/camera_specific.md @@ -231,3 +231,38 @@ ffmpeg: ### TP-Link VIGI Cameras TP-Link VIGI cameras need some adjustments to the main stream settings on the camera itself to avoid issues. The stream needs to be configured as `H264` with `Smart Coding` set to `off`. Without these settings you may have problems when trying to watch recorded footage. For example Firefox will stop playback after a few seconds and show the following error message: `The media playback was aborted due to a corruption problem or because the media used features your browser did not support.`. + +## USB Cameras (aka Webcams) + +To use a USB camera (webcam) with Frigate, the recommendation is to use go2rtc's [FFmpeg Device](https://github.com/AlexxIT/go2rtc?tab=readme-ov-file#source-ffmpeg-device) support: + +- Preparation outside of Frigate: + - Get USB camera path. Run `v4l2-ctl --list-devices` to get a listing of locally-connected cameras available. (You may need to install `v4l-utils` in a way appropriate for your Linux distribution). In the sample configuration below, we use `video=0` to correlate with a detected device path of `/dev/video0` + - Get USB camera formats & resolutions. Run `ffmpeg -f v4l2 -list_formats all -i /dev/video0` to get an idea of what formats and resolutions the USB Camera supports. In the sample configuration below, we use a width of 1024 and height of 576 in the stream and detection settings based on what was reported back. + - If using Frigate in a container (e.g. Docker on TrueNAS), ensure you have USB Passthrough support enabled, along with a specific Host Device (`/dev/video0`) + Container Device (`/dev/video0`) listed. + +- In your Frigate Configuration File, add the go2rtc stream and roles as appropriate: + +``` +go2rtc: + streams: + usb_camera: + - "ffmpeg:device?video=0&video_size=1024x576#video=h264" + +cameras: + usb_camera: + enabled: true + ffmpeg: + inputs: + - path: rtsp://127.0.0.1:8554/usb_camera + input_args: preset-rtsp-restream + roles: + - detect + - record + detect: + enabled: false # <---- disable detection until you have a working camera feed + width: 1024 + height: 576 +``` + + From 011a2dbfaf7c401ded7f325ecf267695cf4cbd39 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sun, 23 Feb 2025 07:28:03 -0600 Subject: [PATCH 08/27] Docs: Clarify review labels and objects to track (#16758) --- docs/docs/configuration/review.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/docs/configuration/review.md b/docs/docs/configuration/review.md index e321fcb8a..752c496a3 100644 --- a/docs/docs/configuration/review.md +++ b/docs/docs/configuration/review.md @@ -21,6 +21,21 @@ In 0.14 and later, all of that is bundled into a single review item which starts Not every segment of video captured by Frigate may be of the same level of interest to you. Video of people who enter your property may be a different priority than those walking by on the sidewalk. For this reason, Frigate 0.14 categorizes review items as _alerts_ and _detections_. By default, all person and car objects are considered alerts. You can refine categorization of your review items by configuring required zones for them. +:::note + +Alerts and detections categorize the tracked objects in review items, but Frigate must first detect those objects with your configured object detector (Coral, OpenVINO, etc). By default, the object tracker only detects `person`. Setting `labels` for `alerts` and `detections` does not automatically enable detection of new objects. To detect more than `person`, you should add the following to your config: + +```yaml +objects: + track: + - person + - car + - ... +``` + +See the [objects documentation](objects.md) for the list of objects that Frigate's default model tracks. +::: + ## Restricting alerts to specific labels By default a review item will only be marked as an alert if a person or car is detected. This can be configured to include any object or audio label using the following config: From 6d80a195185fa65da3d7cb65e844c4d3bacda8b5 Mon Sep 17 00:00:00 2001 From: Tue Topholm Date: Sun, 23 Feb 2025 23:14:26 +0000 Subject: [PATCH 09/27] Add cameras to ptz list (#16767) --- docs/docs/configuration/cameras.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/docs/configuration/cameras.md b/docs/docs/configuration/cameras.md index 50a8c6f93..26751feba 100644 --- a/docs/docs/configuration/cameras.md +++ b/docs/docs/configuration/cameras.md @@ -99,7 +99,12 @@ This list of working and non-working PTZ cameras is based on user feedback. | Amcrest IP5M-1190EW | ✅ | ❌ | ONVIF Port: 80. FOV relative movement not supported. | | Ctronics PTZ | ✅ | ❌ | | | Dahua | ✅ | ✅ | | -| Dahua DH-SD2A500HB | ✅ | ❌ | | +| Dahua DH-SD2A500HB | ✅ | ❌ | + +| Dahua DH-SD49825GB-HNR | ✅ | ✅ | + +| Dahua DH-P5AE-PV | ❌ | ❌ | + | Foscam R5 | ✅ | ❌ | | | Hanwha XNP-6550RH | ✅ | ❌ | | | Hikvision | ✅ | ❌ | Incomplete ONVIF support (MoveStatus won't update even on latest firmware) - reported with HWP-N4215IH-DE and DS-2DE3304W-DE, but likely others | From a9255bddb508ab0109d1c94764b827231df6eea9 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Mon, 24 Feb 2025 11:59:31 -0600 Subject: [PATCH 10/27] fix docs ptz chart (#16786) --- docs/docs/configuration/cameras.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/docs/configuration/cameras.md b/docs/docs/configuration/cameras.md index 26751feba..73f1991fc 100644 --- a/docs/docs/configuration/cameras.md +++ b/docs/docs/configuration/cameras.md @@ -99,12 +99,9 @@ This list of working and non-working PTZ cameras is based on user feedback. | Amcrest IP5M-1190EW | ✅ | ❌ | ONVIF Port: 80. FOV relative movement not supported. | | Ctronics PTZ | ✅ | ❌ | | | Dahua | ✅ | ✅ | | -| Dahua DH-SD2A500HB | ✅ | ❌ | - -| Dahua DH-SD49825GB-HNR | ✅ | ✅ | - -| Dahua DH-P5AE-PV | ❌ | ❌ | - +| Dahua DH-SD2A500HB | ✅ | ❌ | | +| Dahua DH-SD49825GB-HNR | ✅ | ✅ | | +| Dahua DH-P5AE-PV | ❌ | ❌ | | | Foscam R5 | ✅ | ❌ | | | Hanwha XNP-6550RH | ✅ | ❌ | | | Hikvision | ✅ | ❌ | Incomplete ONVIF support (MoveStatus won't update even on latest firmware) - reported with HWP-N4215IH-DE and DS-2DE3304W-DE, but likely others | From 7c33f9c5790a4b2b0ae7df97f3e9920ab16bed44 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Mon, 24 Feb 2025 16:15:10 -0700 Subject: [PATCH 11/27] Add link to advanced camera card in docs (#16791) --- docs/docs/integrations/third_party_extensions.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/integrations/third_party_extensions.md b/docs/docs/integrations/third_party_extensions.md index e1f9a1053..ea023ec31 100644 --- a/docs/docs/integrations/third_party_extensions.md +++ b/docs/docs/integrations/third_party_extensions.md @@ -13,6 +13,10 @@ Please use your own knowledge to assess and vet them before you install anything ::: +## [Advanced Camera Card (formerly known as Frigate Card](https://card.camera/#/README) + +The [Advanced Camera Card](https://card.camera/#/README) is a Home Assistant dashboard card with deep Frigate integration. + ## [Double Take](https://github.com/skrashevich/double-take) [Double Take](https://github.com/skrashevich/double-take) provides an unified UI and API for processing and training images for facial recognition. From efbc1f836b9c7e0ed38db06ed3d14277538e5f15 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 25 Feb 2025 10:02:34 -0700 Subject: [PATCH 12/27] Update mqtt event structure (#16803) --- docs/docs/integrations/mqtt.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/docs/integrations/mqtt.md b/docs/docs/integrations/mqtt.md index 194821cbd..8fbe9f209 100644 --- a/docs/docs/integrations/mqtt.md +++ b/docs/docs/integrations/mqtt.md @@ -28,7 +28,14 @@ Message published for each changed tracked object. The first message is publishe "id": "1607123955.475377-mxklsc", "camera": "front_door", "frame_time": 1607123961.837752, - "snapshot_time": 1607123961.837752, + "snapshot": { + "frame_time": 1607123965.975463, + "box": [415, 489, 528, 700], + "area": 12728, + "region": [260, 446, 660, 846], + "score": 0.77546, + "attributes": [], + }, "label": "person", "sub_label": null, "top_score": 0.958984375, @@ -58,7 +65,14 @@ Message published for each changed tracked object. The first message is publishe "id": "1607123955.475377-mxklsc", "camera": "front_door", "frame_time": 1607123962.082975, - "snapshot_time": 1607123961.837752, + "snapshot": { + "frame_time": 1607123965.975463, + "box": [415, 489, 528, 700], + "area": 12728, + "region": [260, 446, 660, 846], + "score": 0.77546, + "attributes": [], + }, "label": "person", "sub_label": ["John Smith", 0.79], "top_score": 0.958984375, From b01b1faa3f797b05d134a538dd852a4456495044 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 27 Feb 2025 11:34:15 -0600 Subject: [PATCH 13/27] Add docs for updating to latest version (#16849) * add docs for updating to latest version * add db filename * clarity * add faq * version number * stop frigate first * version number * combine steps --- docs/docs/frigate/updating.md | 119 ++++++++++++++++++++++++++++++++++ docs/sidebars.ts | 1 + 2 files changed, 120 insertions(+) create mode 100644 docs/docs/frigate/updating.md diff --git a/docs/docs/frigate/updating.md b/docs/docs/frigate/updating.md new file mode 100644 index 000000000..08ab863ae --- /dev/null +++ b/docs/docs/frigate/updating.md @@ -0,0 +1,119 @@ +--- +id: updating +title: Updating +--- + +# Updating Frigate + +The current stable version of Frigate is **0.15.0**. The release notes and any breaking changes for this version can be found on the [Frigate GitHub releases page](https://github.com/blakeblackshear/frigate/releases/tag/v0.15.0). + +Keeping Frigate up to date ensures you benefit from the latest features, performance improvements, and bug fixes. The update process varies slightly depending on your installation method (Docker, Home Assistant Addon, etc.). Below are instructions for the most common setups. + +## Before You Begin + +- **Stop Frigate**: For most methods, you’ll need to stop the running Frigate instance before backing up and updating. +- **Backup Your Configuration**: Always back up your `/config` directory (e.g., `config.yml` and `frigate.db`, the SQLite database) before updating. This ensures you can roll back if something goes wrong. +- **Check Release Notes**: Carefully review the [Frigate GitHub releases page](https://github.com/blakeblackshear/frigate/releases) for breaking changes or configuration updates that might affect your setup. + +## Updating with Docker + +If you’re running Frigate via Docker (recommended method), follow these steps: + +1. **Stop the Container**: + + - If using Docker Compose: + ```bash + docker compose down frigate + ``` + - If using `docker run`: + ```bash + docker stop frigate + ``` + +2. **Update and Pull the Latest Image**: + + - If using Docker Compose: + - Edit your `docker-compose.yml` file to specify the desired version tag (e.g., `0.15.0` instead of `0.14.1`). For example: + ```yaml + services: + frigate: + image: ghcr.io/blakeblackshear/frigate:0.15.0 + ``` + - Then pull the image: + ```bash + docker pull ghcr.io/blakeblackshear/frigate:0.15.0 + ``` + - **Note for `stable` Tag Users**: If your `docker-compose.yml` uses the `stable` tag (e.g., `ghcr.io/blakeblackshear/frigate:stable`), you don’t need to update the tag manually. The `stable` tag always points to the latest stable release after pulling. + - If using `docker run`: + - Pull the image with the appropriate tag (e.g., `0.15.0`, `0.15.0-tensorrt`, or `stable`): + ```bash + docker pull ghcr.io/blakeblackshear/frigate:0.15.0 + ``` + +3. **Start the Container**: + + - If using Docker Compose: + ```bash + docker compose up -d + ``` + - If using `docker run`, re-run your original command (e.g., from the [Installation](#docker) section) with the updated image tag. + +4. **Verify the Update**: + - Check the container logs to ensure Frigate starts successfully: + ```bash + docker logs frigate + ``` + - Visit the Frigate Web UI (default: `http://:5000`) to confirm the new version is running. The version number is displayed at the top of the System Metrics page. + +### Notes + +- If you’ve customized other settings (e.g., `shm-size`), ensure they’re still appropriate after the update. +- Docker will automatically use the updated image when you restart the container, as long as you pulled the correct version. + +## Updating the Home Assistant Addon + +For users running Frigate as a Home Assistant Addon: + +1. **Check for Updates**: + + - Navigate to **Settings > Add-ons** in Home Assistant. + - Find your installed Frigate addon (e.g., "Frigate NVR" or "Frigate NVR (Full Access)"). + - If an update is available, you’ll see an "Update" button. + +2. **Update the Addon**: + + - Click the "Update" button next to the Frigate addon. + - Wait for the process to complete. Home Assistant will handle downloading and installing the new version. + +3. **Restart the Addon**: + + - After updating, go to the addon’s page and click "Restart" to apply the changes. + +4. **Verify the Update**: + - Check the addon logs (under the "Log" tab) to ensure Frigate starts without errors. + - Access the Frigate Web UI to confirm the new version is running. + +### Notes + +- Ensure your `/config/frigate.yml` is compatible with the new version by reviewing the [Release notes](https://github.com/blakeblackshear/frigate/releases). +- If using custom hardware (e.g., Coral or GPU), verify that configurations still work, as addon updates don’t modify your hardware settings. + +## Rolling Back + +If an update causes issues: + +1. Stop Frigate. +2. Restore your backed-up config file and database. +3. Revert to the previous image version: + - For Docker: Specify an older tag (e.g., `ghcr.io/blakeblackshear/frigate:0.14.1`) in your `docker run` command. + - For Docker Compose: Edit your `docker-compose.yml`, specify the older version tag (e.g., `ghcr.io/blakeblackshear/frigate:0.14.1`), and re-run `docker compose up -d`. + - For Home Assistant: Reinstall the previous addon version manually via the repository if needed and restart the addon. +4. Verify the old version is running again. + +## Troubleshooting + +- **Container Fails to Start**: Check logs (`docker logs frigate`) for errors. +- **UI Not Loading**: Ensure ports (e.g., 5000, 8971) are still mapped correctly and the service is running. +- **Hardware Issues**: Revisit hardware-specific setup (e.g., Coral, GPU) if detection or decoding fails post-update. + +Common questions are often answered in the [FAQ](https://github.com/blakeblackshear/frigate/discussions), pinned at the top of the support discussions. diff --git a/docs/sidebars.ts b/docs/sidebars.ts index 4ed41d2ad..cd662f239 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -8,6 +8,7 @@ const sidebars: SidebarsConfig = { 'frigate/index', 'frigate/hardware', 'frigate/installation', + 'frigate/updating', 'frigate/camera_setup', 'frigate/video_pipeline', 'frigate/glossary', From e3ed1ab8ecffe8c763add6bd4e95ed52eb06a60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Sch=C3=BCller?= Date: Thu, 6 Mar 2025 20:12:01 +0100 Subject: [PATCH 14/27] Update live.md (#16989) Fix link to 2-way audio documentation --- docs/docs/configuration/live.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/configuration/live.md b/docs/docs/configuration/live.md index 22789181a..8221703ca 100644 --- a/docs/docs/configuration/live.md +++ b/docs/docs/configuration/live.md @@ -145,6 +145,6 @@ For devices that support two way talk, Frigate can be configured to use the feat - Set up go2rtc with [WebRTC](#webrtc-extra-configuration). - Ensure you access Frigate via https (may require [opening port 8971](/frigate/installation/#ports)). -- For the Home Assistant Frigate card, [follow the docs](https://github.com/dermotduffy/frigate-hass-card?tab=readme-ov-file#using-2-way-audio) for the correct source. +- For the Home Assistant Frigate card, [follow the docs](http://card.camera/#/usage/2-way-audio) for the correct source. To use the Reolink Doorbell with two way talk, you should use the [recommended Reolink configuration](/configuration/camera_specific#reolink-doorbell) From 0764fea159bb54e526b592909b2a430b3f789d55 Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Tue, 8 Apr 2025 18:36:44 -0500 Subject: [PATCH 15/27] update recommended hardware links (#17609) --- docs/docs/frigate/hardware.md | 69 ++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index 4bbd270f1..5b5222b9c 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -16,16 +16,27 @@ Here are some of the camera's I recommend: - Loryta(Dahua) IPC-T549M-ALED-S3 (affiliate link) - Loryta(Dahua) IPC-T54IR-AS (affiliate link) - Amcrest IP5M-T1179EW-AI-V3 (affiliate link) +- HIKVISION DS-2CD2387G2P-LSU/SL ColorVu 8MP Panoramic Turret IP Camera (affiliate link) I may earn a small commission for my endorsement, recommendation, testimonial, or link to any products or services from this website. ## Server -My current favorite is the Beelink EQ13 because of the efficient N100 CPU and dual NICs that allow you to setup a dedicated private network for your cameras where they can be blocked from accessing the internet. There are many used workstation options on eBay that work very well. Anything with an Intel CPU and capable of running Debian should work fine. As a bonus, you may want to look for devices with a M.2 or PCIe express slot that is compatible with the Google Coral. I may earn a small commission for my endorsement, recommendation, testimonial, or link to any products or services from this website. +My current favorite is the Beelink EQ13 because of the efficient N100 CPU and dual NICs that allow you to setup a dedicated private network for your cameras where they can be blocked from accessing the internet. There are many used workstation options on eBay that work very well. Anything with an Intel CPU and capable of running Debian should work fine. As a bonus, you may want to look for devices with a M.2 or PCIe express slot that is compatible with the Google Coral, Hailo, or other AI accelerators. + +Note that many of these mini PCs come with Windows pre-installed, and you will need to install Linux according to the [getting started guide](../guides/getting_started.md). + +I may earn a small commission for my endorsement, recommendation, testimonial, or link to any products or services from this website. + +:::warning + +If the EQ13 is out of stock, the link below may take you to a suggested alternative on Amazon. The Beelink EQ14 has some known compatibility issues, so you should avoid that model for now. + +::: | Name | Coral Inference Speed | Coral Compatibility | Notes | | ------------------------------------------------------------------------------------------------------------- | --------------------- | ------------------- | ----------------------------------------------------------------------------------------- | -| Beelink EQ13 (Amazon) | 5-10ms | USB | Dual gigabit NICs for easy isolated camera network. Easily handles several 1080p cameras. | +| Beelink EQ13 (Amazon) | 5-10ms | USB | Dual gigabit NICs for easy isolated camera network. Easily handles several 1080p cameras. | ## Detectors @@ -53,24 +64,24 @@ More information is available [in the detector docs](/configuration/object_detec Inference speeds vary greatly depending on the CPU or GPU used, some known examples of GPU inference times are below: -| Name | MobileNetV2 Inference Time | YOLO-NAS Inference Time | Notes | -| -------------------- | -------------------------- | ------------------------- | -------------------------------------- | -| Intel Arc A750       | ~ 4 ms                     | 320: ~ 8 ms               |                                        | -| Intel Arc A380       | ~ 6 ms                     | 320: ~ 10 ms              |                                        | -| Intel Ultra 5 125H | | 320: ~ 10 ms 640: ~ 22 ms | | -| Intel i5 12600K      | ~ 15 ms                    | 320: ~ 20 ms 640: ~ 46 ms |                                        | -| Intel i3 12000       |                            | 320: ~ 19 ms 640: ~ 54 ms |                                        | -| Intel i5 1135G7      | 10 - 15 ms                 |                           |                                        | -| Intel i5 7500        | ~ 15 ms                    |                           |                                        | -| Intel i5 7200u       | 15 - 25 ms                 |                           |                                        | -| Intel i5 6500        | ~ 15 ms                    |                           |                                        | -| Intel i5 4590        | ~ 20 ms                    |                           |                                        | -| Intel i3 8100        | ~ 15 ms                    |                           |                                        | -| Intel i3 6100T       | 15 - 35 ms                 |                           | Can only run one detector instance     | -| Intel Celeron N4020  | 50 - 200 ms                |                           | Inference speed depends on other loads | -| Intel Celeron N3205U | ~ 120 ms                   |                           | Can only run one detector instance     | -| Intel Celeron N3060  | 130 - 150 ms               |                           | Can only run one detector instance     | -| Intel Celeron J4105  | ~ 25 ms                    |                           | Can only run one | +| Name | MobileNetV2 Inference Time | YOLO-NAS Inference Time | Notes | +| --------------------- | --------------------------- | --------------------------- | --------------------------------------- | +| Intel Arc A750        | ~ 4 ms                      | 320: ~ 8 ms                |                                         | +| Intel Arc A380        | ~ 6 ms                      | 320: ~ 10 ms              |                                         | +| Intel Ultra 5 125H | | 320: ~ 10 ms 640: ~ 22 ms | | +| Intel i5 12600K      | ~ 15 ms                    | 320: ~ 20 ms 640: ~ 46 ms |                                         | +| Intel i3 12000        |                             | 320: ~ 19 ms 640: ~ 54 ms |                                         | +| Intel i5 1135G7      | 10 - 15 ms                  |                             |                                         | +| Intel i5 7500        | ~ 15 ms                    |                             |                                         | +| Intel i5 7200u        | 15 - 25 ms                  |                             |                                         | +| Intel i5 6500        | ~ 15 ms                    |                             |                                         | +| Intel i5 4590        | ~ 20 ms                    |                             |                                         | +| Intel i3 8100        | ~ 15 ms                    |                             |                                         | +| Intel i3 6100T        | 15 - 35 ms                  |                             | Can only run one detector instance      | +| Intel Celeron N4020  | 50 - 200 ms                |                             | Inference speed depends on other loads | +| Intel Celeron N3205U | ~ 120 ms                    |                             | Can only run one detector instance      | +| Intel Celeron N3060  | 130 - 150 ms                |                             | Can only run one detector instance      | +| Intel Celeron J4105  | ~ 25 ms                    |                             | Can only run one | ### TensorRT - Nvidia GPU @@ -79,15 +90,15 @@ The TensortRT detector is able to run on x86 hosts that have an Nvidia GPU which Inference speeds will vary greatly depending on the GPU and the model used. `tiny` variants are faster than the equivalent non-tiny model, some known examples are below: -| Name | YoloV7 Inference Time | YOLO-NAS Inference Time | -| --------------- | --------------------- | ------------------------- | -| Quadro P2000    | ~ 12 ms               |                           | -| Quadro P400 2GB | 20 - 25 ms            |                           | -| RTX 3070 Mobile | ~ 5 ms                |                           | -| RTX 3050        | 5 - 7 ms              | 320: ~ 10 ms 640: ~ 16 ms | -| GTX 1660 SUPER  | ~ 4 ms                |                           | -| GTX 1070        | ~ 6 ms                |                           | -| GTX 1060 6GB    | ~ 7 ms                |                           | +| Name | YoloV7 Inference Time | YOLO-NAS Inference Time | +| --------------- | ---------------------- | --------------------------- | +| Quadro P2000    | ~ 12 ms                |                             | +| Quadro P400 2GB | 20 - 25 ms            |                             | +| RTX 3070 Mobile | ~ 5 ms                |                             | +| RTX 3050        | 5 - 7 ms              | 320: ~ 10 ms 640: ~ 16 ms | +| GTX 1660 SUPER  | ~ 4 ms                |                             | +| GTX 1070        | ~ 6 ms                |                             | +| GTX 1060 6GB    | ~ 7 ms                |                             | ### AMD GPUs From 7cfa818e63b217502bacb5880215abc5fd04794b Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Thu, 10 Apr 2025 16:28:57 -0600 Subject: [PATCH 16/27] Update tensorrt model config to use coco-80 (#17640) --- docs/docs/configuration/object_detectors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/configuration/object_detectors.md b/docs/docs/configuration/object_detectors.md index 4aa1d7fe4..7f6f8cb4f 100644 --- a/docs/docs/configuration/object_detectors.md +++ b/docs/docs/configuration/object_detectors.md @@ -327,6 +327,7 @@ detectors: model: path: /config/model_cache/tensorrt/yolov7-320.trt + labelmap_path: /labelmap/coco-80.txt input_tensor: nchw input_pixel_format: rgb width: 320 From 6cb5cfb0c9690b9e9622daa1656fe9b619470d1f Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Fri, 11 Apr 2025 17:23:13 -0500 Subject: [PATCH 17/27] Fix missing space in trt model prepare script (#17661) --- .../rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/run b/docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/run index a88da89d6..419cf4a89 100755 --- a/docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/run +++ b/docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/run @@ -20,7 +20,7 @@ FIRST_MODEL=true MODEL_DOWNLOAD="" MODEL_CONVERT="" -if [ -z "$YOLO_MODELS"]; then +if [ -z "$YOLO_MODELS" ]; then echo "tensorrt model preparation disabled" exit 0 fi From ee4767b1ce3cf3004b77ac39cb1d9b4c3ca9d0d8 Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Wed, 16 Apr 2025 06:56:00 -0500 Subject: [PATCH 18/27] plus docs updates (#17732) --- docs/docs/plus/first_model.md | 2 +- docs/docs/plus/index.md | 26 ++++++++++---------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/docs/docs/plus/first_model.md b/docs/docs/plus/first_model.md index e68fd388d..2a0096e31 100644 --- a/docs/docs/plus/first_model.md +++ b/docs/docs/plus/first_model.md @@ -13,7 +13,7 @@ For more detailed recommendations, you can refer to the docs on [improving your ## Step 2: Submit a model request -Once you have an initial set of verified images, you can request a model on the Models page. For guidance on choosing a model type, refer to [this part of the documentation](./index.md#available-model-types). Each model request requires 1 of the 12 trainings that you receive with your annual subscription. This model will support all [label types available](./index.md#available-label-types) even if you do not submit any examples for those labels. Model creation can take up to 36 hours. +Once you have an initial set of verified images, you can request a model on the Models page. For guidance on choosing a model type, refer to [this part of the documentation](./index.md#available-model-types). If you are unsure which type to request, you can test the base model for each version from the "Base Models" tab. Each model request requires 1 of the 12 trainings that you receive with your annual subscription. This model will support all [label types available](./index.md#available-label-types) even if you do not submit any examples for those labels. Model creation can take up to 36 hours. ![Plus Models Page](/img/plus/plus-models.jpg) ## Step 3: Set your model id in the config diff --git a/docs/docs/plus/index.md b/docs/docs/plus/index.md index 37798badb..e0c984f02 100644 --- a/docs/docs/plus/index.md +++ b/docs/docs/plus/index.md @@ -3,15 +3,9 @@ id: index title: Models --- -Frigate+ offers models trained on images submitted by Frigate+ users from their security cameras and is specifically designed for the way Frigate NVR analyzes video footage. These models offer higher accuracy with less resources. The images you upload are used to fine tune a baseline model trained from images uploaded by all Frigate+ users. This fine tuning process results in a model that is optimized for accuracy in your specific conditions. +Frigate+ offers models trained on images submitted by Frigate+ users from their security cameras and is specifically designed for the way Frigate NVR analyzes video footage. These models offer higher accuracy with less resources. The images you upload are used to fine tune a base model trained from images uploaded by all Frigate+ users. This fine tuning process results in a model that is optimized for accuracy in your specific conditions. -:::info - -The baseline model isn't directly available after subscribing. This may change in the future, but for now you will need to submit a model request with the minimum number of images. - -::: - -With a subscription, 12 model trainings per year are included. If you cancel your subscription, you will retain access to any trained models. An active subscription is required to submit model requests or purchase additional trainings. +With a subscription, 12 model trainings to fine tune your model per year are included. In addition, you will have access to any base models published while your subscription is active. If you cancel your subscription, you will retain access to any trained and base models in your account. An active subscription is required to submit model requests or purchase additional trainings. New base models are published quarterly with target dates of January 15th, April 15th, July 15th, and October 15th. Information on how to integrate Frigate+ with Frigate can be found in the [integration docs](../integrations/plus.md). @@ -19,7 +13,7 @@ Information on how to integrate Frigate+ with Frigate can be found in the [integ There are two model types offered in Frigate+, `mobiledet` and `yolonas`. Both of these models are object detection models and are trained to detect the same set of labels [listed below](#available-label-types). -Not all model types are supported by all detectors, so it's important to choose a model type to match your detector as shown in the table under [supported detector types](#supported-detector-types). +Not all model types are supported by all detectors, so it's important to choose a model type to match your detector as shown in the table under [supported detector types](#supported-detector-types). You can test model types for compatibility and speed on your hardware by using the base models. | Model Type | Description | | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------- | @@ -36,13 +30,13 @@ Using Frigate+ models with `onnx` and `rocm` is only available with Frigate 0.15 ::: -| Hardware | Recommended Detector Type | Recommended Model Type | -| ---------------------------------------------------------------------------------------------------------------------------- | ------------------------- | ---------------------- | -| [CPU](/configuration/object_detectors.md#cpu-detector-not-recommended) | `cpu` | `mobiledet` | -| [Coral (all form factors)](/configuration/object_detectors.md#edge-tpu-detector) | `edgetpu` | `mobiledet` | -| [Intel](/configuration/object_detectors.md#openvino-detector) | `openvino` | `yolonas` | -| [NVidia GPU](https://deploy-preview-13787--frigate-docs.netlify.app/configuration/object_detectors#onnx)\* | `onnx` | `yolonas` | -| [AMD ROCm GPU](https://deploy-preview-13787--frigate-docs.netlify.app/configuration/object_detectors#amdrocm-gpu-detector)\* | `rocm` | `yolonas` | +| Hardware | Recommended Detector Type | Recommended Model Type | +| -------------------------------------------------------------------------------- | ------------------------- | ---------------------- | +| [CPU](/configuration/object_detectors.md#cpu-detector-not-recommended) | `cpu` | `mobiledet` | +| [Coral (all form factors)](/configuration/object_detectors.md#edge-tpu-detector) | `edgetpu` | `mobiledet` | +| [Intel](/configuration/object_detectors.md#openvino-detector) | `openvino` | `yolonas` | +| [NVidia GPU](/configuration/object_detectors#onnx)\* | `onnx` | `yolonas` | +| [AMD ROCm GPU](/configuration/object_detectors#amdrocm-gpu-detector)\* | `rocm` | `yolonas` | _\* Requires Frigate 0.15_ From e7f6e069f6ec85108b3072a7abbca2c6ad877472 Mon Sep 17 00:00:00 2001 From: Daniel Moy <78288231+danmoy@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:57:39 -0700 Subject: [PATCH 19/27] Update tls.md instructions for letsencrypt archive dir (#17747) Current instructions are a little ambiguous about which links need to point to the underlying fqdn dir created by letsencrypt --- docs/docs/configuration/tls.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/configuration/tls.md b/docs/docs/configuration/tls.md index 7b254c100..5c3867ea6 100644 --- a/docs/docs/configuration/tls.md +++ b/docs/docs/configuration/tls.md @@ -36,8 +36,8 @@ Note that certbot uses symlinks, and those can't be followed by the container un frigate: ... volumes: - - /etc/letsencrypt/live/frigate:/etc/letsencrypt/live/frigate:ro - - /etc/letsencrypt/archive/frigate:/etc/letsencrypt/archive/frigate:ro + - /etc/letsencrypt/live/your.fqdn.net:/etc/letsencrypt/live/frigate:ro + - /etc/letsencrypt/archive/your.fqdn.net:/etc/letsencrypt/archive/your.fqdn.net:ro ... ``` From 37618b0f572a8cc7afb10a40e0bc56c007511265 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 17 Apr 2025 08:43:26 -0500 Subject: [PATCH 20/27] fix article link (#17758) --- docs/docs/frigate/hardware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index 5b5222b9c..bb11de05a 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -150,4 +150,4 @@ Basically - When you increase the resolution and/or the frame rate of the stream YES! The Coral does not help with decoding video streams. -Decompressing video streams takes a significant amount of CPU power. Video compression uses key frames (also known as I-frames) to send a full frame in the video stream. The following frames only include the difference from the key frame, and the CPU has to compile each frame by merging the differences with the key frame. [More detailed explanation](https://blog.video.ibm.com/streaming-video-tips/keyframes-interframe-video-compression/). Higher resolutions and frame rates mean more processing power is needed to decode the video stream, so try and set them on the camera to avoid unnecessary decoding work. +Decompressing video streams takes a significant amount of CPU power. Video compression uses key frames (also known as I-frames) to send a full frame in the video stream. The following frames only include the difference from the key frame, and the CPU has to compile each frame by merging the differences with the key frame. [More detailed explanation](https://support.video.ibm.com/hc/en-us/articles/18106203580316-Keyframes-InterFrame-Video-Compression). Higher resolutions and frame rates mean more processing power is needed to decode the video stream, so try and set them on the camera to avoid unnecessary decoding work. From 6857cc2b97710469f3d472f51e9e848cd742d98e Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Mon, 21 Apr 2025 16:01:32 -0600 Subject: [PATCH 21/27] Update camera recommendation (#17844) --- docs/docs/frigate/hardware.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index bb11de05a..bc46c4249 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -9,7 +9,9 @@ Cameras that output H.264 video and AAC audio will offer the most compatibility I recommend Dahua, Hikvision, and Amcrest in that order. Dahua edges out Hikvision because they are easier to find and order, not because they are better cameras. I personally use Dahua cameras because they are easier to purchase directly. In my experience Dahua and Hikvision both have multiple streams with configurable resolutions and frame rates and rock solid streams. They also both have models with large sensors well known for excellent image quality at night. Not all the models are equal. Larger sensors are better than higher resolutions; especially at night. Amcrest is the fallback recommendation because they are rebranded Dahuas. They are rebranding the lower end models with smaller sensors or less configuration options. -Many users have reported various issues with Reolink cameras, so I do not recommend them. If you are using Reolink, I suggest the [Reolink specific configuration](../configuration/camera_specific.md#reolink-cameras). Wifi cameras are also not recommended. Their streams are less reliable and cause connection loss and/or lost video data. +WiFi cameras are not recommended as [their streams are less reliable and cause connection loss and/or lost video data](https://ipcamtalk.com/threads/camera-conflicts.68142/#post-738821), especially when more than a few WiFi cameras will be used at the same time. + +Many users have reported various issues with 4K-plus Reolink cameras, it is best to stick with 5MP and lower for Reolink cameras. If you are using Reolink, I suggest the [Reolink specific configuration](../configuration/camera_specific.md#reolink-cameras). Here are some of the camera's I recommend: From 6a6246799865d305f8b73c8efd2ac5bcc3aec347 Mon Sep 17 00:00:00 2001 From: Daniel Moy <78288231+danmoy@users.noreply.github.com> Date: Tue, 22 Apr 2025 04:10:52 -0700 Subject: [PATCH 22/27] Fix deprecated listen...http2 documentation in nginx reverse proxy (#17848) This is deprecated: listen 443 ssl http2; New syntax has a separate line: http2 on; See e.g. https://forum.hestiacp.com/t/nginx-1-25-1-listen-http2-directive-is-deprecated/9816 --- docs/docs/guides/reverse_proxy.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docs/guides/reverse_proxy.md b/docs/docs/guides/reverse_proxy.md index d408a1444..bbcf2118c 100644 --- a/docs/docs/guides/reverse_proxy.md +++ b/docs/docs/guides/reverse_proxy.md @@ -117,7 +117,8 @@ server { set $port 8971; listen 80; - listen 443 ssl http2; + listen 443 ssl; + http2 on; server_name frigate.domain.com; } From 77589c18f4cc685600c19f2b08dfab6ce4e31c80 Mon Sep 17 00:00:00 2001 From: "genevera (she/her)" Date: Sun, 27 Apr 2025 22:19:00 -0400 Subject: [PATCH 23/27] Update reverse_proxy.md (#17927) * Update reverse_proxy.md Adds a small, working, config for Caddy * Update docs/docs/guides/reverse_proxy.md Co-authored-by: Nicolas Mowen * Update docs/docs/guides/reverse_proxy.md Co-authored-by: Nicolas Mowen --------- Co-authored-by: Nicolas Mowen --- docs/docs/guides/reverse_proxy.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/docs/guides/reverse_proxy.md b/docs/docs/guides/reverse_proxy.md index bbcf2118c..5edfb5c60 100644 --- a/docs/docs/guides/reverse_proxy.md +++ b/docs/docs/guides/reverse_proxy.md @@ -35,6 +35,7 @@ There are many solutions available to implement reverse proxies and the communit * [Apache2](#apache2-reverse-proxy) * [Nginx](#nginx-reverse-proxy) * [Traefik](#traefik-reverse-proxy) +* [Caddy](#caddy-reverse-proxy) ## Apache2 Reverse Proxy @@ -178,3 +179,33 @@ The above configuration will create a "service" in Traefik, automatically adding It will also add a router, routing requests to "traefik.example.com" to your local container. Note that with this approach, you don't need to expose any ports for the Frigate instance since all traffic will be routed over the internal Docker network. + +## Caddy Reverse Proxy + +This example shows Frigate running under a subdomain with logging and a tls cert (in this case a wildcard domain cert obtained independently of caddy) handled via imports + +```caddy +(logging) { + log { + output file /var/log/caddy/{args[0]}.log { + roll_size 10MiB + roll_keep 5 + roll_keep_for 10d + } + format json + level INFO + } +} + + +(tls) { + tls /var/lib/caddy/wildcard.YOUR_DOMAIN.TLD.fullchain.pem /var/lib/caddy/wildcard.YOUR_DOMAIN.TLD.privkey.pem +} + +frigate.YOUR_DOMAIN.TLD { + reverse_proxy http://localhost:8971 + import tls + import logging frigate.YOUR_DOMAIN.TLD +} + +``` From 948b087d3cfa529d18e0a5fe607e576e32871b3a Mon Sep 17 00:00:00 2001 From: gardar Date: Mon, 26 May 2025 02:35:20 +0000 Subject: [PATCH 24/27] docs: firefox h.265 support (#18392) --- docs/docs/frigate/camera_setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/frigate/camera_setup.md b/docs/docs/frigate/camera_setup.md index 421046dd7..21e67ae0d 100644 --- a/docs/docs/frigate/camera_setup.md +++ b/docs/docs/frigate/camera_setup.md @@ -3,7 +3,7 @@ id: camera_setup title: Camera setup --- -Cameras configured to output H.264 video and AAC audio will offer the most compatibility with all features of Frigate and Home Assistant. H.265 has better compression, but less compatibility. Chrome 108+, Safari and Edge are the only browsers able to play H.265 and only support a limited number of H.265 profiles. Ideally, cameras should be configured directly for the desired resolutions and frame rates you want to use in Frigate. Reducing frame rates within Frigate will waste CPU resources decoding extra frames that are discarded. There are three different goals that you want to tune your stream configurations around. +Cameras configured to output H.264 video and AAC audio will offer the most compatibility with all features of Frigate and Home Assistant. H.265 has better compression, but less compatibility. Firefox 134+/136+/137+ (Windows/Mac/Linux & Android), Chrome 108+, Safari and Edge are the only browsers able to play H.265 and only support a limited number of H.265 profiles. Ideally, cameras should be configured directly for the desired resolutions and frame rates you want to use in Frigate. Reducing frame rates within Frigate will waste CPU resources decoding extra frames that are discarded. There are three different goals that you want to tune your stream configurations around. - **Detection**: This is the only stream that Frigate will decode for processing. Also, this is the stream where snapshots will be generated from. The resolution for detection should be tuned for the size of the objects you want to detect. See [Choosing a detect resolution](#choosing-a-detect-resolution) for more details. The recommended frame rate is 5fps, but may need to be higher (10fps is the recommended maximum for most users) for very fast moving objects. Higher resolutions and frame rates will drive higher CPU usage on your server. From ee51326d352b7ebe34a389cffcc0dbe76e9ed16f Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Fri, 30 May 2025 06:38:25 -0500 Subject: [PATCH 25/27] refresh the plus documentation (#18462) * refresh the plus documentation * fix broken links --- docs/docs/frigate/glossary.md | 2 +- docs/docs/frigate/updating.md | 2 +- docs/docs/integrations/plus.md | 2 +- .../{improving_model.md => annotating.md} | 24 +++++++++--------- docs/docs/plus/first_model.md | 2 +- docs/docs/plus/index.md | 20 ++++++++++++++- docs/docusaurus.config.ts | 20 ++++++++++++--- docs/sidebars.ts | 2 +- docs/static/img/plus/suggestions.webp | Bin 0 -> 72808 bytes 9 files changed, 52 insertions(+), 22 deletions(-) rename docs/docs/plus/{improving_model.md => annotating.md} (56%) create mode 100644 docs/static/img/plus/suggestions.webp diff --git a/docs/docs/frigate/glossary.md b/docs/docs/frigate/glossary.md index bd039554c..5bfbfafa5 100644 --- a/docs/docs/frigate/glossary.md +++ b/docs/docs/frigate/glossary.md @@ -66,4 +66,4 @@ The time period starting when a tracked object entered the frame and ending when ## Zone -Zones are areas of interest, zones can be used for notifications and for limiting the areas where Frigate will create an [event](#event). [See the zone docs for more info](/configuration/zones) +Zones are areas of interest, zones can be used for notifications and for limiting the areas where Frigate will create a [review item](#review-item). [See the zone docs for more info](/configuration/zones) diff --git a/docs/docs/frigate/updating.md b/docs/docs/frigate/updating.md index 08ab863ae..95ba5b67c 100644 --- a/docs/docs/frigate/updating.md +++ b/docs/docs/frigate/updating.md @@ -56,7 +56,7 @@ If you’re running Frigate via Docker (recommended method), follow these steps: ```bash docker compose up -d ``` - - If using `docker run`, re-run your original command (e.g., from the [Installation](#docker) section) with the updated image tag. + - If using `docker run`, re-run your original command (e.g., from the [Installation](./installation.md#docker) section) with the updated image tag. 4. **Verify the Update**: - Check the container logs to ensure Frigate starts successfully: diff --git a/docs/docs/integrations/plus.md b/docs/docs/integrations/plus.md index 0a2b7f2d0..30c69c927 100644 --- a/docs/docs/integrations/plus.md +++ b/docs/docs/integrations/plus.md @@ -43,7 +43,7 @@ Snapshots must be enabled to be able to submit examples to Frigate+ ### Annotate and verify -You can view all of your submitted images at [https://plus.frigate.video](https://plus.frigate.video). Annotations can be added by clicking an image. For more detailed information about labeling, see the documentation on [improving your model](../plus/improving_model.md). +You can view all of your submitted images at [https://plus.frigate.video](https://plus.frigate.video). Annotations can be added by clicking an image. For more detailed information about labeling, see the documentation on [annotating](../plus/annotating.md). ![Annotate](/img/annotate.png) diff --git a/docs/docs/plus/improving_model.md b/docs/docs/plus/annotating.md similarity index 56% rename from docs/docs/plus/improving_model.md rename to docs/docs/plus/annotating.md index 578f4512c..3e215faac 100644 --- a/docs/docs/plus/improving_model.md +++ b/docs/docs/plus/annotating.md @@ -1,17 +1,9 @@ --- -id: improving_model -title: Improving your model +id: annotating +title: Annotating your images --- -You may find that Frigate+ models result in more false positives initially, but by submitting true and false positives, the model will improve. With all the new images now being submitted by subscribers, future base models will improve as more and more examples are incorporated. Note that only images with at least one verified label will be used when training your model. Submitting an image from Frigate as a true or false positive will not verify the image. You still must verify the image in Frigate+ in order for it to be used in training. - -- **Submit both true positives and false positives**. This will help the model differentiate between what is and isn't correct. You should aim for a target of 80% true positive submissions and 20% false positives across all of your images. If you are experiencing false positives in a specific area, submitting true positives for any object type near that area in similar lighting conditions will help teach the model what that area looks like when no objects are present. -- **Lower your thresholds a little in order to generate more false/true positives near the threshold value**. For example, if you have some false positives that are scoring at 68% and some true positives scoring at 72%, you can try lowering your threshold to 65% and submitting both true and false positives within that range. This will help the model learn and widen the gap between true and false positive scores. -- **Submit diverse images**. For the best results, you should provide at least 100 verified images per camera. Keep in mind that varying conditions should be included. You will want images from cloudy days, sunny days, dawn, dusk, and night. As circumstances change, you may need to submit new examples to address new types of false positives. For example, the change from summer days to snowy winter days or other changes such as a new grill or patio furniture may require additional examples and training. - -## Properly labeling images - -For the best results, follow the following guidelines. +For the best results, follow these guidelines. You may also want to review the documentation on [improving your model](./index.md#improving-your-model). **Label every object in the image**: It is important that you label all objects in each image before verifying. If you don't label a car for example, the model will be taught that part of the image is _not_ a car and it will start to get confused. You can exclude labels that you don't want detected on any of your cameras. @@ -25,9 +17,17 @@ For the best results, follow the following guidelines. ![Fedex Logo](/img/plus/fedex-logo.jpg) +## AI suggested labels + +If you have an active Frigate+ subscription, new uploads will be scanned for the objects configured for you camera and you will see suggested labels as light blue boxes when annotating in Frigate+. These suggestions are processed via a queue and typically complete within a minute after uploading, but processing times can be longer. + +![Suggestions](/img/plus/suggestions.webp) + +Suggestions are converted to labels when saving, so you should remove any errant suggestions. There is already some logic designed to avoid duplicate labels, but you may still occasionally see some duplicate suggestions. You should keep the most accurate bounding box and delete any duplicates so that you have just one label per object remaining. + ## False positive labels -False positives will be shown with a read box and the label will have a strike through. +False positives will be shown with a read box and the label will have a strike through. These can't be adjusted, but they can be deleted if you accidentally submit a true positive as a false positive from Frigate. ![false positive](/img/plus/false-positive.jpg) Misidentified objects should have a correct label added. For example, if a person was mistakenly detected as a cat, you should submit it as a false positive in Frigate and add a label for the person. The boxes will overlap. diff --git a/docs/docs/plus/first_model.md b/docs/docs/plus/first_model.md index 2a0096e31..7e483d402 100644 --- a/docs/docs/plus/first_model.md +++ b/docs/docs/plus/first_model.md @@ -9,7 +9,7 @@ Before requesting your first model, you will need to upload and verify at least It is recommended to submit **both** true positives and false positives. This will help the model differentiate between what is and isn't correct. You should aim for a target of 80% true positive submissions and 20% false positives across all of your images. If you are experiencing false positives in a specific area, submitting true positives for any object type near that area in similar lighting conditions will help teach the model what that area looks like when no objects are present. -For more detailed recommendations, you can refer to the docs on [improving your model](./improving_model.md). +For more detailed recommendations, you can refer to the docs on [annotating](./annotating.md). ## Step 2: Submit a model request diff --git a/docs/docs/plus/index.md b/docs/docs/plus/index.md index e0c984f02..7666e9983 100644 --- a/docs/docs/plus/index.md +++ b/docs/docs/plus/index.md @@ -40,9 +40,17 @@ Using Frigate+ models with `onnx` and `rocm` is only available with Frigate 0.15 _\* Requires Frigate 0.15_ +## Improving your model + +Some users may find that Frigate+ models result in more false positives initially, but by submitting true and false positives, the model will improve. With all the new images now being submitted by subscribers, future base models will improve as more and more examples are incorporated. Note that only images with at least one verified label will be used when training your model. Submitting an image from Frigate as a true or false positive will not verify the image. You still must verify the image in Frigate+ in order for it to be used in training. + +- **Submit both true positives and false positives**. This will help the model differentiate between what is and isn't correct. You should aim for a target of 80% true positive submissions and 20% false positives across all of your images. If you are experiencing false positives in a specific area, submitting true positives for any object type near that area in similar lighting conditions will help teach the model what that area looks like when no objects are present. +- **Lower your thresholds a little in order to generate more false/true positives near the threshold value**. For example, if you have some false positives that are scoring at 68% and some true positives scoring at 72%, you can try lowering your threshold to 65% and submitting both true and false positives within that range. This will help the model learn and widen the gap between true and false positive scores. +- **Submit diverse images**. For the best results, you should provide at least 100 verified images per camera. Keep in mind that varying conditions should be included. You will want images from cloudy days, sunny days, dawn, dusk, and night. As circumstances change, you may need to submit new examples to address new types of false positives. For example, the change from summer days to snowy winter days or other changes such as a new grill or patio furniture may require additional examples and training. + ## Available label types -Frigate+ models support a more relevant set of objects for security cameras. Currently, the following objects are supported: +Frigate+ models support a more relevant set of objects for security cameras. The labels for annotation in Frigate+ are configurable by editing the camera in the Cameras section of Frigate+. Currently, the following objects are supported: - **People**: `person`, `face` - **Vehicles**: `car`, `motorcycle`, `bicycle`, `boat`, `license_plate` @@ -52,6 +60,16 @@ Frigate+ models support a more relevant set of objects for security cameras. Cur Other object types available in the default Frigate model are not available. Additional object types will be added in future releases. +### Candidate labels + +Candidate labels are also available for annotation. These labels don't have enough data to be included in the model yet, but using them will help add support sooner. You can enable these labels by editing the camera settings. + +Where possible, these labels are mapped to existing labels during training. For example, any `baby` labels are mapped to `person` until support for new labels is added. + +The candidate labels are: `baby`, `royal mail`, `canada post`, `bpost`, `skunk`, `badger`, `possum`, `rodent`, `kangaroo`, `chicken`, `groundhog`, `boar`, `hedgehog`, `school bus`, `tractor`, `golf cart`, `garbage truck`, `bus`, `sports ball` + +Candidate labels are not available for automatic suggestions. + ### Label attributes Frigate has special handling for some labels when using Frigate+ models. `face`, `license_plate`, and delivery logos such as `amazon`, `ups`, and `fedex` are considered attribute labels which are not tracked like regular objects and do not generate review items directly. In addition, the `threshold` filter will have no effect on these labels. You should adjust the `min_score` and other filter values as needed. diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 6c6e2be66..bdc8e7fa7 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -23,10 +23,22 @@ const config: Config = { mermaid: true, }, themeConfig: { - algolia: { - appId: "WIURGBNBPY", - apiKey: "d02cc0a6a61178b25da550212925226b", - indexName: "frigate", + announcementBar: { + id: 'frigate_plus', + content: ` + 🚀 + Get more relevant and accurate detections with Frigate+ models. + Learn more + + `, + backgroundColor: '#005f73', + textColor: '#e0fbfc', + isCloseable: false, }, docs: { sidebar: { diff --git a/docs/sidebars.ts b/docs/sidebars.ts index cd662f239..7007bb0f0 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -87,8 +87,8 @@ const sidebars: SidebarsConfig = { ], 'Frigate+': [ 'plus/index', + 'plus/annotating', 'plus/first_model', - 'plus/improving_model', 'plus/faq', ], Troubleshooting: [ diff --git a/docs/static/img/plus/suggestions.webp b/docs/static/img/plus/suggestions.webp new file mode 100644 index 0000000000000000000000000000000000000000..274eda790f29e43fc65e14b887fb3601500f9458 GIT binary patch literal 72808 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 z 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 literal 0 HcmV?d00001 From 460e291bf1b3b4a8a172d7e2c4be0dbdbee7da41 Mon Sep 17 00:00:00 2001 From: mpeter50 <83356418+mpeter50@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:32:25 +0000 Subject: [PATCH 26/27] Update pwa.md (#18568) add installation instructions for Firefox for Android --- docs/docs/configuration/pwa.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/configuration/pwa.md b/docs/docs/configuration/pwa.md index abe8d6934..fd1aae554 100644 --- a/docs/docs/configuration/pwa.md +++ b/docs/docs/configuration/pwa.md @@ -20,5 +20,5 @@ In order to install Frigate as a PWA, the following requirements must be met: Installation varies slightly based on the device that is being used: - Desktop: Use the install button typically found in right edge of the address bar -- Android: Use the `Install as App` button in the more options menu -- iOS: Use the `Add to Homescreen` button in the share menu \ No newline at end of file +- Android: Use the `Install as App` button in the more options menu for Chrome, and the `Add app to Home screen` button for Firefox +- iOS: Use the `Add to Homescreen` button in the share menu From aabd5b0077aee179cbfc0474551888cfedcbacaf Mon Sep 17 00:00:00 2001 From: HarvsG <11440490+HarvsG@users.noreply.github.com> Date: Wed, 25 Jun 2025 22:43:41 +0100 Subject: [PATCH 27/27] remove incorrect apostrophe (#18884) --- docs/docs/frigate/hardware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index bc46c4249..76cd78802 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -13,7 +13,7 @@ WiFi cameras are not recommended as [their streams are less reliable and cause c Many users have reported various issues with 4K-plus Reolink cameras, it is best to stick with 5MP and lower for Reolink cameras. If you are using Reolink, I suggest the [Reolink specific configuration](../configuration/camera_specific.md#reolink-cameras). -Here are some of the camera's I recommend: +Here are some of the cameras I recommend: - Loryta(Dahua) IPC-T549M-ALED-S3 (affiliate link) - Loryta(Dahua) IPC-T54IR-AS (affiliate link)