mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-10-05 22:32:50 +03:00
Compare commits
123
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cffef45730 | ||
|
|
79ca18d439 | ||
|
|
cabdffea20 | ||
|
|
ba41c90c07 | ||
|
|
0c52a3175d | ||
|
|
4c648f8147 | ||
|
|
e0d4337a25 | ||
|
|
5e689f2d85 | ||
|
|
57a2765d00 | ||
|
|
dd77bae4f7 | ||
|
|
8a98d7c9b1 | ||
|
|
8a8da663c0 | ||
|
|
eddc9fccd1 | ||
|
|
84f981a77c | ||
|
|
4100383738 | ||
|
|
fa30a7e1ae | ||
|
|
eecc43ccef | ||
|
|
7821ecbb43 | ||
|
|
caa6edecac | ||
|
|
acc740a976 | ||
|
|
3931ab74a8 | ||
|
|
5be162a22c | ||
|
|
e57eeb8288 | ||
|
|
cf03df8a98 | ||
|
|
fa36fa403b | ||
|
|
069315be33 | ||
|
|
c583e21b70 | ||
|
|
bb6c2e98eb | ||
|
|
0570a9c4eb | ||
|
|
ced95a1a31 | ||
|
|
1f340f389f | ||
|
|
94422ff24f | ||
|
|
06ff2ced5d | ||
|
|
35b9c4978d | ||
|
|
2106d10e2e | ||
|
|
8b8c90ee1a | ||
|
|
d462aeb068 | ||
|
|
828ecdd0ea | ||
|
|
d5e3fed130 | ||
|
|
3e7cb396e2 | ||
|
|
d71d573edf | ||
|
|
4b71cb76dd | ||
|
|
cf59d9ad56 | ||
|
|
94b37ceb6e | ||
|
|
ea84b1be82 | ||
|
|
105b7bb79d | ||
|
|
c46b099e14 | ||
|
|
05ebab80b6 | ||
|
|
6d2bf59aa6 | ||
|
|
1dd5ec312b | ||
|
|
cd8a159cc6 | ||
|
|
3da100af62 | ||
|
|
d25dbb69e1 | ||
|
|
049263eb42 | ||
|
|
9182d07f12 | ||
|
|
8d652ce6e4 | ||
|
|
9056696ee5 | ||
|
|
94c9cdbe9b | ||
|
|
95bdc232d3 | ||
|
|
8d648756d2 | ||
|
|
89cc76680c | ||
|
|
fc57dc3b36 | ||
|
|
97a2697587 | ||
|
|
021c12d707 | ||
|
|
4cdcb51571 | ||
|
|
c2b9e1222f | ||
|
|
eaad3cdad7 | ||
|
|
cce23c1983 | ||
|
|
c5e9ff6f67 | ||
|
|
177e0b73c0 | ||
|
|
54d2c99f6f | ||
|
|
54c63c485a | ||
|
|
7627008c11 | ||
|
|
0987024856 | ||
|
|
a9eb286db9 | ||
|
|
9af22e0c2f | ||
|
|
9f50aae966 | ||
|
|
9b0c06afda | ||
|
|
87d04687de | ||
|
|
138eb65ac8 | ||
|
|
d418ba4a8d | ||
|
|
11bbb2d45e | ||
|
|
fd31941089 | ||
|
|
292cc648a2 | ||
|
|
078b1e6bb3 | ||
|
|
d2e5de3863 | ||
|
|
4717db79a0 | ||
|
|
2cfdb6cb34 | ||
|
|
8846495e16 | ||
|
|
c639e58dad | ||
|
|
aab79dc4cd | ||
|
|
33f8caf31e | ||
|
|
0f86a00afa | ||
|
|
853d8b0c07 | ||
|
|
de5c18af38 | ||
|
|
acafd8712c | ||
|
|
b5106863df | ||
|
|
7e69bc2dc2 | ||
|
|
eb5e166ee6 | ||
|
|
48fc9f2083 | ||
|
|
fa78baef94 | ||
|
|
0d3ece336f | ||
|
|
5a9f1153c5 | ||
|
|
2a1c087234 | ||
|
|
dfaf3ebe1b | ||
|
|
bd0ab2a71c | ||
|
|
7ff5ff717c | ||
|
|
3d5f14e79e | ||
|
|
6a0e8a851b | ||
|
|
e31592ab2b | ||
|
|
74fb3111dc | ||
|
|
7108d24d8b | ||
|
|
07c15079a3 | ||
|
|
5e8c70f24c | ||
|
|
590b0c9d2d | ||
|
|
f26f9c467a | ||
|
|
b29fb3431b | ||
|
|
c3750ffc80 | ||
|
|
75d22a436c | ||
|
|
a466d46476 | ||
|
|
6aacb47c34 | ||
|
|
c5093e6668 | ||
|
|
9cba1c2963 |
@@ -55,7 +55,6 @@ Dahua
|
||||
datasheet
|
||||
debconf
|
||||
deci
|
||||
deepstack
|
||||
defragment
|
||||
devcontainer
|
||||
DEVICEMAP
|
||||
|
||||
@@ -26,8 +26,8 @@ body:
|
||||
id: version
|
||||
attributes:
|
||||
label: Beta Version
|
||||
description: Visible on the System Metrics page in the Web UI. Please include the full version including the build identifier (eg. 0.18.0-beta1, 0.18.0-8b72c7a, etc.)
|
||||
placeholder: "0.18.0-beta1"
|
||||
description: Visible on the System Metrics page in the Web UI. Please include the full version including the build identifier (eg. 0.19.0-beta1, 0.19.0-8b72c7a, etc.)
|
||||
placeholder: "0.19.0-beta1"
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
||||
@@ -6,7 +6,9 @@ body:
|
||||
value: |
|
||||
Use this form to submit a reproducible bug in Frigate or Frigate's UI.
|
||||
|
||||
**⚠️ If you are running a beta version (0.18.0-beta or similar), please use the [Beta Support template](https://github.com/blakeblackshear/frigate/discussions/new?category=beta-support) instead.**
|
||||
If you are running on Proxmox, please see the [Proxmox FAQ](https://github.com/blakeblackshear/frigate/discussions/23916) and reproduce the issue on a standard Docker install first (bare metal, or a VM running plain Debian/Ubuntu) before submitting here.
|
||||
|
||||
**⚠️ If you are running a beta version (0.19.0-beta or similar), please use the [Beta Support template](https://github.com/blakeblackshear/frigate/discussions/new?category=beta-support) instead.**
|
||||
|
||||
Before submitting your bug report, please ask the AI with the "Ask AI" button on the [official documentation site][ai] about your issue, [search the discussions][discussions], look at recent open and closed [pull requests][prs], read the [official Frigate documentation][docs], and read the [Frigate FAQ][faq] pinned at the Discussion page to see if your bug has already been fixed by the developers or reported by the community.
|
||||
|
||||
|
||||
+10
-10
@@ -23,7 +23,7 @@ jobs:
|
||||
name: AMD64 Build
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -49,7 +49,7 @@ jobs:
|
||||
- amd64_build
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -303,7 +303,7 @@ jobs:
|
||||
# /run must allow exec: S6_READ_ONLY_ROOT has s6 copy its service
|
||||
# scripts there and run them, and --tmpfs defaults to noexec
|
||||
docker run -d --name frigate-ro --shm-size 256m \
|
||||
--read-only --tmpfs /tmp:rw,size=1g --tmpfs /run:exec,nosuid,nodev,mode=0755 \
|
||||
--read-only --tmpfs /tmp:rw,size=1g --tmpfs /run:exec,nosuid,nodev,mode=0755,uid=1000,gid=1000 \
|
||||
--user 1000:1000 \
|
||||
--security-opt no-new-privileges:true \
|
||||
-v /tmp/frigate-config-ro:/config \
|
||||
@@ -405,7 +405,7 @@ jobs:
|
||||
# the config dir above now holds a go2rtc-owned go2rtc_homekit.yml,
|
||||
# which user: keeps readable but not writable (no supplementary groups)
|
||||
docker run -d --name frigate-rod-user --shm-size 256m \
|
||||
--read-only --tmpfs /tmp:rw,size=1g --tmpfs /run:exec,nosuid,nodev,mode=0755 \
|
||||
--read-only --tmpfs /tmp:rw,size=1g --tmpfs /run:exec,nosuid,nodev,mode=0755,uid=1000,gid=1000 \
|
||||
--user 1000:1000 \
|
||||
-v /tmp/frigate-config-rod:/config \
|
||||
-v /tmp/frigate-media-rod:/media/frigate \
|
||||
@@ -426,7 +426,7 @@ jobs:
|
||||
name: ARM Build
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -461,7 +461,7 @@ jobs:
|
||||
name: Jetson Jetpack 6
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -492,7 +492,7 @@ jobs:
|
||||
- amd64_build
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -533,7 +533,7 @@ jobs:
|
||||
- arm64_build
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -558,7 +558,7 @@ jobs:
|
||||
- arm64_build
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up QEMU and Buildx
|
||||
@@ -590,7 +590,7 @@ jobs:
|
||||
with:
|
||||
string: ${{ github.repository }}
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
|
||||
@@ -16,10 +16,10 @@ jobs:
|
||||
name: Web - Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 20.x
|
||||
- run: npm install
|
||||
@@ -35,10 +35,10 @@ jobs:
|
||||
name: Web - Test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 20.x
|
||||
- run: npm install
|
||||
@@ -46,18 +46,15 @@ jobs:
|
||||
- name: Build web
|
||||
run: npm run build
|
||||
working-directory: ./web
|
||||
# - name: Test
|
||||
# run: npm run test
|
||||
# working-directory: ./web
|
||||
|
||||
web_e2e:
|
||||
name: Web - E2E Tests
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 20.x
|
||||
- run: npm install
|
||||
@@ -86,11 +83,11 @@ jobs:
|
||||
name: Python Checks
|
||||
steps:
|
||||
- name: Check out the repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
||||
uses: actions/setup-python@v5.4.0
|
||||
uses: actions/setup-python@v7.0.0
|
||||
with:
|
||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||
- name: Install requirements
|
||||
@@ -109,10 +106,10 @@ jobs:
|
||||
name: Python Tests
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 20.x
|
||||
- name: Install devcontainer cli
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
- id: lowercaseRepo
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
with:
|
||||
string: ${{ github.repository }}
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
|
||||
@@ -160,7 +160,7 @@ When reviewing code, do NOT comment on:
|
||||
|
||||
### Code Quality
|
||||
|
||||
- **Linting**: ESLint (see `web/.eslintrc.cjs`)
|
||||
- **Linting**: ESLint (see `web/eslint.config.js`)
|
||||
- **Formatting**: Prettier with Tailwind CSS plugin
|
||||
- **Type Safety**: TypeScript strict mode enabled
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
ruff == 0.15.20
|
||||
|
||||
# types
|
||||
types-peewee == 3.17.*
|
||||
types-peewee == 4.0.*
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
aiofiles == 24.1.*
|
||||
click == 8.1.*
|
||||
aiofiles == 25.1.*
|
||||
click == 8.5.*
|
||||
# FastAPI
|
||||
aiohttp == 3.12.*
|
||||
starlette == 0.47.*
|
||||
starlette-context == 0.4.*
|
||||
starlette-context == 0.5.*
|
||||
fastapi[standard-no-fastapi-cloud-cli] == 0.116.*
|
||||
uvicorn == 0.35.*
|
||||
uvicorn == 0.52.*
|
||||
slowapi == 0.1.*
|
||||
joserfc == 1.2.*
|
||||
cryptography == 44.0.*
|
||||
joserfc == 1.6.*
|
||||
cryptography == 46.0.*
|
||||
pathvalidate == 3.3.*
|
||||
markupsafe == 3.0.*
|
||||
python-multipart == 0.0.26
|
||||
python-multipart == 0.0.31
|
||||
# Classification Model Training
|
||||
tensorflow == 2.19.* ; platform_machine == 'aarch64'
|
||||
tensorflow-cpu == 2.19.* ; platform_machine == 'x86_64'
|
||||
@@ -26,18 +26,18 @@ psutil == 7.1.*
|
||||
pydantic == 2.10.*
|
||||
git+https://github.com/fbcotter/py3nvml#egg=py3nvml
|
||||
pytz == 2025.*
|
||||
pyzmq == 26.2.*
|
||||
pyzmq == 27.1.*
|
||||
ruamel.yaml == 0.18.*
|
||||
tzlocal == 5.2
|
||||
requests == 2.32.*
|
||||
requests == 2.33.*
|
||||
types-requests == 2.32.*
|
||||
norfair == 2.3.*
|
||||
setproctitle == 1.3.*
|
||||
ws4py == 0.5.*
|
||||
unidecode == 1.3.*
|
||||
unidecode == 1.4.*
|
||||
titlecase == 2.4.*
|
||||
# Image Manipulation
|
||||
numpy == 1.26.*
|
||||
numpy == 2.5.*
|
||||
opencv-python-headless == 4.11.0.*
|
||||
opencv-contrib-python == 4.11.0.*
|
||||
scipy == 1.16.*
|
||||
@@ -51,26 +51,26 @@ google-genai == 1.58.*
|
||||
ollama == 0.6.*
|
||||
openai == 1.65.*
|
||||
# push notifications
|
||||
py-vapid == 1.9.*
|
||||
py-vapid == 1.9.4
|
||||
pywebpush == 2.0.*
|
||||
# alpr
|
||||
pyclipper == 1.3.*
|
||||
pyclipper == 1.4.*
|
||||
shapely == 2.0.*
|
||||
rapidfuzz==3.12.*
|
||||
# HailoRT
|
||||
argcomplete==2.0.*
|
||||
contextlib2==0.6.*
|
||||
future==0.18.*
|
||||
netaddr==0.8.*
|
||||
netaddr==1.3.*
|
||||
netifaces==0.10.*
|
||||
prometheus-client == 0.21.*
|
||||
prometheus-client == 0.26.*
|
||||
# TFLite
|
||||
tflite_runtime @ https://github.com/frigate-nvr/TFlite-builds/releases/download/v2.17.1/tflite_runtime-2.17.1-cp311-cp311-linux_x86_64.whl; platform_machine == 'x86_64'
|
||||
tflite_runtime @ https://github.com/feranick/TFlite-builds/releases/download/v2.17.1/tflite_runtime-2.17.1-cp311-cp311-linux_aarch64.whl; platform_machine == 'aarch64'
|
||||
# audio transcription
|
||||
sherpa-onnx==1.12.*
|
||||
faster-whisper==1.1.*
|
||||
sherpa-onnx==1.13.*
|
||||
faster-whisper==1.2.*
|
||||
librosa==0.11.*
|
||||
soundfile==0.13.*
|
||||
# Memory profiling
|
||||
memray == 1.15.*
|
||||
memray == 1.20.*
|
||||
|
||||
@@ -343,13 +343,6 @@ http {
|
||||
add_header Cache-Control "public";
|
||||
}
|
||||
|
||||
location /fonts/ {
|
||||
access_log off;
|
||||
expires 1y;
|
||||
include security_headers.conf;
|
||||
add_header Cache-Control "public";
|
||||
}
|
||||
|
||||
location /locales/ {
|
||||
access_log off;
|
||||
include security_headers.conf;
|
||||
@@ -376,7 +369,7 @@ http {
|
||||
sub_filter '"/BASE_PATH/assets/' '"$http_x_ingress_path/assets/';
|
||||
sub_filter '"/BASE_PATH/locales/' '"$http_x_ingress_path/locales/';
|
||||
sub_filter '"/BASE_PATH/monacoeditorwork/' '"$http_x_ingress_path/assets/';
|
||||
sub_filter 'return"/BASE_PATH/"' 'return window.baseUrl';
|
||||
sub_filter 'return`/BASE_PATH/`' 'return window.baseUrl';
|
||||
sub_filter '<body>' '<body><script>window.baseUrl="$http_x_ingress_path/";</script>';
|
||||
sub_filter_types text/css application/javascript;
|
||||
sub_filter_once off;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# Nvidia ONNX Runtime GPU Support
|
||||
--extra-index-url 'https://pypi.nvidia.com'
|
||||
cython==3.0.*; platform_machine == 'x86_64'
|
||||
nvidia-cuda-cupti-cu12==12.8.90; platform_machine == 'x86_64'
|
||||
nvidia-cublas-cu12==12.8.4.1; platform_machine == 'x86_64'
|
||||
nvidia-cudnn-cu12==9.8.0.87; platform_machine == 'x86_64'
|
||||
|
||||
@@ -36,13 +36,13 @@ edgeTPU:
|
||||
height: 320 # <--- should match the imgsize of the model, typically 320
|
||||
path: /config/model_cache/yolov9-s-relu6-best_320_int8_edgetpu.tflite
|
||||
labelmap_path: /config/labels-coco17.txt
|
||||
hailo8l:
|
||||
title: Hailo-8/Hailo-8L
|
||||
hailo:
|
||||
title: Hailo
|
||||
models:
|
||||
- key: yolo
|
||||
label: YOLO
|
||||
recommended: true
|
||||
download: If no custom model path or URL is provided, the Hailo detector automatically downloads the default model (YOLOv6n) from the Hailo Model Zoo on first startup based on the detected hardware. Once cached under `/config/model_cache/hailo`, the model works fully offline.
|
||||
download: If no custom model path or URL is provided, the Hailo detector automatically downloads the default model (YOLOv6n) from the Hailo Model Zoo on first startup, choosing the build that matches the attached device. Once cached under `/config/model_cache`, the model works fully offline.
|
||||
ui: |-
|
||||
Navigate to **Settings > System > Detection models** and select **Hailo** from the **Hardware** dropdown. Then, on the same model, open the **Custom Model** tab and configure the model settings:
|
||||
|
||||
@@ -60,7 +60,7 @@ hailo8l:
|
||||
yaml: |-
|
||||
models:
|
||||
- devices:
|
||||
- hailo8l:PCIe
|
||||
- hailo:PCIe
|
||||
width: 320
|
||||
height: 320
|
||||
input_tensor: nhwc
|
||||
@@ -101,7 +101,7 @@ hailo8l:
|
||||
yaml: |-
|
||||
models:
|
||||
- devices:
|
||||
- hailo8l:PCIe
|
||||
- hailo:PCIe
|
||||
width: 300
|
||||
height: 300
|
||||
input_tensor: nhwc
|
||||
@@ -824,24 +824,6 @@ cpu:
|
||||
models:
|
||||
- devices:
|
||||
- cpu:3
|
||||
deepstack:
|
||||
title: DeepStack / CodeProject.AI
|
||||
models:
|
||||
- key: yolo
|
||||
label: YOLO
|
||||
recommended: true
|
||||
download: This detector runs object detection over the network against a CodeProject.AI or DeepStack server, so no model is downloaded into Frigate itself. Visit the [CodeProject.AI official website](https://www.codeproject.com/Articles/5322557/CodeProject-AI-Server-AI-the-easy-way) to download and install the AI server on your preferred device (e.g. Raspberry Pi, Nvidia Jetson, or other compatible hardware) before configuring the detector.
|
||||
ui: |-
|
||||
Navigate to **Settings > System > Detection models** and add a model. The CodeProject.AI server is not reported by the hardware probe, so set `devices` to `deepstack:http://<your_codeproject_ai_server_ip>:<port>/v1/vision/detection` in YAML.
|
||||
|
||||
| Field | Value |
|
||||
| ------------- | ---------------------------------------------------------------------- |
|
||||
| **API URL** | `http://<your_codeproject_ai_server_ip>:<port>/v1/vision/detection` |
|
||||
| **API Timeout** | `0.1` (seconds) |
|
||||
yaml: |-
|
||||
models:
|
||||
- devices:
|
||||
- deepstack:http://<your_codeproject_ai_server_ip>:<port>/v1/vision/detection
|
||||
memryx:
|
||||
title: MemryX
|
||||
models:
|
||||
|
||||
@@ -313,8 +313,16 @@ To remove root from the container entirely, add Docker's `user:`:
|
||||
|
||||
```yaml
|
||||
user: "1000:1000" # NOT compatible with PUID/PGID, see the run modes table
|
||||
tmpfs:
|
||||
- /tmp:size=256m
|
||||
- /tmp/cache:size=1000000000
|
||||
- /run:exec,nosuid,nodev,mode=0755,uid=1000,gid=1000,size=16m # uid must match user:
|
||||
```
|
||||
|
||||
`/run` has to be owned by that uid as well. s6 writes its runtime state there before anything else starts, and with no root in the container a root-owned `/run` stops it during init with `cannot create /run/test of writability`. Keep `uid` and `gid` in the tmpfs options matching `user:`, and don't carry that pair back into the default mode, where a root-owned `/run` is what keeps the unprivileged services out of s6's runtime state.
|
||||
|
||||
This only bites once root is genuinely gone. s6's init helper is setuid, so `user:` on its own still lets init regain root and correct `/run` itself. The `no-new-privileges:true` above is what blocks that, which is also what makes the `/run` ownership mandatory. Dropping it would hide the problem by handing init root again.
|
||||
|
||||
Two things change, and the first one will break a working install if you skip it. The startup device grants can't run, because there is no root left to run them, so every device you pass stops working until you grant that uid access yourself with `group_add:` or a udev rule; see [Manual setup](#manual-setup). Expect this to surface as a driver error rather than a permission error, like `No VA display found` from VAAPI. And every service then runs as that one uid, so go2rtc no longer gets its own restricted user. `/config` and `/media/frigate` have to be owned by that uid already, since Frigate never adjusts ownership in this mode. Switching an existing install over also leaves `/config/go2rtc_homekit.yml` owned by the go2rtc user, which this mode can't write; `chown` it to your uid or HomeKit pairing changes stop persisting. Frigate warns and starts either way.
|
||||
|
||||
This mode can also take `cap_drop: [ALL]`, which the default mode cannot: starting as root needs `CAP_CHOWN` for the ownership sweep, `CAP_SETUID` and `CAP_SETGID` to drop to the runtime user, and `CAP_FOWNER` for the device grants.
|
||||
|
||||
@@ -22,7 +22,7 @@ Frigate supports multiple different detectors that work on different types of ha
|
||||
**Most Hardware**
|
||||
|
||||
- [Coral EdgeTPU](#edge-tpu-detector): The Google Coral EdgeTPU is available in USB, Mini PCIe, and m.2 formats allowing for a wide range of compatibility with devices.
|
||||
- [Hailo](#hailo-8): The Hailo8 and Hailo8L AI Acceleration module is available in m.2 format with a HAT for RPi devices, offering a wide range of compatibility with devices.
|
||||
- [Hailo](#hailo): The Hailo-8, Hailo-8L and Hailo-8R AI Acceleration modules are available in m.2 format with a HAT for RPi devices, offering a wide range of compatibility with devices.
|
||||
- <CommunityBadge /> [MemryX](#memryx-mx3): The MX3 Acceleration module is available in m.2 format, offering broad compatibility across various platforms.
|
||||
|
||||
**AMD**
|
||||
@@ -285,9 +285,9 @@ models:
|
||||
|
||||
---
|
||||
|
||||
## Hailo-8
|
||||
## Hailo
|
||||
|
||||
This detector is available for use with both Hailo-8 and Hailo-8L AI Acceleration Modules. The integration automatically detects your hardware architecture via the Hailo CLI and selects the appropriate default model if no custom model is specified.
|
||||
This detector is available for use with the Hailo-8, Hailo-8L and Hailo-8R AI Acceleration Modules. The integration identifies which of them is attached and selects the matching default model if no custom model is specified.
|
||||
|
||||
See the [installation docs](../frigate/installation.md#hailo-8) for information on configuring the Hailo hardware.
|
||||
|
||||
@@ -308,11 +308,11 @@ The HailoRT runtime is not part of the Frigate image. It is downloaded and insta
|
||||
When configuring the Hailo detector, you have two options to specify the model: a local **path** or a **URL**.
|
||||
If both are provided, the detector will first check for the model at the given local path. If the file is not found, it will download the model from the specified URL. The model file is cached under `/config/model_cache/hailo`.
|
||||
|
||||
<ModelConfigDropdown detectorTitle="Hailo-8/Hailo-8L" models={objectDetectorsModels.hailo8l.models} />
|
||||
<ModelConfigDropdown detectorTitle="Hailo" models={objectDetectorsModels.hailo.models} />
|
||||
|
||||
For additional ready-to-use models, please visit: https://github.com/hailo-ai/hailo_model_zoo
|
||||
|
||||
Hailo8 supports all models in the Hailo Model Zoo that include HailoRT post-processing. You're welcome to choose any of these pre-configured models for your implementation.
|
||||
Hailo supports all models in the Hailo Model Zoo that include HailoRT post-processing. You're welcome to choose any of these pre-configured models for your implementation.
|
||||
|
||||
> **Note:**
|
||||
> The config.path parameter can accept either a local file path or a URL ending with .hef. When provided, the detector will first check if the path is a local file path. If the file exists locally, it will use it directly. If the file is not found locally or if a URL was provided, it will attempt to download the model from the specified URL.
|
||||
@@ -362,7 +362,7 @@ Intel NPUs cannot be used under Home Assistant OS, which does not include the NP
|
||||
|
||||
:::warning
|
||||
|
||||
The network-based detectors (Deepstack and the Apple Silicon client) are being reworked. Their extra options no longer have a place in the config, so only the endpoint carried in the device string is honored right now: Deepstack ignores `api_key` and `api_timeout`, and the Apple Silicon client ignores `request_timeout_ms` and `linger_ms`. Anything else is dropped when your config is migrated.
|
||||
The Apple Silicon detector client is being reworked. Its extra options no longer have a place in the config, so only the endpoint carried in the device string is honored right now, and `request_timeout_ms` and `linger_ms` are ignored. Anything else is dropped when your config is migrated.
|
||||
|
||||
:::
|
||||
|
||||
@@ -540,30 +540,6 @@ A TensorFlow Lite model is provided in the container at `/cpu_model.tflite` and
|
||||
|
||||
When using CPU detectors, you can add one CPU detector per camera. Adding more detectors than the number of cameras should not improve performance.
|
||||
|
||||
## Deepstack / CodeProject.AI Server Detector
|
||||
|
||||
:::warning
|
||||
|
||||
The network-based detectors (Deepstack and the Apple Silicon client) are being reworked. Their extra options no longer have a place in the config, so only the endpoint carried in the device string is honored right now: Deepstack ignores `api_key` and `api_timeout`, and the Apple Silicon client ignores `request_timeout_ms` and `linger_ms`. Anything else is dropped when your config is migrated.
|
||||
|
||||
:::
|
||||
|
||||
The Deepstack / CodeProject.AI Server detector for Frigate allows you to integrate Deepstack and CodeProject.AI object detection capabilities into Frigate. CodeProject.AI and DeepStack are open-source AI platforms that can be run on various devices such as the Raspberry Pi, Nvidia Jetson, and other compatible hardware. It is important to note that the integration is performed over the network, so the inference times may not be as fast as native Frigate detectors, but it still provides an efficient and reliable solution for object detection and tracking.
|
||||
|
||||
### Setup {#setup-deepstack}
|
||||
|
||||
To get started with CodeProject.AI, visit their [official website](https://www.codeproject.com/Articles/5322557/CodeProject-AI-Server-AI-the-easy-way) to follow the instructions to download and install the AI server on your preferred device. Detailed setup instructions for CodeProject.AI are outside the scope of the Frigate documentation.
|
||||
|
||||
To integrate CodeProject.AI into Frigate, configure the detector as follows:
|
||||
|
||||
### Configuration {#configuration-deepstack}
|
||||
|
||||
<ModelConfigDropdown detectorTitle="DeepStack" models={objectDetectorsModels.deepstack.models} />
|
||||
|
||||
Replace `<your_codeproject_ai_server_ip>` and `<port>` with the IP address and port of your CodeProject.AI server.
|
||||
|
||||
To verify that the integration is working correctly, start Frigate and observe the logs for any error messages related to CodeProject.AI. Additionally, you can check the Frigate web interface to see if the objects detected by CodeProject.AI are being displayed and tracked properly.
|
||||
|
||||
# Community Supported Detectors
|
||||
|
||||
## MemryX MX3
|
||||
|
||||
@@ -204,11 +204,20 @@ Light guidelines and advice:
|
||||
npm run lint
|
||||
```
|
||||
|
||||
- Add to unit tests and ensure they pass. As much as possible, you should strive to _increase_ test coverage whenever making changes. This will help ensure features do not accidentally become broken in the future.
|
||||
- If you run into error messages like "TypeError: Cannot read properties of undefined (reading 'context')" when running tests, this may be due to these issues (https://github.com/vitest-dev/vitest/issues/1910, https://github.com/vitest-dev/vitest/issues/1652) in vitest, but I haven't been able to resolve them.
|
||||
- Ensure the backend [unit tests](#unit-tests) pass. Your PR cannot be merged unless tests pass.
|
||||
|
||||
```shell
|
||||
python3 -u -m unittest
|
||||
```
|
||||
|
||||
- Ensure the end-to-end tests pass. They run in Playwright against a production build with mocked API data, so they don't need a running Frigate instance. Add or update tests in `web/e2e/specs/` when you change UI behavior.
|
||||
|
||||
```console
|
||||
npm run test
|
||||
# First-time setup
|
||||
npx playwright install chromium
|
||||
|
||||
# Build the app and run all tests
|
||||
npm run e2e:build && npm run e2e
|
||||
```
|
||||
|
||||
- Test in different browsers. Firefox, Chrome, and Safari all have different quirks that make them unique targets to interact with.
|
||||
|
||||
@@ -54,7 +54,7 @@ Frigate supports multiple different detectors that work on different types of ha
|
||||
|
||||
**Most Hardware**
|
||||
|
||||
- [Hailo](#hailo-8): The Hailo8 and Hailo8L AI Acceleration module is available in m.2 format with a HAT for RPi devices offering a wide range of compatibility with devices.
|
||||
- [Hailo](#hailo-8): The Hailo-8, Hailo-8L and Hailo-8R AI Acceleration modules are available in m.2 format with a HAT for RPi devices offering a wide range of compatibility with devices.
|
||||
- [Supports many model architectures](../../configuration/object_detectors#configuration-hailo)
|
||||
- Runs best with tiny or small size models
|
||||
|
||||
@@ -111,12 +111,13 @@ 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 the Hailo-8, Hailo-8L and Hailo-8R 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 identifies which of them is attached and selects the matching default model when a custom model isn’t provided.
|
||||
|
||||
**Default Model Configuration:**
|
||||
|
||||
- **Hailo-8L:** Default model is **YOLOv6n**.
|
||||
- **Hailo-8:** Default model is **YOLOv6n**.
|
||||
- **Hailo-8L:** Default model is **YOLOv6n**, compiled for the Hailo-8L.
|
||||
- **Hailo-8:** Default model is **YOLOv6n**, compiled for the Hailo-8.
|
||||
- **Hailo-8R:** Default model is the **Hailo-8** build of **YOLOv6n**, since the Hailo Model Zoo publishes no Hailo-8R build.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ Additionally, the USB Coral draws a considerable amount of power. If using any o
|
||||
|
||||
### Hailo-8
|
||||
|
||||
The Hailo-8 and Hailo-8L AI accelerators are available in both M.2 and HAT form factors for the Raspberry Pi. The M.2 version typically connects to a carrier board for PCIe, which then interfaces with the Raspberry Pi 5 as part of the AI Kit. The HAT version can be mounted directly onto compatible Raspberry Pi models. Both form factors have been successfully tested on x86 platforms as well, making them versatile options for various computing environments.
|
||||
The Hailo-8, Hailo-8L and Hailo-8R AI accelerators are available in both M.2 and HAT form factors for the Raspberry Pi. The M.2 version typically connects to a carrier board for PCIe, which then interfaces with the Raspberry Pi 5 as part of the AI Kit. The HAT version can be mounted directly onto compatible Raspberry Pi models. Both form factors have been successfully tested on x86 platforms as well, making them versatile options for various computing environments.
|
||||
|
||||
The HailoRT runtime is not part of the Frigate image; Frigate downloads and installs it at first start once a Hailo detector is configured. Containers without internet access can provide the files themselves, see [Detector runtimes](/frigate/network_requirements#detector-runtimes).
|
||||
|
||||
@@ -300,7 +300,7 @@ If you are using `docker run`, add this option to your command `--device /dev/ha
|
||||
|
||||
#### Configuration
|
||||
|
||||
Finally, configure [hardware object detection](/configuration/object_detectors#hailo-8) to complete the setup.
|
||||
Finally, configure [hardware object detection](/configuration/object_detectors#hailo) to complete the setup.
|
||||
|
||||
### MemryX MX3
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ If you are using one of the following hardware detectors and have not provided y
|
||||
| Detector | Model Downloaded | Source |
|
||||
| ------------------------------------------------------------------ | -------------------- | ------------------------ |
|
||||
| [Rockchip RKNN](/configuration/object_detectors#rockchip-platform) | RKNN detection model | GitHub |
|
||||
| [Hailo 8 / 8L](/configuration/object_detectors#hailo-8) | YOLOv6n (.hef) | Hailo Model Zoo (AWS S3) |
|
||||
| [Hailo 8 / 8L / 8R](/configuration/object_detectors#hailo) | YOLOv6n (.hef) | Hailo Model Zoo (AWS S3) |
|
||||
| [AXERA AXEngine](/configuration/object_detectors) | Detection model | HuggingFace |
|
||||
|
||||
:::note
|
||||
@@ -60,16 +60,16 @@ The default CPU, EdgeTPU, and OpenVINO object detection models are bundled into
|
||||
|
||||
The SDKs for a few hardware detectors are not shipped in the Frigate image. They are downloaded the first time that detector is configured, verified against checksums pinned in the Frigate release, and installed into the Frigate user's home directory (`/config/.local` by default). Once installed they are not downloaded again until a Frigate release pins a new version.
|
||||
|
||||
| Detector | Version | Files | Source |
|
||||
| -------------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
|
||||
| [Hailo 8 / 8L](/configuration/object_detectors#hailo-8) | 4.21.0 | `hailort-debian12-amd64.tar.gz` and `hailort-4.21.0-cp311-cp311-linux_x86_64.whl` on x86, `hailort-debian12-arm64.tar.gz` and `hailort-4.21.0-cp311-cp311-linux_aarch64.whl` on arm64 | [GitHub release](https://github.com/frigate-nvr/hailort/releases/tag/v4.21.0) |
|
||||
| [MemryX MX3](/configuration/object_detectors#memryx-mx3) | 2.1.0 | `mx_accl_frigate-2.1.0.zip` (the release source archive, renamed) | [GitHub archive](https://github.com/memryx/mx_accl_frigate/archive/refs/tags/v2.1.0.zip) |
|
||||
| [AXERA AXEngine](/configuration/object_detectors#axera) | 0.1.3 | `axengine-0.1.3-py3-none-any.whl` | [GitHub release](https://github.com/AXERA-TECH/pyaxengine/releases/tag/0.1.3-frigate) |
|
||||
| Detector | Version | Files | Source |
|
||||
| ---------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| [Hailo 8 / 8L / 8R](/configuration/object_detectors#hailo) | 4.21.0 | `hailort-debian12-amd64.tar.gz` and `hailort-4.21.0-cp311-cp311-linux_x86_64.whl` on x86, `hailort-debian12-arm64.tar.gz` and `hailort-4.21.0-cp311-cp311-linux_aarch64.whl` on arm64 | [GitHub release](https://github.com/frigate-nvr/hailort/releases/tag/v4.21.0) |
|
||||
| [MemryX MX3](/configuration/object_detectors#memryx-mx3) | 2.1.0 | `mx_accl_frigate-2.1.0.zip` (the release source archive, renamed) | [GitHub archive](https://github.com/memryx/mx_accl_frigate/archive/refs/tags/v2.1.0.zip) |
|
||||
| [AXERA AXEngine](/configuration/object_detectors#axera) | 0.1.3 | `axengine-0.1.3-py3-none-any.whl` | [GitHub release](https://github.com/AXERA-TECH/pyaxengine/releases/tag/0.1.3-frigate) |
|
||||
|
||||
If the container cannot reach GitHub, provide the files yourself:
|
||||
|
||||
1. Download the files for your architecture on a machine with internet access.
|
||||
2. Place them, with exactly the file names listed above, in `/config/model_cache/runtimes/<detector>/`, where `<detector>` is the detector `type` from your config (`hailo8l`, `memryx`, or `axengine`).
|
||||
2. Place them, with exactly the file names listed above, in `/config/model_cache/runtimes/<detector>/`, where `<detector>` is the detector named in your config's `devices` (`hailo`, `memryx`, or `axengine`).
|
||||
3. Start Frigate. Files whose checksum matches are installed without any download; a file with the wrong checksum is discarded and downloaded again, so a failed startup log names the file to replace.
|
||||
|
||||
The `GITHUB_ENDPOINT` mirror variable below applies to these downloads as well.
|
||||
@@ -142,10 +142,6 @@ When [notifications](/configuration/notifications) are enabled and users have re
|
||||
|
||||
If an [MQTT broker](/integrations/mqtt) is configured, Frigate maintains a connection to the broker's host and port. This is typically a local network connection, but will require internet if you use a cloud-hosted MQTT broker.
|
||||
|
||||
### DeepStack / CodeProject.AI
|
||||
|
||||
When using the [DeepStack detector plugin](/configuration/object_detectors), Frigate sends images to the configured API endpoint for inference. This is typically local but depends on where the service is hosted.
|
||||
|
||||
## WebRTC (STUN)
|
||||
|
||||
For [WebRTC live streaming](/configuration/live), Frigate uses STUN for NAT traversal:
|
||||
|
||||
@@ -41,7 +41,7 @@ Rockchip models are automatically converted as of 0.17. For 0.16, YOLOv9 onnx mo
|
||||
|
||||
## Supported detector types
|
||||
|
||||
Currently, Frigate+ models support CPU (`cpu`), Google Coral (`edgetpu`), OpenVino (`openvino`), ONNX (`onnx`), Hailo (`hailo8l`), and Rockchip (`rknn`) detectors.
|
||||
Currently, Frigate+ models support CPU (`cpu`), Google Coral (`edgetpu`), OpenVino (`openvino`), ONNX (`onnx`), Hailo (`hailo`), and Rockchip (`rknn`) detectors.
|
||||
|
||||
| Hardware | Recommended Detector Type | Recommended Model Type |
|
||||
| -------------------------------------------------------------------------------- | ------------------------- | ---------------------- |
|
||||
@@ -50,7 +50,7 @@ Currently, Frigate+ models support CPU (`cpu`), Google Coral (`edgetpu`), OpenVi
|
||||
| [Intel](/configuration/object_detectors.md#openvino-detector) | `openvino` | `yolov9` |
|
||||
| [NVidia GPU](/configuration/object_detectors#onnx) | `onnx` | `yolov9` |
|
||||
| [AMD ROCm GPU](/configuration/object_detectors#amdrocm-gpu-detector) | `onnx` | `yolov9` |
|
||||
| [Hailo8/Hailo8L/Hailo8R](/configuration/object_detectors#hailo-8) | `hailo8l` | `yolov9` |
|
||||
| [Hailo8/Hailo8L/Hailo8R](/configuration/object_detectors#hailo) | `hailo` | `yolov9` |
|
||||
| [Rockchip NPU](/configuration/object_detectors#rockchip-platform) | `rknn` | `yolov9` |
|
||||
|
||||
## Improving your model
|
||||
|
||||
Generated
+2070
-3902
File diff suppressed because it is too large
Load Diff
+10
-10
@@ -18,17 +18,17 @@
|
||||
"write-heading-ids": "docusaurus write-heading-ids"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "^3.7.0",
|
||||
"@docusaurus/plugin-content-docs": "^3.7.0",
|
||||
"@docusaurus/preset-classic": "^3.7.0",
|
||||
"@docusaurus/theme-mermaid": "^3.7.0",
|
||||
"@docusaurus/core": "^3.10.2",
|
||||
"@docusaurus/plugin-content-docs": "^3.10.2",
|
||||
"@docusaurus/preset-classic": "^3.10.2",
|
||||
"@docusaurus/theme-mermaid": "^3.10.2",
|
||||
"@inkeep/docusaurus": "^2.0.16",
|
||||
"@mdx-js/react": "^3.1.0",
|
||||
"@types/js-yaml": "^4.0.9",
|
||||
"clsx": "^2.1.1",
|
||||
"docusaurus-plugin-openapi-docs": "^4.5.1",
|
||||
"docusaurus-theme-openapi-docs": "^4.5.1",
|
||||
"js-yaml": "^4.1.1",
|
||||
"docusaurus-plugin-openapi-docs": "^5.2.0",
|
||||
"docusaurus-theme-openapi-docs": "^5.2.0",
|
||||
"js-yaml": "^4.3.2",
|
||||
"marked": "^16.4.2",
|
||||
"prism-react-renderer": "^2.4.1",
|
||||
"raw-loader": "^4.0.2",
|
||||
@@ -48,11 +48,11 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "^3.7.0",
|
||||
"@docusaurus/types": "^3.7.0",
|
||||
"@docusaurus/module-type-aliases": "^3.10.2",
|
||||
"@docusaurus/types": "^3.10.2",
|
||||
"@types/react": "^18.3.27"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0"
|
||||
"node": ">=20.19"
|
||||
}
|
||||
}
|
||||
|
||||
+2
-9
@@ -2,7 +2,6 @@
|
||||
|
||||
import asyncio
|
||||
import copy
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import platform
|
||||
@@ -11,7 +10,6 @@ import urllib
|
||||
from datetime import datetime, timedelta
|
||||
from functools import reduce
|
||||
from io import StringIO
|
||||
from pathlib import Path as FilePath
|
||||
from typing import Any
|
||||
|
||||
import aiofiles
|
||||
@@ -56,6 +54,7 @@ from frigate.jobs.media_sync import (
|
||||
start_media_sync_job,
|
||||
)
|
||||
from frigate.models import Event, Timeline
|
||||
from frigate.plus import load_plus_model_info
|
||||
from frigate.stats.prometheus import get_metrics, update_metrics
|
||||
from frigate.types import JobStatusTypesEnum
|
||||
from frigate.util.builtin import (
|
||||
@@ -401,13 +400,7 @@ def config(request: Request):
|
||||
model_dict["plus"] = None
|
||||
|
||||
if model.path:
|
||||
model_json_path = FilePath(model.path).with_suffix(".json")
|
||||
|
||||
try:
|
||||
with open(model_json_path) as f:
|
||||
model_dict["plus"] = json.load(f)
|
||||
except (FileNotFoundError, json.JSONDecodeError):
|
||||
pass
|
||||
model_dict["plus"] = load_plus_model_info(os.path.basename(model.path))
|
||||
|
||||
return JSONResponse(content=config)
|
||||
|
||||
|
||||
@@ -786,6 +786,13 @@ def auth(request: Request):
|
||||
|
||||
user = token.claims.get("sub")
|
||||
role = token.claims.get("role")
|
||||
|
||||
# the token keeps the role it was issued with, so a role removed from
|
||||
# the config since then must send the user back through login
|
||||
if role not in auth_config.roles:
|
||||
logger.debug("jwt role %s is not in the config", role)
|
||||
return fail_response
|
||||
|
||||
current_time = int(time.time())
|
||||
|
||||
# if the jwt is expired
|
||||
|
||||
+14
-4
@@ -1038,6 +1038,10 @@ def export_recording_custom(
|
||||
if camera_validation_error is not None:
|
||||
return camera_validation_error
|
||||
|
||||
# Validate user-provided ffmpeg args to prevent injection and add to cases.
|
||||
# Admin users are trusted and skip validation.
|
||||
is_admin = request.headers.get("remote-role", "") == "admin"
|
||||
|
||||
playback_source = body.source
|
||||
friendly_name = body.name
|
||||
existing_image, image_validation_error = _sanitize_existing_image(body.image_path)
|
||||
@@ -1048,6 +1052,16 @@ def export_recording_custom(
|
||||
cpu_fallback = body.cpu_fallback
|
||||
|
||||
export_case_id = body.export_case_id
|
||||
|
||||
if export_case_id is not None and not is_admin:
|
||||
return JSONResponse(
|
||||
content={
|
||||
"success": False,
|
||||
"message": "Only admins can attach exports to an existing case.",
|
||||
},
|
||||
status_code=403,
|
||||
)
|
||||
|
||||
case_validation_error = _validate_export_case(export_case_id)
|
||||
if case_validation_error is not None:
|
||||
return case_validation_error
|
||||
@@ -1064,10 +1078,6 @@ def export_recording_custom(
|
||||
status_code=400,
|
||||
)
|
||||
|
||||
# Validate user-provided ffmpeg args to prevent injection.
|
||||
# Admin users are trusted and skip validation.
|
||||
is_admin = request.headers.get("remote-role", "") == "admin"
|
||||
|
||||
if not is_admin:
|
||||
for args_label, args_value in [
|
||||
("input", ffmpeg_input_args),
|
||||
|
||||
@@ -189,7 +189,7 @@ async def camera_ptz_info(request: Request, camera_name: str):
|
||||
future = asyncio.run_coroutine_threadsafe(
|
||||
request.app.onvif.get_camera_info(camera_name), request.app.onvif.loop
|
||||
)
|
||||
result = future.result()
|
||||
result = await asyncio.wrap_future(future)
|
||||
return JSONResponse(content=result)
|
||||
else:
|
||||
return JSONResponse(
|
||||
|
||||
@@ -412,11 +412,8 @@ async def no_recordings(
|
||||
if not camera_list:
|
||||
return JSONResponse(content=[])
|
||||
|
||||
before = params.before or datetime.datetime.now().timestamp()
|
||||
after = (
|
||||
params.after
|
||||
or (datetime.datetime.now() - datetime.timedelta(hours=1)).timestamp()
|
||||
)
|
||||
before = params.before or datetime.now().timestamp()
|
||||
after = params.after or (datetime.now() - timedelta(hours=1)).timestamp()
|
||||
scale = params.scale
|
||||
|
||||
recordings: list[tuple[float, float]] = []
|
||||
|
||||
@@ -253,7 +253,7 @@ class ObjectDescriptionProcessor(PostProcessorApi):
|
||||
# Crop snapshot based on region
|
||||
# provide full image if region doesn't exist (manual events)
|
||||
height, width = img.shape[:2]
|
||||
x1_rel, y1_rel, width_rel, height_rel = event.data.get( # type: ignore[attr-defined]
|
||||
x1_rel, y1_rel, width_rel, height_rel = event.data.get(
|
||||
"region", [0, 0, 1, 1]
|
||||
)
|
||||
x1, y1 = int(x1_rel * width), int(y1_rel * height)
|
||||
|
||||
@@ -8,7 +8,7 @@ import os
|
||||
import shutil
|
||||
import threading
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from typing import Any, cast
|
||||
|
||||
import cv2
|
||||
from peewee import DoesNotExist
|
||||
@@ -528,7 +528,8 @@ class ReviewDescriptionProcessor(PostProcessorApi):
|
||||
.get()
|
||||
)
|
||||
|
||||
time_in_segment = ts - recording.start_time
|
||||
# start_time is a DateTimeField holding a unix timestamp
|
||||
time_in_segment = ts - cast(float, recording.start_time)
|
||||
return get_image_from_recording(
|
||||
self.config.ffmpeg,
|
||||
recording.path,
|
||||
|
||||
@@ -237,7 +237,7 @@ class SemanticTriggerProcessor(PostProcessorApi):
|
||||
return
|
||||
|
||||
# Skip the event if not an object
|
||||
if event.data.get("type") != "object": # type: ignore[attr-defined]
|
||||
if event.data.get("type") != "object":
|
||||
return
|
||||
|
||||
thumbnail_bytes = get_event_thumbnail_bytes(event)
|
||||
|
||||
@@ -3,14 +3,14 @@ import json
|
||||
import logging
|
||||
import os
|
||||
from enum import Enum
|
||||
from typing import Any, ClassVar
|
||||
from typing import ClassVar
|
||||
|
||||
import requests
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.fields import PrivateAttr
|
||||
|
||||
from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP, MODEL_CACHE_DIR
|
||||
from frigate.plus import PlusApi
|
||||
from frigate.plus import PlusApi, load_plus_model_info
|
||||
from frigate.util.builtin import generate_color_palette, load_labels
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -190,12 +190,13 @@ class ModelConfig(BaseModel):
|
||||
|
||||
# download the model info if it doesn't exist
|
||||
if not os.path.isfile(model_info_path):
|
||||
model_info = plus_api.get_model_info(model_id)
|
||||
with open(model_info_path, "w") as f:
|
||||
json.dump(model_info, f)
|
||||
else:
|
||||
with open(model_info_path) as f:
|
||||
model_info: dict[str, Any] = json.load(f)
|
||||
json.dump(plus_api.get_model_info(model_id), f)
|
||||
|
||||
model_info = load_plus_model_info(model_id)
|
||||
|
||||
if model_info is None:
|
||||
raise ValueError(f"Unable to read the model info for {model_id}")
|
||||
|
||||
if detector and detector not in model_info["supportedDetectors"]:
|
||||
raise ValueError(f"Model does not support detector type of {detector}")
|
||||
|
||||
@@ -259,8 +259,8 @@ def detect_hailo() -> DetectionHardware | None:
|
||||
|
||||
# the hailo runtime schedules across every attached device itself, so there
|
||||
# is nothing to address individually
|
||||
units = [HardwareUnit(device="hailo8l:PCIe", label=os.path.basename(nodes[0]))]
|
||||
return _hardware("hailo8l", "hailo8l", "Hailo", units)
|
||||
units = [HardwareUnit(device="hailo:PCIe", label=os.path.basename(nodes[0]))]
|
||||
return _hardware("hailo", "hailo", "Hailo", units)
|
||||
|
||||
|
||||
def detect_memryx() -> DetectionHardware | None:
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
import io
|
||||
import logging
|
||||
from typing import Literal
|
||||
|
||||
import numpy as np
|
||||
import requests
|
||||
from PIL import Image
|
||||
from pydantic import ConfigDict, Field
|
||||
|
||||
from frigate.detectors.detection_api import DetectionApi
|
||||
from frigate.detectors.detector_config import BaseDetectorConfig
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
DETECTOR_KEY = "deepstack"
|
||||
|
||||
|
||||
class DeepstackDetectorConfig(BaseDetectorConfig):
|
||||
"""DeepStack/CodeProject.AI detector that sends images to a remote DeepStack HTTP API for inference. Not recommended."""
|
||||
|
||||
model_config = ConfigDict(
|
||||
title="DeepStack",
|
||||
)
|
||||
|
||||
type: Literal[DETECTOR_KEY]
|
||||
api_url: str = Field(
|
||||
default="http://localhost:80/v1/vision/detection",
|
||||
title="DeepStack API URL",
|
||||
description="The URL of the DeepStack API.",
|
||||
)
|
||||
api_timeout: float = Field(
|
||||
default=0.1,
|
||||
title="DeepStack API timeout (in seconds)",
|
||||
description="Maximum time allowed for a DeepStack API request.",
|
||||
)
|
||||
api_key: str = Field(
|
||||
default="",
|
||||
title="DeepStack API key (if required)",
|
||||
description="Optional API key for authenticated DeepStack services.",
|
||||
)
|
||||
|
||||
|
||||
class DeepStack(DetectionApi):
|
||||
type_key = DETECTOR_KEY
|
||||
|
||||
def __init__(self, detector_config: DeepstackDetectorConfig):
|
||||
self.api_url = detector_config.api_url
|
||||
self.api_timeout = detector_config.api_timeout
|
||||
self.api_key = detector_config.api_key
|
||||
self.labels = detector_config.model.merged_labelmap
|
||||
self.session = requests.Session()
|
||||
|
||||
def get_label_index(self, label_value):
|
||||
if label_value.lower() == "truck":
|
||||
label_value = "car"
|
||||
for index, value in self.labels.items():
|
||||
if value == label_value.lower():
|
||||
return index
|
||||
return -1
|
||||
|
||||
def detect_raw(self, tensor_input):
|
||||
image_data = np.squeeze(tensor_input).astype(np.uint8)
|
||||
image = Image.fromarray(image_data)
|
||||
self.w, self.h = image.size
|
||||
with io.BytesIO() as output:
|
||||
image.save(output, format="JPEG")
|
||||
image_bytes = output.getvalue()
|
||||
data = {"api_key": self.api_key}
|
||||
|
||||
try:
|
||||
response = self.session.post(
|
||||
self.api_url,
|
||||
data=data,
|
||||
files={"image": image_bytes},
|
||||
timeout=self.api_timeout,
|
||||
)
|
||||
except requests.exceptions.RequestException as ex:
|
||||
logger.error("Error calling deepstack API: %s", ex)
|
||||
return np.zeros((20, 6), np.float32)
|
||||
|
||||
response_json = response.json()
|
||||
detections = np.zeros((20, 6), np.float32)
|
||||
if response_json.get("predictions") is None:
|
||||
logger.debug(f"Error in parsing response json: {response_json}")
|
||||
return detections
|
||||
|
||||
for i, detection in enumerate(response_json.get("predictions")):
|
||||
logger.debug(f"Response: {detection}")
|
||||
if detection["confidence"] < 0.4:
|
||||
logger.debug("Break due to confidence < 0.4")
|
||||
break
|
||||
label = self.get_label_index(detection["label"])
|
||||
if label < 0:
|
||||
logger.debug("Break due to unknown label")
|
||||
break
|
||||
detections[i] = [
|
||||
label,
|
||||
float(detection["confidence"]),
|
||||
detection["y_min"] / self.h,
|
||||
detection["x_min"] / self.w,
|
||||
detection["y_max"] / self.h,
|
||||
detection["x_max"] / self.w,
|
||||
]
|
||||
|
||||
return detections
|
||||
@@ -53,7 +53,7 @@ def preprocess_tensor(image: np.ndarray, model_w: int, model_h: int) -> np.ndarr
|
||||
|
||||
|
||||
# ----------------- Global Constants ----------------- #
|
||||
DETECTOR_KEY = "hailo8l"
|
||||
DETECTOR_KEY = "hailo"
|
||||
ARCH = None
|
||||
H8_DEFAULT_MODEL = "yolov6n.hef"
|
||||
H8L_DEFAULT_MODEL = "yolov6n.hef"
|
||||
@@ -469,10 +469,10 @@ class HailoDetector(DetectionApi):
|
||||
|
||||
# ----------------- HailoDetectorConfig Class ----------------- #
|
||||
class HailoDetectorConfig(BaseDetectorConfig):
|
||||
"""Hailo-8/Hailo-8L detector using HEF models and the HailoRT SDK for inference on Hailo hardware."""
|
||||
"""Hailo detector using HEF models and the HailoRT SDK for inference on Hailo hardware."""
|
||||
|
||||
model_config = ConfigDict(
|
||||
title="Hailo-8/Hailo-8L",
|
||||
title="Hailo",
|
||||
)
|
||||
|
||||
type: Literal[DETECTOR_KEY]
|
||||
@@ -37,7 +37,7 @@ class EventCleanup(threading.Thread):
|
||||
if self.removed_camera_labels is None:
|
||||
self.removed_camera_labels = list(
|
||||
Event.select(Event.label)
|
||||
.where(Event.camera.not_in(self.camera_keys)) # type: ignore[arg-type,call-arg,misc]
|
||||
.where(Event.camera.not_in(self.camera_keys))
|
||||
.distinct()
|
||||
.execute()
|
||||
)
|
||||
@@ -89,7 +89,7 @@ class EventCleanup(threading.Thread):
|
||||
Event.thumbnail,
|
||||
)
|
||||
.where(
|
||||
Event.camera.not_in(self.camera_keys), # type: ignore[arg-type,call-arg,misc]
|
||||
Event.camera.not_in(self.camera_keys),
|
||||
Event.start_time < expire_after,
|
||||
Event.label == event.label,
|
||||
Event.retain_indefinitely == False,
|
||||
@@ -111,7 +111,7 @@ class EventCleanup(threading.Thread):
|
||||
|
||||
# update the clips attribute for the db entry
|
||||
query = Event.select(Event.id).where(
|
||||
Event.camera.not_in(self.camera_keys), # type: ignore[arg-type,call-arg,misc]
|
||||
Event.camera.not_in(self.camera_keys),
|
||||
Event.start_time < expire_after,
|
||||
Event.label == event.label,
|
||||
Event.retain_indefinitely == False,
|
||||
@@ -218,7 +218,7 @@ class EventCleanup(threading.Thread):
|
||||
Event.camera,
|
||||
)
|
||||
.where(
|
||||
Event.camera.not_in(self.camera_keys), # type: ignore[arg-type,call-arg,misc]
|
||||
Event.camera.not_in(self.camera_keys),
|
||||
Event.start_time < expire_after,
|
||||
Event.retain_indefinitely == False,
|
||||
)
|
||||
@@ -249,7 +249,7 @@ class EventCleanup(threading.Thread):
|
||||
|
||||
# update the clips attribute for the db entry
|
||||
query = Event.select(Event.id).where(
|
||||
Event.camera.not_in(self.camera_keys), # type: ignore[arg-type,call-arg,misc]
|
||||
Event.camera.not_in(self.camera_keys),
|
||||
Event.start_time < expire_after,
|
||||
Event.retain_indefinitely == False,
|
||||
)
|
||||
|
||||
@@ -216,11 +216,11 @@ class ExportDebugReplaySource(DebugReplaySource):
|
||||
"""
|
||||
|
||||
def __init__(self, export: Export, duration: float) -> None:
|
||||
self._camera = cast(str, export.camera)
|
||||
self._camera = export.camera
|
||||
# Export.date is declared DateTimeField but Frigate writes raw unix
|
||||
# timestamps to the column.
|
||||
self._start_ts = float(cast(Any, export.date))
|
||||
self._video_path = cast(str, export.video_path)
|
||||
self._video_path = export.video_path
|
||||
self._duration = duration
|
||||
|
||||
@property
|
||||
|
||||
@@ -109,6 +109,8 @@ class Export(Model):
|
||||
backref="exports",
|
||||
column_name="export_case_id",
|
||||
)
|
||||
# peewee adds this accessor for the export_case column at runtime
|
||||
export_case_id: str | None
|
||||
|
||||
|
||||
class ReviewSegment(Model):
|
||||
|
||||
@@ -186,7 +186,7 @@ class NoticeRegistry:
|
||||
deleted = (
|
||||
Notice.delete()
|
||||
.where(
|
||||
Notice.kind.in_(camera_kinds), # type: ignore[call-arg, arg-type, misc]
|
||||
Notice.kind.in_(camera_kinds),
|
||||
Notice.scope == camera,
|
||||
)
|
||||
.execute()
|
||||
@@ -257,7 +257,7 @@ class NoticeRegistry:
|
||||
"""Dismissed config and stream check rows, newest first."""
|
||||
rows = (
|
||||
Notice.select()
|
||||
.where(Notice.kind.in_(list(CHECK_KINDS))) # type: ignore[call-arg, arg-type, misc]
|
||||
.where(Notice.kind.in_(list(CHECK_KINDS)))
|
||||
.order_by(Notice.dismissed_at.desc())
|
||||
)
|
||||
return [{"id": row.id, "dismissed_at": row.dismissed_at} for row in rows]
|
||||
@@ -351,7 +351,7 @@ class NoticeRegistry:
|
||||
)
|
||||
Notice.delete().where(
|
||||
Notice.kind == kind,
|
||||
Notice.id.not_in(newest), # type: ignore[call-arg, misc]
|
||||
Notice.id.not_in(newest),
|
||||
).execute()
|
||||
|
||||
def _bump_occurrences(self, kind: str, count: int, now: float) -> None:
|
||||
|
||||
@@ -66,6 +66,12 @@ def get_cache_image_name(camera: str, frame_time: float) -> str:
|
||||
)
|
||||
|
||||
|
||||
def is_camera_preview_frame(file_name: str, camera: str) -> bool:
|
||||
"""Check whether a cached preview frame file belongs to the camera."""
|
||||
# camera names may contain "-", so a prefix match would include "front-door"
|
||||
return file_name.rsplit("-", 1)[0] == f"preview_{camera}"
|
||||
|
||||
|
||||
def get_most_recent_preview_frame(
|
||||
camera: str, before: float | None = None
|
||||
) -> str | None:
|
||||
@@ -79,7 +85,7 @@ def get_most_recent_preview_frame(
|
||||
preview_files = [
|
||||
f
|
||||
for f in os.listdir(PREVIEW_CACHE_DIR)
|
||||
if f.startswith(f"preview_{camera}-")
|
||||
if is_camera_preview_frame(f, camera)
|
||||
and f.endswith(f".{PREVIEW_FRAME_TYPE}")
|
||||
]
|
||||
|
||||
@@ -276,7 +282,7 @@ class PreviewRecorder:
|
||||
start_file = f"{file_start}{start_ts}.webp"
|
||||
|
||||
for file in sorted(os.listdir(os.path.join(CACHE_DIR, FOLDER_PREVIEW_FRAMES))):
|
||||
if not file.startswith(file_start):
|
||||
if not is_camera_preview_frame(file, self.camera_name):
|
||||
continue
|
||||
|
||||
if file < start_file:
|
||||
|
||||
+46
-2
@@ -11,11 +11,50 @@ import requests
|
||||
from numpy import ndarray
|
||||
from requests.models import Response
|
||||
|
||||
from frigate.const import PLUS_API_HOST, PLUS_ENV_VAR
|
||||
from frigate.const import MODEL_CACHE_DIR, PLUS_API_HOST, PLUS_ENV_VAR
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def add_hailo_alias(model_info: dict[str, Any]) -> dict[str, Any]:
|
||||
"""Name the hailo detector by its current key as well as its old one.
|
||||
|
||||
Frigate+ reports every Hailo model as supporting hailo8l, which this
|
||||
detector was called before it was renamed to cover every Hailo device.
|
||||
The old key is kept so an older Frigate still matches the model.
|
||||
|
||||
Args:
|
||||
model_info: A Frigate+ model's metadata, edited in place
|
||||
|
||||
Returns:
|
||||
The same metadata
|
||||
"""
|
||||
supported = model_info.get("supportedDetectors")
|
||||
|
||||
if supported and "hailo8l" in supported and "hailo" not in supported:
|
||||
supported.append("hailo")
|
||||
|
||||
return model_info
|
||||
|
||||
|
||||
def load_plus_model_info(model_id: str) -> dict[str, Any] | None:
|
||||
"""Read a Frigate+ model's cached info file.
|
||||
|
||||
Args:
|
||||
model_id: The Frigate+ model id
|
||||
|
||||
Returns:
|
||||
The model info, or None when it has not been cached or cannot be read
|
||||
"""
|
||||
try:
|
||||
with open(os.path.join(MODEL_CACHE_DIR, f"{model_id}.json")) as f:
|
||||
model_info: dict[str, Any] = json.load(f)
|
||||
except (OSError, ValueError):
|
||||
return None
|
||||
|
||||
return add_hailo_alias(model_info)
|
||||
|
||||
|
||||
def get_jpg_bytes(image: ndarray, max_dim: int, quality: int) -> bytes:
|
||||
if image.shape[1] >= image.shape[0]:
|
||||
width = min(max_dim, image.shape[1])
|
||||
@@ -241,4 +280,9 @@ class PlusApi:
|
||||
if not r.ok:
|
||||
raise Exception(r.text)
|
||||
|
||||
return r.json()
|
||||
models = r.json()
|
||||
|
||||
for model in models.get("list") or []:
|
||||
add_hailo_alias(model)
|
||||
|
||||
return models
|
||||
|
||||
@@ -5,6 +5,7 @@ import itertools
|
||||
import logging
|
||||
import os
|
||||
import threading
|
||||
from collections.abc import Iterable
|
||||
from multiprocessing.synchronize import Event as MpEvent
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
@@ -28,7 +29,7 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _filter_reviews_for_pass(
|
||||
reviews: list[Any],
|
||||
reviews: Iterable[Any],
|
||||
now: datetime.datetime,
|
||||
alerts_days: float,
|
||||
detections_days: float,
|
||||
@@ -121,14 +122,14 @@ class RecordingCleanup(threading.Thread):
|
||||
)
|
||||
|
||||
maybe_empty_dirs = set()
|
||||
thumbs_to_delete = list(map(lambda x: x[1], expired_reviews))
|
||||
for thumb_path in thumbs_to_delete:
|
||||
thumb_path = Path(thumb_path)
|
||||
thumbs_to_delete = list(map(lambda x: x.thumb_path, expired_reviews))
|
||||
for thumb in thumbs_to_delete:
|
||||
thumb_path = Path(thumb)
|
||||
thumb_path.unlink(missing_ok=True)
|
||||
maybe_empty_dirs.add(thumb_path.parent)
|
||||
|
||||
max_deletes = 100000
|
||||
deleted_reviews_list = list(map(lambda x: x[0], expired_reviews))
|
||||
deleted_reviews_list = list(map(lambda x: x.id, expired_reviews))
|
||||
for i in range(0, len(deleted_reviews_list), max_deletes):
|
||||
ReviewSegment.delete().where(
|
||||
ReviewSegment.id << deleted_reviews_list[i : i + max_deletes]
|
||||
|
||||
@@ -14,7 +14,7 @@ from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
from typing import Any, cast
|
||||
|
||||
import pytz # type: ignore[import-untyped]
|
||||
from pathvalidate import sanitize_filename
|
||||
@@ -36,6 +36,7 @@ from frigate.ffmpeg_presets import (
|
||||
parse_preset_hardware_acceleration_encode,
|
||||
)
|
||||
from frigate.models import Export, Previews, Recordings, ReviewSegment
|
||||
from frigate.output.preview import is_camera_preview_frame
|
||||
from frigate.util.ffmpeg import run_ffmpeg_with_progress
|
||||
from frigate.util.ownership import chown_to_runtime
|
||||
from frigate.util.recording_coverage import (
|
||||
@@ -1055,7 +1056,10 @@ class RecordingExporter(threading.Thread):
|
||||
except DoesNotExist:
|
||||
return ""
|
||||
|
||||
diff = max(0.0, float(self.start_time) - float(preview.start_time))
|
||||
# start_time is a DateTimeField holding a unix timestamp
|
||||
diff = max(
|
||||
0.0, float(self.start_time) - float(cast(Any, preview.start_time))
|
||||
)
|
||||
ffmpeg_cmd = [
|
||||
"/usr/lib/ffmpeg/8.0/bin/ffmpeg", # hardcode path for exports thumbnail due to missing libwebp support
|
||||
"-hide_banner",
|
||||
@@ -1095,7 +1099,7 @@ class RecordingExporter(threading.Thread):
|
||||
fallback_preview = None
|
||||
|
||||
for file in sorted(os.listdir(preview_dir)):
|
||||
if not file.startswith(file_start):
|
||||
if not is_camera_preview_frame(file, self.camera):
|
||||
continue
|
||||
|
||||
if file < start_file:
|
||||
|
||||
@@ -467,7 +467,7 @@ def get_hardware_temperatures(detector_type: str) -> list[float | None]:
|
||||
read_temperature(os.path.join(base, apex, "temp"))
|
||||
for apex in sorted(os.listdir(base))
|
||||
]
|
||||
elif detector_type == "hailo8l":
|
||||
elif detector_type == "hailo":
|
||||
hailo_temps = get_hailo_temps()
|
||||
return [hailo_temps[name] for name in sorted(hailo_temps.keys())]
|
||||
|
||||
|
||||
+5
-2
@@ -3,8 +3,10 @@
|
||||
import logging
|
||||
import shutil
|
||||
import threading
|
||||
from collections.abc import Iterable
|
||||
from multiprocessing.synchronize import Event as MpEvent
|
||||
from pathlib import Path
|
||||
from typing import Any, cast
|
||||
|
||||
from peewee import SQL, Case, fn
|
||||
|
||||
@@ -191,14 +193,15 @@ class StorageMaintainer(threading.Thread):
|
||||
|
||||
stream_usages = {
|
||||
row["stream_type"]: row["usage"] or 0
|
||||
for row in (
|
||||
for row in cast(
|
||||
Iterable[dict[str, Any]],
|
||||
Recordings.select(
|
||||
Recordings.stream_type,
|
||||
fn.SUM(Recordings.segment_size).alias("usage"),
|
||||
)
|
||||
.where(Recordings.camera == camera, Recordings.segment_size != 0)
|
||||
.group_by(Recordings.stream_type)
|
||||
.dicts()
|
||||
.dicts(),
|
||||
)
|
||||
}
|
||||
stream_bandwidths = self.camera_storage_stats.get(camera, {}).get(
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
"""Tests that /auth only accepts a JWT whose role is still in the config."""
|
||||
|
||||
import os
|
||||
import time
|
||||
from unittest.mock import MagicMock, Mock, patch
|
||||
|
||||
from frigate.api.auth import create_encoded_jwt
|
||||
from frigate.api.fastapi_app import create_fastapi_app
|
||||
from frigate.config import FrigateConfig
|
||||
from frigate.config.camera.updater import CameraConfigUpdatePublisher
|
||||
from frigate.const import JWT_SECRET_ENV_VAR
|
||||
from frigate.models import Event, Recordings, ReviewSegment
|
||||
from frigate.test.http_api.base_http_test import AuthTestClient, BaseTestHttp
|
||||
|
||||
|
||||
@patch.dict(os.environ, {JWT_SECRET_ENV_VAR: "test-secret"})
|
||||
class TestAuthJwtRole(BaseTestHttp):
|
||||
def setUp(self):
|
||||
super().setUp(models=[Event, Recordings, ReviewSegment])
|
||||
self.minimal_config = {
|
||||
"mqtt": {"host": "mqtt"},
|
||||
"auth": {"enabled": True, "roles": {"garage": ["front_door"]}},
|
||||
"networking": {"listen": {"internal": 5000, "external": 8971}},
|
||||
"cameras": {
|
||||
"front_door": {
|
||||
"ffmpeg": {
|
||||
"inputs": [
|
||||
{"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
|
||||
]
|
||||
},
|
||||
"detect": {
|
||||
"height": 1080,
|
||||
"width": 1920,
|
||||
"fps": 5,
|
||||
},
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
def _create_app(self):
|
||||
mock_publisher = Mock(spec=CameraConfigUpdatePublisher)
|
||||
mock_publisher.publisher = MagicMock()
|
||||
|
||||
return create_fastapi_app(
|
||||
FrigateConfig(**self.minimal_config),
|
||||
self.db,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
mock_publisher,
|
||||
None,
|
||||
enforce_default_admin=False,
|
||||
)
|
||||
|
||||
def _auth(self, app, role: str):
|
||||
token = create_encoded_jwt("bob", role, int(time.time()) + 3600, app.jwt_token)
|
||||
|
||||
with AuthTestClient(app) as client:
|
||||
return client.get(
|
||||
"/auth",
|
||||
headers={
|
||||
"x-server-port": "8971",
|
||||
"authorization": f"Bearer {token}",
|
||||
},
|
||||
)
|
||||
|
||||
def test_configured_role_is_accepted(self):
|
||||
resp = self._auth(self._create_app(), "garage")
|
||||
|
||||
self.assertEqual(resp.status_code, 202)
|
||||
self.assertEqual(resp.headers["remote-user"], "bob")
|
||||
self.assertEqual(resp.headers["remote-role"], "garage")
|
||||
|
||||
def test_role_removed_from_config_is_rejected(self):
|
||||
resp = self._auth(self._create_app(), "removed_role")
|
||||
|
||||
self.assertEqual(resp.status_code, 401)
|
||||
self.assertNotIn("remote-role", resp.headers)
|
||||
@@ -12,6 +12,7 @@ from frigate.util.config import (
|
||||
CURRENT_CONFIG_VERSION,
|
||||
migrate_frigate_config,
|
||||
migrate_models,
|
||||
rename_hailo_detector,
|
||||
)
|
||||
|
||||
|
||||
@@ -128,10 +129,10 @@ class TestMigrateModels(unittest.TestCase):
|
||||
migrated = migrate_models(
|
||||
{
|
||||
"detectors": {
|
||||
"ds": {
|
||||
"type": "deepstack",
|
||||
"api_url": "http://host:5000/v1/vision/detection",
|
||||
"api_key": "secret",
|
||||
"remote": {
|
||||
"type": "zmq",
|
||||
"endpoint": "tcp://host:5555",
|
||||
"request_timeout_ms": 200,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -139,9 +140,9 @@ class TestMigrateModels(unittest.TestCase):
|
||||
|
||||
self.assertEqual(
|
||||
migrated["models"][0]["devices"],
|
||||
["deepstack:http://host:5000/v1/vision/detection"],
|
||||
["zmq:tcp://host:5555"],
|
||||
)
|
||||
self.assertTrue(any("api_key" in message for message in logs.output))
|
||||
self.assertTrue(any("request_timeout_ms" in message for message in logs.output))
|
||||
|
||||
def test_mixed_detector_types_are_logged(self):
|
||||
with self.assertLogs("frigate.util.config", level=logging.ERROR) as logs:
|
||||
@@ -164,6 +165,61 @@ class TestMigrateModels(unittest.TestCase):
|
||||
self.assertEqual(migrated["mqtt"], {"host": "mqtt"})
|
||||
|
||||
|
||||
class TestMigrateRenamedDetectors(unittest.TestCase):
|
||||
def test_a_hailo_detector_is_renamed(self):
|
||||
migrated = migrate_models(
|
||||
{"detectors": {"hailo": {"type": "hailo8l", "device": "PCIe"}}}
|
||||
)
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["hailo:PCIe"])
|
||||
|
||||
def test_a_hailo_detector_without_a_device(self):
|
||||
migrated = migrate_models({"detectors": {"hailo": {"type": "hailo8l"}}})
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["hailo"])
|
||||
|
||||
def test_two_hailo_detectors_stay_separate(self):
|
||||
# the shareable lookup has to resolve through the renamed key
|
||||
migrated = migrate_models(
|
||||
{
|
||||
"detectors": {
|
||||
"hailo1": {"type": "hailo8l", "device": "PCIe"},
|
||||
"hailo2": {"type": "hailo8l", "device": "PCIe"},
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["hailo:PCIe", "hailo:PCIe"])
|
||||
|
||||
|
||||
class TestRenameHailoDetector(unittest.TestCase):
|
||||
def test_a_renamed_detector_is_updated(self):
|
||||
migrated = rename_hailo_detector(
|
||||
{"models": [{"devices": ["hailo8l:PCIe", "hailo8l"]}]}
|
||||
)
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["hailo:PCIe", "hailo"])
|
||||
|
||||
def test_other_detectors_are_untouched(self):
|
||||
migrated = rename_hailo_detector(
|
||||
{"models": [{"devices": ["openvino:GPU", "cpu"]}]}
|
||||
)
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["openvino:GPU", "cpu"])
|
||||
|
||||
def test_renaming_is_idempotent(self):
|
||||
once = rename_hailo_detector({"models": [{"devices": ["hailo8l:PCIe"]}]})
|
||||
twice = rename_hailo_detector(once)
|
||||
|
||||
self.assertEqual(twice["models"][0]["devices"], ["hailo:PCIe"])
|
||||
|
||||
def test_a_config_without_models_is_left_alone(self):
|
||||
self.assertEqual(
|
||||
rename_hailo_detector({"mqtt": {"enabled": False}}),
|
||||
{"mqtt": {"enabled": False}},
|
||||
)
|
||||
|
||||
|
||||
class TestMigrateConfigFile(unittest.TestCase):
|
||||
"""The full file migration, which is gated on shape as well as version."""
|
||||
|
||||
@@ -220,6 +276,37 @@ class TestMigrateConfigFile(unittest.TestCase):
|
||||
os.path.exists(os.path.join(self.temp_dir.name, "backup_config.yaml"))
|
||||
)
|
||||
|
||||
def test_a_legacy_hailo_detector_lands_on_the_hailo_key(self):
|
||||
# the detectors key is folded into models after the version chain has
|
||||
# run, so the rename has to happen there too
|
||||
migrated = self._migrate(
|
||||
"mqtt:\n"
|
||||
" enabled: false\n"
|
||||
"detectors:\n"
|
||||
" hailo:\n"
|
||||
" type: hailo8l\n"
|
||||
" device: PCIe\n"
|
||||
"cameras: {}\n"
|
||||
"version: 0.18-0\n"
|
||||
)
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["hailo:PCIe"])
|
||||
self.assertNotIn("detectors", migrated)
|
||||
|
||||
def test_a_hailo8l_device_is_renamed_at_the_current_version(self):
|
||||
migrated = self._migrate(
|
||||
"mqtt:\n"
|
||||
" enabled: false\n"
|
||||
"models:\n"
|
||||
" - scene: all\n"
|
||||
" devices:\n"
|
||||
" - hailo8l:PCIe\n"
|
||||
"cameras: {}\n"
|
||||
f"version: {CURRENT_CONFIG_VERSION}\n"
|
||||
)
|
||||
|
||||
self.assertEqual(migrated["models"][0]["devices"], ["hailo:PCIe"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(verbosity=2)
|
||||
|
||||
@@ -170,7 +170,7 @@ class TestAccelerators(HardwareProbeTestCase):
|
||||
def test_hailo_is_found_by_its_device_node(self):
|
||||
write(os.path.join(self.dev_root, "hailo0"))
|
||||
|
||||
self.assertEqual(self.probe()["hailo8l"].units[0].device, "hailo8l:PCIe")
|
||||
self.assertEqual(self.probe()["hailo"].units[0].device, "hailo:PCIe")
|
||||
|
||||
def test_each_memryx_node_is_a_unit(self):
|
||||
write(os.path.join(self.dev_root, "memx0"))
|
||||
|
||||
@@ -200,7 +200,7 @@ class TestScanDetectors(HardwareStatsTestCase):
|
||||
self.scan([DeviceSpec("openvino:CPU", "openvino", "CPU")]), set()
|
||||
)
|
||||
self.assertEqual(self.scan([DeviceSpec("cpu", "cpu", None)]), set())
|
||||
self.assertEqual(self.scan([DeviceSpec("hailo8l", "hailo8l", None)]), set())
|
||||
self.assertEqual(self.scan([DeviceSpec("hailo", "hailo", None)]), set())
|
||||
|
||||
def test_onnx_resolves_to_present_gpu(self):
|
||||
spec = DeviceSpec("onnx", "onnx", None)
|
||||
@@ -412,7 +412,7 @@ class TestHardwareTemperatures(unittest.TestCase):
|
||||
return_value={"hailo8l-1": 52.0, "hailo8l-0": 51.0},
|
||||
)
|
||||
def test_hailo_sorted_by_name(self, temps):
|
||||
self.assertEqual(get_hardware_temperatures("hailo8l"), [51.0, 52.0])
|
||||
self.assertEqual(get_hardware_temperatures("hailo"), [51.0, 52.0])
|
||||
|
||||
def test_unsupported_type(self):
|
||||
self.assertEqual(get_hardware_temperatures("rknn"), [])
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
"""Tests for Frigate+ model metadata."""
|
||||
|
||||
import json
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from frigate.plus import PlusApi, load_plus_model_info
|
||||
|
||||
|
||||
class TestHailoAlias(unittest.TestCase):
|
||||
"""Frigate+ reports Hailo models by the detector's pre-rename key.
|
||||
|
||||
Both the model list and a cached info file have to carry the current key,
|
||||
or every Hailo model reads as unsupported.
|
||||
"""
|
||||
|
||||
def _get_models(self, models: list[dict]) -> list[dict]:
|
||||
api = PlusApi.__new__(PlusApi)
|
||||
response = MagicMock(ok=True, json=lambda: {"list": models})
|
||||
|
||||
with patch.object(PlusApi, "_get", return_value=response):
|
||||
return api.get_models()["list"]
|
||||
|
||||
def test_the_model_list_gains_the_current_key(self):
|
||||
models = self._get_models([{"supportedDetectors": ["hailo8l"]}])
|
||||
|
||||
self.assertEqual(models[0]["supportedDetectors"], ["hailo8l", "hailo"])
|
||||
|
||||
def test_the_old_key_is_kept_for_older_versions(self):
|
||||
models = self._get_models([{"supportedDetectors": ["hailo8l"]}])
|
||||
|
||||
self.assertIn("hailo8l", models[0]["supportedDetectors"])
|
||||
|
||||
def test_other_detectors_are_untouched(self):
|
||||
models = self._get_models([{"supportedDetectors": ["openvino", "onnx"]}])
|
||||
|
||||
self.assertEqual(models[0]["supportedDetectors"], ["openvino", "onnx"])
|
||||
|
||||
def test_a_model_already_naming_both_is_unchanged(self):
|
||||
models = self._get_models([{"supportedDetectors": ["hailo8l", "hailo"]}])
|
||||
|
||||
self.assertEqual(models[0]["supportedDetectors"], ["hailo8l", "hailo"])
|
||||
|
||||
def test_an_empty_list(self):
|
||||
self.assertEqual(self._get_models([]), [])
|
||||
|
||||
|
||||
class TestLoadPlusModelInfo(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.cache = tempfile.TemporaryDirectory()
|
||||
self.addCleanup(self.cache.cleanup)
|
||||
patcher = patch("frigate.plus.MODEL_CACHE_DIR", self.cache.name)
|
||||
patcher.start()
|
||||
self.addCleanup(patcher.stop)
|
||||
|
||||
def _write(self, model_id: str, content: str) -> None:
|
||||
with open(os.path.join(self.cache.name, f"{model_id}.json"), "w") as f:
|
||||
f.write(content)
|
||||
|
||||
def test_a_cached_hailo_model_gains_the_current_key(self):
|
||||
self._write("abc", json.dumps({"supportedDetectors": ["hailo8l"]}))
|
||||
|
||||
self.assertEqual(
|
||||
load_plus_model_info("abc")["supportedDetectors"], ["hailo8l", "hailo"]
|
||||
)
|
||||
|
||||
def test_a_missing_file(self):
|
||||
self.assertIsNone(load_plus_model_info("nope"))
|
||||
|
||||
def test_an_unreadable_file(self):
|
||||
self._write("bad", "{not json")
|
||||
|
||||
self.assertIsNone(load_plus_model_info("bad"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(verbosity=2)
|
||||
@@ -75,6 +75,21 @@ class TestPreviewLoader(unittest.TestCase):
|
||||
|
||||
self.assertIsNone(get_most_recent_preview_frame(camera))
|
||||
|
||||
def test_get_most_recent_preview_frame_hyphenated_camera(self):
|
||||
for name in ("preview_front-2000.0", "preview_front-door-3000.0"):
|
||||
with open(
|
||||
os.path.join(PREVIEW_CACHE_DIR, f"{name}.{PREVIEW_FRAME_TYPE}"), "w"
|
||||
) as f:
|
||||
f.write("test")
|
||||
|
||||
expected_path = os.path.join(
|
||||
PREVIEW_CACHE_DIR, f"preview_front-2000.0.{PREVIEW_FRAME_TYPE}"
|
||||
)
|
||||
self.assertEqual(get_most_recent_preview_frame("front"), expected_path)
|
||||
self.assertEqual(
|
||||
get_most_recent_preview_frame("front", before=5000.0), expected_path
|
||||
)
|
||||
|
||||
def test_get_most_recent_preview_frame_no_directory(self):
|
||||
shutil.rmtree(PREVIEW_CACHE_DIR)
|
||||
self.assertIsNone(get_most_recent_preview_frame("test_camera"))
|
||||
|
||||
@@ -406,12 +406,12 @@ class TrackedObjectProcessor(threading.Thread):
|
||||
tracked_obj.obj_data["sub_label"] = (sub_label, score)
|
||||
|
||||
if event:
|
||||
event.sub_label = sub_label # type: ignore[assignment]
|
||||
event.sub_label = sub_label
|
||||
data = event.data
|
||||
if sub_label is None:
|
||||
data["sub_label_score"] = None # type: ignore[index]
|
||||
data["sub_label_score"] = None
|
||||
elif score is not None:
|
||||
data["sub_label_score"] = score # type: ignore[index]
|
||||
data["sub_label_score"] = score
|
||||
event.data = data
|
||||
event.save()
|
||||
|
||||
@@ -440,7 +440,7 @@ class TrackedObjectProcessor(threading.Thread):
|
||||
objects_list = []
|
||||
sub_labels = set()
|
||||
events = Event.select(Event.id, Event.label, Event.sub_label).where(
|
||||
Event.id.in_(detection_ids) # type: ignore[call-arg, misc]
|
||||
Event.id.in_(detection_ids)
|
||||
)
|
||||
for det_event in events:
|
||||
if det_event.sub_label:
|
||||
@@ -506,11 +506,11 @@ class TrackedObjectProcessor(threading.Thread):
|
||||
|
||||
if event:
|
||||
data = event.data
|
||||
data[field_name] = field_value # type: ignore[index]
|
||||
data[field_name] = field_value
|
||||
if field_value is None:
|
||||
data[f"{field_name}_score"] = None # type: ignore[index]
|
||||
data[f"{field_name}_score"] = None
|
||||
elif score is not None:
|
||||
data[f"{field_name}_score"] = score # type: ignore[index]
|
||||
data[f"{field_name}_score"] = score
|
||||
event.data = data
|
||||
event.save()
|
||||
|
||||
|
||||
+61
-4
@@ -31,7 +31,6 @@ DEFAULT_CONFIG_FILE = os.path.join(CONFIG_DIR, "config.yml")
|
||||
DETECTOR_DEVICE_FIELDS = {
|
||||
"cpu": "num_threads",
|
||||
"rknn": "num_cores",
|
||||
"deepstack": "api_url",
|
||||
"degirum": "location",
|
||||
"zmq": "endpoint",
|
||||
}
|
||||
@@ -40,7 +39,6 @@ DETECTOR_DEVICE_FIELDS = {
|
||||
# detectors that use them are being reworked, so they are dropped rather than
|
||||
# carried over.
|
||||
DROPPED_DETECTOR_OPTIONS = {
|
||||
"deepstack": ["api_timeout", "api_key"],
|
||||
"degirum": ["zoo", "token"],
|
||||
"zmq": ["request_timeout_ms", "linger_ms"],
|
||||
}
|
||||
@@ -170,7 +168,20 @@ def migrate_frigate_config(config_file: str):
|
||||
# version and still use the pre-models detectors and model keys
|
||||
needs_models = "detectors" in config or "model" in config
|
||||
|
||||
if previous_version == CURRENT_CONFIG_VERSION and not needs_models:
|
||||
# likewise, it may already be on the models list and still name the hailo
|
||||
# detector by its old key
|
||||
needs_detector_rename = any(
|
||||
isinstance(device, str) and device.partition(":")[0] == "hailo8l"
|
||||
for model in (config.get("models") or [])
|
||||
if isinstance(model, dict)
|
||||
for device in (model.get("devices") or [])
|
||||
)
|
||||
|
||||
if (
|
||||
previous_version == CURRENT_CONFIG_VERSION
|
||||
and not needs_models
|
||||
and not needs_detector_rename
|
||||
):
|
||||
logger.info("frigate config does not need migration...")
|
||||
return
|
||||
|
||||
@@ -244,6 +255,12 @@ def migrate_frigate_config(config_file: str):
|
||||
with open(config_file, "w") as f:
|
||||
yaml.dump(new_config, f)
|
||||
|
||||
if needs_detector_rename:
|
||||
logger.info("Migrating renamed frigate detectors...")
|
||||
new_config = rename_hailo_detector(new_config)
|
||||
with open(config_file, "w") as f:
|
||||
yaml.dump(new_config, f)
|
||||
|
||||
logger.info("Finished frigate config migration...")
|
||||
|
||||
|
||||
@@ -777,9 +794,44 @@ def migrate_018_0(config: dict[str, dict[str, Any]]) -> dict[str, dict[str, Any]
|
||||
return new_config
|
||||
|
||||
|
||||
def rename_hailo_detector(
|
||||
config: dict[str, dict[str, Any]],
|
||||
) -> dict[str, dict[str, Any]]:
|
||||
"""Rename the hailo8l detector, which drives every Hailo device.
|
||||
|
||||
Args:
|
||||
config: The loaded config
|
||||
|
||||
Returns:
|
||||
The config with every models entry naming the detector 'hailo'
|
||||
"""
|
||||
new_config = config.copy()
|
||||
|
||||
for model in new_config.get("models") or []:
|
||||
if not isinstance(model, dict):
|
||||
continue
|
||||
|
||||
devices = model.get("devices")
|
||||
|
||||
if not isinstance(devices, list):
|
||||
continue
|
||||
|
||||
# assigned per index so ruamel keeps the comments on the list
|
||||
for index, device in enumerate(devices):
|
||||
if not isinstance(device, str):
|
||||
continue
|
||||
|
||||
detector, separator, rest = device.partition(":")
|
||||
|
||||
if detector == "hailo8l":
|
||||
devices[index] = f"hailo{separator}{rest}"
|
||||
|
||||
return new_config
|
||||
|
||||
|
||||
def migrate_019_0(config: dict[str, dict[str, Any]]) -> dict[str, dict[str, Any]]:
|
||||
"""Handle migrating Frigate config to 0.19-0."""
|
||||
new_config = config.copy()
|
||||
new_config = rename_hailo_detector(config)
|
||||
|
||||
_migrate_birdseye_mode(new_config.get("birdseye"))
|
||||
|
||||
@@ -824,6 +876,11 @@ def migrate_models(config: dict[str, dict[str, Any]]) -> dict[str, dict[str, Any
|
||||
detector = detector or {}
|
||||
detector_type = detector.get("type", "cpu")
|
||||
device = detector.get(DETECTOR_DEVICE_FIELDS.get(detector_type, "device"))
|
||||
|
||||
# hailo8l named one device, but the detector drives every Hailo device
|
||||
if detector_type == "hailo8l":
|
||||
detector_type = "hailo"
|
||||
|
||||
device_string = detector_type if device is None else f"{detector_type}:{device}"
|
||||
|
||||
# repeating a device now means running an extra inference process on it,
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:react-hooks/recommended",
|
||||
"plugin:vitest-globals/recommended",
|
||||
"plugin:prettier/recommended",
|
||||
],
|
||||
env: { browser: true, es2021: true, "vitest-globals/env": true },
|
||||
ignorePatterns: ["dist", ".eslintrc.cjs"],
|
||||
parser: "@typescript-eslint/parser",
|
||||
parserOptions: {
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
ecmaVersion: "latest",
|
||||
sourceType: "module",
|
||||
},
|
||||
settings: {
|
||||
jest: {
|
||||
version: 27,
|
||||
},
|
||||
},
|
||||
ignorePatterns: ["*.d.ts", "/src/components/ui/*"],
|
||||
plugins: ["react-hooks", "react-refresh"],
|
||||
rules: {
|
||||
"react-hooks/rules-of-hooks": "error",
|
||||
"react-hooks/exhaustive-deps": "error",
|
||||
"react-refresh/only-export-components": [
|
||||
"warn",
|
||||
{ allowConstantExport: true },
|
||||
],
|
||||
"comma-dangle": [
|
||||
"error",
|
||||
{
|
||||
objects: "always-multiline",
|
||||
arrays: "always-multiline",
|
||||
imports: "always-multiline",
|
||||
},
|
||||
],
|
||||
"no-unused-vars": [
|
||||
"error",
|
||||
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
|
||||
],
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"error",
|
||||
{
|
||||
argsIgnorePattern: "^_",
|
||||
varsIgnorePattern: "^_",
|
||||
caughtErrorsIgnorePattern: "^_",
|
||||
},
|
||||
],
|
||||
"no-console": "error",
|
||||
"prettier/prettier": [
|
||||
"warn",
|
||||
{
|
||||
plugins: ["prettier-plugin-tailwindcss"],
|
||||
},
|
||||
],
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
files: ["**/*.{ts,tsx}"],
|
||||
parser: "@typescript-eslint/parser",
|
||||
plugins: ["@typescript-eslint"],
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"prettier",
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -49,9 +49,43 @@ const PLUS_MODEL = {
|
||||
height: 320,
|
||||
};
|
||||
|
||||
// Frigate+ builds a Hailo model per device and names the detector by its
|
||||
// pre-rename key; /api/plus/models adds the current one before serving it
|
||||
const HAILO_PLUS_MODELS = [
|
||||
{
|
||||
...PLUS_MODEL,
|
||||
id: "hailo8l1",
|
||||
supportedDetectors: ["hailo8l", "hailo"],
|
||||
hailoDevice: "hailo8l",
|
||||
},
|
||||
{
|
||||
...PLUS_MODEL,
|
||||
id: "hailo8r1",
|
||||
supportedDetectors: ["hailo8l", "hailo"],
|
||||
hailoDevice: "hailo8r",
|
||||
},
|
||||
];
|
||||
|
||||
const HAILO_HARDWARE = [
|
||||
{
|
||||
key: "hailo",
|
||||
detector: "hailo",
|
||||
name: "Hailo",
|
||||
units: [{ device: "hailo:PCIe", label: "hailo0" }],
|
||||
count: 1,
|
||||
unlimited: true,
|
||||
},
|
||||
];
|
||||
|
||||
type SavedConfig = { config_data?: { models?: Model[] } };
|
||||
|
||||
async function installRoutes(page: Page, models: Model[], plusEnabled = false) {
|
||||
async function installRoutes(
|
||||
page: Page,
|
||||
models: Model[],
|
||||
plusEnabled = false,
|
||||
plusModels: unknown[] = [PLUS_MODEL],
|
||||
hailoHardware = false,
|
||||
) {
|
||||
const config = configFactory({
|
||||
models,
|
||||
plus: { enabled: plusEnabled },
|
||||
@@ -70,8 +104,14 @@ async function installRoutes(page: Page, models: Model[], plusEnabled = false) {
|
||||
route.fulfill({ json: { models } }),
|
||||
);
|
||||
await page.route("**/api/plus/models", (route) =>
|
||||
route.fulfill({ json: [PLUS_MODEL] }),
|
||||
route.fulfill({ json: plusModels }),
|
||||
);
|
||||
|
||||
if (hailoHardware) {
|
||||
await page.route("**/api/hardware/probe**", (route) =>
|
||||
route.fulfill({ json: HAILO_HARDWARE }),
|
||||
);
|
||||
}
|
||||
await page.route("**/api/config/set", async (route) => {
|
||||
saves.push(route.request().postDataJSON() as SavedConfig);
|
||||
await route.fulfill({ json: { success: true, require_restart: false } });
|
||||
@@ -262,6 +302,35 @@ test.describe("Detection models settings @high", () => {
|
||||
expect(saves.at(-1)?.config_data?.models?.[0].path).toBe("plus://abc123");
|
||||
});
|
||||
|
||||
test("a Frigate+ Hailo model is listed by the device it was built for", async ({
|
||||
frigateApp,
|
||||
}) => {
|
||||
// every Hailo model supports the one hailo detector, so the detector name
|
||||
// says nothing; which device it was built for is what the user picks on
|
||||
await installRoutes(
|
||||
frigateApp.page,
|
||||
[{ scene: "all", devices: ["hailo:PCIe"], path: "/config/custom.hef" }],
|
||||
true,
|
||||
HAILO_PLUS_MODELS,
|
||||
true,
|
||||
);
|
||||
await openPage(frigateApp);
|
||||
|
||||
await frigateApp.page.getByRole("tab", { name: "Frigate+" }).click();
|
||||
await frigateApp.page.getByRole("combobox").last().click();
|
||||
|
||||
const options = frigateApp.page.getByRole("option");
|
||||
|
||||
await expect(options).toHaveCount(2);
|
||||
await expect(options.first()).toContainText("hailo8l");
|
||||
await expect(options.last()).toContainText("hailo8r");
|
||||
|
||||
// knowing which device is attached is left to the user, so neither is
|
||||
// ruled out here
|
||||
await expect(options.first()).not.toHaveAttribute("aria-disabled", "true");
|
||||
await expect(options.last()).not.toHaveAttribute("aria-disabled", "true");
|
||||
});
|
||||
|
||||
test("a freshly opened page is not reported as modified", async ({
|
||||
frigateApp,
|
||||
}) => {
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
/**
|
||||
* Object filters settings tests -- MEDIUM tier.
|
||||
*
|
||||
* `objects.filters` is an additionalProperties map, so each label's filter is
|
||||
* an entry RJSF adds at runtime. RJSF has changed how a cleared field nested
|
||||
* inside such an entry is stored (`""` before 6.9, omitted after). These tests
|
||||
* pin what Frigate does with it: the save payload deletes only the cleared
|
||||
* key, and restoring the value leaves the section clean.
|
||||
*/
|
||||
|
||||
import { readFileSync } from "node:fs";
|
||||
import { resolve, dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { test, expect } from "../../fixtures/frigate-test";
|
||||
import type { Page } from "@playwright/test";
|
||||
import { configFactory } from "../../fixtures/mock-data/config";
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const CONFIG_SCHEMA = JSON.parse(
|
||||
readFileSync(
|
||||
resolve(__dirname, "../../fixtures/mock-data/config-schema.json"),
|
||||
"utf-8",
|
||||
),
|
||||
);
|
||||
|
||||
const SETTINGS_URL = "/settings?page=cameraObjects&camera=front_door";
|
||||
const UNSAVED = "You have unsaved changes";
|
||||
|
||||
// A non-default value can only come from the YAML, so deleting it is safe
|
||||
const MIN_AREA = 5000;
|
||||
|
||||
async function installRoutes(page: Page) {
|
||||
const config = configFactory({
|
||||
cameras: {
|
||||
front_door: {
|
||||
objects: {
|
||||
filters: {
|
||||
person: {
|
||||
min_area: MIN_AREA,
|
||||
max_area: 24000000,
|
||||
min_ratio: 0,
|
||||
max_ratio: 24000000,
|
||||
threshold: 0.7,
|
||||
min_score: 0.5,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
let lastSavedConfig: unknown = null;
|
||||
|
||||
await page.route("**/api/config/schema.json", (route) =>
|
||||
route.fulfill({ json: CONFIG_SCHEMA }),
|
||||
);
|
||||
await page.route("**/api/config", (route) => {
|
||||
if (route.request().method() === "GET") {
|
||||
return route.fulfill({ json: config });
|
||||
}
|
||||
return route.fulfill({ json: { success: true } });
|
||||
});
|
||||
await page.route("**/api/config/raw_paths", (route) =>
|
||||
route.fulfill({ json: {} }),
|
||||
);
|
||||
await page.route("**/api/config/set", async (route) => {
|
||||
lastSavedConfig = route.request().postDataJSON();
|
||||
await route.fulfill({ json: { success: true, require_restart: false } });
|
||||
});
|
||||
|
||||
return { capturedConfig: () => lastSavedConfig };
|
||||
}
|
||||
|
||||
async function openPersonMinArea(page: Page) {
|
||||
await page.getByText("Object filters", { exact: true }).click();
|
||||
await page.locator('[aria-expanded="false"]', { hasText: /^Person/ }).click();
|
||||
|
||||
const minArea = page.getByRole("textbox", { name: "Minimum object area" });
|
||||
await expect(minArea).toHaveValue(String(MIN_AREA));
|
||||
return minArea;
|
||||
}
|
||||
|
||||
test.describe("object filters additionalProperties entries @medium", () => {
|
||||
test("clearing a nested filter field deletes only that key on save", async ({
|
||||
frigateApp,
|
||||
}) => {
|
||||
const capture = await installRoutes(frigateApp.page);
|
||||
await frigateApp.goto(SETTINGS_URL);
|
||||
|
||||
const minArea = await openPersonMinArea(frigateApp.page);
|
||||
await minArea.fill("");
|
||||
|
||||
await expect(frigateApp.page.getByText(UNSAVED)).toBeVisible();
|
||||
await frigateApp.page
|
||||
.getByRole("button", { name: "Save", exact: true })
|
||||
.click();
|
||||
|
||||
// Empty string is the backend's remove sentinel. Sibling filter fields
|
||||
// must not appear, or the save would rewrite values the user didn't touch.
|
||||
await expect
|
||||
.poll(() => capture.capturedConfig(), { timeout: 5_000 })
|
||||
.toMatchObject({
|
||||
config_data: {
|
||||
cameras: {
|
||||
front_door: { objects: { filters: { person: { min_area: "" } } } },
|
||||
},
|
||||
},
|
||||
});
|
||||
const saved = capture.capturedConfig() as {
|
||||
config_data: {
|
||||
cameras: {
|
||||
front_door: { objects: { filters: { person: object } } };
|
||||
};
|
||||
};
|
||||
};
|
||||
expect(saved.config_data.cameras.front_door.objects.filters.person).toEqual(
|
||||
{ min_area: "" },
|
||||
);
|
||||
});
|
||||
|
||||
test("restoring a cleared nested filter field leaves the section clean", async ({
|
||||
frigateApp,
|
||||
}) => {
|
||||
await installRoutes(frigateApp.page);
|
||||
await frigateApp.goto(SETTINGS_URL);
|
||||
|
||||
const minArea = await openPersonMinArea(frigateApp.page);
|
||||
const save = frigateApp.page.getByRole("button", {
|
||||
name: "Save",
|
||||
exact: true,
|
||||
});
|
||||
|
||||
await minArea.fill("");
|
||||
await expect(frigateApp.page.getByText(UNSAVED)).toBeVisible();
|
||||
await expect(save).toBeEnabled();
|
||||
|
||||
await minArea.fill(String(MIN_AREA));
|
||||
await expect(frigateApp.page.getByText(UNSAVED)).toBeHidden();
|
||||
await expect(save).toBeDisabled();
|
||||
});
|
||||
});
|
||||
@@ -422,7 +422,7 @@ test.describe("System — Health hardware pane @medium", () => {
|
||||
frigateApp,
|
||||
}) => {
|
||||
await frigateApp.installDefaults({
|
||||
config: { models: [{ scene: "all", devices: ["hailo8l"] }] },
|
||||
config: { models: [{ scene: "all", devices: ["hailo"] }] },
|
||||
stats: QUIET_STATS,
|
||||
});
|
||||
await frigateApp.goto("/system#health");
|
||||
@@ -431,7 +431,7 @@ test.describe("System — Health hardware pane @medium", () => {
|
||||
await expect(row).toHaveAttribute("data-state", "error", {
|
||||
timeout: 15_000,
|
||||
});
|
||||
await expect(row).toContainText("hailo8l was not found on this system");
|
||||
await expect(row).toContainText("hailo was not found on this system");
|
||||
});
|
||||
|
||||
test("a generic device the probe cannot enumerate is judged by its runtime", async ({
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
import path from "node:path";
|
||||
import js from "@eslint/js";
|
||||
import { defineConfig, globalIgnores, includeIgnoreFile } from "eslint/config";
|
||||
import prettierRecommended from "eslint-plugin-prettier/recommended";
|
||||
import reactHooks from "eslint-plugin-react-hooks";
|
||||
import reactRefresh from "eslint-plugin-react-refresh";
|
||||
import globals from "globals";
|
||||
import tseslint from "typescript-eslint";
|
||||
|
||||
export default defineConfig([
|
||||
includeIgnoreFile(path.join(import.meta.dirname, ".gitignore")),
|
||||
globalIgnores(["src/components/ui/", "**/*.d.ts", "**/*.cjs", "**/*.mjs"]),
|
||||
js.configs.recommended,
|
||||
tseslint.configs.recommended,
|
||||
prettierRecommended,
|
||||
{
|
||||
languageOptions: {
|
||||
globals: { ...globals.browser, ...globals.node },
|
||||
},
|
||||
plugins: {
|
||||
"react-hooks": reactHooks,
|
||||
"react-refresh": reactRefresh,
|
||||
},
|
||||
rules: {
|
||||
"react-hooks/rules-of-hooks": "error",
|
||||
"react-hooks/exhaustive-deps": "error",
|
||||
"react-refresh/only-export-components": [
|
||||
"warn",
|
||||
{ allowConstantExport: true },
|
||||
],
|
||||
"no-unused-vars": "off",
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"error",
|
||||
{
|
||||
argsIgnorePattern: "^_",
|
||||
varsIgnorePattern: "^_",
|
||||
caughtErrorsIgnorePattern: "^_",
|
||||
},
|
||||
],
|
||||
"no-console": "error",
|
||||
"prettier/prettier": "warn",
|
||||
},
|
||||
},
|
||||
]);
|
||||
Generated
+2608
-6313
File diff suppressed because it is too large
Load Diff
+77
-91
@@ -7,13 +7,11 @@
|
||||
"dev": "vite --host",
|
||||
"postinstall": "patch-package",
|
||||
"build": "tsc && vite build --base=/BASE_PATH/",
|
||||
"lint": "eslint --ext .jsx,.js,.tsx,.ts --ignore-path .gitignore . && npm run e2e:lint",
|
||||
"lint": "eslint . && npm run e2e:lint",
|
||||
"e2e:lint": "node e2e/scripts/lint-specs.mjs",
|
||||
"lint:fix": "eslint --ext .jsx,.js,.tsx,.ts --ignore-path .gitignore --fix .",
|
||||
"lint:fix": "eslint --fix .",
|
||||
"preview": "vite preview",
|
||||
"prettier:write": "prettier -u -w --ignore-path .gitignore \"*.{ts,tsx,js,jsx,css,html}\"",
|
||||
"test": "vitest",
|
||||
"coverage": "vitest run --coverage",
|
||||
"e2e:build": "tsc && vite build --base=/",
|
||||
"e2e": "playwright test --config e2e/playwright.config.ts",
|
||||
"e2e:ui": "playwright test --config e2e/playwright.config.ts --ui",
|
||||
@@ -24,120 +22,108 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@cycjimmy/jsmpeg-player": "^6.1.2",
|
||||
"@hookform/resolvers": "^3.10.0",
|
||||
"@melloware/react-logviewer": "^6.1.2",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.15",
|
||||
"@radix-ui/react-aspect-ratio": "^1.1.2",
|
||||
"@radix-ui/react-checkbox": "^1.1.4",
|
||||
"@radix-ui/react-collapsible": "^1.1.12",
|
||||
"@radix-ui/react-context-menu": "^2.2.16",
|
||||
"@radix-ui/react-dialog": "^1.1.15",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||
"@radix-ui/react-hover-card": "^1.1.15",
|
||||
"@radix-ui/react-label": "^2.1.2",
|
||||
"@radix-ui/react-popover": "^1.1.6",
|
||||
"@radix-ui/react-progress": "^1.1.8",
|
||||
"@radix-ui/react-radio-group": "^1.2.3",
|
||||
"@radix-ui/react-scroll-area": "^1.2.3",
|
||||
"@radix-ui/react-select": "^2.1.6",
|
||||
"@radix-ui/react-separator": "^1.1.7",
|
||||
"@radix-ui/react-slider": "^1.2.3",
|
||||
"@hookform/resolvers": "^5.9.1",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.23",
|
||||
"@radix-ui/react-aspect-ratio": "^1.1.15",
|
||||
"@radix-ui/react-checkbox": "^1.3.11",
|
||||
"@radix-ui/react-collapsible": "^1.1.20",
|
||||
"@radix-ui/react-context-menu": "^2.3.7",
|
||||
"@radix-ui/react-dialog": "^1.1.23",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.24",
|
||||
"@radix-ui/react-hover-card": "^1.1.23",
|
||||
"@radix-ui/react-label": "^2.1.15",
|
||||
"@radix-ui/react-popover": "^1.1.23",
|
||||
"@radix-ui/react-progress": "^1.1.16",
|
||||
"@radix-ui/react-radio-group": "^1.4.7",
|
||||
"@radix-ui/react-scroll-area": "^1.2.18",
|
||||
"@radix-ui/react-select": "^2.3.7",
|
||||
"@radix-ui/react-separator": "^1.1.15",
|
||||
"@radix-ui/react-slider": "^1.4.7",
|
||||
"@radix-ui/react-slot": "1.2.4",
|
||||
"@radix-ui/react-switch": "^1.1.3",
|
||||
"@radix-ui/react-tabs": "^1.1.3",
|
||||
"@radix-ui/react-toggle": "^1.1.2",
|
||||
"@radix-ui/react-toggle-group": "^1.1.2",
|
||||
"@radix-ui/react-tooltip": "^1.2.8",
|
||||
"@rjsf/core": "^6.4.1",
|
||||
"@rjsf/shadcn": "^6.4.1",
|
||||
"@rjsf/utils": "^6.4.1",
|
||||
"@rjsf/validator-ajv8": "^6.4.1",
|
||||
"apexcharts": "^3.52.0",
|
||||
"axios": "^1.13.6",
|
||||
"@radix-ui/react-switch": "^1.3.7",
|
||||
"@radix-ui/react-tabs": "^1.1.21",
|
||||
"@radix-ui/react-toggle": "^1.1.18",
|
||||
"@radix-ui/react-toggle-group": "^1.1.19",
|
||||
"@radix-ui/react-tooltip": "^1.2.16",
|
||||
"@rjsf/core": "^6.10.0",
|
||||
"@rjsf/shadcn": "^6.10.0",
|
||||
"@rjsf/utils": "^6.10.0",
|
||||
"@rjsf/validator-ajv8": "^6.10.0",
|
||||
"apexcharts": "^7.3.0",
|
||||
"axios": "^1.20.0",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"cmdk": "^1.0.0",
|
||||
"copy-to-clipboard": "^3.3.3",
|
||||
"date-fns": "^3.6.0",
|
||||
"copy-to-clipboard": "^4.0.2",
|
||||
"date-fns": "^4.4.0",
|
||||
"date-fns-tz": "^3.2.0",
|
||||
"framer-motion": "^12.38.0",
|
||||
"hls.js": "^1.6.15",
|
||||
"i18next": "^24.2.0",
|
||||
"i18next-http-backend": "^3.0.1",
|
||||
"idb-keyval": "^6.2.1",
|
||||
"immer": "^10.1.1",
|
||||
"js-yaml": "^4.1.1",
|
||||
"konva": "^10.2.3",
|
||||
"framer-motion": "^13.3.0",
|
||||
"hls.js": "^1.7.3",
|
||||
"i18next": "^26.4.2",
|
||||
"i18next-http-backend": "^4.0.2",
|
||||
"idb-keyval": "^6.3.0",
|
||||
"js-yaml": "^5.4.2",
|
||||
"konva": "^10.5.0",
|
||||
"lodash": "^4.18.1",
|
||||
"lucide-react": "^0.577.0",
|
||||
"monaco-yaml": "^5.4.1",
|
||||
"lucide-react": "^1.46.0",
|
||||
"monaco-yaml": "^5.5.1",
|
||||
"next-themes": "^0.4.6",
|
||||
"nosleep.js": "^0.12.0",
|
||||
"react": "^19.2.4",
|
||||
"react-apexcharts": "^1.4.1",
|
||||
"react": "^19.3.0",
|
||||
"react-apexcharts": "^2.1.1",
|
||||
"react-day-picker": "^9.14.0",
|
||||
"react-device-detect": "^2.2.3",
|
||||
"react-dom": "^19.2.4",
|
||||
"react-dropzone": "^14.3.8",
|
||||
"react-grid-layout": "^2.2.2",
|
||||
"react-hook-form": "^7.72.0",
|
||||
"react-i18next": "^15.2.0",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-konva": "^19.2.3",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-router-dom": "^6.30.3",
|
||||
"react-dom": "^19.3.0",
|
||||
"react-dropzone": "^20.1.2",
|
||||
"react-grid-layout": "^2.2.4",
|
||||
"react-hook-form": "^7.88.0",
|
||||
"react-i18next": "^17.0.14",
|
||||
"react-icons": "^5.7.0",
|
||||
"react-konva": "^19.2.7",
|
||||
"react-markdown": "^10.1.0",
|
||||
"react-router-dom": "^6.30.6",
|
||||
"react-swipeable": "^7.0.2",
|
||||
"react-zoom-pan-pinch": "3.4.4",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"scroll-into-view-if-needed": "^3.1.0",
|
||||
"sonner": "^2.0.7",
|
||||
"sort-by": "^1.2.0",
|
||||
"strftime": "^0.10.3",
|
||||
"swr": "^2.4.1",
|
||||
"sonner": "^2.0.8",
|
||||
"swr": "^2.5.1",
|
||||
"tailwind-merge": "^2.4.0",
|
||||
"tailwind-scrollbar": "^3.1.0",
|
||||
"tailwindcss-animate": "^1.0.7",
|
||||
"use-long-press": "^3.2.0",
|
||||
"use-long-press": "^3.3.0",
|
||||
"vaul": "^1.1.2",
|
||||
"virtua": "^0.51.3",
|
||||
"vite-plugin-monaco-editor": "^1.1.0",
|
||||
"zod": "^3.23.8"
|
||||
"zod": "^3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.59.1",
|
||||
"@tailwindcss/forms": "^0.5.9",
|
||||
"@testing-library/jest-dom": "^6.6.2",
|
||||
"@eslint/js": "^10.0.1",
|
||||
"@playwright/test": "^1.63.0",
|
||||
"@types/js-yaml": "^4.0.9",
|
||||
"@types/lodash": "^4.17.12",
|
||||
"@types/node": "^20.14.10",
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/strftime": "^0.9.8",
|
||||
"@typescript-eslint/eslint-plugin": "^7.5.0",
|
||||
"@typescript-eslint/parser": "^7.5.0",
|
||||
"@vitejs/plugin-react-swc": "^3.8.0",
|
||||
"@vitest/coverage-v8": "^3.0.7",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-jest": "^28.2.0",
|
||||
"eslint-plugin-prettier": "^5.0.1",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.8",
|
||||
"eslint-plugin-vitest-globals": "^1.5.0",
|
||||
"fake-indexeddb": "^6.0.0",
|
||||
"@types/lodash": "^4.17.25",
|
||||
"@types/node": "^26.5.1",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@vitejs/plugin-react": "^6.1.1",
|
||||
"autoprefixer": "^10.6.0",
|
||||
"esbuild": "^0.28.2",
|
||||
"eslint": "^10.10.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.5.6",
|
||||
"eslint-plugin-react-hooks": "^7.1.1",
|
||||
"eslint-plugin-react-refresh": "^0.5.7",
|
||||
"globals": "^17.12.0",
|
||||
"i18next-cli": "^1.5.11",
|
||||
"jest-websocket-mock": "^2.5.0",
|
||||
"jsdom": "^24.1.1",
|
||||
"monaco-editor": "^0.52.2",
|
||||
"msw": "^2.3.5",
|
||||
"patch-package": "^8.0.1",
|
||||
"postcss": "^8.5.8",
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-tailwindcss": "^0.6.5",
|
||||
"postcss": "^8.5.12",
|
||||
"prettier": "^3.9.6",
|
||||
"prettier-plugin-tailwindcss": "^0.8.1",
|
||||
"tailwindcss": "^3.4.9",
|
||||
"typescript": "^5.9.3",
|
||||
"vite": "^6.4.2",
|
||||
"vitest": "^3.0.7"
|
||||
"typescript-eslint": "^8.70.0",
|
||||
"vite": "^8.3.0"
|
||||
},
|
||||
"overrides": {
|
||||
"@radix-ui/react-compose-refs": "1.1.2",
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
"submit": "تقديم"
|
||||
},
|
||||
"livePlayerRequiredIOSVersion": "مطلوب نظام iOS 17.1 أو أكبر لهذا النوع من البث المباشر.",
|
||||
"cameraDisabled": "الكاميرا معطلة",
|
||||
"stats": {
|
||||
"streamType": {
|
||||
"title": "نوع الدفق:",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"detection": "لا توجد عمليات كشف لمراجعتها",
|
||||
"motion": "لم يتم العثور على بيانات الحركة"
|
||||
},
|
||||
"timeline": "التسلسل الزمني",
|
||||
"timeline.aria": "اختر التسلسل الزمني",
|
||||
"events": {
|
||||
"label": "اﻷحداث",
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"search": "بحث",
|
||||
"noExports": "لا يوجد تصديرات",
|
||||
"documentTitle": "التصدير - فرايجيت",
|
||||
"deleteExport": "حذف التصدير",
|
||||
"deleteExport.desc": "هل أنت متأكد من رغبتك في حذف{{exportName}}؟",
|
||||
"editExport": {
|
||||
"title": "إعادة تسمية التصدير",
|
||||
|
||||
@@ -5,13 +5,9 @@
|
||||
"placeholder": "أدخل أسم لهذه المجموعة"
|
||||
},
|
||||
"details": {
|
||||
"person": "شخص",
|
||||
"subLabelScore": "نتيجة العلامة الفرعية",
|
||||
"timestamp": "الطابع الزمني",
|
||||
"unknown": "غير معروف",
|
||||
"scoreInfo": "النتيجة الفرعية هي النتيجة المرجحة لجميع درجات الثقة المعترف بها للوجه، لذلك قد تختلف عن النتيجة الموضحة في اللقطة.",
|
||||
"face": "تفاصيل الوجه",
|
||||
"faceDesc": "تفاصيل الكائن المتتبع الذي أنشأ هذا الوجه"
|
||||
"scoreInfo": "النتيجة الفرعية هي النتيجة المرجحة لجميع درجات الثقة المعترف بها للوجه، لذلك قد تختلف عن النتيجة الموضحة في اللقطة."
|
||||
},
|
||||
"documentTitle": "مكتبة الوجوه - Frigate",
|
||||
"uploadFaceImage": {
|
||||
@@ -20,8 +16,6 @@
|
||||
},
|
||||
"collections": "المجموعات",
|
||||
"createFaceLibrary": {
|
||||
"title": "إنشاء المجاميع",
|
||||
"desc": "إنشاء مجموعة جديدة",
|
||||
"new": "إضافة وجه جديد",
|
||||
"nextSteps": "لبناء أساس قوي:<li>استخدم علامة التبويب \"التعرّفات الأخيرة\" لاختيار الصور والتدريب عليها لكل شخص تم اكتشافه.</li> <li>ركّز على الصور الأمامية المباشرة للحصول على أفضل النتائج؛ وتجنّب صور التدريب التي تُظهر الوجوه بزاوية.</li>"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"documentTitle": "بث حي - فرايجيت",
|
||||
"documentTitle.withCamera": "{{camera}} - بث حي - فرايجيت",
|
||||
"lowBandwidthMode": "وضع موفر للبيانات",
|
||||
"twoWayTalk": {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"documentTitle": {
|
||||
"camera": "إعدادات الكاميرا - فرايجيت",
|
||||
"default": "الإعدادات - فرايجيت",
|
||||
"authentication": "إعدادات المصادقة - فرايجيت",
|
||||
"enrichments": "إحصاء الاعدادات",
|
||||
|
||||
@@ -86,11 +86,7 @@
|
||||
"gpuTemperature": "درجة حرارة الـ GPU",
|
||||
"npuUsage": "معلومات وحدة معالجة الشبكة",
|
||||
"npuMemory": "استخدام وحدة المعالجة العصبية",
|
||||
"npuTemperature": "درجة حرارة الـ NPU",
|
||||
"intelGpuWarning": {
|
||||
"title": "تحذير إحصائيات معالج Intel الرسومي",
|
||||
"description": "هذا خطأ برمي معروف في أدوات تقارير إحصائيات معالجات Intel الرسومية (intel_gpu_top)، حيث تتوقف الأداة عن العمل وتُظهر استهلاك المعالج الرسومي (GPU) بنسبة 0% بشكل متكرر، حتى في الحالات التي يعمل فيها تسريع العتاد وكشف الكائنات بشكل صحيح على المعالج الرسومي المدمج (iGPU). هذا ليس خطأً في برنامج فرايجيت (Frigate). يمكنك إعادة تشغيل الجهاز المضيف لحل المشكلة مؤقتاً والتأكد من أن المعالج الرسومي يعمل بشكل صحيح. علماً بأن هذا الخلل لا يؤثر على الأداء."
|
||||
}
|
||||
"npuTemperature": "درجة حرارة الـ NPU"
|
||||
},
|
||||
"title": "لمحة عامة",
|
||||
"detector": {
|
||||
|
||||
@@ -144,10 +144,6 @@
|
||||
"label": "Уключыць Birdseye",
|
||||
"description": "Уключыць або адключыць функцыю выгляду Birdseye."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Рэжым адсочвання",
|
||||
"description": "Рэжым уключэння камер у Birdseye: «objects», «motion» або «continuous»."
|
||||
},
|
||||
"order": {
|
||||
"label": "Пазіцыя",
|
||||
"description": "Лічбавае становішча, якое вызначае парадак камеры ў раскладцы Birdseye."
|
||||
|
||||
@@ -66,10 +66,6 @@
|
||||
"label": "Уключыць Birdseye",
|
||||
"description": "Уключыць або адключыць функцыю выгляду Birdseye."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Рэжым адсочвання",
|
||||
"description": "Рэжым уключэння камер у Birdseye: «objects», «motion» або «continuous»."
|
||||
},
|
||||
"order": {
|
||||
"label": "Пазіцыя",
|
||||
"description": "Лічбавае становішча, якое вызначае парадак камеры ў раскладцы Birdseye."
|
||||
@@ -1240,213 +1236,6 @@
|
||||
"description": "Сістэма адзінак для адлюстравання (metric або imperial) у інтэрфейсе і MQTT."
|
||||
}
|
||||
},
|
||||
"detectors": {
|
||||
"label": "Абсталяванне дэтэктара",
|
||||
"description": "Канфігурацыя дэтэктараў аб'ектаў (CPU, GPU, бэкенды ONNX) і любых налад мадэлі, характэрных для дэтэктара.",
|
||||
"type": {
|
||||
"label": "Тып"
|
||||
},
|
||||
"model": {
|
||||
"label": "Канфігурацыя мадэлі для дэтэктара",
|
||||
"description": "Параметры канфігурацыі мадэлі, характэрныя для дэтэктара (шлях, памер уваходу і г. д.).",
|
||||
"path": {
|
||||
"label": "Шлях да ўласнай мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Шлях да файла ўласнай мадэлі дэтэктавання (або plus://<model_id> для мадэляў Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Карта метак для ўласнага дэтэктара аб'ектаў",
|
||||
"description": "Шлях да файла labelmap, які супастаўляе лічбавыя класы з радковымі меткамі для дэтэктара."
|
||||
},
|
||||
"width": {
|
||||
"label": "Шырыня ўваходу мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Шырыня ўваходнага тэнзара мадэлі ў пікселях."
|
||||
},
|
||||
"height": {
|
||||
"label": "Вышыня ўваходу мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Вышыня ўваходнага тэнзара мадэлі ў пікселях."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Наладка labelmap",
|
||||
"description": "Перавызначэнні або запісы перасупастаўлення, якія аб'ядноўваюцца са стандартным labelmap."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Карта метак аб'ектаў да іх метак атрыбутаў",
|
||||
"description": "Супастаўленне метак аб'ектаў з меткамі атрыбутаў для далучэння метаданых (напрыклад «car» -> [«license_plate»])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Форма ўваходнага тэнзара мадэлі",
|
||||
"description": "Фармат тэнзара, які чакае мадэль: «nhwc» або «nchw»."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Фармат колеру пікселяў на ўваходзе мадэлі",
|
||||
"description": "Колеравая прастора, якую чакае мадэль: «rgb», «bgr» або «yuv»."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Тып даных уваходу мадэлі",
|
||||
"description": "Тып даных уваходнага тэнзара мадэлі (напрыклад «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Тып мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Тып архітэктуры мадэлі дэтэктара (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine), які некаторыя дэтэктары выкарыстоўваюць для аптымізацыі."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Шлях да мадэлі для дэтэктара",
|
||||
"description": "Шлях да файла мадэлі дэтэктара, калі гэта патрабуе выбраны дэтэктар."
|
||||
},
|
||||
"axengine": {
|
||||
"label": "NPU AXEngine",
|
||||
"description": "Дэтэктар на NPU AXERA AX650N/AX8850N, які запускае скампіляваныя файлы .axmodel праз асяроддзе AXEngine."
|
||||
},
|
||||
"cpu": {
|
||||
"label": "Цэнтральны працэсар",
|
||||
"description": "Дэтэктар CPU TFLite, які запускае мадэлі TensorFlow Lite на CPU без апаратнага паскарэння. Не рэкамендуецца.",
|
||||
"num_threads": {
|
||||
"label": "Колькасць патокаў дэтэктавання",
|
||||
"description": "Колькасць патокаў для вывядзення на CPU."
|
||||
}
|
||||
},
|
||||
"deepstack": {
|
||||
"label": "DeepStack",
|
||||
"description": "Дэтэктар DeepStack/CodeProject.AI, які адпраўляе відарысы на аддалены HTTP API DeepStack. Не рэкамендуецца.",
|
||||
"api_url": {
|
||||
"label": "URL API DeepStack",
|
||||
"description": "URL API DeepStack."
|
||||
},
|
||||
"api_timeout": {
|
||||
"label": "Тайм-аўт API DeepStack (у секундах)",
|
||||
"description": "Максімальны час, дазволены на запыт да API DeepStack."
|
||||
},
|
||||
"api_key": {
|
||||
"label": "Ключ API DeepStack (калі патрэбны)",
|
||||
"description": "Неабавязковы ключ API для сэрвісаў DeepStack з праверкай сапраўднасці."
|
||||
}
|
||||
},
|
||||
"edgetpu": {
|
||||
"label": "EdgeTPU",
|
||||
"description": "Дэтэктар EdgeTPU, які запускае мадэлі TensorFlow Lite, скампіляваныя пад Coral EdgeTPU, праз дэлегат EdgeTPU.",
|
||||
"device": {
|
||||
"label": "Тып прылады",
|
||||
"description": "Прылада для вывядзення на EdgeTPU (напрыклад «usb», «pci»)."
|
||||
}
|
||||
},
|
||||
"hailo8l": {
|
||||
"label": "Hailo-8/Hailo-8L",
|
||||
"description": "Дэтэктар Hailo-8/Hailo-8L, які выкарыстоўвае мадэлі HEF і SDK HailoRT для вывядзення на абсталяванні Hailo.",
|
||||
"device": {
|
||||
"label": "Тып прылады",
|
||||
"description": "Прылада для вывядзення на Hailo (напрыклад «PCIe», «M.2»)."
|
||||
}
|
||||
},
|
||||
"memryx": {
|
||||
"label": "MemryX",
|
||||
"description": "Дэтэктар MemryX MX3, які запускае скампіляваныя мадэлі DFP на паскаральніках MemryX.",
|
||||
"device": {
|
||||
"label": "Шлях да прылады",
|
||||
"description": "Прылада для вывядзення на MemryX (напрыклад «PCIe»)."
|
||||
}
|
||||
},
|
||||
"onnx": {
|
||||
"label": "ONNX",
|
||||
"description": "Дэтэктар ONNX для запуску мадэляў ONNX. Пры магчымасці выкарыстоўвае даступныя бэкенды паскарэння (CUDA/ROCm/OpenVINO).",
|
||||
"device": {
|
||||
"label": "Тып прылады",
|
||||
"description": "Прылада для вывядзення на ONNX (напрыклад «AUTO», «CPU», «GPU»)."
|
||||
}
|
||||
},
|
||||
"openvino": {
|
||||
"label": "OpenVINO",
|
||||
"description": "Дэтэктар OpenVINO для CPU AMD і Intel, GPU Intel і абсталявання Intel VPU.",
|
||||
"device": {
|
||||
"label": "Тып прылады",
|
||||
"description": "Прылада для вывядзення на OpenVINO (напрыклад «CPU», «GPU», «NPU»)."
|
||||
}
|
||||
},
|
||||
"rknn": {
|
||||
"label": "RKNN",
|
||||
"description": "Дэтэктар RKNN для NPU Rockchip. Запускае скампіляваныя мадэлі RKNN на абсталяванні Rockchip.",
|
||||
"num_cores": {
|
||||
"label": "Колькасць ядраў NPU для выкарыстання.",
|
||||
"description": "Колькасць ядраў NPU (0 - аўтаматычна)."
|
||||
}
|
||||
},
|
||||
"synaptics": {
|
||||
"label": "Synaptics",
|
||||
"description": "Дэтэктар на NPU Synaptics для мадэляў у фармаце .synap праз Synap SDK на абсталяванні Synaptics."
|
||||
},
|
||||
"teflon_tfl": {
|
||||
"label": "Teflon",
|
||||
"description": "Дэтэктар-дэлегат Teflon для TFLite, які выкарыстоўвае бібліятэку дэлегата Mesa Teflon, каб паскорыць вывядзенне на падтрыманых GPU."
|
||||
},
|
||||
"tensorrt": {
|
||||
"label": "TensorRT",
|
||||
"description": "Дэтэктар TensorRT для прылад Nvidia Jetson, які выкарыстоўвае серыялізаваныя рухавікі TensorRT для паскоранага вывядзення.",
|
||||
"device": {
|
||||
"label": "Індэкс прылады GPU",
|
||||
"description": "Індэкс прылады GPU для выкарыстання."
|
||||
}
|
||||
},
|
||||
"zmq": {
|
||||
"label": "ZMQ IPC",
|
||||
"description": "Дэтэктар ZMQ IPC, які перадае вывядзенне знешняму працэсу праз канчатковы пункт ZeroMQ IPC.",
|
||||
"endpoint": {
|
||||
"label": "Канчатковы пункт ZMQ IPC",
|
||||
"description": "Канчатковы пункт ZMQ для падлучэння."
|
||||
},
|
||||
"request_timeout_ms": {
|
||||
"label": "Тайм-аўт запыту ZMQ у мілісекундах",
|
||||
"description": "Тайм-аўт запытаў ZMQ у мілісекундах."
|
||||
},
|
||||
"linger_ms": {
|
||||
"label": "Затрымка сокета ZMQ у мілісекундах",
|
||||
"description": "Перыяд затрымкі сокета ў мілісекундах."
|
||||
}
|
||||
}
|
||||
},
|
||||
"model": {
|
||||
"label": "Мадэль дэтэктавання",
|
||||
"description": "Налады ўласнай мадэлі дэтэктавання аб'ектаў і формы яе ўваходу.",
|
||||
"path": {
|
||||
"label": "Шлях да ўласнай мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Шлях да файла ўласнай мадэлі дэтэктавання (або plus://<model_id> для мадэляў Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Карта метак для ўласнага дэтэктара аб'ектаў",
|
||||
"description": "Шлях да файла labelmap, які супастаўляе лічбавыя класы з радковымі меткамі для дэтэктара."
|
||||
},
|
||||
"width": {
|
||||
"label": "Шырыня ўваходу мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Шырыня ўваходнага тэнзара мадэлі ў пікселях."
|
||||
},
|
||||
"height": {
|
||||
"label": "Вышыня ўваходу мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Вышыня ўваходнага тэнзара мадэлі ў пікселях."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Наладка labelmap",
|
||||
"description": "Перавызначэнні або запісы перасупастаўлення, якія аб'ядноўваюцца са стандартным labelmap."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Карта метак аб'ектаў да іх метак атрыбутаў",
|
||||
"description": "Супастаўленне метак аб'ектаў з меткамі атрыбутаў для далучэння метаданых (напрыклад «car» -> [«license_plate»])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Форма ўваходнага тэнзара мадэлі",
|
||||
"description": "Фармат тэнзара, які чакае мадэль: «nhwc» або «nchw»."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Фармат колеру пікселяў на ўваходзе мадэлі",
|
||||
"description": "Колеравая прастора, якую чакае мадэль: «rgb», «bgr» або «yuv»."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Тып даных уваходу мадэлі",
|
||||
"description": "Тып даных уваходнага тэнзара мадэлі (напрыклад «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Тып мадэлі дэтэктавання аб'ектаў",
|
||||
"description": "Тып архітэктуры мадэлі дэтэктара (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine), які некаторыя дэтэктары выкарыстоўваюць для аптымізацыі."
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
"label": "Канфігурацыя Generative AI",
|
||||
"description": "Налады інтэграваных правайдараў generative AI, якія ствараюць апісанні аб'ектаў і зводкі разгляду.",
|
||||
|
||||
@@ -1274,31 +1274,6 @@
|
||||
"error": "Не ўдалося захаваць змены канфігурацыі: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"detectorsAndModel": {
|
||||
"title": "Дэтэктары і мадэль",
|
||||
"description": "Наладзьце бэкенд дэтэктара, які запускае дэтэктаванне аб'ектаў, і мадэль, якую ён выкарыстоўвае. Змены захоўваюцца разам, каб дэтэктар і мадэль заставаліся ўзгодненымі.",
|
||||
"cardTitles": {
|
||||
"detector": "Абсталяванне дэтэктара",
|
||||
"model": "Мадэль дэтэктавання"
|
||||
},
|
||||
"tabs": {
|
||||
"plus": "Frigate+",
|
||||
"custom": "Уласная мадэль"
|
||||
},
|
||||
"mismatch": {
|
||||
"warning": "Бягучая мадэль Frigate+ «{{model}}» патрабуе дэтэктар {{required}}. Выберыце сумяшчальную мадэль ніжэй або пераключыцеся на ўласную мадэль перад захаваннем."
|
||||
},
|
||||
"plusModel": {
|
||||
"requiresDetector": "Патрабуе: {{detector}}",
|
||||
"noModelSelected": "Выберыце мадэль Frigate+"
|
||||
},
|
||||
"toast": {
|
||||
"saveSuccess": "Налады дэтэктараў і мадэлі захаваны. Перазапусціце Frigate, каб прымяніць змены.",
|
||||
"saveError": "Не ўдалося захаваць налады дэтэктара і мадэлі"
|
||||
},
|
||||
"unsavedChanges": "Незахаваныя змены дэтэктара і мадэлі",
|
||||
"restartRequired": "Патрабуецца перазапуск (зменены дэтэктар або мадэль)"
|
||||
},
|
||||
"triggers": {
|
||||
"documentTitle": "Трыгеры",
|
||||
"semanticSearch": {
|
||||
@@ -1617,16 +1592,6 @@
|
||||
"detect": {
|
||||
"title": "Налады дэтэктавання"
|
||||
},
|
||||
"detectors": {
|
||||
"title": "Налады дэтэктара",
|
||||
"singleType": "Дазволены толькі адзін дэтэктар тыпу {{type}}.",
|
||||
"keyRequired": "Патрабуецца назва дэтэктара.",
|
||||
"keyDuplicate": "Дэтэктар з такой назвай ужо існуе.",
|
||||
"noSchema": "Схемы дэтэктараў недаступныя.",
|
||||
"none": "Асобнікі дэтэктараў не наладжаны.",
|
||||
"add": "Дадаць дэтэктар",
|
||||
"addCustomKey": "Дадаць уласны ключ"
|
||||
},
|
||||
"record": {
|
||||
"title": "Налады запісу"
|
||||
},
|
||||
@@ -1858,11 +1823,6 @@
|
||||
}
|
||||
},
|
||||
"birdseye": {
|
||||
"trackingMode": {
|
||||
"objects": "Аб'екты",
|
||||
"motion": "Рух",
|
||||
"continuous": "Бесперапынна"
|
||||
},
|
||||
"cameraOrder": {
|
||||
"label": "Парадак камер",
|
||||
"description": "Перацягвайце камеры, каб задаць іх парадак у раскладцы Birdseye.",
|
||||
@@ -1971,16 +1931,9 @@
|
||||
"record": {
|
||||
"noRecordRole": "Ніводнай плыні не прызначана роля «record». Запіс працаваць не будзе."
|
||||
},
|
||||
"birdseye": {
|
||||
"objectsModeDetectDisabled": "Birdseye зададзены ў рэжыме «objects», але дэтэктаванне аб'ектаў для гэтай камеры адключана. Камера не з'явіцца ў Birdseye."
|
||||
},
|
||||
"snapshots": {
|
||||
"detectDisabled": "Дэтэктаванне аб'ектаў адключана. Здымкі ствараюцца з аб'ектаў пад адсочваннем і стварацца не будуць."
|
||||
},
|
||||
"detectors": {
|
||||
"mixedTypes": "Усе дэтэктары мусяць быць аднаго тыпу. Выдаліце наяўныя дэтэктары, каб выкарыстаць іншы тып.",
|
||||
"mixedTypesSuggestion": "Усе дэтэктары мусяць быць аднаго тыпу. Выдаліце наяўныя дэтэктары або выберыце {{type}}."
|
||||
},
|
||||
"semanticSearch": {
|
||||
"jinav2SmallModelSize": "Памер «small» з мадэллю Jina V2 патрабуе шмат RAM і рэсурсаў на вывядзенне. Рэкамендуецца мадэль «large» з асобным GPU."
|
||||
},
|
||||
|
||||
@@ -180,8 +180,6 @@
|
||||
"gap": "Прамежак паміж ключавымі кадрамі (мін. / сяр. / макс.):",
|
||||
"segmentLength": "Даўжыня сегмента запісу:",
|
||||
"ok": "Ключавыя кадры прыблізна кожныя {{seconds}} с, гэта добра для запісу і прайгравання.",
|
||||
"warning": "Рэдкія або нераўнамерныя ключавыя кадры (найбольшы прамежак каля {{seconds}} с), верагодна разумны кодэк (H.264+/H.265+), гэта не рэкамендуецца.",
|
||||
"error": "Прамежак паміж ключавымі кадрамі (каля {{seconds}} с) перавышае даўжыню сегмента запісу ({{segmentTime}} с). Некаторыя сегменты могуць застацца без ключавога кадра, што ламае прайграванне. Адключыце разумны кодэк «+» на камеры або скараціце інтэрвал ключавых кадраў.",
|
||||
"unknown": "Не ўдалося вызначыць інтэрвал ключавых кадраў.",
|
||||
"recordDisabled": "Для гэтай камеры запіс адключаны."
|
||||
}
|
||||
@@ -236,7 +234,6 @@
|
||||
"cameraIsOffline": "{{camera}} па-за сеткай",
|
||||
"detectIsSlow": "{{detect}} працуе павольна ({{speed}} мс)",
|
||||
"detectIsVerySlow": "{{detect}} працуе вельмі павольна ({{speed}} мс)",
|
||||
"shmTooLow": "Выдзеленую памяць /dev/shm ({{total}} МБ) трэба павялічыць прынамсі да {{min}} МБ.",
|
||||
"debugReplayActive": "Сеанс адладачнага паўтору актыўны"
|
||||
},
|
||||
"enrichments": {
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
"noPreviewFound": "Не е намерен предварителен преглед",
|
||||
"noRecordingsFoundForThisTime": "За това време не са намерени записи",
|
||||
"livePlayerRequiredIOSVersion": "За този тип поток на живо се изисква iOS 17.1 или по-нова версия.",
|
||||
"cameraDisabled": "Камерата е изключена",
|
||||
"toast": {
|
||||
"success": {
|
||||
"submittedFrigatePlus": "Успешно изпратен кадър към Frigate+"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"timeline.aria": "Избери хронология",
|
||||
"timeline": "Хронология",
|
||||
"calendarFilter": {
|
||||
"last24Hours": "Последните 24 часа"
|
||||
},
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"documentTitle": "Експорт - Frigate",
|
||||
"search": "Търси",
|
||||
"noExports": "Няма намерени експорти",
|
||||
"deleteExport": "Изтрий експорт",
|
||||
"deleteExport.desc": "Сигурни ли сте, че искате да изтриете {{exportName}}?",
|
||||
"editExport": {
|
||||
"title": "Преименувай експорт",
|
||||
|
||||
@@ -39,8 +39,6 @@
|
||||
"disable": "Изключи аудио разпознаване"
|
||||
},
|
||||
"camera": {
|
||||
"enable": "Включи камера",
|
||||
"disable": "Изключи камера",
|
||||
"turnOn": "Включване на камера",
|
||||
"turnOff": "Изключване на камера"
|
||||
},
|
||||
@@ -65,10 +63,6 @@
|
||||
},
|
||||
"recordDisabledTips": "Тъй като записът е изключен или ограничен в конфигурацията за тази камера, ще бъде запазена само моментна снимка."
|
||||
},
|
||||
"cameraSettings": {
|
||||
"cameraEnabled": "Камерата е включена"
|
||||
},
|
||||
"documentTitle": "Наживо - Frigate",
|
||||
"documentTitle.withCamera": "{{camera}} - На живо - Фригейт",
|
||||
"noCameras": {
|
||||
"default": {
|
||||
|
||||
@@ -426,7 +426,6 @@
|
||||
"radio": "Radio",
|
||||
"field_recording": "Snimka na terenu",
|
||||
"scream": "Vrisak",
|
||||
"sodeling": "Sodeling",
|
||||
"chird": "Chird",
|
||||
"change_ringing": "Promjena zvona",
|
||||
"shofar": "Šofar",
|
||||
|
||||
@@ -98,9 +98,6 @@
|
||||
"started_one": "Pokrenut 1 izvoz. Otvaranje slučaja sada.",
|
||||
"started_few": "Pokrenuta {{count}} izvoza. Otvaranje slučaja sada.",
|
||||
"started_other": "Pokrenuto {{count}} izvoza. Otvaranje slučaja sada.",
|
||||
"startedNoCase_one": "Pokrenut 1 izvoz.",
|
||||
"startedNoCase_few": "Pokrenuta {{count}} izvoza.",
|
||||
"startedNoCase_other": "Pokrenuto {{count}} izvoza.",
|
||||
"partial": "Pokrenuto {{successful}} od {{total}} izvoza. Neuspješno: {{failedItems}}",
|
||||
"failed": "Neuspješno pokretanje {{total}} izvoza. Neuspješno: {{failedItems}}"
|
||||
}
|
||||
@@ -121,8 +118,7 @@
|
||||
"batchQueueFailed": "Neuspješno dodavanje {{total}} izvoza. Neuspješne kamere: {{failedCameras}}",
|
||||
"error": {
|
||||
"failed": "Neuspješno dodavanje izvoza: {{error}}",
|
||||
"endTimeMustAfterStartTime": "Krajnje vrijeme mora biti nakon početnog vremena",
|
||||
"noVaildTimeSelected": "Nije odabran valjan vremenski opseg"
|
||||
"endTimeMustAfterStartTime": "Krajnje vrijeme mora biti nakon početnog vremena"
|
||||
}
|
||||
},
|
||||
"fromTimeline": {
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
"title": "Prijenos je offline",
|
||||
"desc": "Nisu primljeni okviri na {{cameraName}} <code>detect</code> prijenos, provjerite zapise o greškama"
|
||||
},
|
||||
"cameraDisabled": "Kamera je onemogućena",
|
||||
"stats": {
|
||||
"streamType": {
|
||||
"title": "Tip prijenosa:",
|
||||
|
||||
@@ -140,10 +140,6 @@
|
||||
"label": "Omogući Birdseye",
|
||||
"description": "Omogući ili onemogući funkciju prikaza Birdseye."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Način praćenja",
|
||||
"description": "Način uključivanja kamera u Birdseye: 'objekti', 'kretanje' ili 'kontinuirano'."
|
||||
},
|
||||
"order": {
|
||||
"label": "Pozicija",
|
||||
"description": "Numerička pozicija koja kontroliše redoslijed kamera u rasporedu Birdseye."
|
||||
@@ -736,10 +732,6 @@
|
||||
"label": "Zadano zadržavanje",
|
||||
"description": "Zadani broj dana za zadržavanje snimki."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Način zadržavanja",
|
||||
"description": "Način zadržavanja: sve (sačuvati sve segmente), pokret (sačuvati segmente s pokretom), ili aktivni_objekti (sačuvati segmente s aktivnim objektima)."
|
||||
},
|
||||
"objects": {
|
||||
"label": "Zadržavanje objekata",
|
||||
"description": "Prekriženja po objektu za dane zadržavanja snimki."
|
||||
|
||||
@@ -66,10 +66,6 @@
|
||||
"label": "Omogući Birdseye",
|
||||
"description": "Omogući ili onemogući funkciju prikaza Birdseye."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Način praćenja",
|
||||
"description": "Način uključivanja kamera u Birdseye: 'objekti', 'kretanje' ili 'kontinuirano'."
|
||||
},
|
||||
"order": {
|
||||
"label": "Pozicija",
|
||||
"description": "Numerička pozicija koja kontroliše redoslijed kamera u rasporedu Birdseye."
|
||||
@@ -795,10 +791,6 @@
|
||||
"label": "Zadano zadržavanje",
|
||||
"description": "Zadani broj dana za zadržavanje snimki."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Način zadržavanja",
|
||||
"description": "Način zadržavanja: sve (sačuvati sve segmente), pokret (sačuvati segmente s pokretom), ili aktivni_objekti (sačuvati segmente s aktivnim objektima)."
|
||||
},
|
||||
"objects": {
|
||||
"label": "Zadržavanje objekata",
|
||||
"description": "Prekriženja po objektu za dane zadržavanja snimki."
|
||||
@@ -1197,242 +1189,11 @@
|
||||
"label": "Oblik vremena",
|
||||
"description": "Oblik vremena za korištenje u UI (browser, 12hour, ili 24hour)."
|
||||
},
|
||||
"date_style": {
|
||||
"label": "Oblik datuma",
|
||||
"description": "Oblik datuma za korištenje u UI (full, long, medium, short)."
|
||||
},
|
||||
"time_style": {
|
||||
"label": "Oblik vremena",
|
||||
"description": "Oblik vremena za korištenje u UI (full, long, medium, short)."
|
||||
},
|
||||
"unit_system": {
|
||||
"label": "Sustav jedinica",
|
||||
"description": "Sustav jedinica za prikaz (metric ili imperial) korišten u UI i MQTT."
|
||||
}
|
||||
},
|
||||
"detectors": {
|
||||
"label": "Hardver detektora",
|
||||
"description": "Konfiguracija za detektore objekata (CPU, GPU, ONNX backends) i bilo koje postavke modela specifične za detektor.",
|
||||
"type": {
|
||||
"label": "Tip"
|
||||
},
|
||||
"model": {
|
||||
"label": "Konfiguracija modela specifične za detektor",
|
||||
"description": "Opcije konfiguracije modela specifične za detektor (putanja, veličina ulaza, itd.).",
|
||||
"path": {
|
||||
"label": "Putanja za prilagođeni model detektora objekata",
|
||||
"description": "Putanja do datoteke prilagođenog modela detekcije (ili plus://<model_id> za modele Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa oznaka za prilagođeni detektor objekata",
|
||||
"description": "Putanja do datoteke mape oznaka koja mapira numeričke klase na string oznake za detektor."
|
||||
},
|
||||
"width": {
|
||||
"label": "Širina ulaznog tenzora modela detekcije objekata",
|
||||
"description": "Širina ulaznog tenzora modela u pikselima."
|
||||
},
|
||||
"height": {
|
||||
"label": "Visina ulaznog tenzora modela detekcije objekata",
|
||||
"description": "Visina ulaznog tenzora modela u pikselima."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Prilagodba mape oznaka",
|
||||
"description": "Preklop ili preslikavanje unosa za uključivanje u standardnu mapu oznaka."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa oznaka objekata na njihove atribute",
|
||||
"description": "Preslikavanje iz oznaka objekata na atribute oznaka koje se koriste za dodavanje metapodataka (npr. 'car' -> ['license_plate'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Oblik tenzora ulaza modela",
|
||||
"description": "Format tenzora očekivan od strane modela: 'nhwc' ili 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format boje piksela ulaza modela",
|
||||
"description": "Boja piksela očekivana od strane modela: 'rgb', 'bgr' ili 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tip D ulaza modela",
|
||||
"description": "Tip podataka modela ulaznog tenzora (npr. 'float32')."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tip modela detekcije objekata",
|
||||
"description": "Tip arhitekture modela detektora (ssd, yolox, yolonas) korišten od strane nekih detektora za optimizaciju."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Putanja modela specifična za detektor",
|
||||
"description": "Putanja datoteke do binarne datoteke modela detektora ako je potrebna odabranim detektorom."
|
||||
},
|
||||
"axengine": {
|
||||
"label": "AXEngine NPU",
|
||||
"description": "Detektor AXERA AX650N/AX8850N NPU koji pokreće prevedene .axmodel datoteke putem AXEngine runtime-a."
|
||||
},
|
||||
"cpu": {
|
||||
"label": "CPU",
|
||||
"description": "Detektor CPU TFLite koji pokreće modele TensorFlow Lite na domaćem CPU bez hardverske akceleracije. Nije preporučeno.",
|
||||
"num_threads": {
|
||||
"label": "Broj nitova detekcije",
|
||||
"description": "Broj nitova korištenih za inferenciju na CPU."
|
||||
}
|
||||
},
|
||||
"deepstack": {
|
||||
"label": "DeepStack",
|
||||
"description": "Detektor DeepStack/CodeProject.AI koji šalje slike na udaljenu DeepStack HTTP API za inferenciju. Nije preporučeno.",
|
||||
"api_url": {
|
||||
"label": "URL API-ja DeepStack",
|
||||
"description": "URL API-ja DeepStack."
|
||||
},
|
||||
"api_timeout": {
|
||||
"label": "Vrijeme čekanja API-ja DeepStack (u sekundama)",
|
||||
"description": "Maksimalno dozvoljeno vrijeme za zahtjev API-ja DeepStack."
|
||||
},
|
||||
"api_key": {
|
||||
"label": "Ključ API-ja DeepStack (ako je potreban)",
|
||||
"description": "Nepovlađeni ključ API-ja za autentificirane usluge DeepStack."
|
||||
}
|
||||
},
|
||||
"degirum": {
|
||||
"label": "DeGirum",
|
||||
"description": "Detektor DeGirum za pokretanje modela putem DeGirum oblaka ili lokalnih usluga inferencije.",
|
||||
"location": {
|
||||
"label": "Lokacija inferencije",
|
||||
"description": "Lokacija DeGirim inferencije (npr. '@cloud', '127.0.0.1')."
|
||||
},
|
||||
"zoo": {
|
||||
"label": "Model Zoo",
|
||||
"description": "Putanja ili URL do DeGirum model zoo."
|
||||
},
|
||||
"token": {
|
||||
"label": "Token za DeGirum Cloud",
|
||||
"description": "Token za pristup DeGirum Cloud."
|
||||
}
|
||||
},
|
||||
"edgetpu": {
|
||||
"label": "EdgeTPU",
|
||||
"description": "Detektor EdgeTPU koji pokreće modele TensorFlow Lite kompilirane za Coral EdgeTPU pomoću EdgeTPU delegata.",
|
||||
"device": {
|
||||
"label": "Tip uređaja",
|
||||
"description": "Uređaj za korištenje EdgeTPU inferencije (npr. 'usb', 'pci')."
|
||||
}
|
||||
},
|
||||
"hailo8l": {
|
||||
"label": "Hailo-8/Hailo-8L",
|
||||
"description": "Detektor Hailo-8/Hailo-8L koji koristi HEF modele i HailoRT SDK za inferenciju na Hailo uređaju.",
|
||||
"device": {
|
||||
"label": "Tip uređaja",
|
||||
"description": "Uređaj za korištenje Hailo inferencije (npr. 'PCIe', 'M.2')."
|
||||
}
|
||||
},
|
||||
"memryx": {
|
||||
"label": "MemryX",
|
||||
"description": "Detektor MemryX MX3 koji pokreće kompilirane modele DFP na MemryX akceleratorima.",
|
||||
"device": {
|
||||
"label": "Putanja uređaja",
|
||||
"description": "Uređaj za korištenje MemryX inferencije (npr. 'PCIe')."
|
||||
}
|
||||
},
|
||||
"onnx": {
|
||||
"label": "ONNX",
|
||||
"description": "Detektor ONNX za pokretanje ONNX modela; koristi dostupne akceleracijske backendove (CUDA/ROCm/OpenVINO) kada su dostupni.",
|
||||
"device": {
|
||||
"label": "Tip uređaja",
|
||||
"description": "Uređaj za korištenje ONNX inferencije (npr. 'AUTO', 'CPU', 'GPU')."
|
||||
}
|
||||
},
|
||||
"openvino": {
|
||||
"label": "OpenVINO",
|
||||
"description": "Detektor OpenVINO za AMD i Intel CPU-e, Intel GPU-e i Intel VPU uređaje.",
|
||||
"device": {
|
||||
"label": "Tip uređaja",
|
||||
"description": "Uređaj za korištenje za inferenciju OpenVINO (npr. 'CPU', 'GPU', 'NPU')."
|
||||
}
|
||||
},
|
||||
"rknn": {
|
||||
"label": "RKNN",
|
||||
"description": "Detektor RKNN za NPUs Rockchipa; izvršava preveđene modele RKNN na Rockchip uređaju.",
|
||||
"num_cores": {
|
||||
"label": "Broj jezgri NPU koje se koriste.",
|
||||
"description": "Broj jezgri NPU koje se koriste (0 za automatsko)."
|
||||
}
|
||||
},
|
||||
"synaptics": {
|
||||
"label": "Synaptics",
|
||||
"description": "Detektor NPU Synaptics za modele u formatu .synap pomoću SDK-a Synap na uređaju Synaptics."
|
||||
},
|
||||
"teflon_tfl": {
|
||||
"label": "Teflon",
|
||||
"description": "Detektor delegata Teflon za TFLite pomoću biblioteke Mesa Teflon delegata za ubrzanje inferencije na podržanim GPU-ima."
|
||||
},
|
||||
"tensorrt": {
|
||||
"label": "TensorRT",
|
||||
"description": "Detektor TensorRT za uređaje Nvidia Jetson koji koristi serijalizirane TensorRT motore za ubrzanu inferenciju.",
|
||||
"device": {
|
||||
"label": "Indeks GPU uređaja",
|
||||
"description": "Indeks GPU uređaja za korištenje."
|
||||
}
|
||||
},
|
||||
"zmq": {
|
||||
"label": "ZMQ IPC",
|
||||
"description": "Detektor ZMQ IPC koji prenosi inferenciju vanjskom procesu putem ZMQ IPC kraja.",
|
||||
"endpoint": {
|
||||
"label": "ZMQ IPC kraja",
|
||||
"description": "Kraj ZMQ-a na koji se povezati."
|
||||
},
|
||||
"request_timeout_ms": {
|
||||
"label": "ZMQ zahtjev timeout u milisekundama",
|
||||
"description": "Timeout za ZMQ zahtjeve u milisekundama."
|
||||
},
|
||||
"linger_ms": {
|
||||
"label": "ZMQ socket linger u milisekundama",
|
||||
"description": "Period linger socketa u milisekundama."
|
||||
}
|
||||
}
|
||||
},
|
||||
"model": {
|
||||
"label": "Model detekcije",
|
||||
"description": "Postavke za konfiguraciju prilagođenog modela detekcije objekata i njegove ulazne oblike.",
|
||||
"path": {
|
||||
"label": "Put do prilagođenog modela detekcije",
|
||||
"description": "Put do datoteke prilagođenog modela detekcije (ili plus://<model_id> za modele Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa oznaka za prilagođeni detektor objekata",
|
||||
"description": "Putanja do datoteke labelmap koja preslikava numeričke klase u string oznake za detektor."
|
||||
},
|
||||
"width": {
|
||||
"label": "Širina ulaznog tenzora modela detekcije objekata",
|
||||
"description": "Širina ulaznog tenzora modela u pikselima."
|
||||
},
|
||||
"height": {
|
||||
"label": "Visina ulaznog tenzora modela detekcije objekata",
|
||||
"description": "Visina ulaznog tenzora modela u pikselima."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Prilagodba labelmap",
|
||||
"description": "Preklop ili preslikavanje unosa za spajanje u standardnu labelmap."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa oznaka objekata na njihove atribute oznake",
|
||||
"description": "Preslikavanje iz oznaka objekata na atribute oznake koje se koriste za dodavanje metapodataka (npr. 'car' -> ['license_plate'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Oblik ulaznog tenzora modela",
|
||||
"description": "Format tenzora očekivan od strane modela: 'nhwc' ili 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format boje piksela ulaznog modela",
|
||||
"description": "Boja prostor očekivan od strane modela: 'rgb', 'bgr' ili 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "D tip ulaza modela",
|
||||
"description": "Tip podataka ulaznog tenzora modela (npr. 'float32')."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tip modela detekcije objekata",
|
||||
"description": "Tip arhitekture modela detektora (ssd, yolox, yolonas) korišten od strane nekih detektora za optimizaciju."
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
"label": "Konfiguracija generativne AI",
|
||||
"description": "Postavke za integrirane generativne AI provajdere korišteni za generisanje opisa objekata i pregled sažetaka.",
|
||||
|
||||
@@ -56,10 +56,6 @@
|
||||
},
|
||||
"presets": "Preseti PTZ kamere"
|
||||
},
|
||||
"camera": {
|
||||
"enable": "Omogući kameru",
|
||||
"disable": "Onemogući kameru"
|
||||
},
|
||||
"muteCameras": {
|
||||
"enable": "Utišajte sve kamere",
|
||||
"disable": "Ponovo uključite zvuk za sve kamere"
|
||||
@@ -152,7 +148,6 @@
|
||||
},
|
||||
"cameraSettings": {
|
||||
"title": "{{camera}} Postavke",
|
||||
"cameraEnabled": "Kamera omogućena",
|
||||
"objectDetection": "Detekcija objekata",
|
||||
"recording": "Snimanje",
|
||||
"snapshots": "Snimci",
|
||||
|
||||
@@ -47,8 +47,6 @@
|
||||
"thresholdDesc": "Niže vrijednosti detektiraju manje promjene (1-255)",
|
||||
"minArea": "Minimalna površina promjene",
|
||||
"minAreaDesc": "Minimalni postotak područja interesa koji mora promijeniti da bi se smatrao značajnim",
|
||||
"frameSkip": "Preskoči okvir",
|
||||
"frameSkipDesc": "Obrađujte svaki N-ti okvir. Postavite ovo na brzinu okvira vaše kamere da biste obradili jedan okvir po sekundi (npr. 5 za 5 FPS kameru, 30 za 30 FPS kameru). Više vrijednosti će biti brže, ali mogu propustiti kratke događaje pokreta.",
|
||||
"maxResults": "Maksimalni rezultati",
|
||||
"maxResultsDesc": "Zaustavi nakon ovog broja odgovarajućih vremenskih oznaka"
|
||||
},
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
"systemTelemetry": "Telemetrija",
|
||||
"systemBirdseye": "Birdseye",
|
||||
"systemFfmpeg": "FFmpeg",
|
||||
"systemDetectorHardware": "Hardver detektora",
|
||||
"systemDetectionModel": "Model detekcije",
|
||||
"systemMqtt": "MQTT",
|
||||
"systemGo2rtcStreams": "go2rtc streams",
|
||||
"integrationSemanticSearch": "Semantička pretraga",
|
||||
@@ -468,17 +466,7 @@
|
||||
"backToSettings": "Povratak na postavke kamere",
|
||||
"streams": {
|
||||
"title": "Omogući / Onemogući kamere",
|
||||
"enableLabel": "Omogućene kamere",
|
||||
"enableDesc": "Privremeno onemogući omogućenu kameru dok Frigate ne ponovo započne. Onemogućavanje kamere potpuno zaustavlja obradu tokova ove kamere od strane Frigate. Detekcija, snimanje i praćenje nedostat će.<br /> <em>Napomena: Ovo ne onemogućava restreamove go2rtc.</em>",
|
||||
"disableLabel": "Onemogućene kamere",
|
||||
"disableDesc": "Omogući kameru koja trenutno nije vidljiva u UI-ju i onemogućena u konfiguraciji. Potrebno je ponovno pokrenuti Frigate nakon omogućavanja.",
|
||||
"enableSuccess": "Omogućena {{cameraName}} u konfiguraciji. Ponovno pokrenite Frigate da biste primijenili promjene.",
|
||||
"friendlyName": {
|
||||
"edit": "Uredi prikazano ime kamere",
|
||||
"title": "Uredi prikazano ime",
|
||||
"description": "Postavite prijateljsko ime koje će se prikazivati za ovu kameru kroz cijeli Frigate UI. Ostavite prazno da biste koristili ID kamere.",
|
||||
"rename": "Preimenuj"
|
||||
}
|
||||
"enableSuccess": "Omogućena {{cameraName}} u konfiguraciji. Ponovno pokrenite Frigate da biste primijenili promjene."
|
||||
},
|
||||
"cameraConfig": {
|
||||
"add": "Dodaj kameru",
|
||||
@@ -513,9 +501,7 @@
|
||||
"title": "Prekrižavanja kamere profila",
|
||||
"selectLabel": "Odaberi profil",
|
||||
"description": "Konfigurirajte koje kamere su omogućene ili onemogućene kada je profil aktiviran. Kamere postavljene na \"Naslijeđivanje\" očuvaju svoje osnovno stanje omogućeno.",
|
||||
"inherit": "Naslijeđivanje",
|
||||
"enabled": "Omogućeno",
|
||||
"disabled": "Onemogućeno"
|
||||
"inherit": "Naslijeđivanje"
|
||||
},
|
||||
"cameraType": {
|
||||
"title": "Tip kamere",
|
||||
@@ -1146,15 +1132,6 @@
|
||||
"error": "Nije uspješno sačuvana promjena konfiguracije: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"detectionModel": {
|
||||
"plusActive": {
|
||||
"title": "Upravljanje modelima Frigate+",
|
||||
"label": "Trenutni izvor modela",
|
||||
"description": "Ova instanca pokreće model Frigate+. Odaberite ili promijenite svoj model u postavkama Frigate+.",
|
||||
"goToFrigatePlus": "Idi na postavke Frigate+",
|
||||
"showModelForm": "Ručno konfigurirajte model"
|
||||
}
|
||||
},
|
||||
"triggers": {
|
||||
"documentTitle": "Pokretači",
|
||||
"semanticSearch": {
|
||||
@@ -1445,16 +1422,6 @@
|
||||
"detect": {
|
||||
"title": "Postavke detekcije"
|
||||
},
|
||||
"detectors": {
|
||||
"title": "Postavke detektora",
|
||||
"singleType": "Dozvoljen je samo jedan {{type}} detektor.",
|
||||
"keyRequired": "Ime detektora je obavezno.",
|
||||
"keyDuplicate": "Ime detektora već postoji.",
|
||||
"noSchema": "Nema dostupnih šema detektora.",
|
||||
"none": "Nema konfiguriranih instanci detektora.",
|
||||
"add": "Dodaj detektor",
|
||||
"addCustomKey": "Dodaj prilagođeni ključ"
|
||||
},
|
||||
"record": {
|
||||
"title": "Postavke snimanja"
|
||||
},
|
||||
@@ -1497,9 +1464,7 @@
|
||||
},
|
||||
"genaiRoles": {
|
||||
"options": {
|
||||
"embeddings": "Ugrađivanje",
|
||||
"vision": "Vizija",
|
||||
"tools": "Alati"
|
||||
"embeddings": "Ugrađivanje"
|
||||
}
|
||||
},
|
||||
"semanticSearchModel": {
|
||||
@@ -1684,15 +1649,8 @@
|
||||
"record": {
|
||||
"noRecordRole": "Nema streamova koji imaju definisanu ulogu snimanja. Snimanje neće funkcionišati."
|
||||
},
|
||||
"birdseye": {
|
||||
"objectsModeDetectDisabled": "Birdseye je postavljen na režim 'objekti', ali je detekcija objekata onemogućena za ovu kameru. Kamera neće biti prikazana u Birdseye."
|
||||
},
|
||||
"snapshots": {
|
||||
"detectDisabled": "Detekcija objekata je onemogućena. Snimci se generišu iz praćenih objekata i neće biti kreirani."
|
||||
},
|
||||
"detectors": {
|
||||
"mixedTypes": "Svi detektori moraju koristiti isti tip. Uklonite postojet će detektore da biste koristili drugi tip.",
|
||||
"mixedTypesSuggestion": "Svi detektori moraju koristiti isti tip. Uklonite postojet će detektore ili izaberite {{type}}."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,12 +107,7 @@
|
||||
},
|
||||
"npuUsage": "Korišćenje NPU",
|
||||
"npuMemory": "Memorija NPU",
|
||||
"npuTemperature": "Temperatura NPU",
|
||||
"intelGpuWarning": {
|
||||
"title": "Upozorenje o statistikama Intel GPU",
|
||||
"message": "Statistike GPU nedostupne",
|
||||
"description": "Ovo je poznati bug u alatima za prikaz statistika Intel GPU (intel_gpu_top) gdje će se prekiniti i ponovo vratiti GPU korišćenje od 0% čak i u slučajevima kada se hardverska akceleracija i detekcija objekata ispravno izvršavaju na (i)GPU. Ovo nije bug Frigate. Možete ponovo pokrenuti host kako biste privremeno popravili problem i potvrdili da GPU radi ispravno. Ovo ne utiče na performanse."
|
||||
}
|
||||
"npuTemperature": "Temperatura NPU"
|
||||
},
|
||||
"otherProcesses": {
|
||||
"title": "Drugi procesi",
|
||||
@@ -223,7 +218,6 @@
|
||||
"cameraIsOffline": "{{camera}} je offline",
|
||||
"detectIsSlow": "{{detect}} je spor ({{speed}} ms)",
|
||||
"detectIsVerySlow": "{{detect}} je vrlo spor ({{speed}} ms)",
|
||||
"shmTooLow": "/dev/shm alokacija ({{total}} MB) treba povećati na najmanje {{min}} MB.",
|
||||
"debugReplayActive": "Debug ponavljanje sesije je aktivno"
|
||||
},
|
||||
"enrichments": {
|
||||
|
||||
@@ -426,7 +426,6 @@
|
||||
"pink_noise": "Soroll rosa",
|
||||
"power_windows": "Finestres elèctriques",
|
||||
"artillery_fire": "Foc d'artilleria",
|
||||
"sodeling": "Cant a la tirolesa",
|
||||
"vibration": "Vibració",
|
||||
"throbbing": "Palpitant",
|
||||
"cacophony": "Cacofonia",
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
"audioIsUnavailable": "L'audio no està disponible per a aquesta transmissió",
|
||||
"audio": {
|
||||
"tips": {
|
||||
"document": "Llegir la documentació · ",
|
||||
"title": "L'audio ha de venir de la càmera i estar configurat a go2rtc per a aquesta transmissió."
|
||||
}
|
||||
},
|
||||
|
||||
@@ -60,7 +60,6 @@
|
||||
"success": "Exportació inciada amb èxit. Pots veure l'arxiu a la pàgina d'exportacions.",
|
||||
"error": {
|
||||
"endTimeMustAfterStartTime": "L'hora de finalització ha de ser posterior a l'hora d'inici",
|
||||
"noVaildTimeSelected": "No s'ha seleccionat un rang de temps vàlid",
|
||||
"failed": "No s'ha pogut inciar l'exportació: {{error}}",
|
||||
"noValidTimeSelected": "No s'ha seleccionat cap interval de temps vàlid"
|
||||
},
|
||||
@@ -135,9 +134,6 @@
|
||||
"started_one": "S'ha iniciat l'exportació 1.",
|
||||
"started_many": "S'han iniciat {{count}} exportacions.",
|
||||
"started_other": "S'han iniciat {{count}} exportacions.",
|
||||
"startedNoCase_one": "S'ha iniciat l'exportació 1.",
|
||||
"startedNoCase_many": "S'han iniciat {{count}} exportacions.",
|
||||
"startedNoCase_other": "S'han iniciat {{count}} exportacions.",
|
||||
"partial": "S'han iniciat {{successful}} de {{total}} exportacions. Ha fallat: {{failedItems}}",
|
||||
"failed": "No s'han pogut iniciar {{total}} exportacions. Ha fallat: {{failedItems}}"
|
||||
}
|
||||
@@ -148,8 +144,7 @@
|
||||
"restreaming": {
|
||||
"disabled": "La retransmissió no està habilitada per a aquesta càmera.",
|
||||
"desc": {
|
||||
"title": "Configurar go2rtc per a àudio i opcions addicionals de visualització en directe per a aquesta càmera.",
|
||||
"readTheDocumentation": "Llegir la documentació"
|
||||
"title": "Configurar go2rtc per a àudio i opcions addicionals de visualització en directe per a aquesta càmera."
|
||||
}
|
||||
},
|
||||
"showStats": {
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
"title": "Transmissió desconnectada",
|
||||
"desc": "No s’han rebut imatges a la transmissió <code>detect</code> de la càmera {{cameraName}}. Comprova els registres d’errors"
|
||||
},
|
||||
"cameraDisabled": "La càmera està desactivada",
|
||||
"toast": {
|
||||
"success": {
|
||||
"submittedFrigatePlus": "Fotograma enviat correctament a Frigate+"
|
||||
|
||||
@@ -70,10 +70,6 @@
|
||||
"label": "Habilita Birdseye",
|
||||
"description": "Activa o desactiva la funció de vista Birdseye."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Mode de seguiment",
|
||||
"description": "Mode per a incloure càmeres en Birdseye: 'objectes', 'motion' o 'continuous'."
|
||||
},
|
||||
"order": {
|
||||
"label": "Posició",
|
||||
"description": "Posició numèrica que controla l'ordenació de la càmera en la disposició Birdseye."
|
||||
@@ -642,10 +638,6 @@
|
||||
"label": "Habilita les instantànies",
|
||||
"description": "Activa o desactiva el desament de les instantànies d'aquesta càmera."
|
||||
},
|
||||
"clean_copy": {
|
||||
"label": "Desa la còpia neta",
|
||||
"description": "Desa una còpia neta no anotada de les instantànies a més de les anotades."
|
||||
},
|
||||
"timestamp": {
|
||||
"label": "Superposició de marca horària",
|
||||
"description": "Superposa una marca horària a les instantànies de l'API."
|
||||
@@ -673,10 +665,6 @@
|
||||
"label": "Retenció predeterminada",
|
||||
"description": "Nombre predeterminat de dies per a retenir les instantànies."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Mode de retenció",
|
||||
"description": "Mode de retenció: tot (desa tots els segments), moviment (desa els segments amb moviment), o actiuobobjectes (desa els segments amb objectes actius)."
|
||||
},
|
||||
"objects": {
|
||||
"label": "Retenció d'objectes",
|
||||
"description": "Anul·lació per objecte per dies de retenció d'instantànies."
|
||||
|
||||
@@ -94,14 +94,6 @@
|
||||
"label": "Format de l'hora",
|
||||
"description": "Format d'hora a utilitzar a la interfície d'usuari (navegador, 12 hores o 24 hores)."
|
||||
},
|
||||
"date_style": {
|
||||
"label": "Estil de data",
|
||||
"description": "Estil de data a utilitzar a la interfície d'usuari (complet, llarg, mitjà, curt)."
|
||||
},
|
||||
"time_style": {
|
||||
"label": "Estil de temps",
|
||||
"description": "Estil de temps a utilitzar a la interfície d'usuari (complet, llarg, mitjà, curt)."
|
||||
},
|
||||
"unit_system": {
|
||||
"label": "Sistema d'unitat",
|
||||
"description": "Sistema d'unitats per a la visualització (mètrica o imperial) utilitzat en la IU i MQTT."
|
||||
@@ -549,10 +541,6 @@
|
||||
"label": "Habilita les instantànies",
|
||||
"description": "Habilita o inhabilita les instantànies de desament per a totes les càmeres; es pot sobreescriure per càmera."
|
||||
},
|
||||
"clean_copy": {
|
||||
"label": "Desa la còpia neta",
|
||||
"description": "Desa una còpia neta no anotada de les instantànies a més de les anotades."
|
||||
},
|
||||
"timestamp": {
|
||||
"label": "Superposició de marca horària",
|
||||
"description": "Superposa una marca horària a les instantànies de l'API."
|
||||
@@ -580,10 +568,6 @@
|
||||
"label": "Retenció predeterminada",
|
||||
"description": "Nombre predeterminat de dies per a retenir les instantànies."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Mode de retenció",
|
||||
"description": "Mode de retenció: tot (desa tots els segments), moviment (desa els segments amb moviment), o actiuobobjectes (desa els segments amb objectes actius)."
|
||||
},
|
||||
"objects": {
|
||||
"label": "Retenció d'objectes",
|
||||
"description": "Anul·lació per objecte per dies de retenció d'instantànies."
|
||||
@@ -1034,944 +1018,6 @@
|
||||
"description": "Activa TLS per a la interfície d'usuari web i l'API de Frigate al port TLS configurat."
|
||||
}
|
||||
},
|
||||
"detectors": {
|
||||
"label": "Detector de hardware",
|
||||
"description": "Configuració per a detectors d'objectes (CPU, GPU, dorsals ONNX) i qualsevol configuració de model específica per a detectors.",
|
||||
"type": {
|
||||
"label": "Tipus",
|
||||
"description": "Tipus de detector a utilitzar per a la detecció d'objectes (per exemple 'cpu', 'edgetpu', 'openvino')."
|
||||
},
|
||||
"cpu": {
|
||||
"label": "CPU",
|
||||
"description": "Detector TFLite de CPU que executa els models TensorFlow Lite a la CPU de l'amfitrió sense acceleració de maquinari. No recomanat.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Mapeig d'etiquetes d'objecte a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple, 'cotxe' -> ['matrícula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"num_threads": {
|
||||
"label": "Nombre de fils de detecció",
|
||||
"description": "El nombre de fils utilitzats per a la inferència basada en CPU."
|
||||
}
|
||||
},
|
||||
"deepstack": {
|
||||
"label": "DeepStack",
|
||||
"description": "Detector DeepStack/CodeProject.AI que envia imatges a una API HTTP de DeepStack remota per a la inferència. No recomanat.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Camí personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Camí a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple, 'cotxe' -> ['matrícula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"api_url": {
|
||||
"label": "URL de l'API del DeepStack",
|
||||
"description": "L'URL de l'API de DeepStack."
|
||||
},
|
||||
"api_timeout": {
|
||||
"label": "Temps d'espera de l'API DeepStack (en segons)",
|
||||
"description": "Temps màxim permès per a una sol·licitud de l'API DeepStack."
|
||||
},
|
||||
"api_key": {
|
||||
"label": "Clau API del DeepStack (si es requereix)",
|
||||
"description": "Clau API opcional per als serveis DeepStack autenticats."
|
||||
}
|
||||
},
|
||||
"degirum": {
|
||||
"label": "DeGirum",
|
||||
"description": "Detector DeGirum per a l'execució de models a través del núvol DeGirum o serveis d'inferència locals.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple, 'cotxe' -> ['matrícula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"location": {
|
||||
"label": "Ubicació de la referència",
|
||||
"description": "Ubicació del motor d'inferència DeGirim (p. ex. ',cloud', '127.0.0.1')."
|
||||
},
|
||||
"zoo": {
|
||||
"label": "Model Zoo",
|
||||
"description": "Camí o URL al zoològic del model zoo."
|
||||
},
|
||||
"token": {
|
||||
"label": "Token del cloud de DeGirum",
|
||||
"description": "Token d'accés al cloud de DeGirum."
|
||||
}
|
||||
},
|
||||
"edgetpu": {
|
||||
"label": "EdgeTPU",
|
||||
"description": "Detector EdgeTPU que executa models TensorFlow Lite compilats per a Coral EdgeTPU utilitzant el delegat EdgeTPU.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' -> ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"device": {
|
||||
"label": "Tipus de dispositiu",
|
||||
"description": "El dispositiu a utilitzar per a la inferència EdgeTPU (p. ex. «usb», «pci»)."
|
||||
}
|
||||
},
|
||||
"hailo8l": {
|
||||
"label": "Hailo-8/Hailo-8L",
|
||||
"description": "Detector Hailo-8/Hailo-8L utilitzant models HEF i el HailoRT SDK per inferència en maquinari Hailo.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' -> ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"device": {
|
||||
"label": "Tipus de dispositiu",
|
||||
"description": "El dispositiu a utilitzar per a la inferència Hailo (p. ex. 'PCIe', 'M.2')."
|
||||
}
|
||||
},
|
||||
"memryx": {
|
||||
"label": "MemryX",
|
||||
"description": "Detector MemryX MX3 que executa models DFP compilats en acceleradors MemryX.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' -> ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Camí del model específic del detector",
|
||||
"description": "Camí de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"device": {
|
||||
"label": "Camí del dispositiu",
|
||||
"description": "El dispositiu a utilitzar per a la inferència MemryX (p. ex. «PCIe»)."
|
||||
}
|
||||
},
|
||||
"onnx": {
|
||||
"description": "Detector ONNX per executar models ONNX; utilitzarà els dorsals d'acceleració disponibles (CUDA/ROCm/OpenVINO) quan estigui disponible.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' -> ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple 'float32')."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"device": {
|
||||
"label": "Tipus de dispositiu",
|
||||
"description": "El dispositiu a utilitzar per a la inferència ONNX (p. ex. «AUTO», «CPU», «GPU»)."
|
||||
},
|
||||
"label": "ONNX"
|
||||
},
|
||||
"openvino": {
|
||||
"description": "Detector OpenVINO per a CPU AMD i Intel, GPUs Intel i maquinari Intel VPU.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Rutaa un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"device": {
|
||||
"label": "Tipus de dispositiu",
|
||||
"description": "El dispositiu a utilitzar per a la inferència OpenVINO (p. ex. 'CPU', 'GPU', 'NPU')."
|
||||
},
|
||||
"label": "OpenVINO"
|
||||
},
|
||||
"rknn": {
|
||||
"description": "El detector RKNN per a Rockchip NPUs; executa models RKNN compilats en maquinari Rockchip.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"num_cores": {
|
||||
"label": "Nombre de nuclis NPU a utilitzar.",
|
||||
"description": "El nombre de nuclis NPU a usar (0 per a l'automàtic)."
|
||||
},
|
||||
"label": "RKNN"
|
||||
},
|
||||
"synaptics": {
|
||||
"label": "Sinapsi",
|
||||
"description": "Detector NPU Synaptics per a models en format .synap utilitzant el Synap SDK en maquinari Synaptics.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)"
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
}
|
||||
},
|
||||
"teflon_tfl": {
|
||||
"description": "Detector delegat de Teflon per a TFLite utilitzant la biblioteca delegat de Mesa Teflon per accelerar la inferència en GPU compatibles.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Cami de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"label": "Teflon"
|
||||
},
|
||||
"tensorrt": {
|
||||
"description": "Detector TensorRT per a dispositius Nvidia Jetson utilitzant motors TensorRT serialitzats per a la inferència accelerada.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"device": {
|
||||
"label": "Índex del dispositiu GPU",
|
||||
"description": "L'índex del dispositiu GPU a utilitzar."
|
||||
},
|
||||
"label": "TensorRT"
|
||||
},
|
||||
"zmq": {
|
||||
"description": "Detector ZMQ IPC que descarrega la inferència a un procés extern a través d'un extrem IPC ZeroMQ.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta personalitzat del model de detecció d'objectes",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta del model específic del detector",
|
||||
"description": "Ruta de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
},
|
||||
"endpoint": {
|
||||
"label": "Final ZMQ IPC",
|
||||
"description": "L'extrem ZMQ al qual connectar-se."
|
||||
},
|
||||
"request_timeout_ms": {
|
||||
"label": "Temps d'espera de la sol·licitud ZMQ en mil·lisegons",
|
||||
"description": "Temps d'espera per a les sol·licituds ZMQ en mil·lisegons."
|
||||
},
|
||||
"linger_ms": {
|
||||
"label": "Socket ZMQ roman en mil·lisegons",
|
||||
"description": "Període de permanència del socket en mil·lisegons."
|
||||
},
|
||||
"label": "ZMQ IPC"
|
||||
},
|
||||
"axengine": {
|
||||
"label": "AXEngine NPU",
|
||||
"description": "Detector AXERA AX650N/AX8850N NPU executant fitxers .axmodel compilats a través del temps d'execució d'AXEngine.",
|
||||
"type": {
|
||||
"label": "Tipus"
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració del model específic del detector",
|
||||
"description": "Opcions de configuració del model específic del detector (camí, mida d'entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Camí personalitzat del model de detecció d'objectes",
|
||||
"description": "Camí a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Camí a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'cotxe' -). ['matrícula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple 'float32')."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Camí del model específic del detector",
|
||||
"description": "Camí de fitxer al binari del model de detector si el detector escollit ho requereix."
|
||||
}
|
||||
},
|
||||
"model": {
|
||||
"label": "Configuració de model de detector específic",
|
||||
"description": "Opcions de configuració de model de detector específic (ruta, tamany entrada, etc.).",
|
||||
"path": {
|
||||
"label": "Ruta del model de detector d'objectes personalitzat",
|
||||
"description": "Ruta a l'arxiu del model de detecció personalitzat ( o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Etiqueta per a detector d'objectes personalitzat",
|
||||
"description": "Ruta a l'arxiu d'etiqueta que mapeja les classes numériques a etiquetes per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objecte",
|
||||
"description": "Amplada de l'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Entrada de l'altura del model de detecció d'objecte",
|
||||
"description": "Altura de l'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personlització d'etiquetes",
|
||||
"description": "Sobreescriu o remapeja entrades per fusionar a l'estandar d'etiquetes."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapeja d'etiquetes d'objecte a la seva etiqueta",
|
||||
"description": "Mapeja des de les etiquetes d'objectes als seus atributs usats per anexar metadades (per exemple 'car' -> ['license_plate'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Model d'entrada de forma de tensor",
|
||||
"description": "El format del tensor experat per el model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Entrada del format de píxel del model",
|
||||
"description": "Espai-color del píxel experat per el model: 'rgb', 'bgr', o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D entrada del model",
|
||||
"description": "tipus de dada per al model de tensor (per exemple 'float32')."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de Model de detecció d'objecte",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine) utilitzat per alguns detectors per a l'optimització"
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
"label": "Ruta a model de detector específic",
|
||||
"description": "Ruta a l'arxiu al model binari de detector si es requerit per al detector seleccionat."
|
||||
}
|
||||
},
|
||||
"model": {
|
||||
"label": "Model de detecció",
|
||||
"description": "Configuració per a configurar un model de detecció d'objectes personalitzat i la seva forma d'entrada.",
|
||||
"path": {
|
||||
"label": "Ruta del model de detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de model de detecció personalitzat (o plus://<model_id> per a models Frigate+)."
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "Mapa d'etiquetes per al detector d'objectes personalitzat",
|
||||
"description": "Ruta a un fitxer de mapa d'etiquetes que assigna classes numèriques a etiquetes de cadena per al detector."
|
||||
},
|
||||
"width": {
|
||||
"label": "Amplada d'entrada del model de detecció d'objectes",
|
||||
"description": "Amplada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"height": {
|
||||
"label": "Alçada d'entrada del model de detecció d'objectes",
|
||||
"description": "Alçada del tensor d'entrada del model en píxels."
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Personalització del mapa d'etiquetes",
|
||||
"description": "Sobreescriu o reassigna les entrades per a fusionar-se en el mapa d'etiquetes estàndard."
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "Mapa d'etiquetes d'objectes a les seves etiquetes d'atribut",
|
||||
"description": "Assignació des d'etiquetes d'objectes a etiquetes d'atribut utilitzades per adjuntar metadades (per exemple 'car' ->. ['matricula'])."
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "Forma del sensor d'entrada del model",
|
||||
"description": "Format del sensor esperat pel model: 'nhwc' o 'nchw'."
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "Format de color del píxel d'entrada del model",
|
||||
"description": "Espai de color del píxel esperat pel model: 'rgb', 'bgr' o 'yuv'."
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "Tipus D d'entrada del model",
|
||||
"description": "Tipus de dades del tensor d'entrada del model (per exemple «float32»)."
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Tipus de model de detecció d'objectes",
|
||||
"description": "Tipus d'arquitectura del model de detector (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine) utilitzat per alguns detectors per a l'optimització."
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
"label": "Configuració de la IA generada",
|
||||
"description": "Paràmetres per als proveïdors integrats generatius d'IA utilitzats per generar descripcions d'objectes i resums de revisions.",
|
||||
@@ -2046,10 +1092,6 @@
|
||||
"label": "Habilita Birdseye",
|
||||
"description": "Activa o desactiva la funció de vista Birdseye."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Mode de seguiment",
|
||||
"description": "Mode per a incloure càmeres en Birdseye: 'objectes', 'motion' o 'continuous'."
|
||||
},
|
||||
"restream": {
|
||||
"label": "Restream RTSP",
|
||||
"description": "Torna a transmetre la sortida Birdseye com a font RTSP; habilitant això es mantindrà Birdseye funcionant contínuament."
|
||||
|
||||
@@ -125,7 +125,6 @@
|
||||
"baby": "Nadó",
|
||||
"baby_stroller": "Cotxet",
|
||||
"rickshaw": "Ricksaw",
|
||||
"Rodent": "Rosegador",
|
||||
"rodent": "Rosegador",
|
||||
"possum": "Possum",
|
||||
"garbage_truck": "Camió de brossa"
|
||||
|
||||
@@ -213,7 +213,6 @@
|
||||
"modelNotReady": "El model no está preparat per entrenar",
|
||||
"noChanges": "No hi ha canvis al conjunt de dades des de l'última formació."
|
||||
},
|
||||
"none": "Cap",
|
||||
"reclassifyImageAs": "Reclassifica la imatge com a:",
|
||||
"reclassifyImage": "Reclassifica la imatge",
|
||||
"disabled": "Desactivat"
|
||||
|
||||
@@ -43,8 +43,6 @@
|
||||
"camera": "Càmera",
|
||||
"selected_one": "{{count}} seleccionats",
|
||||
"selected_other": "{{count}} seleccionats",
|
||||
"suspiciousActivity": "Activitat sospitosa",
|
||||
"threateningActivity": "Activitat amenaçadora",
|
||||
"detail": {
|
||||
"noDataFound": "No hi ha dades detallades a revisar",
|
||||
"trackedObject_one": "{{count}} objecte",
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
"exploreIsUnavailable": {
|
||||
"downloadingModels": {
|
||||
"tips": {
|
||||
"context": "Potser voldreu reindexar els vectors dels objectes seguits un cop s'hagin descarregat els models.",
|
||||
"documentation": "Llegir la documentació"
|
||||
"context": "Potser voldreu reindexar els vectors dels objectes seguits un cop s'hagin descarregat els models."
|
||||
},
|
||||
"context": "El Frigate està baixant els models de vectors necessaris per a admetre la funció de Cerca Semàntica. Això pot trigar uns quants minuts depenent de la velocitat de la vostra connexió de xarxa.",
|
||||
"setup": {
|
||||
@@ -30,53 +29,7 @@
|
||||
"documentTitle": "Explora - Frigate",
|
||||
"generativeAI": "IA Generativa",
|
||||
"objectLifecycle": {
|
||||
"createObjectMask": "Crear màscara per a l'objecte",
|
||||
"title": "Cicle de vida de l'objecte",
|
||||
"noImageFound": "No s'ha trobat cap imatge per a aquesta marca temporal.",
|
||||
"adjustAnnotationSettings": "Ajustar els paràmetres de les anotacions",
|
||||
"scrollViewTips": "Desplaça't per veure els moments significatius del cicle de vida d'aquest objecte.",
|
||||
"lifecycleItemDesc": {
|
||||
"entered_zone": "{{label}} ha entrat a {{zones}}",
|
||||
"active": "{{label}} s'ha activat",
|
||||
"stationary": "{{label}} ha esdevingut estacionari",
|
||||
"attribute": {
|
||||
"faceOrLicense_plate": "{{attribute}} detectat per a {{label}}",
|
||||
"other": "{{label}} reconegut com a {{attribute}}"
|
||||
},
|
||||
"header": {
|
||||
"zones": "Zones",
|
||||
"ratio": "Proporció",
|
||||
"area": "Àrea"
|
||||
},
|
||||
"heard": "{{label}} escoltat",
|
||||
"external": "{{label}} detectat",
|
||||
"gone": "{{label}} ha marxat",
|
||||
"visible": "{{label}} detectat"
|
||||
},
|
||||
"annotationSettings": {
|
||||
"offset": {
|
||||
"documentation": "Llegir la documentació ",
|
||||
"label": "Desplaçament de l'anotació",
|
||||
"desc": "Aquestes dades provenen de la detecció d'objectes, però se superposen a les imatges d’enregistrament. És poc probable que les dues transmissions estiguin perfectament sincronitzades. Per aquest motiu, la capsa delimitadora i les imatges poden no coincidir exactament. Tanmateix, es pot utilitzar el camp <code>annotation_offset</code> per ajustar-ho.",
|
||||
"tips": "CONSELL: Imagina que hi ha la captura d'un esdeveniment on una persona camina d'esquerra a dreta. Si la caixa delimitadora de l'objecte està constantment a l'esquerra de la persona, llavors el valor s'hauria de disminuir. Si, per contra, la caixa delimitadora està constantment per davant de la persona (a la seva dreta en aquest exemple), llavors el valor s'hauria d'augmentar.",
|
||||
"toast": {
|
||||
"success": "El desplaçament d'anotació per {{camera}} s'ha guardat al fitxer de configuració. Reinicia Frigate per aplicar els canvis."
|
||||
},
|
||||
"millisecondsToOffset": "Mil·lisegons a desplaçar les anotacions de detecció: <em>Per Defecte: 0</em>"
|
||||
},
|
||||
"title": "Paràmetres de les anotacions",
|
||||
"showAllZones": {
|
||||
"title": "Mostra totes les zones",
|
||||
"desc": "Mostra sempre les zones en fotogrames on hi hagin aparegut objectes."
|
||||
}
|
||||
},
|
||||
"carousel": {
|
||||
"next": "Diapositiva següent",
|
||||
"previous": "Diapositiva anterior"
|
||||
},
|
||||
"autoTrackingTips": "Les posicions dels recuadres delimitadors seràn inexactes per a càmeres amb seguiment automàtic.",
|
||||
"count": "{{first}} de {{second}}",
|
||||
"trackedPoint": "Punt seguit"
|
||||
"noImageFound": "No s'ha trobat cap imatge per a aquesta marca temporal."
|
||||
},
|
||||
"exploreMore": "Explora més {{label}} objectes",
|
||||
"trackedObjectDetails": "Detalls de l'objecte rastrejat",
|
||||
@@ -84,7 +37,6 @@
|
||||
"details": "detalls",
|
||||
"snapshot": "instantània",
|
||||
"video": "vídeo",
|
||||
"object_lifecycle": "cicle de vida de l'objecte",
|
||||
"thumbnail": "miniatura",
|
||||
"tracking_details": "detalls del seguiment"
|
||||
},
|
||||
@@ -203,10 +155,6 @@
|
||||
"label": "Cercar similars",
|
||||
"aria": "Trobar objectes de seguiment similars"
|
||||
},
|
||||
"viewObjectLifecycle": {
|
||||
"label": "Veure el cicle de vida de l'objecte",
|
||||
"aria": "Mostrar el cicle de vida de l'objecte"
|
||||
},
|
||||
"viewInHistory": {
|
||||
"label": "Veure a l'historial",
|
||||
"aria": "Veure a l'historial"
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
{
|
||||
"selectItem": "Selecciona {{item}}",
|
||||
"details": {
|
||||
"subLabelScore": "Puntuació de la subetiqueta",
|
||||
"scoreInfo": "La puntuació de la subetiqueta és la puntuació ponderada de totes la confidència dels rostres reconeguts, de manera que pot ser diferent de la puntuació que es mostra a la instantània.",
|
||||
"unknown": "Desconegut",
|
||||
"person": "Persona",
|
||||
"faceDesc": "Detalls de l'objecte que ha generat aquest rostre",
|
||||
"timestamp": "Marca temporal",
|
||||
"face": "Detalls del rostre"
|
||||
"timestamp": "Marca temporal"
|
||||
},
|
||||
"collections": "Col·leccions",
|
||||
"train": {
|
||||
@@ -32,8 +27,6 @@
|
||||
"desc": "Carregar una imatge per escanejar els rostres i incloure per a {{pageToggle}}"
|
||||
},
|
||||
"createFaceLibrary": {
|
||||
"title": "Crear Col·lecció",
|
||||
"desc": "Crear una nova col·lecció",
|
||||
"new": "Crear un nou rostre",
|
||||
"nextSteps": "Per establir una base sòlida:<li>Utilitza la pestanya Entrenament per seleccionar i entrenar imatges de cada persona detectada.</li><li>Centra’t en imatges frontals per obtenir millors resultats; evita imatges d’entrenament amb rostres en angle.</li></ul>"
|
||||
},
|
||||
@@ -45,7 +38,6 @@
|
||||
"uploadFace": "Pugeu una imatge de {{name}} que mostra la seva cara des d'un angle frontal. La imatge no necessita ser retallada a la seva cara."
|
||||
}
|
||||
},
|
||||
"selectFace": "Seleccionar rostre",
|
||||
"deleteFaceLibrary": {
|
||||
"desc": "Estàs segur que vols eliminar la col·lecció {{name}}? Això eliminarà permanentment tots els rostres associats.",
|
||||
"title": "Suprimir nom"
|
||||
@@ -103,9 +95,7 @@
|
||||
"desc_many": "Estàs segur que vols suprimir {{count}} rostres? Aquesta acció no es pot desfer.",
|
||||
"desc_other": "Estàs segur que vols suprimir {{count}} rostres? Aquesta acció no es pot desfer."
|
||||
},
|
||||
"pixels": "{{area}}px",
|
||||
"trainFace": "Entrenar rostre",
|
||||
"readTheDocs": "Llegir la documentació",
|
||||
"trainFaceAs": "Entrenar rostre com a:",
|
||||
"reclassifyFaceAs": "Reclassifica la cara com a:",
|
||||
"reclassifyFace": "Reclassifica la cara"
|
||||
|
||||
@@ -57,8 +57,6 @@
|
||||
"disable": "Deshabilita l'àudio de la càmera"
|
||||
},
|
||||
"camera": {
|
||||
"enable": "Habilitar la càmera",
|
||||
"disable": "Deshabilita la càmera",
|
||||
"turnOn": "Activa la càmera",
|
||||
"turnOff": "Apaga la càmera"
|
||||
},
|
||||
@@ -117,14 +115,12 @@
|
||||
"title": "Transmissió",
|
||||
"audio": {
|
||||
"tips": {
|
||||
"documentation": "Llegir la documentació ",
|
||||
"title": "L'àudio ha de provenir de la càmera i estar configurat amb go2rtc per a aquesta transmissió."
|
||||
},
|
||||
"available": "L'àudio està disponible per a aquesta transmissió",
|
||||
"unavailable": "L'audio no està disponible per a aquesta transmissió"
|
||||
},
|
||||
"twoWayTalk": {
|
||||
"tips.documentation": "Llegir la documentació ",
|
||||
"tips": "El teu dispositiu ha de suportar la funció i WebRTC ha d'estar configurat per a conversa bidireccional.",
|
||||
"available": "La conversa bidireccional està disponible per a aquesta transmissió",
|
||||
"unavailable": "La conversa bidireccional no està disponible per a aquesta transmissió"
|
||||
@@ -147,7 +143,6 @@
|
||||
},
|
||||
"cameraSettings": {
|
||||
"title": "{{camera}} Paràmetres",
|
||||
"cameraEnabled": "Càmera habilitada",
|
||||
"recording": "Gravació",
|
||||
"snapshots": "Instantànies",
|
||||
"autotracking": "Seguiment automàtic",
|
||||
@@ -164,8 +159,7 @@
|
||||
"all": "Tot",
|
||||
"motion": "Moviment",
|
||||
"active_objects": "Objectes actius"
|
||||
},
|
||||
"notAllTips": "El vostre {{source}} registre de configuració de retenció s'ha posat en el mode <code>: {{effectiveRetainMode}}</code>, així que la gravaciò a demanda només seguirà segments amb {{effectiveRetainModeName}}."
|
||||
}
|
||||
},
|
||||
"editLayout": {
|
||||
"label": "Editar el disseny",
|
||||
|
||||
@@ -49,8 +49,6 @@
|
||||
"thresholdDesc": "Els valors més baixos detecten canvis més petits (1-255)",
|
||||
"minArea": "Àrea de canvi mínim",
|
||||
"minAreaDesc": "Mida mínima d'una sola regió en moviment, com a percentatge de la regió d'interès",
|
||||
"frameSkip": "Omet el fotograma",
|
||||
"frameSkipDesc": "Processa cada N fotograma. Establiu això a la velocitat de fotogrames de la càmera per processar un fotograma per segon (p. ex. 5 per a una càmera de 5 FPS, 30 per a una càmera de 30 FPS). Els valors més alts seran més ràpids, però poden perdre els esdeveniments de curt moviment.",
|
||||
"maxResults": "Resultats màxims",
|
||||
"maxResultsDesc": "Atura després d'aquestes quantes marques horàries coincidents"
|
||||
},
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"object": "Depurar - Frigate",
|
||||
"default": "Paràmetres - Frigate",
|
||||
"authentication": "Configuració d'autenticació - Frigate",
|
||||
"camera": "Paràmetres de càmera - Frigate",
|
||||
"masksAndZones": "Editor de màscares i zones - Frigate",
|
||||
"general": "Configuració del perfil - Frigate",
|
||||
"frigatePlus": "Paràmetres de Frigate+ - Frigate",
|
||||
@@ -36,7 +35,6 @@
|
||||
"globalConfig": "Configuració global",
|
||||
"system": "Sistema",
|
||||
"integrations": "Integracions",
|
||||
"profileSettings": "Configuració del perfil",
|
||||
"globalDetect": "Detecció d'objectes",
|
||||
"globalRecording": "Enregistrament",
|
||||
"globalSnapshots": "Instantànies",
|
||||
@@ -58,8 +56,6 @@
|
||||
"systemTelemetry": "Telemetria",
|
||||
"systemBirdseye": "Birdseye",
|
||||
"systemFfmpeg": "FFmpeg",
|
||||
"systemDetectorHardware": "Hardware del detector",
|
||||
"systemDetectionModel": "Model de detecció",
|
||||
"systemMqtt": "MQTT",
|
||||
"integrationSemanticSearch": "Cerca semàntica",
|
||||
"integrationGenerativeAi": "IA generativa",
|
||||
@@ -242,7 +238,6 @@
|
||||
"speedEstimation": {
|
||||
"lineDDistance": "Distància de la línia D ({{unit}})",
|
||||
"title": "Estimació de velocitat",
|
||||
"docs": "Llegir la documentació",
|
||||
"lineADistance": "Distància de la línia A ({{unit}})",
|
||||
"lineBDistance": "Distància de la línia B ({{unit}})",
|
||||
"lineCDistance": "Distància de la línia C ({{unit}})",
|
||||
@@ -301,11 +296,9 @@
|
||||
"title": "Les màscares de moviment s’utilitzen per evitar que certs tipus de moviment no desitjats activin la detecció. Si s’aplica una màscara excessiva, es dificultarà el seguiment dels objectes."
|
||||
},
|
||||
"context": {
|
||||
"documentation": "Llegir la documentació",
|
||||
"title": "Les màscares de moviment s’utilitzen per evitar que certs tipus de moviment no desitjats activin la detecció (per exemple: branques d’arbres, marques temporals). Les màscares de moviment s’han d’utilitzar <em>amb molta moderació</em>, un excés de màscares dificultarà el seguiment dels objectes."
|
||||
},
|
||||
"polygonAreaTooLarge": {
|
||||
"documentation": "Llegir la documentació",
|
||||
"tips": "Les màscares de moviment no impedeixen la detecció d'objectes. Hauries de fer servir una zona requerida en el seu lloc.",
|
||||
"title": "La màscara de moviment cobreix el {{polygonArea}}% del camp de visió de la càmera. Les màscares de moviment molt grans no son recomanables."
|
||||
},
|
||||
@@ -390,7 +383,6 @@
|
||||
"desc": "Es requereix un correu electrònic vàlid que s’utilitzarà per notificar-te si hi ha algun problema amb el servei de notificacions push."
|
||||
},
|
||||
"notificationSettings": {
|
||||
"documentation": "Llegir la documentació",
|
||||
"title": "Paràmetres de notificació",
|
||||
"desc": "Frigate pot enviar notificacions push directament al teu dispositiu quan s’executa des del navegador o està instal·lat com a PWA (aplicació web progressiva)."
|
||||
},
|
||||
@@ -425,7 +417,6 @@
|
||||
"title": "Notificacions",
|
||||
"notificationUnavailable": {
|
||||
"title": "Notificacions no disponibles",
|
||||
"documentation": "Llegir la documentació",
|
||||
"desc": "Les notificacions push web requereixen un context segur (<code>https://…</code>). Aquesta és una limitació del navegador. Accedeix a Frigate de manera segura per utilitzar les notificacions.",
|
||||
"descPwa": "A iOS, les notificacions push web només estàn disponibles quan Frigate està instalat a la pantalla principal. Obre el menú <strong>Compartir</strong> , selecciona <strong>Afegir a la pantalla</strong>, i obre Frigate des del nou icona per registrar les notificacions en aquest dispositiu."
|
||||
},
|
||||
@@ -439,77 +430,6 @@
|
||||
"unsavedRegistrations": "Registres de notificació no desats",
|
||||
"sendTestNotification": "Enviar una notificació de prova"
|
||||
},
|
||||
"camera": {
|
||||
"streams": {
|
||||
"title": "Transmissions",
|
||||
"desc": "Desactiva temporalment una càmera fins que es reiniciï Frigate. La desactivació d'una càmera atura completament el processament de les transmissions d'aquesta càmera per part de Frigate. La detecció, gravació i depuració no estaran disponibles.<br /><em>Nota: Això no desactiva les retransmissions de go2rtc.</em>"
|
||||
},
|
||||
"title": "Paràmetres de la càmera",
|
||||
"reviewClassification": {
|
||||
"title": "Revisar la classificació",
|
||||
"readTheDocumentation": "Llegir la documentació",
|
||||
"selectAlertsZones": "Seleccionar zones per alertes",
|
||||
"limitDetections": "Limitar deteccions a zones específiques",
|
||||
"selectDetectionsZones": "Seleccionar zones per deteccions",
|
||||
"unsavedChanges": "Paràmetres de la revisió de classificació no guardats per a {{camera}}",
|
||||
"noDefinedZones": "No s'han definit zones per a aquesta càmera.",
|
||||
"objectAlertsTips": "Tots els objectes {{alertsLabels}} a {{cameraName}} es mostraràn com a Alertes.",
|
||||
"zoneObjectAlertsTips": "Tots els objectes {{alertsLabels}} detectats a la {{zone}} de {{cameraName}} es mostraràn com a Alertes.",
|
||||
"toast": {
|
||||
"success": "S'ha desat la configuració de la classificació de revisió. Reinicia Frigate per aplicar els canvis."
|
||||
},
|
||||
"zoneObjectDetectionsTips": {
|
||||
"text": "Tots els objectes {{detectionsLabels}} no classificats a la {{zone}} de {{cameraName}} es mostraràn com a Deteccions.",
|
||||
"notSelectDetections": "Tots els objectes {{detectionsLabels}} detectats a {{zone}} de la càmera {{cameraName}} que no estiguin categoritzats com a Alertes es mostraran com a Deteccions, independentment de la zona en què es trobin.",
|
||||
"regardlessOfZoneObjectDetectionsTips": "Tots els objectes {{detectionsLabels}} no categoritzats a {{cameraName}} es mostraran com a Deteccions independentment de la zona en què es trobin."
|
||||
},
|
||||
"objectDetectionsTips": "Tots els objectes {{detectionsLabels}} no categoritzats a {{cameraName}} es mostraran com a Deteccions independentment de la zona en què es trobin.",
|
||||
"desc": "Frigate categoritza els elements de revisió com a Alertes i Deteccions. Per defecte, tots els objectes de tipus <em>persona</em> i <em>cotxe</em> es consideren Alertes. Pots afinar la categorització dels teus elements de revisió configurant zones requerides per a aquests."
|
||||
},
|
||||
"review": {
|
||||
"alerts": "Alertes ",
|
||||
"detections": "Deteccions ",
|
||||
"title": "Revisar",
|
||||
"desc": "Habilita o deshabilita temporalment les alertes i deteccions per a aquesta càmera fins que es reiniciï Frigate. Quan estigui desactivat, no es generaran nous elements de revisió. "
|
||||
},
|
||||
"object_descriptions": {
|
||||
"title": "Descripció d'objectes per IA generativa",
|
||||
"desc": "Activar/desactivar temporalment la IA generativa de descripcions per aquesta càmera. Quan està desactivat, les descripcions d'IA generativa no seran requerides per als objectes seguits per aquesta càmera."
|
||||
},
|
||||
"review_descriptions": {
|
||||
"title": "Revisar las descripcions d'IA generativa",
|
||||
"desc": "Activar/desactivals temporalment les descripcions d'IA generativa per aquesta càmera. Quan estan desactivades, les descripcions d'IA generativa no serán requerides per revisar els items en aquesta càmera."
|
||||
},
|
||||
"addCamera": "Afegir Nova Càmera",
|
||||
"editCamera": "Editar Càmera:",
|
||||
"selectCamera": "Seleccionar Càmera",
|
||||
"backToSettings": "Tornar a la Configuració de Càmera",
|
||||
"cameraConfig": {
|
||||
"add": "Afegir Càmera",
|
||||
"edit": "Editar Càmera",
|
||||
"description": "Configurar la càmera incloent les entrades y rols.",
|
||||
"name": "Nom de Càmera",
|
||||
"nameRequired": "El nom de càmera es necesari",
|
||||
"nameLength": "El nom de la càmera ha de ser com a mínim de 24 caràcters.",
|
||||
"namePlaceholder": "e.x., porta_entrada",
|
||||
"enabled": "Activat",
|
||||
"ffmpeg": {
|
||||
"inputs": "Entrades",
|
||||
"path": "Direcció d'entrada",
|
||||
"pathRequired": "Direcció d'entrada necesaria",
|
||||
"pathPlaceholder": "rtsp://...",
|
||||
"roles": "Rols",
|
||||
"rolesRequired": "Com a mínin un rol es necesari",
|
||||
"rolesUnique": "Cada rol (audio, detecció, gravació) pot ser assiganda a una entrada",
|
||||
"addInput": "Afegir una entrada",
|
||||
"removeInput": "Esborrar una entrada",
|
||||
"inputsRequired": "Com a mínim una entrada es necesaria"
|
||||
},
|
||||
"toast": {
|
||||
"success": "La càmera {{cameraName}} s'ha guardat correctament"
|
||||
}
|
||||
}
|
||||
},
|
||||
"motionDetectionTuner": {
|
||||
"Threshold": {
|
||||
"title": "Llindar",
|
||||
@@ -549,7 +469,6 @@
|
||||
},
|
||||
"objectShapeFilterDrawing": {
|
||||
"score": "Puntuació",
|
||||
"document": "Llegir la documentació ",
|
||||
"ratio": "Proporció",
|
||||
"area": "Àrea",
|
||||
"title": "Dibuix del filtre de forma de l'objecte",
|
||||
@@ -644,10 +563,7 @@
|
||||
"hide": "Amaga contrasenya",
|
||||
"requirements": {
|
||||
"title": "Requisits contrasenya:",
|
||||
"length": "Com a mínim 12 carácters",
|
||||
"uppercase": "Com a mínim una majúscula",
|
||||
"digit": "Com a mínim un digit",
|
||||
"special": "Com a mínim un carácter especial (!@#$%^&*(),.?\":{}|<>)"
|
||||
"length": "Com a mínim 12 carácters"
|
||||
}
|
||||
},
|
||||
"newPassword": {
|
||||
@@ -713,11 +629,9 @@
|
||||
"snapshotConfig": {
|
||||
"table": {
|
||||
"camera": "Càmera",
|
||||
"snapshots": "Instantànies",
|
||||
"cleanCopySnapshots": "<code>clean_copy</code> Instantànies"
|
||||
"snapshots": "Instantànies"
|
||||
},
|
||||
"title": "Configuració d'instantànies",
|
||||
"documentation": "Llegir la documentació",
|
||||
"desc": "Per a enviar a Frigate+ fa falta que la instantània estigui habilitada a la configuració.",
|
||||
"cleanCopyWarning": "Algunes càmeres tenen la captura desactivada"
|
||||
},
|
||||
@@ -793,7 +707,6 @@
|
||||
"alreadyInProgress": "La reindexació ja està en curs.",
|
||||
"error": "Error en iniciar la reindexació: {{errorMessage}}"
|
||||
},
|
||||
"readTheDocumentation": "Llegir la documentació",
|
||||
"title": "Cerca semàntica",
|
||||
"desc": "La cerca semàntica a Frigate permet trobar objectes rastrejats dins dels elements de revisió utilitzant la pròpia imatge, una descripció de text definida per l'usuari o una de generada automàticament."
|
||||
},
|
||||
@@ -810,13 +723,11 @@
|
||||
"label": "Mida del model",
|
||||
"desc": "La mida del model utilitzat per al reconeixement facial."
|
||||
},
|
||||
"readTheDocumentation": "Llegir la documentació",
|
||||
"title": "Reconeixement de rostres",
|
||||
"desc": "El reconeixement facial permet a les persones assignar noms i quan es reconeix la seva cara Frigate assignarà el nom de la persona com a subetiqueta. Aquesta informació s'inclou en la interfície d'usuari, filtres, així com en les notificacions."
|
||||
},
|
||||
"unsavedChanges": "Canvis dels paràmetres complementaris sense desar",
|
||||
"licensePlateRecognition": {
|
||||
"readTheDocumentation": "Llegir la documentació",
|
||||
"title": "Reconeixement de matrícules",
|
||||
"desc": "Frigate pot reconèixer les plaques de matrícula en vehicles i afegir automàticament els caràcters detectats al camp de la placa reconeguda o un nom conegut com a sub_etiqueta en objectes que són de tipus cotxe. Un cas d'ús comú pot ser llegir les plaques de matrícula dels cotxes que entren en un lloc o els cotxes que passen per un carrer."
|
||||
},
|
||||
@@ -848,7 +759,6 @@
|
||||
"description": "Descripció"
|
||||
},
|
||||
"actions": {
|
||||
"alert": "Marcar com Alerta",
|
||||
"notification": "Enviar Notificació",
|
||||
"sub_label": "Afegeix una subetiqueta",
|
||||
"attribute": "Afegeix un atribut"
|
||||
@@ -910,11 +820,6 @@
|
||||
"error": {
|
||||
"min": "S'ha de seleccionar una acció com a mínim."
|
||||
}
|
||||
},
|
||||
"friendly_name": {
|
||||
"title": "Nom amistós",
|
||||
"placeholder": "Nom o descripció d'aquest disparador",
|
||||
"description": "Un nom opcional amistós o text descriptiu per a aquest activador."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1044,33 +949,16 @@
|
||||
"brandInformation": "Informació de marca",
|
||||
"brandUrlFormat": "Per a càmeres amb el format d'URL RTSP com: {{exampleUrl}}",
|
||||
"customUrlPlaceholder": "rtsp://usuari:contrasenya@host:port/ruta",
|
||||
"testConnection": "Prova la connexió",
|
||||
"testSuccess": "Prova de connexió correcta!",
|
||||
"testFailed": "Ha fallat la prova de connexió. Si us plau, comproveu la vostra entrada i torneu-ho a provar.",
|
||||
"streamDetails": "Detalls del flux",
|
||||
"warnings": {
|
||||
"noSnapshot": "No s'ha pogut obtenir una instantània del flux configurat."
|
||||
},
|
||||
"errors": {
|
||||
"brandOrCustomUrlRequired": "Seleccioneu una marca de càmera amb host/IP o trieu 'Altres' amb un URL personalitzat",
|
||||
"nameRequired": "Es requereix el nom de la càmera",
|
||||
"nameLength": "El nom de la càmera ha de tenir 64 caràcters o menys",
|
||||
"invalidCharacters": "El nom de la càmera conté caràcters no vàlids",
|
||||
"nameExists": "El nom de la càmera ja existeix",
|
||||
"brands": {
|
||||
"reolink-rtsp": "No es recomana Reolink RST. Es recomana habilitar HTTP a la configuració de la càmera i reiniciar l'assistent de la càmera."
|
||||
},
|
||||
"customUrlRtspRequired": "Els URL personalitzats han de començar amb \"rtsp://\" o \"rtsps://\". Es requereix configuració manual per a fluxos de càmera no RTSP."
|
||||
},
|
||||
"selectBrand": "Seleccioneu la marca de la càmera per a la plantilla d'URL",
|
||||
"customUrl": "URL de flux personalitzat",
|
||||
"docs": {
|
||||
"reolink": "https://docs.frigate.video/configuration/camera_specific.html#reolink-cameras"
|
||||
},
|
||||
"testing": {
|
||||
"probingMetadata": "S'estan provant les metadades de la càmera...",
|
||||
"fetchingSnapshot": "S'està recuperant la instantània de la càmera..."
|
||||
},
|
||||
"connectionSettings": "Configuració de la connexió",
|
||||
"detectionMethod": "Mètode de detecció de flux",
|
||||
"onvifPort": "ONVIF Port",
|
||||
@@ -1097,42 +985,11 @@
|
||||
},
|
||||
"step2": {
|
||||
"description": "Proveu la càmera per als fluxos disponibles o configureu la configuració manual basada en el mètode de detecció seleccionat.",
|
||||
"streamsTitle": "Fluxos de la càmera",
|
||||
"addStream": "Afegeix un flux",
|
||||
"addAnotherStream": "Afegeix un altre flux",
|
||||
"streamTitle": "Flux {{number}}",
|
||||
"streamUrl": "URL del flux",
|
||||
"url": "URL",
|
||||
"resolution": "Resolució",
|
||||
"selectResolution": "Selecciona la resolució",
|
||||
"quality": "Qualitat",
|
||||
"selectQuality": "Selecciona la qualitat",
|
||||
"roleLabels": {
|
||||
"detect": "Detecció d'objectes",
|
||||
"record": "Enregistrament",
|
||||
"audio": "Àudio"
|
||||
},
|
||||
"testStream": "Prova la connexió",
|
||||
"testSuccess": "Prova de connexió correcta!",
|
||||
"testFailed": "Ha fallat la prova de connexió. Si us plau, comproveu la vostra entrada i torneu-ho a provar.",
|
||||
"testFailedTitle": "Ha fallat la prova",
|
||||
"connected": "Connectat",
|
||||
"notConnected": "No connectat",
|
||||
"featuresTitle": "Característiques",
|
||||
"go2rtc": "Redueix les connexions a la càmera",
|
||||
"detectRoleWarning": "Almenys un flux ha de tenir el rol de \"detecte\" per continuar.",
|
||||
"rolesPopover": {
|
||||
"title": "Rols de flux",
|
||||
"detect": "Canal principal per a la detecció d'objectes.",
|
||||
"record": "Desa els segments del canal de vídeo basats en la configuració.",
|
||||
"audio": "Canal per a la detecció basada en àudio."
|
||||
},
|
||||
"featuresPopover": {
|
||||
"title": "Característiques del flux",
|
||||
"description": "Utilitzeu el restreaming go2rtc per reduir les connexions a la càmera."
|
||||
},
|
||||
"roles": "Rols",
|
||||
"streamUrlPlaceholder": "rtsp://usuari:contrasenya@host:port/ruta",
|
||||
"streamDetails": "Detalls del flux",
|
||||
"probing": "Provant càmera...",
|
||||
"retry": "Intentar de nou",
|
||||
@@ -1167,48 +1024,9 @@
|
||||
}
|
||||
},
|
||||
"step3": {
|
||||
"none": "Cap",
|
||||
"error": "Error",
|
||||
"saveAndApply": "Desa una càmera nova",
|
||||
"saveError": "Configuració no vàlida. Si us plau, comproveu la configuració.",
|
||||
"issues": {
|
||||
"title": "Validació del flux",
|
||||
"videoCodecGood": "El còdec de vídeo és {{codec}}.",
|
||||
"audioCodecGood": "El còdec d'àudio és {{codec}}.",
|
||||
"noAudioWarning": "No s'ha detectat cap àudio per a aquest flux, els enregistraments no tindran àudio.",
|
||||
"audioCodecRecordError": "El còdec d'àudio AAC és necessari per a suportar l'àudio en els enregistraments.",
|
||||
"audioCodecRequired": "Es requereix un flux d'àudio per admetre la detecció d'àudio.",
|
||||
"restreamingWarning": "Reduir les connexions a la càmera per al flux de registre pot augmentar lleugerament l'ús de la CPU.",
|
||||
"dahua": {
|
||||
"substreamWarning": "El substream 1 està bloquejat a una resolució baixa. Moltes càmeres Dahua / Amcrest / EmpireTech suporten subfluxos addicionals que han d'estar habilitats a la configuració de la càmera. Es recomana comprovar i utilitzar aquests corrents si estan disponibles."
|
||||
},
|
||||
"hikvision": {
|
||||
"substreamWarning": "El substream 1 està bloquejat a una resolució baixa. Moltes càmeres Hikvision suporten subfluxos addicionals que han d'estar habilitats a la configuració de la càmera. Es recomana comprovar i utilitzar aquests corrents si estan disponibles."
|
||||
},
|
||||
"resolutionHigh": "Una resolució de {{resolution}} pot causar un ús més gran dels recursos.",
|
||||
"resolutionLow": "Una resolució de {{resolution}} pot ser massa baixa per a la detecció fiable d'objectes petits."
|
||||
},
|
||||
"description": "Configura els rols de flux i afegeix fluxos addicionals per a la càmera.",
|
||||
"validationTitle": "Validació del flux",
|
||||
"connectAllStreams": "Connecta tots els fluxos",
|
||||
"reconnectionSuccess": "S'ha reconnectat correctament.",
|
||||
"reconnectionPartial": "Alguns fluxos no s'han pogut tornar a connectar.",
|
||||
"streamUnavailable": "La vista prèvia del flux no està disponible",
|
||||
"reload": "Torna a carregar",
|
||||
"connecting": "Connectant...",
|
||||
"streamTitle": "Flux {{number}}",
|
||||
"valid": "Vàlid",
|
||||
"failed": "Ha fallat",
|
||||
"notTested": "No provat",
|
||||
"connectStream": "Connecta",
|
||||
"connectingStream": "Connectant",
|
||||
"disconnectStream": "Desconnecta",
|
||||
"estimatedBandwidth": "Amplada de banda estimad",
|
||||
"roles": "Rols",
|
||||
"streamValidated": "El flux {{number}} s'ha validat correctament",
|
||||
"streamValidationFailed": "Ha fallat la validació del flux {{number}}",
|
||||
"ffmpegModule": "Usa el mode de compatibilitat del flux",
|
||||
"ffmpegModuleDescription": "Si el flux no es carrega després de diversos intents, proveu d'activar-ho. Quan està activat, Frigate utilitzarà el mòdul ffmpeg amb go2rtc. Això pot proporcionar una millor compatibilitat amb alguns fluxos de càmera.",
|
||||
"streamsTitle": "Fluxos de la càmera",
|
||||
"addStream": "Afegeix un flux",
|
||||
"addAnotherStream": "Afegeix un altre flux",
|
||||
@@ -1305,18 +1123,7 @@
|
||||
"backToSettings": "Torna a la configuració de la càmera",
|
||||
"streams": {
|
||||
"title": "Estat i detalls de la càmera",
|
||||
"desc": "Inhabilita temporalment una càmera fins que es reiniciï la fragata. La inhabilitació d'una càmera atura completament el processament de Frigate dels fluxos d'aquesta càmera. La detecció, l'enregistrament i la depuració no estaran disponibles.<br /> <em>Nota: això no desactiva les retransmissions de go2rtc.</em>",
|
||||
"enableLabel": "Càmeres habilitades",
|
||||
"enableDesc": "Inhabilita temporalment una càmera habilitada fins que es reiniciï Frigate. La inhabilitació d'una càmera atura completament el processament de Frigate dels fluxos d'aquesta càmera. La detecció, l'enregistrament i la depuració no estaran disponibles.<br /> <em>Nota: això no inhabilita els restreams go2rtc.</em><br /><br />Drag el handle per reordenar les càmeres tal com apareixen a la interfície d'usuari. L'ordre de les càmeres habilitades es reflectirà en tota la interfície d'usuari, incloent el tauler en viu i els desplegables de selecció de càmeres.",
|
||||
"disableLabel": "Càmeres inhabilitades",
|
||||
"disableDesc": "Habilita una càmera que actualment no és visible a la interfície d'usuari i està desactivada a la configuració. Es requereix un reinici de Frigate després d'activar-la.",
|
||||
"enableSuccess": "{{cameraName}} activat. Reinicia Frigate a aplicar.",
|
||||
"friendlyName": {
|
||||
"edit": "Edita el nom de la pantalla de la càmera",
|
||||
"title": "Edita el nom de la pantalla",
|
||||
"description": "Estableix el nom amigable que es mostra per a aquesta càmera a tota la interfície d'usuari de la Fragata. Deixeu-ho en blanc per utilitzar l'ID de la càmera.",
|
||||
"rename": "Canvia el nom"
|
||||
},
|
||||
"reorderHandle": "Arrossega per reordenar",
|
||||
"saving": "S'està desant…",
|
||||
"saved": "Desat",
|
||||
@@ -1390,8 +1197,6 @@
|
||||
"selectLabel": "Seleccioneu el perfil",
|
||||
"description": "Configura quines càmeres estan activades o desactivades quan s'activa un perfil. Les càmeres establertes a «herit» mantenen el seu estat per defecte.",
|
||||
"inherit": "Hereta",
|
||||
"enabled": "Habilitat",
|
||||
"disabled": "Desactivat",
|
||||
"on": "Engegat",
|
||||
"off": "Apagat"
|
||||
},
|
||||
@@ -1550,15 +1355,6 @@
|
||||
"label": "Perfil"
|
||||
}
|
||||
},
|
||||
"detectionModel": {
|
||||
"plusActive": {
|
||||
"title": "Gestió del model Frigate+",
|
||||
"label": "Font del model actual",
|
||||
"description": "Aquesta instància està executant un model Frigate+. Seleccioneu o canvieu el vostre model a la configuració de Frigate+.",
|
||||
"goToFrigatePlus": "Ves a la configuració de Frigate+",
|
||||
"showModelForm": "Configuració manual d'un model"
|
||||
}
|
||||
},
|
||||
"maintenance": {
|
||||
"title": "Manteniment",
|
||||
"sync": {
|
||||
@@ -1741,16 +1537,6 @@
|
||||
"detect": {
|
||||
"title": "Configuració de detecció"
|
||||
},
|
||||
"detectors": {
|
||||
"title": "Configuració del detector",
|
||||
"singleType": "Només es permet un detector {{type}}.",
|
||||
"keyRequired": "Es requereix el nom del detector.",
|
||||
"keyDuplicate": "El nom del detector ja existeix.",
|
||||
"noSchema": "No hi ha esquemes de detector disponibles.",
|
||||
"none": "No s'ha configurat cap instància de detector.",
|
||||
"add": "Afegeix un detector",
|
||||
"addCustomKey": "Afegeix una clau personalitzada"
|
||||
},
|
||||
"record": {
|
||||
"title": "Configuració de l'enregistrament"
|
||||
},
|
||||
@@ -1806,8 +1592,6 @@
|
||||
"genaiRoles": {
|
||||
"options": {
|
||||
"embeddings": "Vectors",
|
||||
"vision": "Visió",
|
||||
"tools": "Eines",
|
||||
"descriptions": "Descripcions",
|
||||
"chat": "Xat"
|
||||
}
|
||||
@@ -1819,8 +1603,7 @@
|
||||
},
|
||||
"reviewLabels": {
|
||||
"summary": "{{count}} etiquetes seleccionades",
|
||||
"empty": "No hi ha etiquetes disponibles",
|
||||
"allNonAlertDetections": "Totes les activitats no alertes s'inclouran com a deteccions."
|
||||
"empty": "No hi ha etiquetes disponibles"
|
||||
},
|
||||
"addCustomLabel": "Afegeix una etiqueta personalitzada...",
|
||||
"genaiModel": {
|
||||
@@ -2026,7 +1809,6 @@
|
||||
"hardwareDxva2": "DXVA2",
|
||||
"hardwareVideotoolbox": "VideoToolbox"
|
||||
},
|
||||
"streamNumber": "Flux {{index}}",
|
||||
"sourceNumber": "Font {{index}}"
|
||||
},
|
||||
"timestampPosition": {
|
||||
@@ -2082,22 +1864,14 @@
|
||||
"record": {
|
||||
"noRecordRole": "Cap flux té el rol de registre definit. L'enregistrament no funcionarà."
|
||||
},
|
||||
"birdseye": {
|
||||
"objectsModeDetectDisabled": "Birdseye està configurat en mode 'objectes', però la detecció d'objectes està desactivada per a aquesta càmera. La càmera no apareixerà a Birdseye."
|
||||
},
|
||||
"snapshots": {
|
||||
"detectDisabled": "La detecció d'objectes està desactivada. Les instantànies es generen a partir d'objectes rastrejats i no es crearan."
|
||||
},
|
||||
"detectors": {
|
||||
"mixedTypes": "Tots els detectors han d'utilitzar el mateix tipus. Elimina els detectors existents per utilitzar un tipus diferent.",
|
||||
"mixedTypesSuggestion": "Tots els detectors han d'utilitzar el mateix tipus. Suprimiu detectors existents o seleccioneu {{type}}."
|
||||
},
|
||||
"objects": {
|
||||
"genaiNoDescriptionsProvider": "Heu de configurar un proveïdor de GenAI amb el rol 'descripcions' per a les descripcions que es generaran."
|
||||
},
|
||||
"semanticSearch": {
|
||||
"jinav2SmallModelSize": "La mida 'petita' amb el model Jina V2 té un alt cost de RAM i d'inferència. Es recomana el model 'gran' amb una GPU discreta.",
|
||||
"modelSizeIgnoredForProvider": "La mida del model només s'aplica als models de Jina incorporats. Aquest valor s'ignorarà quan s'utilitzi un proveïdor d'incrustació GenAI."
|
||||
"jinav2SmallModelSize": "La mida 'petita' amb el model Jina V2 té un alt cost de RAM i d'inferència. Es recomana el model 'gran' amb una GPU discreta."
|
||||
},
|
||||
"onvif": {
|
||||
"autotrackingNoZones": "Autotraquejar requereix al menys una zona. Defineix una zona per aquesta cámera a Mascares/Zones, després usa'l com a requerit a la part inferior."
|
||||
@@ -2116,11 +1890,6 @@
|
||||
"small": "Petit"
|
||||
},
|
||||
"birdseye": {
|
||||
"trackingMode": {
|
||||
"objects": "Objectes",
|
||||
"motion": "Moviment",
|
||||
"continuous": "Continu"
|
||||
},
|
||||
"cameraOrder": {
|
||||
"label": "Ordre de la càmera",
|
||||
"description": "Arrossega les càmeres per establir el seu ordre en la disposició Birdseye.",
|
||||
@@ -2129,25 +1898,12 @@
|
||||
"saved": "Desat"
|
||||
}
|
||||
},
|
||||
"snapshot": {
|
||||
"retainMode": {
|
||||
"all": "Tots",
|
||||
"motion": "Moviment",
|
||||
"active_objects": "Objectes Actius"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
"timeFormat": {
|
||||
"browser": "Visor",
|
||||
"12hour": "12 hores",
|
||||
"24hour": "24 hores"
|
||||
},
|
||||
"TimeOrDateStyle": {
|
||||
"full": "Complet",
|
||||
"long": "Llarg",
|
||||
"medium": "Mitjà",
|
||||
"short": "Curt"
|
||||
},
|
||||
"unitSystem": {
|
||||
"metric": "Métric",
|
||||
"imperial": "Imperial"
|
||||
@@ -2180,31 +1936,6 @@
|
||||
"low": "Baix",
|
||||
"very_low": "Molt baix"
|
||||
},
|
||||
"detectorsAndModel": {
|
||||
"restartRequired": "Reinici requerit (canvi en detector o model)",
|
||||
"title": "Detectors i model",
|
||||
"description": "Configuri el detector final que corre la detecció d'objectes i el model que usa. Els canvis es gravaràn junts i així el detector i el model estan sincronitzats.",
|
||||
"cardTitles": {
|
||||
"detector": "Detector Hardware",
|
||||
"model": "Model de detecció"
|
||||
},
|
||||
"tabs": {
|
||||
"plus": "Frigate+",
|
||||
"custom": "Model personalitzat"
|
||||
},
|
||||
"mismatch": {
|
||||
"warning": "El model actual de Frigate+ \"{{model}}\" requereix el detector {{required}}. Selecciona un model compatible a baix o canvía e model personalitzat abans de gravar."
|
||||
},
|
||||
"plusModel": {
|
||||
"requiresDetector": "Requereix: {{detector}}",
|
||||
"noModelSelected": "Selecciona un model Frigate+"
|
||||
},
|
||||
"toast": {
|
||||
"saveSuccess": "Configuració de detectors i model guardats. Reinicia Frigate per aplicar els canvis.",
|
||||
"saveError": "Fallo en gravar la configuració de detector i model"
|
||||
},
|
||||
"unsavedChanges": "Canvis de detector i model no gravats"
|
||||
},
|
||||
"menuDot": {
|
||||
"overrideGlobal": "Aquesta secció substitueix la configuració global",
|
||||
"overrideProfile": "Aquesta secció està substituïda pel perfil {{profile}}",
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
"cameras_count_other": "{{count}} Càmeres"
|
||||
},
|
||||
"empty": "Encara no s'ha capturat cap missatge",
|
||||
"count": "{{count}} missatges",
|
||||
"expanded": {
|
||||
"payload": "Payload"
|
||||
},
|
||||
@@ -106,11 +105,6 @@
|
||||
},
|
||||
"npuUsage": "Ús de NPU",
|
||||
"npuMemory": "Memòria de NPU",
|
||||
"intelGpuWarning": {
|
||||
"title": "Avís d'estadístiques de la GPU d'Intel",
|
||||
"message": "Estadístiques de GPU no disponibles",
|
||||
"description": "Aquest és un error conegut en les eines d'informació de les estadístiques de GPU d'Intel (intel.gpu.top) on es trencarà i retornarà repetidament un ús de GPU del 0% fins i tot en els casos en què l'acceleració del maquinari i la detecció d'objectes s'executen correctament a la (i)GPU. Això no és un error de Frigate. Podeu reiniciar l'amfitrió per a corregir temporalment el problema i confirmar que la GPU funciona correctament. Això no afecta el rendiment."
|
||||
},
|
||||
"gpuTemperature": "Temperatura de la GPU",
|
||||
"npuTemperature": "Temperatura NPU",
|
||||
"gpuCompute": "Càlcul / Codificació per GPU"
|
||||
@@ -202,8 +196,6 @@
|
||||
"gap": "Espai de fotogrames clau (mín / avg / max):",
|
||||
"segmentLength": "Longitud del segment d'enregistrament:",
|
||||
"ok": "Fotogrames clau cada ,{{seconds}}s, bons per enregistrar i reproduir.",
|
||||
"warning": "Els fotogrames clau dispersos o variables (espai més llarg .{{seconds}}s), probablement un còdec intel·ligent (H.264+/H.265+), això no és recomanable.",
|
||||
"error": "El buit dels fotogrames clau ( the{{seconds}}s) excedeix la longitud del segment d'enregistrament ({{segmentTime}}s). Alguns segments poden no tenir un fotograma clau, el qual trenca la reproducció. Desactiva el còdec intel·ligent/+ a la càmera o escurça el seu interval de fotogrames clau.",
|
||||
"unknown": "No s'ha pogut determinar l'espaiat dels fotogrames clau.",
|
||||
"recordDisabled": "L'enregistrament està desactivat per a aquesta càmera."
|
||||
}
|
||||
@@ -242,7 +234,6 @@
|
||||
"detectHighCpuUsage": "{{camera}} te un ús elevat de CPU per la detecció ({{detectAvg}}%)",
|
||||
"detectIsVerySlow": "{{detect}} és molt lent ({{speed}} ms)",
|
||||
"detectIsSlow": "{{detect}} és lent ({{speed}} ms)",
|
||||
"shmTooLow": "/dev/shm directori ({{total}} MB) hauria de ser incrementat com a mínim {{min}} MB.",
|
||||
"debugReplayActive": "La sessió de repetició de depuració està activa"
|
||||
},
|
||||
"enrichments": {
|
||||
|
||||
@@ -457,7 +457,6 @@
|
||||
"cacophony": "Kakofonie",
|
||||
"throbbing": "Pulzování",
|
||||
"vibration": "Vibrace",
|
||||
"sodeling": "Jódlování",
|
||||
"shofar": "Šofar",
|
||||
"slosh": "Šplouchání",
|
||||
"gush": "Příval",
|
||||
|
||||
@@ -227,7 +227,8 @@
|
||||
"ur": "اردو (Urdština)",
|
||||
"hr": "Hrvatski (Chorvatština)",
|
||||
"zhHant": "繁體中文 (Tradiční čínština)",
|
||||
"bs": "Bosanski (Bosenština)"
|
||||
"bs": "Bosanski (Bosenština)",
|
||||
"be": "Беларуская (Běloruština)"
|
||||
},
|
||||
"theme": {
|
||||
"highcontrast": "Vysoký kontrast",
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
"audioIsUnavailable": "Audio není k dispozici pro tento stream",
|
||||
"audio": {
|
||||
"tips": {
|
||||
"document": "Přečtěte si dokumentaci ",
|
||||
"title": "Pro tento stream musí být výstup zvuku z vaší kamery a nakonfigurován v go2rtc."
|
||||
}
|
||||
},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user