@camstack/addon-pipeline 1.2.326 → 1.2.328

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/THIRD_PARTY_MODELS.md +49 -43
  2. package/dist/audio-analyzer/index.js +2 -2
  3. package/dist/audio-analyzer/index.mjs +2 -2
  4. package/dist/{default-detection-model-WnGDQAQh.js → default-detection-model-1SadEKsW.js} +120 -61
  5. package/dist/{default-detection-model-Bu4So71h.mjs → default-detection-model-CMeVTcPZ.mjs} +120 -61
  6. package/dist/detection-pipeline/index.js +49 -9
  7. package/dist/detection-pipeline/index.mjs +49 -9
  8. package/dist/{dist-BuU8Y4o1.mjs → dist-Bpub2VcJ.mjs} +584 -396
  9. package/dist/{dist-BTBbIGSC.js → dist-wJO7mXeO.js} +631 -395
  10. package/dist/motion-wasm/index.js +1 -1
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-UK2v2ZSw.js → node-BCrqaejt.js} +1 -1
  13. package/dist/{node-inZFYgkm.mjs → node-BjCSgD4M.mjs} +1 -1
  14. package/dist/pipeline-runner/index.js +253 -87
  15. package/dist/pipeline-runner/index.mjs +253 -88
  16. package/dist/{process-memory-DbSOL63T.mjs → process-memory-BaKQ8u2G.mjs} +1 -1
  17. package/dist/{process-memory-BfDlwJc4.js → process-memory-iUJuTpXs.js} +1 -1
  18. package/dist/recorder/index.js +9 -8
  19. package/dist/recorder/index.mjs +9 -8
  20. package/dist/{segment-demux-js-CMj020zz.mjs → segment-demux-js-C5ez9LYG.mjs} +1 -1
  21. package/dist/{segment-demux-js-C1GXgxZ0.js → segment-demux-js-Opx6Hv9G.js} +1 -1
  22. package/dist/session-decode/decode-worker-main.js +13 -21
  23. package/dist/session-decode/decode-worker-main.mjs +13 -21
  24. package/dist/stream-broker/_stub.js +1 -1
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-qHD9Dl1z.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B94LgsV0.mjs} +3 -3
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BPWYf4_O.mjs +26 -0
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-BgWrKrQn.mjs → hostInit-xOx7AvgW.mjs} +3 -3
  30. package/dist/stream-broker/index.js +6 -5
  31. package/dist/stream-broker/index.mjs +6 -5
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/package.json +1 -1
  34. package/python/inference_pool.py +38 -121
  35. package/python/postprocessors/scrfd.py +2 -0
  36. package/python/postprocessors/test_bird_edgetpu.py +124 -0
  37. package/python/postprocessors/testdata/bird_classifier_int8_outputs.json +1 -0
  38. package/python/test_inference_pool_static_batch.py +2 -4
  39. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-NkeMtp-v.mjs +0 -26
@@ -30,13 +30,13 @@ under [Non-commercial models](#non-commercial-models).
30
30
 
31
31
  ## Required attributions
32
32
 
33
- - © Ultralytics, AGPL-3.0. Corresponding source: the upstream Ultralytics checkpoint and scripts/build-camstack-models.py in https://github.com/camstack/server. https://github.com/ultralytics/ultralytics
33
+ - © Ultralytics, AGPL-3.0. Corresponding source: the upstream Ultralytics checkpoint and build-camstack-models.py (with convert_lib.py) published at https://huggingface.co/camstack/camstack-models/tree/main/source. https://github.com/ultralytics/ultralytics
34
34
  - Coral Edge TPU models and AIY Vision Birds V1 © Google LLC, Apache-2.0. https://github.com/google-coral/test_data
35
- - © Ultralytics, AGPL-3.0 (Ultralytics YOLOv9 weights). YOLOv9 architecture: Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao, GPL-3.0 (https://github.com/WongKinYiu/yolov9). Corresponding source: the upstream Ultralytics checkpoint and scripts/build-camstack-models.py in https://github.com/camstack/server. https://github.com/ultralytics/ultralytics
35
+ - © Ultralytics, AGPL-3.0 (Ultralytics YOLOv9 weights). YOLOv9 architecture: Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao, GPL-3.0 (https://github.com/WongKinYiu/yolov9). Corresponding source: the upstream Ultralytics checkpoint and build-camstack-models.py (with convert_lib.py) published at https://huggingface.co/camstack/camstack-models/tree/main/source. https://github.com/ultralytics/ultralytics
36
36
  - RF-DETR © Roboflow, Apache-2.0. https://github.com/roboflow/rf-detr
37
37
  - YuNet weights Copyright (c) 2020 Shiqi Yu, MIT. Training code: ShiqiYu/libfacedetection.train, BSD-3-Clause. https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet
38
38
  - AuraFace v1 by fal.ai, Apache-2.0. https://huggingface.co/fal/AuraFace-v1
39
- - © Ultralytics, AGPL-3.0 (YOLOv8n base, fine-tuned for plates by an unidentified third party). CamStack holds no training checkpoint; the ONNX file is the only form it has. https://github.com/ultralytics/ultralytics
39
+ - open-lpr models, Copyright the open-lpr contributors, Apache-2.0 (https://huggingface.co/faisalthaheem/open-lpr-models, tag detector-2026.10.1). YOLOX architecture and COCO pretraining by Megvii (https://github.com/Megvii-BaseDetection/YOLOX), Apache-2.0. The upstream NOTICE is reproduced verbatim (`NOTICE-open-lpr.txt`). https://huggingface.co/faisalthaheem/open-lpr-models
40
40
  - fast-plate-ocr, MIT License, copyright (c) 2024 ankandrew (full notice: licenses/models/MIT-fast-plate-ocr.txt). https://github.com/ankandrew/fast-plate-ocr
41
41
  - EfficientNet-Lite0 via timm (Ross Wightman), Apache-2.0. Open Images V7 annotations © Google LLC, CC BY 4.0; images listed by Google as CC BY 2.0, without warranty. https://github.com/huggingface/pytorch-image-models
42
42
  - torchvision MobileNetV3, BSD-3-Clause. Trained on the Vehicle classification dataset by DrBimmer (https://huggingface.co/datasets/DrBimmer/vehicle-classification), CC BY-NC 4.0. https://github.com/pytorch/vision
@@ -45,11 +45,10 @@ under [Non-commercial models](#non-commercial-models).
45
45
  - YAMNet © Google LLC, Apache-2.0. AudioSet ontology and labels © Google LLC, CC BY 4.0. https://github.com/tensorflow/models/tree/master/research/audioset/yamnet
46
46
  - Qwen models © Alibaba Cloud, Apache-2.0. https://huggingface.co/Qwen · https://huggingface.co/unsloth · https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF
47
47
  - Built with Llama. Llama 3.2 is licensed under the Llama 3.2 Community License, Copyright © Meta Platforms, Inc. All Rights Reserved. https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF
48
- - Scrypted YOLOv9 ReLU detectors, Koushik Dutta (scrypted/plugin-models, repository tagged MIT); trained with the YOLOv9 code of Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao, GPL-3.0 (https://github.com/WongKinYiu/yolov9). https://huggingface.co/scrypted/plugin-models
49
48
 
50
49
  Training data under attribution terms:
51
50
 
52
- - **COCO 2017** (training data of `yolo26n` and 51 more): annotations CC-BY-4.0; images under their Flickr owners' terms. https://cocodataset.org/#termsofuse
51
+ - **COCO 2017** (training data of `yolo26n` and 50 more): annotations CC-BY-4.0; images under their Flickr owners' terms. https://cocodataset.org/#termsofuse
53
52
  - **WIDER FACE** (training data of `yunet-2023mar`): research-oriented terms; images CC BY-NC-ND. http://shuoyang1213.me/WIDERFACE/
54
53
  - **Open Images V7** (training data of `animal-classifier`): annotations CC-BY-4.0 (Google LLC); images listed as CC-BY-2.0, no warranty. https://storage.googleapis.com/openimages/web/factsfigures_v7.html
55
54
  - **DrBimmer/vehicle-classification** (training data of `vehicle-type-v1`): CC-BY-NC-4.0 — treated as binding the trained weights (conservative reading). https://huggingface.co/datasets/DrBimmer/vehicle-classification
@@ -63,32 +62,42 @@ Training data under attribution terms:
63
62
  cards link here instead of repeating it.
64
63
  -->
65
64
 
66
- The folders `objectDetection/yolo26`, `objectDetection/yolov9`, `plateDetection/yolov8-plate` and `segmentation/yolo26-seg` of the model mirror hold Ultralytics weights,
65
+ The folders `objectDetection/yolo26`, `objectDetection/yolov9` and `segmentation/yolo26-seg` of the model mirror hold Ultralytics weights,
67
66
  modified by CamStack and distributed under AGPL-3.0. Their Corresponding Source
68
- is the public CamStack source repository, **https://github.com/camstack/server**
69
- (MIT), together with the upstream checkpoints it starts from:
70
-
71
- 1. **The upstream checkpoints**, published by Ultralytics at
72
- https://github.com/ultralytics/assets/releases: `yolo26{n,s,m,l,x}.pt`,
73
- `yolov9{t,s,m,c}.pt`, `yolo26{n,s,m}-seg.pt`.
74
- 2. **The export scripts** in https://github.com/camstack/server:
75
- `scripts/build-camstack-models.py` (ONNX with a dynamic batch axis, CoreML
76
- FP16, OpenVINO IR, OpenVINO NNCF INT8) and `scripts/export-models.py`. The
77
- build instructions (Python environment, invocation, calibration images for
78
- INT8) are in each script's header.
79
- 3. **The software** that downloads and runs these weights, CamStack itself, is
80
- the same repository.
81
-
82
- What the repository does **not** cover yet:
83
-
84
- - **Some hosted sizes and input resolutions.** The export scripts do not list
85
- every variant in the mirror (for example the `-320`/`-256` YOLO26 exports,
86
- `yolov9m`/`yolov9c`, and the `yolo26*-seg` models). Each one is the same
87
- Ultralytics `export()` with a different model id or `imgsz`, but no script in
88
- the repository reproduces it as-is.
89
- - **`yolov8n-plate` has no training checkpoint.** It is a third-party model
90
- (trained 2023-12-05 according to its own metadata, origin not identified).
91
- The ONNX file is the only form CamStack has.
67
+ is published in the mirror itself, in its **`source/`** folder,
68
+ **https://huggingface.co/camstack/camstack-models/tree/main/source**, together
69
+ with the upstream checkpoints it starts from:
70
+
71
+ 1. **The upstream checkpoints.** Ultralytics publishes
72
+ `yolo26{n,s,m,l,x}.pt`, `yolov9{t,s,m,c}.pt` and `yolo26{n,s,m}-seg.pt` at
73
+ https://github.com/ultralytics/assets/releases.
74
+ 2. **The build script** in `source/`: `build-camstack-models.py`, with
75
+ `convert_lib.py` (the ONNX to OpenVINO / INT8 converter it calls, the same
76
+ file CamStack's Model Studio runs) and `requirements.txt`. It holds one
77
+ recipe per hosted file: the upstream checkpoint, the input size, the
78
+ Ultralytics `export()` arguments, the OpenVINO precision and the INT8
79
+ calibration count that file records about itself. Every hosted
80
+ Ultralytics-derived file is rebuilt by one invocation:
81
+ `build-camstack-models.py --variant <file stem>` (for example
82
+ `camstack-yolo26n-320` or `camstack-yolov9m-640`), `--family <folder>`
83
+ or `--all`; `--list` prints the recipes and `--check-hosted` confirms
84
+ against the mirror that every hosted file is a recipe output. The INT8
85
+ builds are NNCF post-training quantisation calibrated on COCO images: 128
86
+ for YOLO26, 300 for YOLOv9, as each IR records; the documented set is the
87
+ first N of COCO val2017 in file-name order. The Python
88
+ environment, the recorded tool versions and the calibration set are in
89
+ `source/README.md` and the script's header. These scripts are CamStack's
90
+ own code and are offered under the MIT licence; the weights they produce
91
+ keep their upstream licence.
92
+
93
+ Limits of a rebuild:
94
+
95
+ - **Tool versions.** With the Ultralytics, PyTorch, coremltools and OpenVINO
96
+ versions each recipe names, a rebuild reproduces the hosted weights. Other
97
+ versions give the same weights in a possibly different graph.
98
+ - **INT8 calibration.** An IR records how many images calibrated it, not
99
+ which ones. Calibrating on the same COCO images gives the documented build;
100
+ a different set gives an equivalent, not bit-identical, INT8 model.
92
101
 
93
102
  ## Non-commercial models
94
103
 
@@ -137,7 +146,7 @@ entry kept resolvable for a saved selection but no longer offered.
137
146
 
138
147
  | Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
139
148
  | --- | --- | --- | --- | --- | --- |
140
- | `yolov8n-plate` (default) | [Ultralytics](https://github.com/ultralytics/ultralytics) | AGPL-3.0 / AGPL-3.0 (`AGPL-3.0.txt`) | unidentified plate dataset (third-party model, trained 2023-12-05 per its ONNX metadata): UNKNOWN | converted to OpenVINO IR and CoreML | mirror `plateDetection/yolov8-plate` |
149
+ | `yolox-tiny-plate` (default) | [open-lpr models (faisalthaheem/open-lpr-models), YOLOX-tiny](https://huggingface.co/faisalthaheem/open-lpr-models) | Apache-2.0 / Apache-2.0 (`Apache-2.0.txt`) | Simanno annotated plate corpus plus community-contributed photographs, pseudo-labelled by a teacher model (not published; the upstream NOTICE says the photographs were uploaded without consent obtained): UNKNOWN | input contract baked into the graph (static 1x3x640x640 RGB /255 becomes the upstream BGR 0..255: Mul(255) plus a channel Gather) and the output reshaped to the YOLOv8 layout (cx, cy, w, h, obj*cls); ONNX fp32, OpenVINO IR fp16, CoreML fp16 (scripts/build-yolox-plate-model.py) | mirror `plateDetection/yolox-tiny-plate` |
141
150
 
142
151
  ### Licence plate reading
143
152
 
@@ -155,7 +164,7 @@ entry kept resolvable for a saved selection but no longer offered.
155
164
 
156
165
  | Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
157
166
  | --- | --- | --- | --- | --- | --- |
158
- | `bird-classifier` (default) | [Google AIY Vision birds_V1](https://github.com/google-coral/test_data) | — / Apache-2.0 (`Apache-2.0.txt`) | — | converted from TensorFlow with tf2onnx; OpenVINO IR and CoreML derived from it | mirror `animalClassification/bird-classifier` |
167
+ | `bird-classifier` (default) | [Google AIY Vision birds_V1](https://github.com/google-coral/test_data) | — / Apache-2.0 (`Apache-2.0.txt`) | — | converted from TensorFlow with tf2onnx; OpenVINO IR and CoreML derived from it; the Edge TPU build is the Google full-integer quantised TFLite of the same model, compiled with edgetpu_compiler 14 (scripts/build-bird-classifier-edgetpu.py) | mirror `animalClassification/bird-classifier` |
159
168
 
160
169
  ### Vehicle classifier
161
170
 
@@ -205,16 +214,13 @@ entry kept resolvable for a saved selection but no longer offered.
205
214
  | `llm-qwen3-vl-8b-instruct-q4` | [Qwen3-VL (GGUF by unsloth)](https://huggingface.co/unsloth) | — / Apache-2.0 (`Apache-2.0.txt`) | — | Q4_K_M GGUF quantisation by unsloth (not re-hosted by CamStack) | https://huggingface.co/unsloth/Qwen3-VL-8B-Instruct-GGUF |
206
215
  | `llm-qwen3.6-35b-a3b-ud-q4` | [Qwen3.6-35B-A3B (GGUF by unsloth)](https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF) | — / Apache-2.0 (`Apache-2.0.txt`) | — | UD-Q4_K_M GGUF quantisation by unsloth (not re-hosted by CamStack) | https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF |
207
216
 
208
- ### Model Studio catalogs (object detection, imported on request)
209
-
210
- | Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
211
- | --- | --- | --- | --- | --- | --- |
212
- | `scrypted-yolov9t-relu-320`, `scrypted-yolov9t-relu_test-320`, `scrypted-yolov9s-relu-320`, `scrypted-yolov9s-relu_test-320`, `scrypted-yolov9m-relu-320`, `scrypted-yolov9m-relu_test-320`, `scrypted-yolov9c-relu-320`, `scrypted-yolov9c-relu_test-320`, `scrypted-yolov9t-relu-int8-320`, `scrypted-yolov9t-relu_test-int8-320`, `scrypted-yolov9s-relu-int8-320`, `scrypted-yolov9s-relu_test-int8-320`, `scrypted-yolov9m-relu-int8-320`, `scrypted-yolov9m-relu_test-int8-320`, `scrypted-yolov9c-relu-int8-320`, `scrypted-yolov9c-relu_test-int8-320` | [Scrypted plugin-models (repository tagged MIT, no per-model terms)](https://huggingface.co/scrypted/plugin-models) | GPL-3.0 (`GPL-3.0.txt`) / **Unknown** | not stated by Scrypted: UNKNOWN | none: downloaded as published, at a pinned revision | https://huggingface.co/scrypted/plugin-models |
213
- | `frigate-mobiledet-edgetpu` | [Google Coral test_data](https://github.com/google-coral/test_data) | Apache-2.0 / Apache-2.0 (`Apache-2.0.txt`) | COCO 2017: annotations CC-BY-4.0; images under their Flickr owners' terms | none | https://github.com/google-coral/test_data |
214
-
215
217
  ### Your own models
216
218
 
217
- The Scrypted and Frigate catalogs that Model Studio offers are listed above. A
218
- model you upload or convert yourself, or pull from your own Frigate+ account,
219
- keeps whatever licence its author published. CamStack does not change it and
220
- does not record it.
219
+ Model Studio can import third-party models (for example community
220
+ object-detection catalogs) on request. They are downloaded from their
221
+ publishers, are not hosted or redistributed by CamStack, and keep their
222
+ publishers' licences; Model Studio shows the licence where the source declares
223
+ one. A model you upload or convert
224
+ yourself, or pull from your own Frigate+ account, likewise keeps whatever
225
+ licence its author published. CamStack does not change it and does not record
226
+ it.
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-BTBbIGSC.js");
7
- const require_process_memory = require("../process-memory-BfDlwJc4.js");
6
+ const require_dist = require("../dist-wJO7mXeO.js");
7
+ const require_process_memory = require("../process-memory-iUJuTpXs.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
10
10
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as PoolMemoryWatchdog, E as HF_BASE_URL, En as nodePin, Kt as resolvePoolMemoryPolicy, Sn as hydrateSchema, St as mapAudioLabelToMacro, U as audioAnalysisCapability, Un as EventCategory, W as audioAnalyzerCapability, _n as audioChunkBytesPerSample, fn as errMsg, m as DEFAULT_AUDIO_ANALYZER_CONFIG, mn as BaseAddon, r as AUDIO_BACKEND_CHOICES, xn as expandAudioChunkToF32le } from "../dist-BuU8Y4o1.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DbSOL63T.mjs";
2
+ import { An as hydrateSchema, F as PoolMemoryWatchdog, J as audioAnalysisCapability, Pn as nodePin, Sn as BaseAddon, Tn as audioChunkBytesPerSample, Y as audioAnalyzerCapability, Zn as EventCategory, bn as errMsg, en as resolvePoolMemoryPolicy, k as HF_BASE_URL, kn as expandAudioChunkToF32le, kt as mapAudioLabelToMacro, m as DEFAULT_AUDIO_ANALYZER_CONFIG, r as AUDIO_BACKEND_CHOICES } from "../dist-Bpub2VcJ.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BaKQ8u2G.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-BTBbIGSC.js");
1
+ const require_dist = require("./dist-wJO7mXeO.js");
2
2
  const require_worker_protocol = require("./worker-protocol-C-G8qmye.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  //#region src/detection-pipeline/registry/effective-confidence.ts
@@ -43,13 +43,13 @@ var ULTRALYTICS_AGPL = {
43
43
  url: "https://github.com/ultralytics/ultralytics"
44
44
  },
45
45
  url: "https://github.com/ultralytics/ultralytics/blob/main/LICENSE",
46
- attribution: "© Ultralytics, AGPL-3.0. Corresponding source: the upstream Ultralytics checkpoint and scripts/build-camstack-models.py in https://github.com/camstack/server.",
46
+ attribution: "© Ultralytics, AGPL-3.0. Corresponding source: the upstream Ultralytics checkpoint and build-camstack-models.py (with convert_lib.py) published at https://huggingface.co/camstack/camstack-models/tree/main/source.",
47
47
  modifications: "exported to ONNX, OpenVINO IR and CoreML (scripts/build-camstack-models.py)",
48
48
  hosting: "camstack-hf"
49
49
  };
50
50
  var ULTRALYTICS_YOLOV9_AGPL = {
51
51
  ...ULTRALYTICS_AGPL,
52
- attribution: "© Ultralytics, AGPL-3.0 (Ultralytics YOLOv9 weights). YOLOv9 architecture: Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao, GPL-3.0 (https://github.com/WongKinYiu/yolov9). Corresponding source: the upstream Ultralytics checkpoint and scripts/build-camstack-models.py in https://github.com/camstack/server."
52
+ attribution: "© Ultralytics, AGPL-3.0 (Ultralytics YOLOv9 weights). YOLOv9 architecture: Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao, GPL-3.0 (https://github.com/WongKinYiu/yolov9). Corresponding source: the upstream Ultralytics checkpoint and build-camstack-models.py (with convert_lib.py) published at https://huggingface.co/camstack/camstack-models/tree/main/source."
53
53
  };
54
54
  /** The CamStack Coral COCO detector (SSD MobileNet V2). */
55
55
  var CORAL_COCO_APACHE = {
@@ -104,6 +104,30 @@ var AURAFACE_APACHE = {
104
104
  modifications: "input scaling y = 2x - 1 baked ahead of the first Conv (scripts/build-auraface-model.py); converted to OpenVINO IR and CoreML FP16",
105
105
  hosting: "camstack-hf"
106
106
  };
107
+ /**
108
+ * open-lpr's YOLOX-tiny plate detector (D719). Weights Apache-2.0 by the
109
+ * open-lpr repository licence and NOTICE (YOLOX code and its same-repository
110
+ * COCO weights are Apache-2.0; no Ultralytics weights used) — the weights'
111
+ * status is inferred from that statement, not from a per-file licence. The
112
+ * NOTICE travels verbatim (Apache-2.0 §4(d)): licenses/models/NOTICE-open-lpr.txt
113
+ * and the mirror folder's own NOTICE.
114
+ */
115
+ var OPEN_LPR_YOLOX_APACHE = {
116
+ weights: "Apache-2.0",
117
+ code: "Apache-2.0",
118
+ data: {
119
+ name: "Simanno annotated plate corpus plus community-contributed photographs, pseudo-labelled by a teacher model (not published; the upstream NOTICE says the photographs were uploaded without consent obtained)",
120
+ terms: "UNKNOWN"
121
+ },
122
+ upstream: {
123
+ name: "open-lpr models (faisalthaheem/open-lpr-models), YOLOX-tiny",
124
+ url: "https://huggingface.co/faisalthaheem/open-lpr-models"
125
+ },
126
+ url: "https://huggingface.co/faisalthaheem/open-lpr-models/blob/aed0df35ec2891c5a90437041ebeadb592cc516b/LICENSE",
127
+ attribution: "open-lpr models, Copyright the open-lpr contributors, Apache-2.0 (https://huggingface.co/faisalthaheem/open-lpr-models, tag detector-2026.10.1). YOLOX architecture and COCO pretraining by Megvii (https://github.com/Megvii-BaseDetection/YOLOX), Apache-2.0. The upstream NOTICE is reproduced verbatim (`NOTICE-open-lpr.txt`).",
128
+ modifications: "input contract baked into the graph (static 1x3x640x640 RGB /255 becomes the upstream BGR 0..255: Mul(255) plus a channel Gather) and the output reshaped to the YOLOv8 layout (cx, cy, w, h, obj*cls); ONNX fp32, OpenVINO IR fp16, CoreML fp16 (scripts/build-yolox-plate-model.py)",
129
+ hosting: "camstack-hf"
130
+ };
107
131
  var FAST_PLATE_OCR_MIT = {
108
132
  weights: "MIT",
109
133
  code: "MIT",
@@ -145,7 +169,7 @@ var AIY_BIRDS_APACHE = {
145
169
  },
146
170
  url: "https://github.com/google-coral/test_data/blob/master/LICENSE",
147
171
  attribution: "Coral Edge TPU models and AIY Vision Birds V1 © Google LLC, Apache-2.0.",
148
- modifications: "converted from TensorFlow with tf2onnx; OpenVINO IR and CoreML derived from it",
172
+ modifications: "converted from TensorFlow with tf2onnx; OpenVINO IR and CoreML derived from it; the Edge TPU build is the Google full-integer quantised TFLite of the same model, compiled with edgetpu_compiler 14 (scripts/build-bird-classifier-edgetpu.py)",
149
173
  hosting: "camstack-hf"
150
174
  };
151
175
  var VEHICLE_TYPE_V1_NC = {
@@ -762,17 +786,10 @@ var FACE_EMBEDDING_MODELS = [{
762
786
  }
763
787
  }];
764
788
  var PLATE_DETECTION_MODELS = [{
765
- id: "yolov8n-plate",
766
- license: licensed(ULTRALYTICS_AGPL, {
767
- data: {
768
- name: "unidentified plate dataset (third-party model, trained 2023-12-05 per its ONNX metadata)",
769
- terms: "UNKNOWN"
770
- },
771
- attribution: "© Ultralytics, AGPL-3.0 (YOLOv8n base, fine-tuned for plates by an unidentified third party). CamStack holds no training checkpoint; the ONNX file is the only form it has.",
772
- modifications: "converted to OpenVINO IR and CoreML"
773
- }),
774
- name: "YOLOv8 Nano — License Plate",
775
- description: "YOLOv8 Nano fine-tuned for license plate detection",
789
+ id: "yolox-tiny-plate",
790
+ license: OPEN_LPR_YOLOX_APACHE,
791
+ name: "YOLOX-tiny — License Plate",
792
+ description: "YOLOX-tiny licence-plate detector trained by the open-lpr project (Apache-2.0)",
776
793
  inputSize: {
777
794
  width: 640,
778
795
  height: 640
@@ -782,19 +799,20 @@ var PLATE_DETECTION_MODELS = [{
782
799
  name: "License Plate"
783
800
  }],
784
801
  preprocessMode: "letterbox",
802
+ postprocessor: "yolo",
785
803
  formats: {
786
804
  onnx: {
787
- url: hf("plateDetection/yolov8-plate/onnx/camstack-yolov8n-plate.onnx"),
788
- sizeMB: 12
805
+ url: hf("plateDetection/yolox-tiny-plate/onnx/camstack-yolox-tiny-plate.onnx"),
806
+ sizeMB: 19.3
789
807
  },
790
808
  coreml: {
791
- url: hf("plateDetection/yolov8-plate/coreml/camstack-yolov8n-plate.mlpackage"),
792
- sizeMB: 5.9,
809
+ url: hf("plateDetection/yolox-tiny-plate/coreml/camstack-yolox-tiny-plate.mlpackage"),
810
+ sizeMB: 9.8,
793
811
  isDirectory: true,
794
812
  files: [...MLPACKAGE_FILES],
795
813
  runtimes: ["python"]
796
814
  },
797
- openvino: ovFormat(hf("plateDetection/yolov8-plate/openvino/camstack-yolov8n-plate.xml"), 6.1)
815
+ openvino: ovFormat(hf("plateDetection/yolox-tiny-plate/openvino/camstack-yolox-tiny-plate.xml"), 10)
798
816
  }
799
817
  }];
800
818
  var PACKAGE_DETECTION_MODELS = [{
@@ -924,7 +942,12 @@ var BIRD_CLASSIFIER_MODELS = [{
924
942
  files: [...MLPACKAGE_FILES],
925
943
  runtimes: ["python"]
926
944
  },
927
- openvino: ovFormat(hf("animalClassification/bird-classifier/openvino/bird-classifier.xml"), 14)
945
+ openvino: ovFormat(hf("animalClassification/bird-classifier/openvino/bird-classifier.xml"), 14),
946
+ tflite: {
947
+ url: hf("animalClassification/bird-classifier/tflite/bird-classifier_edgetpu.tflite"),
948
+ sizeMB: 3.9,
949
+ runtimes: ["python"]
950
+ }
928
951
  },
929
952
  extraFiles: [{
930
953
  url: hf("animalClassification/bird-classifier/onnx/bird-classifier-labels.json"),
@@ -1151,16 +1174,27 @@ var ANIMAL_10_LABELS = [
1151
1174
  "sheep",
1152
1175
  "spider"
1153
1176
  ];
1154
- var ANIMAL_CLASSIFIER_LABELS = [
1155
- "bird",
1156
- "cat",
1157
- "cow",
1158
- "deer",
1159
- "dog",
1160
- "horse",
1161
- "sheep",
1162
- "squirrel"
1163
- ];
1177
+ var ANIMAL_CLASSIFIER_LABELS = require_dist.FILLABLE_STEP_VOCABULARIES["animal-classifier"];
1178
+ var VEHICLE_CLASSIFIER_LABELS = require_dist.FILLABLE_STEP_VOCABULARIES["vehicle-classifier"];
1179
+ /**
1180
+ * The `labelLink` policy field (D715) — offered on every step a root detector
1181
+ * can fill. Stored in the step's own settings (`DeviceStepConfig.settings` /
1182
+ * `CameraStepOverridePatch.settings`), so it has ONE authority. It changes
1183
+ * nothing unless the camera's root model declares it fills this step.
1184
+ */
1185
+ function labelLinkField(stepName) {
1186
+ return {
1187
+ type: "select",
1188
+ key: require_dist.LABEL_LINK_SETTING_KEY,
1189
+ label: "When the detector already fills this step",
1190
+ description: `Only matters when the root detection model declares it fills ${stepName} (e.g. a Frigate+ model). "Skip" does not run ${stepName} for a subject the detector already named, and makes the detector's label the one answer — but only once every class the detector cannot produce is switched off in this step's class list. "Run" always runs ${stepName}; the detector's label is then a fallback any answer of the step outranks.`,
1191
+ options: require_dist.LABEL_LINK_POLICIES.map((p) => ({
1192
+ value: p,
1193
+ label: p === "run" ? "Run anyway" : "Skip when filled"
1194
+ })),
1195
+ default: require_dist.DEFAULT_LABEL_LINK_POLICY
1196
+ };
1197
+ }
1164
1198
  var VGG_G2_CHARSET = [
1165
1199
  "",
1166
1200
  ..."0123456789".split(""),
@@ -1376,27 +1410,31 @@ var AnimalClassifierStep = class {
1376
1410
  }
1377
1411
  };
1378
1412
  getConfigSchema(model) {
1379
- return [{
1380
- type: "multiselect",
1381
- key: "enabledClasses",
1382
- label: "Species",
1383
- description: "Which animal species to keep (empty = all). The classifier still scores every label but only the selected classes are returned on the detection.",
1384
- options: ANIMAL_CLASSIFIER_LABELS.map((l) => ({
1385
- value: l,
1386
- label: l
1387
- })),
1388
- default: []
1389
- }, {
1390
- type: "slider",
1391
- key: "minConfidence",
1392
- label: "Min Confidence",
1393
- description: "Drop classifications whose score is below this threshold.",
1394
- default: resolveModelDefaultConfidence(this.definition, model),
1395
- min: 0,
1396
- max: 1,
1397
- step: .05,
1398
- showValue: true
1399
- }];
1413
+ return [
1414
+ {
1415
+ type: "multiselect",
1416
+ key: "enabledClasses",
1417
+ label: "Species",
1418
+ description: "Which animal species to keep (empty = all). The classifier still scores every label but only the selected classes are returned on the detection.",
1419
+ options: ANIMAL_CLASSIFIER_LABELS.map((l) => ({
1420
+ value: l,
1421
+ label: l
1422
+ })),
1423
+ default: []
1424
+ },
1425
+ labelLinkField("the animal classifier"),
1426
+ {
1427
+ type: "slider",
1428
+ key: "minConfidence",
1429
+ label: "Min Confidence",
1430
+ description: "Drop classifications whose score is below this threshold.",
1431
+ default: resolveModelDefaultConfidence(this.definition, model),
1432
+ min: 0,
1433
+ max: 1,
1434
+ step: .05,
1435
+ showValue: true
1436
+ }
1437
+ ];
1400
1438
  }
1401
1439
  };
1402
1440
  /**
@@ -1434,7 +1472,7 @@ var PackageDetectionStep = class extends PipelineStepBase {
1434
1472
  step: .05,
1435
1473
  default: resolveModelDefaultConfidence(this.definition, model),
1436
1474
  showValue: true
1437
- }];
1475
+ }, labelLinkField("package detection")];
1438
1476
  }
1439
1477
  };
1440
1478
  var ClassifierWithMinConfidence = class extends PipelineStepBase {
@@ -1582,7 +1620,7 @@ var STEP_PLATE_DETECTION = new PipelineStepBase({
1582
1620
  inputClasses: ["vehicle"],
1583
1621
  outputClasses: ["plate"],
1584
1622
  models: [...PLATE_DETECTION_MODELS],
1585
- defaultModelId: "yolov8n-plate",
1623
+ defaultModelId: "yolox-tiny-plate",
1586
1624
  defaultConfidence: .5,
1587
1625
  defaultMinParentScore: .7,
1588
1626
  labels: ["plate"],
@@ -1649,7 +1687,32 @@ var STEP_BIRD_CLASSIFIER = new ClassifierWithMinConfidence({
1649
1687
  stickyOnConfidence: .7
1650
1688
  }
1651
1689
  });
1652
- var STEP_VEHICLE_CLASSIFIER = new ClassifierWithMinConfidence({
1690
+ /**
1691
+ * `vehicle-classifier` — the `minConfidence` slider plus the two fields a
1692
+ * root-detector fill needs (D715): the class allow-list (a coverage gap the
1693
+ * detector cannot produce, e.g. `Van` for Frigate+, is switched off HERE before
1694
+ * the skip applies) and the `labelLink` policy.
1695
+ */
1696
+ var VehicleClassifierStep = class extends ClassifierWithMinConfidence {
1697
+ getConfigSchema(model) {
1698
+ return [
1699
+ {
1700
+ type: "multiselect",
1701
+ key: "enabledClasses",
1702
+ label: "Vehicle types",
1703
+ description: "Which vehicle types to keep (empty = all). The classifier still scores every type but only the selected ones are returned on the detection.",
1704
+ options: VEHICLE_CLASSIFIER_LABELS.map((l) => ({
1705
+ value: l,
1706
+ label: l
1707
+ })),
1708
+ default: []
1709
+ },
1710
+ ...super.getConfigSchema(model),
1711
+ labelLinkField("the vehicle classifier")
1712
+ ];
1713
+ }
1714
+ };
1715
+ var STEP_VEHICLE_CLASSIFIER = new VehicleClassifierStep({
1653
1716
  id: "vehicle-classifier",
1654
1717
  name: "Vehicle Classifier",
1655
1718
  slot: "classifier",
@@ -2879,14 +2942,10 @@ var LocalFrameRegistry = class {
2879
2942
  if (entry.releaseNativeOnClose) entry.image.releaseNativeLease?.();
2880
2943
  }
2881
2944
  };
2882
- function envPositiveInt(name, fallback) {
2883
- const parsed = Number(process.env[name]);
2884
- return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
2885
- }
2886
2945
  /** Shared only by addons in the same grouped runner process. */
2887
2946
  var localFrameRegistry = new LocalFrameRegistry({
2888
- maxFrames: envPositiveInt("CAMSTACK_LOCAL_FRAME_MAX_FRAMES", DEFAULT_MAX_FRAMES),
2889
- maxBytes: envPositiveInt("CAMSTACK_LOCAL_FRAME_BUDGET_MB", DEFAULT_MAX_BYTES / 1048576) * 1048576
2947
+ maxFrames: DEFAULT_MAX_FRAMES,
2948
+ maxBytes: DEFAULT_MAX_BYTES
2890
2949
  });
2891
2950
  //#endregion
2892
2951
  //#region src/detection-pipeline/pipeline/macro-gate.ts