@camstack/addon-pipeline 1.2.293 → 1.2.295
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.
- package/THIRD_PARTY_MODELS.md +233 -0
- package/dist/audio-analyzer/index.js +2 -2
- package/dist/audio-analyzer/index.mjs +2 -2
- package/dist/{default-detection-model-DCQlW9fx.mjs → default-detection-model-CAUBVbgK.mjs} +53 -19
- package/dist/{default-detection-model-DTKHLLcC.js → default-detection-model-wNEISVA9.js} +58 -18
- package/dist/detection-pipeline/index.js +286 -458
- package/dist/detection-pipeline/index.mjs +286 -458
- package/dist/{dist-Ce8s7XqV.js → dist-BsVcf5wO.js} +1321 -833
- package/dist/{dist-C0Fr4hM5.mjs → dist-CuxSNLKW.mjs} +1316 -834
- package/dist/motion-wasm/index.js +1 -1
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/{node-Xm7amG2e.mjs → node-Cqb1QiXk.mjs} +1 -1
- package/dist/{node-DpOrymbW.js → node-UFk6I2f6.js} +1 -1
- package/dist/pipeline-runner/index.js +266 -72
- package/dist/pipeline-runner/index.mjs +266 -72
- package/dist/{process-memory-CBRjuhyg.js → process-memory-CJV29sPf.js} +1 -1
- package/dist/{process-memory-BN5qYGsD.mjs → process-memory-D0Nvs9rr.mjs} +1 -1
- package/dist/recorder/index.js +12 -2
- package/dist/recorder/index.mjs +12 -2
- package/dist/{segment-demux-js-BhMlS_Ow.js → segment-demux-js-DGwmf5hu.js} +1 -1
- package/dist/{segment-demux-js-Bhwpj5Wl.mjs → segment-demux-js-DIDWw1iE.mjs} +1 -1
- package/dist/stream-broker/_stub.js +2 -2
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DKd7oYba.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B7nBFqva.mjs} +2 -2
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CCIyBvRa.mjs +26 -0
- package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DoyA71_q.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DeD_UFdb.mjs} +1 -1
- package/dist/stream-broker/demux-worker-child.js +1 -1
- package/dist/stream-broker/demux-worker-child.mjs +1 -1
- package/dist/stream-broker/{hostInit-CCMIHjff.mjs → hostInit-BKlb3qac.mjs} +2 -2
- package/dist/stream-broker/index.js +3 -3
- package/dist/stream-broker/index.mjs +3 -3
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/package.json +3 -2
- package/python/postprocessors/__init__.py +2 -0
- package/python/postprocessors/ssd.py +73 -17
- package/python/postprocessors/test_ssd.py +205 -0
- package/python/postprocessors/test_yunet.py +292 -0
- package/python/postprocessors/testdata/ssdlite_mobiledet_outputs.json +1 -0
- package/python/postprocessors/yunet.py +275 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-6IHzlLJ_.mjs +0 -26
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
THIRD_PARTY_MODELS.md: the product notice for every model CamStack can download.
|
|
3
|
+
|
|
4
|
+
HAND-WRITTEN FOR NOW. Task 7 of docs/superpowers/plans/2026-09-26-model-license-compliance.md
|
|
5
|
+
replaces this file with generator output (scripts/gen-model-licenses.ts), built from the
|
|
6
|
+
licence records on the model catalogs. Until then this root file is the single source:
|
|
7
|
+
- packages/addon-pipeline, packages/addon-post-analysis, packages/addon-ai and server/backend
|
|
8
|
+
each carry a byte-identical COPY (npm cannot ship a file from outside the package).
|
|
9
|
+
Edit this root file, then copy it: for d in packages/addon-pipeline packages/addon-post-analysis
|
|
10
|
+
packages/addon-ai server/backend; do cp THIRD_PARTY_MODELS.md "$d/"; done
|
|
11
|
+
scripts/check-model-notices-shipped.ts fails CI when a copy drifts.
|
|
12
|
+
- The Hugging Face mirror (camstack/camstack-models) receives this same file, staged by
|
|
13
|
+
hf/camstack-models/upload.sh. Its model card points at the "Source offer" section below.
|
|
14
|
+
Facts: docs/superpowers/specs/2026-09-26-model-license-compliance.md (verified 2026-09-26).
|
|
15
|
+
Not legal advice.
|
|
16
|
+
-->
|
|
17
|
+
|
|
18
|
+
# Third-party models
|
|
19
|
+
|
|
20
|
+
CamStack's own source code is MIT-licensed (see `LICENSE`). CamStack does not
|
|
21
|
+
include model weights in its npm packages or its Docker image. It downloads
|
|
22
|
+
them, on demand, from the locations listed below. **Each model stays under its
|
|
23
|
+
own licence.** Converting a model to another format does not change its
|
|
24
|
+
licence: every CamStack-made build is a modified version (a "model derivative")
|
|
25
|
+
of the upstream weights, and the change is stated per model.
|
|
26
|
+
|
|
27
|
+
Full licence texts: `licenses/models/` in the CamStack source repository, and
|
|
28
|
+
[`LICENSES/`](https://huggingface.co/camstack/camstack-models/tree/main/LICENSES)
|
|
29
|
+
in the model mirror https://huggingface.co/camstack/camstack-models.
|
|
30
|
+
|
|
31
|
+
Some of these models are **not licensed for commercial use**. They are listed
|
|
32
|
+
under [Non-commercial models](#non-commercial-models).
|
|
33
|
+
|
|
34
|
+
## Required attributions
|
|
35
|
+
|
|
36
|
+
- **Ultralytics YOLO26, YOLOv9 and YOLOv8** — © Ultralytics. Licensed under
|
|
37
|
+
AGPL-3.0 (`AGPL-3.0.txt`). See the [source offer](#source-offer-for-the-agpl-30-weights).
|
|
38
|
+
https://github.com/ultralytics/ultralytics
|
|
39
|
+
- **YOLOv9** (architecture) — Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao,
|
|
40
|
+
GPL-3.0 (`GPL-3.0.txt`). https://github.com/WongKinYiu/yolov9
|
|
41
|
+
- **SCRFD / InsightFace** — code MIT. The pretrained weights are released by
|
|
42
|
+
InsightFace for non-commercial research purposes only (`InsightFace-terms.txt`).
|
|
43
|
+
https://github.com/deepinsight/insightface
|
|
44
|
+
- **MobileCLIP** — © Apple Inc. *Apple Machine Learning Research Model is
|
|
45
|
+
licensed under the Apple Machine Learning Research Model License Agreement.*
|
|
46
|
+
(`Apple-AMLR.txt`). CamStack's MobileCLIP files are **Model Derivatives**:
|
|
47
|
+
the image encoders are converted to OpenVINO IR and CoreML at FP16; the text
|
|
48
|
+
encoders are quantised to INT8 ONNX and converted to OpenVINO IR.
|
|
49
|
+
https://github.com/apple/ml-mobileclip
|
|
50
|
+
- **Llama 3.2** — **Built with Llama.** Llama 3.2 is licensed under the Llama
|
|
51
|
+
3.2 Community License, Copyright © Meta Platforms, Inc. All Rights Reserved.
|
|
52
|
+
(`Llama-3.2-Community.txt`; Acceptable Use Policy:
|
|
53
|
+
https://www.llama.com/llama3_2/use-policy)
|
|
54
|
+
- **fast-plate-ocr** — Copyright (c) 2024 ankandrew, MIT (`MIT-fast-plate-ocr.txt`).
|
|
55
|
+
https://github.com/ankandrew/fast-plate-ocr
|
|
56
|
+
- **RF-DETR** — © Roboflow, Apache-2.0. https://github.com/roboflow/rf-detr
|
|
57
|
+
- **YuNet** — weights Copyright (c) 2020 Shiqi Yu, MIT (`MIT-yunet-reference.txt`).
|
|
58
|
+
https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet ·
|
|
59
|
+
[license](https://github.com/opencv/opencv_zoo/blob/main/models/face_detection_yunet/LICENSE).
|
|
60
|
+
Training code BSD-3-Clause (`BSD-3-Clause.txt`),
|
|
61
|
+
https://github.com/ShiqiYu/libfacedetection.train.
|
|
62
|
+
Trained on WIDER FACE, whose images are CC BY-NC-ND.
|
|
63
|
+
- **AuraFace v1** — fal.ai, Apache-2.0. https://huggingface.co/fal/AuraFace-v1
|
|
64
|
+
- **EasyOCR** — JaidedAI, Apache-2.0. https://github.com/JaidedAI/EasyOCR
|
|
65
|
+
- **U²-Net** — Xuebin Qin et al., Apache-2.0. https://github.com/xuebinqin/U-2-Net
|
|
66
|
+
- **YAMNet** — © Google LLC, Apache-2.0.
|
|
67
|
+
https://github.com/tensorflow/models/tree/master/research/audioset/yamnet
|
|
68
|
+
- **AIY Vision Birds V1** and the **Coral Edge TPU models** — © Google LLC,
|
|
69
|
+
Apache-2.0. https://github.com/google-coral/test_data
|
|
70
|
+
- **EfficientNet-Lite0** via **timm** — Ross Wightman, Apache-2.0.
|
|
71
|
+
https://github.com/huggingface/pytorch-image-models
|
|
72
|
+
- **torchvision MobileNetV3** — BSD-3-Clause (`BSD-3-Clause.txt`). https://github.com/pytorch/vision
|
|
73
|
+
- **Scrypted plugin models** — Koushik Dutta, repository tagged MIT
|
|
74
|
+
(`MIT-scrypted-plugin-models.txt`). https://huggingface.co/scrypted/plugin-models
|
|
75
|
+
- **Qwen2.5, Qwen3-VL, Qwen3.6** — Alibaba Cloud, Apache-2.0. https://huggingface.co/Qwen
|
|
76
|
+
- **Open Images V7** (animal-classifier training data) — annotations © Google
|
|
77
|
+
LLC, licensed under CC BY 4.0 (`CC-BY-4.0.txt`). Images are listed by Google
|
|
78
|
+
as CC BY 2.0, without warranty.
|
|
79
|
+
https://storage.googleapis.com/openimages/web/factsfigures_v7.html
|
|
80
|
+
- **Vehicle classification dataset** (vehicle-type-v1 training data) — by
|
|
81
|
+
DrBimmer, https://huggingface.co/datasets/DrBimmer/vehicle-classification,
|
|
82
|
+
licensed under CC BY-NC 4.0 (`CC-BY-NC-4.0.txt`). CamStack fine-tuned a model
|
|
83
|
+
on it; the resulting weights are treated as non-commercial.
|
|
84
|
+
- **AudioSet** ontology and labels (YAMNet) — © Google LLC, CC BY 4.0.
|
|
85
|
+
https://research.google.com/audioset/
|
|
86
|
+
- **COCO** annotations (YOLO pretraining) — COCO Consortium, CC BY 4.0. Images
|
|
87
|
+
remain under the terms of their Flickr owners. https://cocodataset.org/#termsofuse
|
|
88
|
+
|
|
89
|
+
## Source offer for the AGPL-3.0 weights
|
|
90
|
+
|
|
91
|
+
<!--
|
|
92
|
+
This section is the ONE place the source offer is written. The package copies are
|
|
93
|
+
byte-identical copies of this file, and the Hugging Face model card, its LICENSE and its folder
|
|
94
|
+
cards link here instead of repeating it.
|
|
95
|
+
-->
|
|
96
|
+
|
|
97
|
+
The folders `objectDetection/yolo26`, `objectDetection/yolov9`,
|
|
98
|
+
`segmentation/yolo26-seg`, `plateDetection/yolov8-plate` and
|
|
99
|
+
`packageDetection/yolov8-package` of the model mirror hold Ultralytics weights,
|
|
100
|
+
modified by CamStack and distributed under AGPL-3.0. Their Corresponding Source
|
|
101
|
+
is the public CamStack source repository, **https://github.com/camstack/server**
|
|
102
|
+
(MIT), together with the upstream checkpoints it starts from:
|
|
103
|
+
|
|
104
|
+
1. **The upstream checkpoints**, published by Ultralytics at
|
|
105
|
+
https://github.com/ultralytics/assets/releases: `yolo26{n,s,m,l,x}.pt`,
|
|
106
|
+
`yolov9{t,s,m,c}.pt`, `yolo26{n,s,m}-seg.pt`.
|
|
107
|
+
2. **The export scripts** in https://github.com/camstack/server:
|
|
108
|
+
`scripts/build-camstack-models.py` (ONNX with a dynamic batch axis, CoreML
|
|
109
|
+
FP16, OpenVINO IR, OpenVINO NNCF INT8) and `scripts/export-models.py`. The
|
|
110
|
+
build instructions (Python environment, invocation, calibration images for
|
|
111
|
+
INT8) are in each script's header.
|
|
112
|
+
3. **The software** that downloads and runs these weights, CamStack itself, is
|
|
113
|
+
the same repository.
|
|
114
|
+
|
|
115
|
+
What the repository does **not** cover yet:
|
|
116
|
+
|
|
117
|
+
- **Some hosted sizes and input resolutions.** The export scripts do not list
|
|
118
|
+
every variant in the mirror (for example the `-320`/`-256` YOLO26 exports,
|
|
119
|
+
`yolov9m`/`yolov9c`, and the `yolo26*-seg` models). Each one is the same
|
|
120
|
+
Ultralytics `export()` with a different model id or `imgsz`, but no script in
|
|
121
|
+
the repository reproduces it as-is.
|
|
122
|
+
- **`yolov8n-plate` has no training checkpoint.** It is a third-party model
|
|
123
|
+
(trained 2023-12-05 according to its own metadata, origin not identified).
|
|
124
|
+
The ONNX file is the only form CamStack has.
|
|
125
|
+
- **The `yolov8n-package` checkpoint is not published yet.** CamStack
|
|
126
|
+
fine-tuned it with Ultralytics.
|
|
127
|
+
|
|
128
|
+
## Non-commercial models
|
|
129
|
+
|
|
130
|
+
These are downloaded by default or selectable, and their terms **do not allow
|
|
131
|
+
commercial use**:
|
|
132
|
+
|
|
133
|
+
| Model | Terms |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| `scrfd-2.5g` (face detection, selectable, not the default since 2026-09-26) | InsightFace pretrained models: non-commercial research purposes only |
|
|
136
|
+
| `mobileclip-s1`, `mobileclip-s2`, `mobileclip-s1-text`, `mobileclip-s2-text` (semantic search, `mobileclip-s1` default) | Apple Machine Learning Research Model License: research purposes only, no commercial product or service |
|
|
137
|
+
| `vehicle-type-v1` (vehicle classifier) | trained on a CC BY-NC 4.0 dataset; weights treated as non-commercial |
|
|
138
|
+
| `bird-nabirds-404` (hidden, pending removal) | NABirds: no reproduction, distribution or products without the Cornell Lab's written permission |
|
|
139
|
+
|
|
140
|
+
## Models
|
|
141
|
+
|
|
142
|
+
"Mirror" means https://huggingface.co/camstack/camstack-models, folder given.
|
|
143
|
+
"Code / weights" gives the two licences separately because they often differ.
|
|
144
|
+
**Unknown** means no licence could be traced; it does not mean free to use.
|
|
145
|
+
|
|
146
|
+
### Object detection
|
|
147
|
+
|
|
148
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
149
|
+
| --- | --- | --- | --- | --- | --- |
|
|
150
|
+
| `yolo26n`, `yolo26s`, `yolo26m`, `yolo26l`, `yolo26x`, with every `-fp16`, `-int8`, `-320`, `-256`, `-320-int8`, `-256-int8` variant | Ultralytics YOLO26, COCO-pretrained | AGPL-3.0 / AGPL-3.0 | COCO 2017 (annotations CC BY 4.0) | exported to ONNX, OpenVINO IR (FP32/FP16) and CoreML FP16; `-320`/`-256` re-exported at that input size; `-int8` OpenVINO NNCF post-training INT8 | Mirror `objectDetection/yolo26` |
|
|
151
|
+
| `yolov9{t,s,m,c}-320`, `yolov9{t,s,m,c}-640`, and their `-int8` twins | Ultralytics YOLOv9 weights, COCO-pretrained; architecture by WongKinYiu | AGPL-3.0 / AGPL-3.0 (original YOLOv9 repository GPL-3.0) | COCO 2017 | exported to ONNX, OpenVINO IR FP16 and CoreML at 320 and 640; `-int8` NNCF INT8 | Mirror `objectDetection/yolov9` |
|
|
152
|
+
| `ssd-mobilenet-v2-coco-edgetpu`, `efficientdet-lite0-edgetpu` | Google Coral `test_data` | Apache-2.0 / Apache-2.0 | COCO | none | https://github.com/google-coral/test_data |
|
|
153
|
+
| `ssdlite-mobiledet-coco-edgetpu` (selectable, not the default) | Google Coral `test_data`, `ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite` (sha256 `b69e508e…434a2e`); MobileDets (Xiong et al., CVPR 2021) trained with the TensorFlow Object Detection API, https://github.com/tensorflow/models/tree/master/research/object_detection | Apache-2.0 / Apache-2.0 (`Apache-2.0.txt`; https://github.com/google-coral/test_data/blob/master/LICENSE) | COCO 2017 (annotations CC BY 4.0, images under Flickr terms) | none: mirrored byte for byte, with the CPU build and `coco_labels.txt` beside it (`scripts/build-ssdlite-mobiledet-model.py`) | Mirror `objectDetection/ssdlite-mobiledet` |
|
|
154
|
+
|
|
155
|
+
### Package detection
|
|
156
|
+
|
|
157
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
158
|
+
| --- | --- | --- | --- | --- | --- |
|
|
159
|
+
| `rfdetr-package` | Roboflow RF-DETR-M | Apache-2.0 / Apache-2.0 | fine-tuning set not recorded (unverified) | fine-tuned to 2 classes at 576; exported to ONNX, OpenVINO IR and CoreML; training checkpoint `.pth` also published | Mirror `packageDetection/rfdetr-package` |
|
|
160
|
+
| `yolov8n-package` | Ultralytics YOLOv8n | AGPL-3.0 / AGPL-3.0 | most likely Roboflow Universe `package-at-front-door` (unverified) | fine-tuned by CamStack with Ultralytics; exported to ONNX, OpenVINO IR and CoreML | Mirror `packageDetection/yolov8-package` |
|
|
161
|
+
|
|
162
|
+
### Face detection
|
|
163
|
+
|
|
164
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
165
|
+
| --- | --- | --- | --- | --- | --- |
|
|
166
|
+
| `scrfd-2.5g` | InsightFace SCRFD 2.5G (bnkps), via the ONNX re-upload `RuteNL/SCRFD-face-detection-ONNX` | MIT / **InsightFace: non-commercial research only** | WIDER FACE (research-oriented terms) | converted to OpenVINO IR and CoreML FP16 | Mirror `faceDetection/scrfd` |
|
|
167
|
+
| `yunet-2023mar` (face-detection default since 2026-09-26) | OpenCV Zoo YuNet 2023mar, `face_detection_yunet_2023mar.onnx` (fp32), https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet | BSD-3-Clause (training code, https://github.com/ShiqiYu/libfacedetection.train; `BSD-3-Clause.txt`) / MIT, Copyright (c) 2020 Shiqi Yu (opencv_zoo; `MIT-yunet-reference.txt`; https://github.com/opencv/opencv_zoo/blob/main/models/face_detection_yunet/LICENSE) | WIDER FACE (images CC BY-NC-ND) | input contract baked into the graph: the pool's RGB /255 becomes the upstream BGR 0..255 (`Mul(255)` plus a channel `Gather`); internal tensor names cleared in the OpenVINO IR; ONNX fp32, OpenVINO IR fp32, CoreML fp16 (`scripts/build-yunet-model.py`) | Mirror `faceDetection/yunet` |
|
|
168
|
+
| `scrypted-yolov9t-face` (retired from the catalog, D643; nothing downloads it) | Scrypted `plugin-models` (YOLOv9t ReLU face) | repository tagged MIT; YOLOv9 architecture GPL-3.0 upstream / **Unknown** per model | unknown | OpenVINO IR converted by CamStack | its OpenVINO IR is still on mirror `faceDetection/scrypted-yolov9-face` |
|
|
169
|
+
| `ssd-mobilenet-v2-face-edgetpu` (hidden) | Google Coral `test_data` | Apache-2.0 / Apache-2.0 | — | none | https://github.com/google-coral/test_data |
|
|
170
|
+
|
|
171
|
+
### Face recognition
|
|
172
|
+
|
|
173
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
174
|
+
| --- | --- | --- | --- | --- | --- |
|
|
175
|
+
| `arcface-r100` (a ResNet34) | re-upload `onnx-community/arcface-onnx` (itself pointing at `garavv/arcface-onnx`); original author not stated | **Unknown** / **Unknown** | not stated | converted to OpenVINO IR and CoreML FP16 | Mirror `faceRecognition/arcface` |
|
|
176
|
+
| `auraface-r100` | fal.ai AuraFace v1 (`glintr100.onnx` only) | Apache-2.0 / Apache-2.0 | stated upstream as commercially and publicly available sources | input scaling `y = 2x - 1` baked ahead of the first Conv (`scripts/build-auraface-model.py`); converted to OpenVINO IR and CoreML FP16 | Mirror `faceRecognition/auraface` |
|
|
177
|
+
| `inception-resnet-v1` | Scrypted `plugin-models` | repository tagged MIT / **Unknown** per model | not stated | OpenVINO IR converted by CamStack | ONNX and CoreML: https://huggingface.co/scrypted/plugin-models · OpenVINO: mirror `faceRecognition/inception-resnet-v1` |
|
|
178
|
+
|
|
179
|
+
### Licence plate detection and OCR
|
|
180
|
+
|
|
181
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
182
|
+
| --- | --- | --- | --- | --- | --- |
|
|
183
|
+
| `yolov8n-plate` | Ultralytics YOLOv8n fine-tuned for plates by a third party (trained 2023-12-05 per its metadata) | AGPL-3.0 / AGPL-3.0 | **unknown** | converted to OpenVINO IR, CoreML and TFLite fp32 (`tflite/camstack-yolov8n-plate_float32.tflite`, mirrored but not referenced by the catalog) | Mirror `plateDetection/yolov8-plate` |
|
|
184
|
+
| `cct-s-v2-global` | `ankandrew/fast-plate-ocr` release model | MIT / MIT | private, not released upstream | input head removed (recorded in the ONNX `doc_string`); converted to OpenVINO IR and CoreML | Mirror `plateRecognition/cct-s-v2-global` |
|
|
185
|
+
| `vgg-english-g2` | JaidedAI EasyOCR, via Scrypted `plugin-models` | Apache-2.0 / Apache-2.0 | — | OpenVINO IR converted by CamStack | ONNX and CoreML: https://huggingface.co/scrypted/plugin-models · OpenVINO: mirror `plateRecognition/vgg_english_g2` |
|
|
186
|
+
|
|
187
|
+
### Classifiers
|
|
188
|
+
|
|
189
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
190
|
+
| --- | --- | --- | --- | --- | --- |
|
|
191
|
+
| `animal-classifier` | timm EfficientNet-Lite0 | Apache-2.0 / Apache-2.0 | Open Images V7 animal subset (annotations CC BY 4.0, © Google LLC) | fine-tuned by CamStack (8 classes); exported to ONNX, OpenVINO IR and CoreML | Mirror `animalClassification/animal-classifier` |
|
|
192
|
+
| `animals-10` (hidden, pending removal) | origin not identified | **Unknown** / **Unknown** | unknown | converted to ONNX, OpenVINO IR and CoreML | Mirror `animalClassification/animals-10` |
|
|
193
|
+
| `bird-classifier` | Google AIY Vision `birds_V1` | Apache-2.0 / Apache-2.0 | — | converted from TensorFlow with tf2onnx; OpenVINO IR and CoreML derived from it | Mirror `animalClassification/bird-classifier` |
|
|
194
|
+
| `bird-classifier-aiy-edgetpu` (hidden) | Google Coral `test_data` | Apache-2.0 / Apache-2.0 | — | none | https://github.com/google-coral/test_data |
|
|
195
|
+
| `bird-nabirds-404` (hidden, pending removal) | ResNet50 trained on NABirds (origin not recorded) | **Unknown** / NABirds: no products without Cornell Lab permission | NABirds (Cornell Lab of Ornithology) | converted to ONNX, OpenVINO IR and CoreML | Mirror `animalClassification/bird-nabirds` |
|
|
196
|
+
| `vehicle-type-v1` | torchvision MobileNetV3-Large | BSD-3-Clause / **CC BY-NC 4.0** (from its data) | DrBimmer `vehicle-classification`, CC BY-NC 4.0 | fine-tuned by CamStack (8 classes); exported to ONNX, OpenVINO IR and CoreML | Mirror `vehicleClassification/vehicle-type-v1` |
|
|
197
|
+
| `vehicle-type-efficientnet` (hidden, pending removal) | trained on VMMRdb (origin not recorded) | **Unknown** / VMMRdb terms unverified | VMMRdb | converted to ONNX, OpenVINO IR and CoreML | Mirror `vehicleClassification/efficientnet` |
|
|
198
|
+
|
|
199
|
+
### Semantic search (CLIP)
|
|
200
|
+
|
|
201
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
202
|
+
| --- | --- | --- | --- | --- | --- |
|
|
203
|
+
| `mobileclip-s1`, `mobileclip-s2` (image) | Apple `ml-mobileclip` | MIT / **Apple Machine Learning Research Model License** | per Apple | Model Derivative: converted to OpenVINO IR and CoreML FP16 | Mirror `clip/mobileclip-s1`, `clip/mobileclip-s2` |
|
|
204
|
+
| `mobileclip-s1-text`, `mobileclip-s2-text` | Apple `ml-mobileclip`, with the CLIP tokenizer | MIT / **Apple Machine Learning Research Model License** | per Apple | Model Derivative: quantised to INT8 ONNX and converted to OpenVINO IR | Mirror `clip/mobileclip-s1`, `clip/mobileclip-s2` |
|
|
205
|
+
|
|
206
|
+
### Segmentation
|
|
207
|
+
|
|
208
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
209
|
+
| --- | --- | --- | --- | --- | --- |
|
|
210
|
+
| `u2netp` | `xuebinqin/U-2-Net` | Apache-2.0 / Apache-2.0 | DUTS-TR (terms not checked) | converted to ONNX, OpenVINO IR and CoreML | Mirror `segmentationRefiner/u2netp` |
|
|
211
|
+
| `yolo26n-seg`, `yolo26s-seg`, `yolo26m-seg` | Ultralytics YOLO26-seg, COCO-pretrained | AGPL-3.0 / AGPL-3.0 | COCO 2017 | exported to ONNX, OpenVINO IR and CoreML | Mirror `segmentation/yolo26-seg` |
|
|
212
|
+
|
|
213
|
+
### Audio
|
|
214
|
+
|
|
215
|
+
| Catalog ids | Upstream | Code / weights | Training data | CamStack changes | Downloaded from |
|
|
216
|
+
| --- | --- | --- | --- | --- | --- |
|
|
217
|
+
| `yamnet-onnx` | `tensorflow/models` `research/audioset/yamnet` | Apache-2.0 / Apache-2.0 | AudioSet (labels CC BY 4.0, © Google LLC) | converted from TensorFlow with tf2onnx; OpenVINO IR derived from it | Mirror `audioClassification/yamnet` |
|
|
218
|
+
| `apple-soundanalysis` | Apple SoundAnalysis, built into macOS | under Apple's macOS licence | — | nothing downloaded | built in |
|
|
219
|
+
|
|
220
|
+
### Language and vision-language models (AI addon, not hosted by CamStack)
|
|
221
|
+
|
|
222
|
+
| Catalog ids | Upstream | Code / weights | CamStack changes | Downloaded from |
|
|
223
|
+
| --- | --- | --- | --- | --- |
|
|
224
|
+
| `llm-qwen2.5-1.5b-instruct-q4` | Qwen2.5 1.5B Instruct | — / Apache-2.0 | none (GGUF Q4_K_M by Qwen) | https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF |
|
|
225
|
+
| `llm-llama3.2-3b-instruct-q4` | Meta Llama 3.2 3B Instruct | — / Llama 3.2 Community License | none by CamStack (GGUF Q4_K_M by bartowski) | https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF |
|
|
226
|
+
| `llm-qwen3-vl-2b-instruct-q4`, `llm-qwen3-vl-4b-instruct-q4`, `llm-qwen3-vl-8b-instruct-q4` | Qwen3-VL Instruct | — / Apache-2.0 | none by CamStack (GGUF by unsloth) | https://huggingface.co/unsloth (`Qwen3-VL-{2B,4B,8B}-Instruct-GGUF`) |
|
|
227
|
+
| `llm-qwen3.6-35b-a3b-ud-q4` | Qwen3.6 35B-A3B | — / Apache-2.0 | none by CamStack (GGUF UD-Q4_K_M by unsloth) | https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF |
|
|
228
|
+
|
|
229
|
+
### Your own models
|
|
230
|
+
|
|
231
|
+
A model you import through Model Studio (uploaded, converted, or pulled from
|
|
232
|
+
Frigate+ or Scrypted) keeps whatever licence its author published. CamStack
|
|
233
|
+
does not change it and does not record 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-
|
|
7
|
-
const require_process_memory = require("../process-memory-
|
|
6
|
+
const require_dist = require("../dist-BsVcf5wO.js");
|
|
7
|
+
const require_process_memory = require("../process-memory-CJV29sPf.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 {
|
|
3
|
-
import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-
|
|
2
|
+
import { E as HF_BASE_URL, G as audioAnalyzerCapability, Rn as EventCategory, W as audioAnalysisCapability, Wt as resolvePoolMemoryPolicy, _n as hydrateSchema, bt as mapAudioLabelToMacro, en as errMsg, f as DEFAULT_AUDIO_ANALYZER_CONFIG, fn as audioChunkBytesPerSample, gn as expandAudioChunkToF32le, j as PoolMemoryWatchdog, n as AUDIO_BACKEND_CHOICES, sn as BaseAddon, xn as nodePin } from "../dist-CuxSNLKW.mjs";
|
|
3
|
+
import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-D0Nvs9rr.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
|
-
import {
|
|
1
|
+
import { K as audioKindId, d as COCO_TO_MACRO, ht as hfModelUrl, r as AUDIO_MACRO_LABELS, u as COCO_80_LABELS } from "./dist-CuxSNLKW.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
//#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
|
|
4
4
|
/**
|
|
@@ -384,6 +384,24 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
384
384
|
runtimes: ["python"]
|
|
385
385
|
} }
|
|
386
386
|
},
|
|
387
|
+
{
|
|
388
|
+
id: "ssdlite-mobiledet-coco-edgetpu",
|
|
389
|
+
name: "SSDLite MobileDet (Coral)",
|
|
390
|
+
description: "SSDLite MobileDet COCO (QAT) — EdgeTPU-compiled full-integer TFLite, 320×320; runs on the Coral USB Edge TPU. More accurate than SSD MobileNet V2 (32.9 vs 25.6 % COCO mAP, Coral-published). Scores top out near 0.77.",
|
|
391
|
+
inputSize: {
|
|
392
|
+
width: 320,
|
|
393
|
+
height: 320
|
|
394
|
+
},
|
|
395
|
+
labels: [],
|
|
396
|
+
preprocessMode: "letterbox",
|
|
397
|
+
postprocessor: "ssd",
|
|
398
|
+
license: "Apache-2.0",
|
|
399
|
+
formats: { tflite: {
|
|
400
|
+
url: hf("objectDetection/ssdlite-mobiledet/edgetpu/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite"),
|
|
401
|
+
sizeMB: 5.1,
|
|
402
|
+
runtimes: ["python"]
|
|
403
|
+
} }
|
|
404
|
+
},
|
|
387
405
|
ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "fp16", 5, true),
|
|
388
406
|
ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "int8", 3),
|
|
389
407
|
ovPrecisionVariant("yolo26s", "objectDetection/yolo26/openvino", "YOLO26 Small", "fp16", 19, true),
|
|
@@ -491,6 +509,17 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
491
509
|
ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "fp16", 112, true),
|
|
492
510
|
ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "int8", 56, true)
|
|
493
511
|
];
|
|
512
|
+
/**
|
|
513
|
+
* Model ids REMOVED from a step's catalog, per step id (D643).
|
|
514
|
+
*
|
|
515
|
+
* Not the same as `legacy` (still in the catalog, still runnable when chosen):
|
|
516
|
+
* a retired id has nothing to download and nothing that can parse it. It is
|
|
517
|
+
* listed rather than simply deleted because `resolveModelForFormat` passes an
|
|
518
|
+
* id the catalog does not know through UNCHANGED — it reads as an operator's
|
|
519
|
+
* custom model — so a saved pin would keep naming a model no node can load.
|
|
520
|
+
* A retired id resolves to the step's format default instead.
|
|
521
|
+
*/
|
|
522
|
+
var RETIRED_MODEL_IDS = { "face-detection": ["scrypted-yolov9t-face"] };
|
|
494
523
|
var FACE_DETECTION_MODELS = [
|
|
495
524
|
{
|
|
496
525
|
id: "scrfd-2.5g",
|
|
@@ -523,32 +552,33 @@ var FACE_DETECTION_MODELS = [
|
|
|
523
552
|
}
|
|
524
553
|
},
|
|
525
554
|
{
|
|
526
|
-
id: "
|
|
527
|
-
name: "
|
|
528
|
-
description: "
|
|
555
|
+
id: "yunet-2023mar",
|
|
556
|
+
name: "YuNet 2023mar",
|
|
557
|
+
description: "YuNet (OpenCV Zoo, 2023mar) — tiny face detector with 5 keypoints, MIT weights (WIDER FACE AP 0.884/0.866/0.750). ~0.2 MB. Trained on WIDER FACE (CC BY-NC-ND images).",
|
|
529
558
|
inputSize: {
|
|
530
|
-
width:
|
|
531
|
-
height:
|
|
559
|
+
width: 640,
|
|
560
|
+
height: 640
|
|
532
561
|
},
|
|
533
562
|
labels: [{
|
|
534
563
|
id: "face",
|
|
535
564
|
name: "Face"
|
|
536
565
|
}],
|
|
537
566
|
preprocessMode: "letterbox",
|
|
538
|
-
|
|
567
|
+
postprocessor: "yunet",
|
|
568
|
+
license: "MIT",
|
|
539
569
|
formats: {
|
|
540
570
|
onnx: {
|
|
541
|
-
url:
|
|
542
|
-
sizeMB:
|
|
571
|
+
url: hf("faceDetection/yunet/onnx/camstack-yunet-2023mar.onnx"),
|
|
572
|
+
sizeMB: .23
|
|
543
573
|
},
|
|
544
574
|
coreml: {
|
|
545
|
-
url:
|
|
546
|
-
sizeMB:
|
|
575
|
+
url: hf("faceDetection/yunet/coreml/camstack-yunet-2023mar.mlpackage"),
|
|
576
|
+
sizeMB: .2,
|
|
547
577
|
isDirectory: true,
|
|
548
578
|
files: [...MLPACKAGE_FILES],
|
|
549
579
|
runtimes: ["python"]
|
|
550
580
|
},
|
|
551
|
-
openvino: ovFormat(hf("faceDetection/
|
|
581
|
+
openvino: ovFormat(hf("faceDetection/yunet/openvino/camstack-yunet-2023mar.xml"), .36)
|
|
552
582
|
}
|
|
553
583
|
},
|
|
554
584
|
{
|
|
@@ -1595,7 +1625,8 @@ var STEP_FACE_DETECTION = new PipelineStepBase({
|
|
|
1595
1625
|
inputClasses: ["person"],
|
|
1596
1626
|
outputClasses: ["face"],
|
|
1597
1627
|
models: [...FACE_DETECTION_MODELS],
|
|
1598
|
-
defaultModelId: "
|
|
1628
|
+
defaultModelId: "yunet-2023mar",
|
|
1629
|
+
defaultModelIdByFormat: { tflite: "scrfd-2.5g" },
|
|
1599
1630
|
defaultConfidence: .5,
|
|
1600
1631
|
defaultMinParentScore: .7,
|
|
1601
1632
|
cadence: {
|
|
@@ -1840,11 +1871,12 @@ function getStepDefinition(stepId) {
|
|
|
1840
1871
|
* has a build for `format`.
|
|
1841
1872
|
* 2. `def.defaultModelId` — the step's plain declared default — if it
|
|
1842
1873
|
* exists in `def.models` AND has a build for `format`.
|
|
1843
|
-
* 3. The smallest-by-size model among those with a `format`
|
|
1844
|
-
* (
|
|
1874
|
+
* 3. The smallest-by-size NON-legacy model among those with a `format`
|
|
1875
|
+
* build (fallback, preserved for steps/formats with no declared
|
|
1845
1876
|
* preference reachable).
|
|
1846
|
-
* 4.
|
|
1847
|
-
*
|
|
1877
|
+
* 4. When NO non-legacy model has a `format` build — an unloadable case
|
|
1878
|
+
* flagged elsewhere, not resolved here — the declared per-format id if
|
|
1879
|
+
* there is one, else `def.defaultModelId`, unchanged.
|
|
1848
1880
|
*/
|
|
1849
1881
|
function getDefaultModelForFormat(stepId, format) {
|
|
1850
1882
|
return getDefaultModelForFormatFromDef(getStepDefinition(stepId), format);
|
|
@@ -1862,7 +1894,7 @@ function getDefaultModelForFormatFromDef(def, format) {
|
|
|
1862
1894
|
if (declaredForFormat !== void 0 && hasFormatBuild(declaredForFormat)) return declaredForFormat;
|
|
1863
1895
|
if (hasFormatBuild(def.defaultModelId)) return def.defaultModelId;
|
|
1864
1896
|
const available = def.models.filter((m) => m.formats[format] && m.legacy !== true);
|
|
1865
|
-
if (available.length === 0) return def.defaultModelId;
|
|
1897
|
+
if (available.length === 0) return declaredForFormat ?? def.defaultModelId;
|
|
1866
1898
|
return [...available].toSorted((a, b) => {
|
|
1867
1899
|
return (a.formats[format]?.sizeMB ?? Infinity) - (b.formats[format]?.sizeMB ?? Infinity);
|
|
1868
1900
|
})[0].id;
|
|
@@ -1877,6 +1909,7 @@ function getDefaultModelForFormatFromDef(def, format) {
|
|
|
1877
1909
|
* - chosen is a catalog model → keep it if it has a `format` build; else
|
|
1878
1910
|
* the addon's default model for `format`
|
|
1879
1911
|
* (a substitution — the caller surfaces it).
|
|
1912
|
+
* - chosen is RETIRED (`RETIRED_MODEL_IDS`) → the format default (D643).
|
|
1880
1913
|
* - chosen is NOT in the catalog (custom/unknown) → returned unchanged; the
|
|
1881
1914
|
* operator owns a custom model's format compat.
|
|
1882
1915
|
* - unknown stepId → chosen returned unchanged (never throws).
|
|
@@ -1889,6 +1922,7 @@ function resolveModelForFormat(stepId, chosenModelId, format) {
|
|
|
1889
1922
|
return chosenModelId ?? "";
|
|
1890
1923
|
}
|
|
1891
1924
|
if (chosenModelId === null) return getDefaultModelForFormat(stepId, format);
|
|
1925
|
+
if (RETIRED_MODEL_IDS[stepId]?.includes(chosenModelId) === true) return getDefaultModelForFormat(stepId, format);
|
|
1892
1926
|
const entry = def.models.find((m) => m.id === chosenModelId);
|
|
1893
1927
|
if (!entry) return chosenModelId;
|
|
1894
1928
|
if (entry.formats[format]) return chosenModelId;
|
|
@@ -2226,4 +2260,4 @@ function resolveDefaultDetectionModel(backend, device, format, getStepDef = getS
|
|
|
2226
2260
|
return getDefaultModelForFormatFromDef(def, format);
|
|
2227
2261
|
}
|
|
2228
2262
|
//#endregion
|
|
2229
|
-
export { localFrameRegistry as a, ALL_STEPS as c, getStepDefinition as d, resolveModelForFormat as f, rootObjectGate as i, getDefaultModelForFormat as l, resolveDefaultDetectionModel as n, resolveFrameViewGeometry as o,
|
|
2263
|
+
export { localFrameRegistry as a, ALL_STEPS as c, getStepDefinition as d, resolveModelForFormat as f, rootObjectGate as i, getDefaultModelForFormat as l, landmarkPrecisionVerdict as m, resolveDefaultDetectionModel as n, resolveFrameViewGeometry as o, RETIRED_MODEL_IDS as p, macroGateVerdict as r, ALL_PIPELINE_STEPS as s, OBJECT_DETECTION_STEP_ID as t, getStep as u };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_dist = require("./dist-
|
|
1
|
+
const require_dist = require("./dist-BsVcf5wO.js");
|
|
2
2
|
let node_crypto = require("node:crypto");
|
|
3
3
|
//#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
|
|
4
4
|
/**
|
|
@@ -384,6 +384,24 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
384
384
|
runtimes: ["python"]
|
|
385
385
|
} }
|
|
386
386
|
},
|
|
387
|
+
{
|
|
388
|
+
id: "ssdlite-mobiledet-coco-edgetpu",
|
|
389
|
+
name: "SSDLite MobileDet (Coral)",
|
|
390
|
+
description: "SSDLite MobileDet COCO (QAT) — EdgeTPU-compiled full-integer TFLite, 320×320; runs on the Coral USB Edge TPU. More accurate than SSD MobileNet V2 (32.9 vs 25.6 % COCO mAP, Coral-published). Scores top out near 0.77.",
|
|
391
|
+
inputSize: {
|
|
392
|
+
width: 320,
|
|
393
|
+
height: 320
|
|
394
|
+
},
|
|
395
|
+
labels: [],
|
|
396
|
+
preprocessMode: "letterbox",
|
|
397
|
+
postprocessor: "ssd",
|
|
398
|
+
license: "Apache-2.0",
|
|
399
|
+
formats: { tflite: {
|
|
400
|
+
url: hf("objectDetection/ssdlite-mobiledet/edgetpu/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite"),
|
|
401
|
+
sizeMB: 5.1,
|
|
402
|
+
runtimes: ["python"]
|
|
403
|
+
} }
|
|
404
|
+
},
|
|
387
405
|
ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "fp16", 5, true),
|
|
388
406
|
ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "int8", 3),
|
|
389
407
|
ovPrecisionVariant("yolo26s", "objectDetection/yolo26/openvino", "YOLO26 Small", "fp16", 19, true),
|
|
@@ -491,6 +509,17 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
491
509
|
ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "fp16", 112, true),
|
|
492
510
|
ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "int8", 56, true)
|
|
493
511
|
];
|
|
512
|
+
/**
|
|
513
|
+
* Model ids REMOVED from a step's catalog, per step id (D643).
|
|
514
|
+
*
|
|
515
|
+
* Not the same as `legacy` (still in the catalog, still runnable when chosen):
|
|
516
|
+
* a retired id has nothing to download and nothing that can parse it. It is
|
|
517
|
+
* listed rather than simply deleted because `resolveModelForFormat` passes an
|
|
518
|
+
* id the catalog does not know through UNCHANGED — it reads as an operator's
|
|
519
|
+
* custom model — so a saved pin would keep naming a model no node can load.
|
|
520
|
+
* A retired id resolves to the step's format default instead.
|
|
521
|
+
*/
|
|
522
|
+
var RETIRED_MODEL_IDS = { "face-detection": ["scrypted-yolov9t-face"] };
|
|
494
523
|
var FACE_DETECTION_MODELS = [
|
|
495
524
|
{
|
|
496
525
|
id: "scrfd-2.5g",
|
|
@@ -523,32 +552,33 @@ var FACE_DETECTION_MODELS = [
|
|
|
523
552
|
}
|
|
524
553
|
},
|
|
525
554
|
{
|
|
526
|
-
id: "
|
|
527
|
-
name: "
|
|
528
|
-
description: "
|
|
555
|
+
id: "yunet-2023mar",
|
|
556
|
+
name: "YuNet 2023mar",
|
|
557
|
+
description: "YuNet (OpenCV Zoo, 2023mar) — tiny face detector with 5 keypoints, MIT weights (WIDER FACE AP 0.884/0.866/0.750). ~0.2 MB. Trained on WIDER FACE (CC BY-NC-ND images).",
|
|
529
558
|
inputSize: {
|
|
530
|
-
width:
|
|
531
|
-
height:
|
|
559
|
+
width: 640,
|
|
560
|
+
height: 640
|
|
532
561
|
},
|
|
533
562
|
labels: [{
|
|
534
563
|
id: "face",
|
|
535
564
|
name: "Face"
|
|
536
565
|
}],
|
|
537
566
|
preprocessMode: "letterbox",
|
|
538
|
-
|
|
567
|
+
postprocessor: "yunet",
|
|
568
|
+
license: "MIT",
|
|
539
569
|
formats: {
|
|
540
570
|
onnx: {
|
|
541
|
-
url:
|
|
542
|
-
sizeMB:
|
|
571
|
+
url: hf("faceDetection/yunet/onnx/camstack-yunet-2023mar.onnx"),
|
|
572
|
+
sizeMB: .23
|
|
543
573
|
},
|
|
544
574
|
coreml: {
|
|
545
|
-
url:
|
|
546
|
-
sizeMB:
|
|
575
|
+
url: hf("faceDetection/yunet/coreml/camstack-yunet-2023mar.mlpackage"),
|
|
576
|
+
sizeMB: .2,
|
|
547
577
|
isDirectory: true,
|
|
548
578
|
files: [...MLPACKAGE_FILES],
|
|
549
579
|
runtimes: ["python"]
|
|
550
580
|
},
|
|
551
|
-
openvino: ovFormat(hf("faceDetection/
|
|
581
|
+
openvino: ovFormat(hf("faceDetection/yunet/openvino/camstack-yunet-2023mar.xml"), .36)
|
|
552
582
|
}
|
|
553
583
|
},
|
|
554
584
|
{
|
|
@@ -1595,7 +1625,8 @@ var STEP_FACE_DETECTION = new PipelineStepBase({
|
|
|
1595
1625
|
inputClasses: ["person"],
|
|
1596
1626
|
outputClasses: ["face"],
|
|
1597
1627
|
models: [...FACE_DETECTION_MODELS],
|
|
1598
|
-
defaultModelId: "
|
|
1628
|
+
defaultModelId: "yunet-2023mar",
|
|
1629
|
+
defaultModelIdByFormat: { tflite: "scrfd-2.5g" },
|
|
1599
1630
|
defaultConfidence: .5,
|
|
1600
1631
|
defaultMinParentScore: .7,
|
|
1601
1632
|
cadence: {
|
|
@@ -1840,11 +1871,12 @@ function getStepDefinition(stepId) {
|
|
|
1840
1871
|
* has a build for `format`.
|
|
1841
1872
|
* 2. `def.defaultModelId` — the step's plain declared default — if it
|
|
1842
1873
|
* exists in `def.models` AND has a build for `format`.
|
|
1843
|
-
* 3. The smallest-by-size model among those with a `format`
|
|
1844
|
-
* (
|
|
1874
|
+
* 3. The smallest-by-size NON-legacy model among those with a `format`
|
|
1875
|
+
* build (fallback, preserved for steps/formats with no declared
|
|
1845
1876
|
* preference reachable).
|
|
1846
|
-
* 4.
|
|
1847
|
-
*
|
|
1877
|
+
* 4. When NO non-legacy model has a `format` build — an unloadable case
|
|
1878
|
+
* flagged elsewhere, not resolved here — the declared per-format id if
|
|
1879
|
+
* there is one, else `def.defaultModelId`, unchanged.
|
|
1848
1880
|
*/
|
|
1849
1881
|
function getDefaultModelForFormat(stepId, format) {
|
|
1850
1882
|
return getDefaultModelForFormatFromDef(getStepDefinition(stepId), format);
|
|
@@ -1862,7 +1894,7 @@ function getDefaultModelForFormatFromDef(def, format) {
|
|
|
1862
1894
|
if (declaredForFormat !== void 0 && hasFormatBuild(declaredForFormat)) return declaredForFormat;
|
|
1863
1895
|
if (hasFormatBuild(def.defaultModelId)) return def.defaultModelId;
|
|
1864
1896
|
const available = def.models.filter((m) => m.formats[format] && m.legacy !== true);
|
|
1865
|
-
if (available.length === 0) return def.defaultModelId;
|
|
1897
|
+
if (available.length === 0) return declaredForFormat ?? def.defaultModelId;
|
|
1866
1898
|
return [...available].toSorted((a, b) => {
|
|
1867
1899
|
return (a.formats[format]?.sizeMB ?? Infinity) - (b.formats[format]?.sizeMB ?? Infinity);
|
|
1868
1900
|
})[0].id;
|
|
@@ -1877,6 +1909,7 @@ function getDefaultModelForFormatFromDef(def, format) {
|
|
|
1877
1909
|
* - chosen is a catalog model → keep it if it has a `format` build; else
|
|
1878
1910
|
* the addon's default model for `format`
|
|
1879
1911
|
* (a substitution — the caller surfaces it).
|
|
1912
|
+
* - chosen is RETIRED (`RETIRED_MODEL_IDS`) → the format default (D643).
|
|
1880
1913
|
* - chosen is NOT in the catalog (custom/unknown) → returned unchanged; the
|
|
1881
1914
|
* operator owns a custom model's format compat.
|
|
1882
1915
|
* - unknown stepId → chosen returned unchanged (never throws).
|
|
@@ -1889,6 +1922,7 @@ function resolveModelForFormat(stepId, chosenModelId, format) {
|
|
|
1889
1922
|
return chosenModelId ?? "";
|
|
1890
1923
|
}
|
|
1891
1924
|
if (chosenModelId === null) return getDefaultModelForFormat(stepId, format);
|
|
1925
|
+
if (RETIRED_MODEL_IDS[stepId]?.includes(chosenModelId) === true) return getDefaultModelForFormat(stepId, format);
|
|
1892
1926
|
const entry = def.models.find((m) => m.id === chosenModelId);
|
|
1893
1927
|
if (!entry) return chosenModelId;
|
|
1894
1928
|
if (entry.formats[format]) return chosenModelId;
|
|
@@ -2244,6 +2278,12 @@ Object.defineProperty(exports, "OBJECT_DETECTION_STEP_ID", {
|
|
|
2244
2278
|
return OBJECT_DETECTION_STEP_ID;
|
|
2245
2279
|
}
|
|
2246
2280
|
});
|
|
2281
|
+
Object.defineProperty(exports, "RETIRED_MODEL_IDS", {
|
|
2282
|
+
enumerable: true,
|
|
2283
|
+
get: function() {
|
|
2284
|
+
return RETIRED_MODEL_IDS;
|
|
2285
|
+
}
|
|
2286
|
+
});
|
|
2247
2287
|
Object.defineProperty(exports, "getDefaultModelForFormat", {
|
|
2248
2288
|
enumerable: true,
|
|
2249
2289
|
get: function() {
|