@camstack/addon-pipeline 1.2.338 → 1.2.339

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 (30) hide show
  1. package/dist/audio-analyzer/index.js +22 -30
  2. package/dist/audio-analyzer/index.mjs +23 -31
  3. package/dist/{custom-model-catalog-CN6WPGB8.mjs → custom-model-catalog-B5sCwSgr.mjs} +2 -1447
  4. package/dist/{custom-model-catalog-BYJyfhgj.js → custom-model-catalog-BY35vysX.js} +15 -1460
  5. package/dist/detection-pipeline/index.js +24 -4
  6. package/dist/detection-pipeline/index.mjs +25 -5
  7. package/dist/{dist-WIL4yeyi.js → dist-BUqvRc-c.js} +8 -12
  8. package/dist/{dist-CdmlJu1J.mjs → dist-BylL-kRe.mjs} +9 -7
  9. package/dist/model-catalogs-DygV-lXw.js +1522 -0
  10. package/dist/model-catalogs-x1G07ScE.mjs +1445 -0
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/{node-CEtew1DU.mjs → node-4Vnc6mbI.mjs} +1 -1
  14. package/dist/{node-DCFClFJ1.js → node-r1KgYS72.js} +1 -1
  15. package/dist/pipeline-runner/index.js +3 -3
  16. package/dist/pipeline-runner/index.mjs +3 -3
  17. package/dist/{process-memory-maZfOnev.mjs → process-memory-DOX7Esg9.mjs} +1 -1
  18. package/dist/{process-memory-Bsj_b---.js → process-memory-Dr9tFNCX.js} +1 -1
  19. package/dist/recorder/index.js +2 -2
  20. package/dist/recorder/index.mjs +2 -2
  21. package/dist/{segment-demux-js-CXmBf_nf.js → segment-demux-js-5UX_f1ey.js} +1 -1
  22. package/dist/{segment-demux-js-DnPcYYbc.mjs → segment-demux-js-Brk0ORQN.mjs} +1 -1
  23. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BdsJXZcP.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-oF4bquCk.mjs} +1 -1
  24. package/dist/stream-broker/demux-worker-child.js +1 -1
  25. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  26. package/dist/stream-broker/{hostInit-BU5SBy0i.mjs → hostInit-BOteWKrZ.mjs} +1 -1
  27. package/dist/stream-broker/index.js +3 -3
  28. package/dist/stream-broker/index.mjs +3 -3
  29. package/dist/stream-broker/remoteEntry.js +1 -1
  30. package/package.json +1 -1
@@ -0,0 +1,1445 @@
1
+ import { wt as hfModelUrl } from "./dist-BylL-kRe.mjs";
2
+ //#region src/detection-pipeline/registry/model-licenses.ts
3
+ var COCO_DATA = {
4
+ name: "COCO 2017",
5
+ terms: "annotations CC-BY-4.0; images under their Flickr owners' terms",
6
+ url: "https://cocodataset.org/#termsofuse"
7
+ };
8
+ var WIDER_FACE_DATA = {
9
+ name: "WIDER FACE",
10
+ terms: "research-oriented terms; images CC BY-NC-ND",
11
+ url: "http://shuoyang1213.me/WIDERFACE/"
12
+ };
13
+ var ULTRALYTICS_AGPL = {
14
+ weights: "AGPL-3.0",
15
+ code: "AGPL-3.0",
16
+ data: COCO_DATA,
17
+ upstream: {
18
+ name: "Ultralytics",
19
+ url: "https://github.com/ultralytics/ultralytics"
20
+ },
21
+ url: "https://github.com/ultralytics/ultralytics/blob/main/LICENSE",
22
+ 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.",
23
+ modifications: "exported to ONNX, OpenVINO IR and CoreML (scripts/build-camstack-models.py)",
24
+ hosting: "camstack-hf"
25
+ };
26
+ var ULTRALYTICS_YOLOV9_AGPL = {
27
+ ...ULTRALYTICS_AGPL,
28
+ 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."
29
+ };
30
+ /** The CamStack Coral COCO detector (SSD MobileNet V2). */
31
+ var CORAL_COCO_APACHE = {
32
+ weights: "Apache-2.0",
33
+ code: "Apache-2.0",
34
+ upstream: {
35
+ name: "Google Coral test_data",
36
+ url: "https://github.com/google-coral/test_data"
37
+ },
38
+ url: "https://github.com/google-coral/test_data/blob/master/LICENSE",
39
+ attribution: "Coral Edge TPU models and AIY Vision Birds V1 © Google LLC, Apache-2.0.",
40
+ hosting: "third-party",
41
+ data: COCO_DATA
42
+ };
43
+ var RFDETR_APACHE = {
44
+ weights: "Apache-2.0",
45
+ code: "Apache-2.0",
46
+ data: {
47
+ name: "parcel fine-tuning set (not recorded)",
48
+ terms: "UNVERIFIED"
49
+ },
50
+ upstream: {
51
+ name: "Roboflow RF-DETR",
52
+ url: "https://github.com/roboflow/rf-detr"
53
+ },
54
+ url: "https://github.com/roboflow/rf-detr/blob/develop/LICENSE",
55
+ attribution: "RF-DETR © Roboflow, Apache-2.0.",
56
+ modifications: "RF-DETR-M fine-tuned to 2 classes at 576; exported to ONNX, OpenVINO IR and CoreML; training checkpoint .pth also published",
57
+ hosting: "camstack-hf"
58
+ };
59
+ var YUNET_MIT = {
60
+ weights: "MIT",
61
+ code: "BSD-3-Clause",
62
+ data: WIDER_FACE_DATA,
63
+ upstream: {
64
+ name: "OpenCV Zoo YuNet",
65
+ url: "https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet"
66
+ },
67
+ url: "https://github.com/opencv/opencv_zoo/blob/main/models/face_detection_yunet/LICENSE",
68
+ attribution: "YuNet weights Copyright (c) 2020 Shiqi Yu, MIT. Training code: ShiqiYu/libfacedetection.train, BSD-3-Clause.",
69
+ modifications: "input contract baked into the graph (the pool 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); Edge TPU build: the bake folded into the first Conv, full-integer int8 post-training quantisation calibrated on CamStack person crops, compiled with edgetpu_compiler 14 (scripts/build-yunet-edgetpu.py)",
70
+ hosting: "camstack-hf"
71
+ };
72
+ var AURAFACE_APACHE = {
73
+ weights: "Apache-2.0",
74
+ upstream: {
75
+ name: "fal.ai AuraFace v1 (glintr100.onnx only)",
76
+ url: "https://huggingface.co/fal/AuraFace-v1"
77
+ },
78
+ url: "https://huggingface.co/fal/AuraFace-v1",
79
+ attribution: "AuraFace v1 by fal.ai, Apache-2.0.",
80
+ modifications: "input scaling y = 2x - 1 baked ahead of the first Conv (scripts/build-auraface-model.py); converted to OpenVINO IR and CoreML FP16",
81
+ hosting: "camstack-hf"
82
+ };
83
+ /**
84
+ * open-lpr's YOLOX-tiny plate detector (D719). Weights Apache-2.0 by the
85
+ * open-lpr repository licence and NOTICE (YOLOX code and its same-repository
86
+ * COCO weights are Apache-2.0; no Ultralytics weights used) — the weights'
87
+ * status is inferred from that statement, not from a per-file licence. The
88
+ * NOTICE travels verbatim (Apache-2.0 §4(d)): licenses/models/NOTICE-open-lpr.txt
89
+ * and the mirror folder's own NOTICE.
90
+ */
91
+ var OPEN_LPR_YOLOX_APACHE = {
92
+ weights: "Apache-2.0",
93
+ code: "Apache-2.0",
94
+ data: {
95
+ 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)",
96
+ terms: "UNKNOWN"
97
+ },
98
+ upstream: {
99
+ name: "open-lpr models (faisalthaheem/open-lpr-models), YOLOX-tiny",
100
+ url: "https://huggingface.co/faisalthaheem/open-lpr-models"
101
+ },
102
+ url: "https://huggingface.co/faisalthaheem/open-lpr-models/blob/aed0df35ec2891c5a90437041ebeadb592cc516b/LICENSE",
103
+ 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`).",
104
+ 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); Edge TPU build: the Focus stem rewritten as the equivalent 6x6 stride-2 Conv with the input bake folded into it, the graph cut before the grid decode (raw per-stride head), full-integer int8 post-training quantisation calibrated on CamStack vehicle crops, compiled with edgetpu_compiler 14 (scripts/build-yolox-plate-edgetpu.py)",
105
+ hosting: "camstack-hf"
106
+ };
107
+ var FAST_PLATE_OCR_MIT = {
108
+ weights: "MIT",
109
+ code: "MIT",
110
+ data: {
111
+ name: "fast-plate-ocr training set",
112
+ terms: "private, not released upstream"
113
+ },
114
+ upstream: {
115
+ name: "ankandrew/fast-plate-ocr",
116
+ url: "https://github.com/ankandrew/fast-plate-ocr"
117
+ },
118
+ url: "https://github.com/ankandrew/fast-plate-ocr/blob/master/LICENSE",
119
+ attribution: "fast-plate-ocr, MIT License, copyright (c) 2024 ankandrew (full notice: licenses/models/MIT-fast-plate-ocr.txt).",
120
+ modifications: "input head removed (recorded in the ONNX doc_string); converted to OpenVINO IR and CoreML",
121
+ hosting: "camstack-hf"
122
+ };
123
+ var ANIMAL_CLASSIFIER_APACHE = {
124
+ weights: "Apache-2.0",
125
+ code: "Apache-2.0",
126
+ data: {
127
+ name: "Open Images V7",
128
+ terms: "annotations CC-BY-4.0 (Google LLC); images listed as CC-BY-2.0, no warranty",
129
+ url: "https://storage.googleapis.com/openimages/web/factsfigures_v7.html"
130
+ },
131
+ upstream: {
132
+ name: "timm EfficientNet-Lite0, fine-tuned by CamStack",
133
+ url: "https://github.com/huggingface/pytorch-image-models"
134
+ },
135
+ url: "https://github.com/huggingface/pytorch-image-models/blob/main/LICENSE",
136
+ attribution: "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.",
137
+ modifications: "fine-tuned by CamStack on the Open Images V7 animal subset (8 classes); exported to ONNX, OpenVINO IR and CoreML",
138
+ hosting: "camstack-hf"
139
+ };
140
+ var AIY_BIRDS_APACHE = {
141
+ weights: "Apache-2.0",
142
+ upstream: {
143
+ name: "Google AIY Vision birds_V1",
144
+ url: "https://github.com/google-coral/test_data"
145
+ },
146
+ url: "https://github.com/google-coral/test_data/blob/master/LICENSE",
147
+ 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; 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
+ hosting: "camstack-hf"
150
+ };
151
+ var VEHICLE_TYPE_V1_NC = {
152
+ weights: "CC-BY-NC-4.0",
153
+ code: "BSD-3-Clause",
154
+ data: {
155
+ name: "DrBimmer/vehicle-classification",
156
+ terms: "CC-BY-NC-4.0 — treated as binding the trained weights (conservative reading)",
157
+ url: "https://huggingface.co/datasets/DrBimmer/vehicle-classification"
158
+ },
159
+ upstream: {
160
+ name: "torchvision MobileNetV3-Large, fine-tuned by CamStack",
161
+ url: "https://github.com/pytorch/vision"
162
+ },
163
+ url: "https://creativecommons.org/licenses/by-nc/4.0/",
164
+ attribution: "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.",
165
+ modifications: "fine-tuned by CamStack (8 classes); exported to ONNX, OpenVINO IR and CoreML",
166
+ hosting: "camstack-hf",
167
+ nonCommercial: true
168
+ };
169
+ var U2NET_APACHE = {
170
+ weights: "Apache-2.0",
171
+ code: "Apache-2.0",
172
+ data: {
173
+ name: "DUTS-TR",
174
+ terms: "not checked"
175
+ },
176
+ upstream: {
177
+ name: "xuebinqin/U-2-Net",
178
+ url: "https://github.com/xuebinqin/U-2-Net"
179
+ },
180
+ url: "https://github.com/xuebinqin/U-2-Net/blob/master/LICENSE",
181
+ attribution: "U²-Net © Xuebin Qin et al., Apache-2.0.",
182
+ modifications: "converted to ONNX, OpenVINO IR and CoreML",
183
+ hosting: "camstack-hf"
184
+ };
185
+ var SIGLIP2_APACHE = {
186
+ weights: "Apache-2.0",
187
+ code: "Apache-2.0",
188
+ data: {
189
+ name: "WebLI",
190
+ terms: "Google internal, not released"
191
+ },
192
+ upstream: {
193
+ name: "Google SigLIP 2 (google/siglip2-base-patch16-224)",
194
+ url: "https://huggingface.co/google/siglip2-base-patch16-224"
195
+ },
196
+ url: "https://huggingface.co/google/siglip2-base-patch16-224",
197
+ attribution: "SigLIP 2 © Google LLC, Apache-2.0.",
198
+ modifications: "input scaling y = 2x - 1 baked ahead of the patch embedding; converted to OpenVINO IR and CoreML FP16, an FP32 ONNX hosted as the verification reference (scripts/build-siglip2-model.py)",
199
+ hosting: "camstack-hf"
200
+ };
201
+ var YAMNET_APACHE = {
202
+ weights: "Apache-2.0",
203
+ code: "Apache-2.0",
204
+ data: {
205
+ name: "AudioSet ontology/labels",
206
+ terms: "CC-BY-4.0 (Google LLC)",
207
+ url: "https://research.google.com/audioset/"
208
+ },
209
+ upstream: {
210
+ name: "tensorflow/models research/audioset/yamnet",
211
+ url: "https://github.com/tensorflow/models/tree/master/research/audioset/yamnet"
212
+ },
213
+ url: "https://github.com/tensorflow/models/blob/master/LICENSE",
214
+ attribution: "YAMNet © Google LLC, Apache-2.0. AudioSet ontology and labels © Google LLC, CC BY 4.0.",
215
+ modifications: "converted from TensorFlow with tf2onnx; OpenVINO IR derived from it",
216
+ hosting: "camstack-hf"
217
+ };
218
+ var APPLE_SOUNDANALYSIS = {
219
+ weights: "LicenseRef-Apple-macOS",
220
+ upstream: {
221
+ name: "Apple SoundAnalysis (macOS built-in)",
222
+ url: "https://developer.apple.com/documentation/soundanalysis"
223
+ },
224
+ url: "https://www.apple.com/legal/sla/",
225
+ hosting: "built-in"
226
+ };
227
+ /** Compose a per-entry record: same upstream, entry-specific modifications / data. */
228
+ function licensed(base, overrides) {
229
+ return {
230
+ ...base,
231
+ ...overrides
232
+ };
233
+ }
234
+ //#endregion
235
+ //#region src/detection-pipeline/registry/model-catalogs.ts
236
+ var HF_REPO = "camstack/camstack-models";
237
+ var hf = (path) => hfModelUrl(HF_REPO, path);
238
+ /**
239
+ * Build an OpenVINO format entry (always python runtime).
240
+ *
241
+ * OpenVINO IR is a two-file bundle: a `.xml` topology + a sibling `.bin`
242
+ * weights file with the same basename. We declare the `.bin` in `files` so
243
+ * the (format-agnostic) downloader fetches it alongside the `.xml` — without
244
+ * the weights, OpenVINO compile fails with "Empty weights data in bin file".
245
+ * A plain `.onnx` run through the OpenVINO runtime (e.g. yamnet) has no
246
+ * sibling, so none is added.
247
+ */
248
+ var ovFormat = (url, sizeMB) => {
249
+ const base = url.split("/").pop() ?? "";
250
+ const files = base.endsWith(".xml") ? [base.replace(/\.xml$/, ".bin")] : void 0;
251
+ return {
252
+ url,
253
+ sizeMB,
254
+ runtimes: ["python"],
255
+ ...files ? { files } : {}
256
+ };
257
+ };
258
+ /**
259
+ * Build a precision-variant catalog entry (OpenVINO-only) derived from a base
260
+ * detection model. fp16 halves the weights (Intel iGPU/NPU sweet spot); int8 is
261
+ * NNCF post-training-quantized (~4× smaller, fastest on CPU/iGPU at a small
262
+ * accuracy cost). The IRs live next to the base `.xml` on HF as
263
+ * `camstack-<id>-<precision>.xml`. Lets an operator scale the model to the node
264
+ * (e.g. yolo26x-int8 on a 265K, yolo26n-int8 on an N100).
265
+ */
266
+ var ovPrecisionVariant = (baseId, ovDir, baseName, precision, sizeMB, legacy = false) => ({
267
+ id: `${baseId}-${precision}`,
268
+ name: `${baseName} (${precision.toUpperCase()})`,
269
+ description: precision === "int8" ? `${baseName} — OpenVINO INT8 variant for Intel iGPU/CPU; scale by hardware. On the Intel NPU it loses recall — use the base model there` : `${baseName} — OpenVINO ${precision.toUpperCase()} variant for Intel iGPU/NPU; scale by hardware`,
270
+ inputSize: {
271
+ width: 640,
272
+ height: 640
273
+ },
274
+ labels: [],
275
+ preprocessMode: "letterbox",
276
+ license: licensed(ULTRALYTICS_AGPL, { modifications: precision === "int8" ? "exported to OpenVINO IR, then OpenVINO NNCF INT8 post-training quantisation" : "OpenVINO FP16 export" }),
277
+ formats: { openvino: ovFormat(hf(`${ovDir}/camstack-${baseId}-${precision}.xml`), sizeMB) },
278
+ ...legacy ? { legacy: true } : {},
279
+ ...precision === "int8" ? { group: {
280
+ family: baseId.slice(0, -1),
281
+ tier: baseId.slice(-1),
282
+ precision: "int8",
283
+ resolution: 640
284
+ } } : {}
285
+ });
286
+ var MLPACKAGE_FILES = [
287
+ "Manifest.json",
288
+ "Data/com.apple.CoreML/model.mlmodel",
289
+ "Data/com.apple.CoreML/weights/weight.bin"
290
+ ];
291
+ var YOLO26_TIER_NAME = {
292
+ n: "Nano",
293
+ s: "Small",
294
+ m: "Medium",
295
+ l: "Large"
296
+ };
297
+ var YOLOV9_TIER_NAME = {
298
+ t: "Tiny",
299
+ s: "Small",
300
+ m: "Medium",
301
+ c: "Compact"
302
+ };
303
+ /**
304
+ * The Ultralytics YOLOv9 family (COCO-pretrained Ultralytics weights,
305
+ * re-exported by CamStack — not trained by us) — the default NPU-detection line.
306
+ * It runs on the Intel NPU ("AI Boost"), and its INT8 builds are as accurate
307
+ * there as on the CPU. YOLO26 runs on the NPU too since OpenVINO 2025.4
308
+ * (measured 2026-10-07): its base IRs match the CPU, its INT8 IRs lose recall
309
+ * there (see `yolo26Reduced`). Empirically: the yolov9t-320-int8 export = ~298 fps on the
310
+ * NPU vs yolo26n = 103 on the iGPU (~2.9×). t/s/m/c × {320,640}; each size ships
311
+ * a base entry (onnx + coreml + openvino **fp16**) + an OpenVINO **int8** entry
312
+ * (the NPU/iGPU-optimal config). CoreML (fp16) runs on the Mac ANE — the
313
+ * apple-ane default detector (`default-detection-model.ts`).
314
+ *
315
+ * The CoreML packages were FP32 until 2026-10-07 and ran on the Mac GPU, never
316
+ * the ANE. The FP16 re-export replaced them IN PLACE (same file names); the
317
+ * revision every mirror artefact carries (the sha256 of its weight file, from
318
+ * the downloader's generated table) makes a node holding the FP32 copy fetch
319
+ * the FP16 one (D743, D744).
320
+ */
321
+ var yolov9Reduced = (tier, res, sizes) => {
322
+ const name = YOLOV9_TIER_NAME[tier] ?? tier.toUpperCase();
323
+ return [{
324
+ id: `yolov9${tier}-${res}`,
325
+ group: {
326
+ family: "yolov9",
327
+ tier,
328
+ resolution: res
329
+ },
330
+ name: `YOLOv9 ${name} @${res}`,
331
+ description: `YOLOv9 ${name} @${res}×${res} (Ultralytics) — OpenVINO fp16, runs on Intel NPU + iGPU.`,
332
+ inputSize: {
333
+ width: res,
334
+ height: res
335
+ },
336
+ labels: [],
337
+ preprocessMode: "letterbox",
338
+ license: licensed(ULTRALYTICS_YOLOV9_AGPL, { modifications: `exported at ${res}×${res} to ONNX, OpenVINO IR FP16 and CoreML` }),
339
+ formats: {
340
+ onnx: {
341
+ url: hf(`objectDetection/yolov9/onnx/camstack-yolov9${tier}-${res}.onnx`),
342
+ sizeMB: sizes.onnx
343
+ },
344
+ coreml: {
345
+ url: hf(`objectDetection/yolov9/coreml/camstack-yolov9${tier}-${res}.mlpackage`),
346
+ sizeMB: sizes.coreml,
347
+ isDirectory: true,
348
+ files: [...MLPACKAGE_FILES],
349
+ runtimes: ["python"]
350
+ },
351
+ openvino: ovFormat(hf(`objectDetection/yolov9/openvino/camstack-yolov9${tier}-${res}-fp16.xml`), sizes.ovFp16)
352
+ }
353
+ }, {
354
+ id: `yolov9${tier}-${res}-int8`,
355
+ group: {
356
+ family: "yolov9",
357
+ tier,
358
+ precision: "int8",
359
+ resolution: res
360
+ },
361
+ name: `YOLOv9 ${name} @${res} (INT8)`,
362
+ description: `YOLOv9 ${name} @${res} — OpenVINO INT8 for the Intel NPU / iGPU. The NPU's fastest config (Ultralytics YOLOv9 weights).`,
363
+ inputSize: {
364
+ width: res,
365
+ height: res
366
+ },
367
+ labels: [],
368
+ preprocessMode: "letterbox",
369
+ license: licensed(ULTRALYTICS_YOLOV9_AGPL, { modifications: `exported at ${res}×${res} to OpenVINO IR; OpenVINO NNCF INT8 post-training quantisation` }),
370
+ formats: { openvino: ovFormat(hf(`objectDetection/yolov9/openvino/camstack-yolov9${tier}-${res}-int8.xml`), sizes.ovInt8) }
371
+ }];
372
+ };
373
+ /**
374
+ * Reduced-input YOLO26 variants (2026-07-11). A lower square input (320 / 256)
375
+ * is the biggest, cheapest latency lever measured across every runtime — Mac
376
+ * ANE, Intel Ultra NPU, and especially the N100 — at a small-object accuracy
377
+ * cost. Each resolution ships a base (fp32) entry (onnx + coreml + openvino)
378
+ * grouped under `{family, tier, resolution}`, plus an OpenVINO INT8 entry (best
379
+ * on Intel/N100) grouped with `precision:'int8'`. The grouped selector surfaces
380
+ * `resolution` as a variant axis alongside precision.
381
+ *
382
+ * Intel NPU (OpenVINO 2025.4, measured 2026-10-07): every YOLO26 IR compiles
383
+ * and runs. The base IRs are as accurate as the CPU; the INT8 IRs lose recall
384
+ * there (`yolo26s-int8` 0.58 on the NPU vs 0.70 on CPU/iGPU, `yolo26m-int8`
385
+ * 0.78 vs 0.83), so on an NPU the base IR is the one to run.
386
+ */
387
+ var yolo26Reduced = (tier, res, sizes) => {
388
+ const name = YOLO26_TIER_NAME[tier] ?? tier.toUpperCase();
389
+ return [{
390
+ id: `yolo26${tier}-${res}`,
391
+ group: {
392
+ family: "yolo26",
393
+ tier,
394
+ resolution: res
395
+ },
396
+ name: `YOLO26 ${name} @${res}`,
397
+ description: `YOLO26 ${name}, reduced ${res}×${res} input — faster on ANE / hub NPU / N100 at a small-object accuracy cost`,
398
+ inputSize: {
399
+ width: res,
400
+ height: res
401
+ },
402
+ labels: [],
403
+ preprocessMode: "letterbox",
404
+ license: licensed(ULTRALYTICS_AGPL, { modifications: `re-exported at ${res}×${res} to ONNX, OpenVINO IR and CoreML` }),
405
+ formats: {
406
+ onnx: {
407
+ url: hf(`objectDetection/yolo26/onnx/camstack-yolo26${tier}-${res}.onnx`),
408
+ sizeMB: sizes.onnx
409
+ },
410
+ coreml: {
411
+ url: hf(`objectDetection/yolo26/coreml/camstack-yolo26${tier}-${res}.mlpackage`),
412
+ sizeMB: sizes.coreml,
413
+ isDirectory: true,
414
+ files: [...MLPACKAGE_FILES],
415
+ runtimes: ["python"]
416
+ },
417
+ openvino: ovFormat(hf(`objectDetection/yolo26/openvino/camstack-yolo26${tier}-${res}.xml`), sizes.ovFp32)
418
+ }
419
+ }, {
420
+ id: `yolo26${tier}-${res}-int8`,
421
+ group: {
422
+ family: "yolo26",
423
+ tier,
424
+ precision: "int8",
425
+ resolution: res
426
+ },
427
+ name: `YOLO26 ${name} @${res} (INT8)`,
428
+ description: `YOLO26 ${name} @${res} — OpenVINO INT8 for Intel iGPU/CPU; the N100's fastest config. On the Intel NPU it loses recall — use the base model there`,
429
+ inputSize: {
430
+ width: res,
431
+ height: res
432
+ },
433
+ labels: [],
434
+ preprocessMode: "letterbox",
435
+ license: licensed(ULTRALYTICS_AGPL, { modifications: `re-exported at ${res}×${res} to OpenVINO IR; OpenVINO NNCF INT8 post-training quantisation` }),
436
+ formats: { openvino: ovFormat(hf(`objectDetection/yolo26/openvino/camstack-yolo26${tier}-${res}-int8.xml`), sizes.ovInt8) }
437
+ }];
438
+ };
439
+ /** Variant family of the YOLO26 builds with an instance-segmentation head. */
440
+ var YOLO26_SEG_FAMILY = "yolo26-seg";
441
+ /** What choosing a seg build as the root means, in the catalog's own words. */
442
+ var YOLO26_SEG_ROOT_NOTE = "As the root model it detects like YOLO26 and also supplies the Segmentation step its masks (detection + masks, slightly heavier).";
443
+ var OBJECT_DETECTION_MODEL_ENTRIES = [
444
+ {
445
+ id: "yolo26n",
446
+ license: ULTRALYTICS_AGPL,
447
+ group: {
448
+ family: "yolo26",
449
+ tier: "n",
450
+ resolution: 640
451
+ },
452
+ name: "YOLO26 Nano",
453
+ description: "YOLO26 Nano — latest generation ultra-lightweight detector with attention mechanism",
454
+ inputSize: {
455
+ width: 640,
456
+ height: 640
457
+ },
458
+ labels: [],
459
+ preprocessMode: "letterbox",
460
+ formats: {
461
+ onnx: {
462
+ url: hf("objectDetection/yolo26/onnx/camstack-yolo26n.onnx"),
463
+ sizeMB: 10
464
+ },
465
+ coreml: {
466
+ url: hf("objectDetection/yolo26/coreml/camstack-yolo26n.mlpackage"),
467
+ sizeMB: 5,
468
+ isDirectory: true,
469
+ files: [...MLPACKAGE_FILES],
470
+ runtimes: ["python"]
471
+ },
472
+ openvino: ovFormat(hf("objectDetection/yolo26/openvino/camstack-yolo26n.xml"), 9)
473
+ }
474
+ },
475
+ {
476
+ id: "yolo26s",
477
+ license: ULTRALYTICS_AGPL,
478
+ group: {
479
+ family: "yolo26",
480
+ tier: "s",
481
+ resolution: 640
482
+ },
483
+ name: "YOLO26 Small",
484
+ description: "YOLO26 Small — balanced speed/accuracy with attention-based architecture",
485
+ inputSize: {
486
+ width: 640,
487
+ height: 640
488
+ },
489
+ labels: [],
490
+ preprocessMode: "letterbox",
491
+ formats: {
492
+ onnx: {
493
+ url: hf("objectDetection/yolo26/onnx/camstack-yolo26s.onnx"),
494
+ sizeMB: 37
495
+ },
496
+ coreml: {
497
+ url: hf("objectDetection/yolo26/coreml/camstack-yolo26s.mlpackage"),
498
+ sizeMB: 18,
499
+ isDirectory: true,
500
+ files: [...MLPACKAGE_FILES],
501
+ runtimes: ["python"]
502
+ },
503
+ openvino: ovFormat(hf("objectDetection/yolo26/openvino/camstack-yolo26s.xml"), 36)
504
+ }
505
+ },
506
+ {
507
+ id: "yolo26m",
508
+ license: ULTRALYTICS_AGPL,
509
+ group: {
510
+ family: "yolo26",
511
+ tier: "m",
512
+ resolution: 640
513
+ },
514
+ name: "YOLO26 Medium",
515
+ description: "YOLO26 Medium — high accuracy general-purpose detector",
516
+ inputSize: {
517
+ width: 640,
518
+ height: 640
519
+ },
520
+ labels: [],
521
+ preprocessMode: "letterbox",
522
+ formats: {
523
+ onnx: {
524
+ url: hf("objectDetection/yolo26/onnx/camstack-yolo26m.onnx"),
525
+ sizeMB: 78
526
+ },
527
+ coreml: {
528
+ url: hf("objectDetection/yolo26/coreml/camstack-yolo26m.mlpackage"),
529
+ sizeMB: 39,
530
+ isDirectory: true,
531
+ files: [...MLPACKAGE_FILES],
532
+ runtimes: ["python"]
533
+ },
534
+ openvino: ovFormat(hf("objectDetection/yolo26/openvino/camstack-yolo26m.xml"), 78)
535
+ }
536
+ },
537
+ {
538
+ id: "yolo26l",
539
+ license: ULTRALYTICS_AGPL,
540
+ group: {
541
+ family: "yolo26",
542
+ tier: "l",
543
+ resolution: 640
544
+ },
545
+ name: "YOLO26 Large",
546
+ description: "YOLO26 Large — maximum accuracy for demanding deployments",
547
+ inputSize: {
548
+ width: 640,
549
+ height: 640
550
+ },
551
+ labels: [],
552
+ preprocessMode: "letterbox",
553
+ formats: {
554
+ onnx: {
555
+ url: hf("objectDetection/yolo26/onnx/camstack-yolo26l.onnx"),
556
+ sizeMB: 95
557
+ },
558
+ coreml: {
559
+ url: hf("objectDetection/yolo26/coreml/camstack-yolo26l.mlpackage"),
560
+ sizeMB: 48,
561
+ isDirectory: true,
562
+ files: [...MLPACKAGE_FILES],
563
+ runtimes: ["python"]
564
+ },
565
+ openvino: ovFormat(hf("objectDetection/yolo26/openvino/camstack-yolo26l.xml"), 95)
566
+ }
567
+ },
568
+ {
569
+ id: "yolo26x",
570
+ license: ULTRALYTICS_AGPL,
571
+ legacy: true,
572
+ name: "YOLO26 XLarge",
573
+ description: "YOLO26 XLarge — highest accuracy, attention-based architecture",
574
+ inputSize: {
575
+ width: 640,
576
+ height: 640
577
+ },
578
+ labels: [],
579
+ preprocessMode: "letterbox",
580
+ formats: {
581
+ onnx: {
582
+ url: hf("objectDetection/yolo26/onnx/camstack-yolo26x.onnx"),
583
+ sizeMB: 213
584
+ },
585
+ coreml: {
586
+ url: hf("objectDetection/yolo26/coreml/camstack-yolo26x.mlpackage"),
587
+ sizeMB: 107,
588
+ isDirectory: true,
589
+ files: [...MLPACKAGE_FILES],
590
+ runtimes: ["python"]
591
+ },
592
+ openvino: ovFormat(hf("objectDetection/yolo26/openvino/camstack-yolo26x.xml"), 213)
593
+ }
594
+ },
595
+ {
596
+ id: "ssd-mobilenet-v2-coco-edgetpu",
597
+ license: CORAL_COCO_APACHE,
598
+ name: "SSD MobileNet V2 (Coral)",
599
+ description: "SSD MobileNet V2 COCO — EdgeTPU-compiled full-integer TFLite, 300×300; runs on the Coral USB Edge TPU (~11 ms/frame)",
600
+ inputSize: {
601
+ width: 300,
602
+ height: 300
603
+ },
604
+ labels: [],
605
+ preprocessMode: "letterbox",
606
+ postprocessor: "ssd",
607
+ formats: { tflite: {
608
+ url: "https://github.com/google-coral/test_data/raw/master/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite",
609
+ sizeMB: 6.6,
610
+ runtimes: ["python"]
611
+ } }
612
+ },
613
+ {
614
+ id: "yolo26n-seg",
615
+ license: licensed(ULTRALYTICS_AGPL, { modifications: "exported to ONNX, OpenVINO IR and CoreML" }),
616
+ group: {
617
+ family: YOLO26_SEG_FAMILY,
618
+ tier: "n",
619
+ resolution: 640
620
+ },
621
+ name: "YOLO26-seg Nano",
622
+ description: `YOLO26 Nano with its instance-segmentation head — ultra-lightweight. ${YOLO26_SEG_ROOT_NOTE}`,
623
+ inputSize: {
624
+ width: 640,
625
+ height: 640
626
+ },
627
+ labels: [],
628
+ preprocessMode: "letterbox",
629
+ postprocessor: "yolo-seg",
630
+ formats: {
631
+ onnx: {
632
+ url: hf("segmentation/yolo26-seg/onnx/camstack-yolo26n-seg.onnx"),
633
+ sizeMB: 11
634
+ },
635
+ coreml: {
636
+ url: hf("segmentation/yolo26-seg/coreml/camstack-yolo26n-seg.mlpackage"),
637
+ sizeMB: 6,
638
+ isDirectory: true,
639
+ files: [...MLPACKAGE_FILES],
640
+ runtimes: ["python"]
641
+ },
642
+ openvino: ovFormat(hf("segmentation/yolo26-seg/openvino/camstack-yolo26n-seg.xml"), 11)
643
+ }
644
+ },
645
+ {
646
+ id: "yolo26s-seg",
647
+ license: licensed(ULTRALYTICS_AGPL, { modifications: "exported to ONNX, OpenVINO IR and CoreML" }),
648
+ group: {
649
+ family: YOLO26_SEG_FAMILY,
650
+ tier: "s",
651
+ resolution: 640
652
+ },
653
+ name: "YOLO26-seg Small",
654
+ description: `YOLO26 Small with its instance-segmentation head — balanced. ${YOLO26_SEG_ROOT_NOTE}`,
655
+ inputSize: {
656
+ width: 640,
657
+ height: 640
658
+ },
659
+ labels: [],
660
+ preprocessMode: "letterbox",
661
+ postprocessor: "yolo-seg",
662
+ formats: {
663
+ onnx: {
664
+ url: hf("segmentation/yolo26-seg/onnx/camstack-yolo26s-seg.onnx"),
665
+ sizeMB: 40
666
+ },
667
+ coreml: {
668
+ url: hf("segmentation/yolo26-seg/coreml/camstack-yolo26s-seg.mlpackage"),
669
+ sizeMB: 20,
670
+ isDirectory: true,
671
+ files: [...MLPACKAGE_FILES],
672
+ runtimes: ["python"]
673
+ },
674
+ openvino: ovFormat(hf("segmentation/yolo26-seg/openvino/camstack-yolo26s-seg.xml"), 40)
675
+ }
676
+ },
677
+ {
678
+ id: "yolo26m-seg",
679
+ license: licensed(ULTRALYTICS_AGPL, { modifications: "exported to ONNX, OpenVINO IR and CoreML" }),
680
+ group: {
681
+ family: YOLO26_SEG_FAMILY,
682
+ tier: "m",
683
+ resolution: 640
684
+ },
685
+ name: "YOLO26-seg Medium",
686
+ description: `YOLO26 Medium with its instance-segmentation head — high accuracy. ${YOLO26_SEG_ROOT_NOTE}`,
687
+ inputSize: {
688
+ width: 640,
689
+ height: 640
690
+ },
691
+ labels: [],
692
+ preprocessMode: "letterbox",
693
+ postprocessor: "yolo-seg",
694
+ formats: {
695
+ onnx: {
696
+ url: hf("segmentation/yolo26-seg/onnx/camstack-yolo26m-seg.onnx"),
697
+ sizeMB: 90
698
+ },
699
+ coreml: {
700
+ url: hf("segmentation/yolo26-seg/coreml/camstack-yolo26m-seg.mlpackage"),
701
+ sizeMB: 45,
702
+ isDirectory: true,
703
+ files: [...MLPACKAGE_FILES],
704
+ runtimes: ["python"]
705
+ },
706
+ openvino: ovFormat(hf("segmentation/yolo26-seg/openvino/camstack-yolo26m-seg.xml"), 90)
707
+ }
708
+ },
709
+ ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "fp16", 5, true),
710
+ ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "int8", 3),
711
+ ovPrecisionVariant("yolo26s", "objectDetection/yolo26/openvino", "YOLO26 Small", "fp16", 19, true),
712
+ ovPrecisionVariant("yolo26s", "objectDetection/yolo26/openvino", "YOLO26 Small", "int8", 10),
713
+ ovPrecisionVariant("yolo26m", "objectDetection/yolo26/openvino", "YOLO26 Medium", "fp16", 41, true),
714
+ ovPrecisionVariant("yolo26m", "objectDetection/yolo26/openvino", "YOLO26 Medium", "int8", 21),
715
+ ovPrecisionVariant("yolo26l", "objectDetection/yolo26/openvino", "YOLO26 Large", "fp16", 50, true),
716
+ ovPrecisionVariant("yolo26l", "objectDetection/yolo26/openvino", "YOLO26 Large", "int8", 25),
717
+ ...yolo26Reduced("n", 320, {
718
+ onnx: 10.47,
719
+ coreml: 5.05,
720
+ ovFp32: 10.05,
721
+ ovInt8: 3.29
722
+ }),
723
+ ...yolo26Reduced("n", 256, {
724
+ onnx: 10.47,
725
+ coreml: 5.05,
726
+ ovFp32: 10.05,
727
+ ovInt8: 3.29
728
+ }),
729
+ ...yolo26Reduced("s", 320, {
730
+ onnx: 38.82,
731
+ coreml: 19.23,
732
+ ovFp32: 38.4,
733
+ ovInt8: 10.43
734
+ }),
735
+ ...yolo26Reduced("s", 256, {
736
+ onnx: 38.82,
737
+ coreml: 19.23,
738
+ ovFp32: 38.4,
739
+ ovInt8: 10.43
740
+ }),
741
+ ...yolo26Reduced("m", 320, {
742
+ onnx: 83.31,
743
+ coreml: 41.07,
744
+ ovFp32: 82.09,
745
+ ovInt8: 21.47
746
+ }),
747
+ ...yolo26Reduced("m", 256, {
748
+ onnx: 83.31,
749
+ coreml: 41.07,
750
+ ovFp32: 82.09,
751
+ ovInt8: 21.47
752
+ }),
753
+ ...yolo26Reduced("l", 320, {
754
+ onnx: 101.74,
755
+ coreml: 49.97,
756
+ ovFp32: 99.85,
757
+ ovInt8: 26.31
758
+ }),
759
+ ...yolo26Reduced("l", 256, {
760
+ onnx: 101.74,
761
+ coreml: 49.97,
762
+ ovFp32: 99.85,
763
+ ovInt8: 26.31
764
+ }),
765
+ ...yolov9Reduced("t", 320, {
766
+ onnx: 8,
767
+ coreml: 4.3,
768
+ ovFp16: 4,
769
+ ovInt8: 3
770
+ }),
771
+ ...yolov9Reduced("t", 640, {
772
+ onnx: 8,
773
+ coreml: 4.4,
774
+ ovFp16: 4,
775
+ ovInt8: 3
776
+ }),
777
+ ...yolov9Reduced("s", 320, {
778
+ onnx: 27,
779
+ coreml: 14.1,
780
+ ovFp16: 14,
781
+ ovInt8: 8
782
+ }),
783
+ ...yolov9Reduced("s", 640, {
784
+ onnx: 27,
785
+ coreml: 14.1,
786
+ ovFp16: 14,
787
+ ovInt8: 8
788
+ }),
789
+ ...yolov9Reduced("m", 320, {
790
+ onnx: 76,
791
+ coreml: 38.6,
792
+ ovFp16: 38,
793
+ ovInt8: 20
794
+ }),
795
+ ...yolov9Reduced("m", 640, {
796
+ onnx: 76,
797
+ coreml: 38.6,
798
+ ovFp16: 38,
799
+ ovInt8: 20
800
+ }),
801
+ ...yolov9Reduced("c", 320, {
802
+ onnx: 97,
803
+ coreml: 48.7,
804
+ ovFp16: 49,
805
+ ovInt8: 25
806
+ }),
807
+ ...yolov9Reduced("c", 640, {
808
+ onnx: 97,
809
+ coreml: 48.7,
810
+ ovFp16: 49,
811
+ ovInt8: 25
812
+ }),
813
+ ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "fp16", 112, true),
814
+ ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "int8", 56, true)
815
+ ];
816
+ /**
817
+ * The per-class confidence-floor DEFAULTS of each object-detection model
818
+ * (D738), keyed by model id. Applied onto the catalog entries below as
819
+ * `defaultClassFloors`; this is the ONLY place a model's floor is written. A
820
+ * model absent here runs at the step slider's global default
821
+ * (`ObjectDetectionStep.getConfigSchema`: person 0.65, vehicle 0.50, animal
822
+ * 0.50).
823
+ *
824
+ * Measured 2026-10-07 (`docs/benchmarks/model-floors.json`, which also holds
825
+ * precision/recall per class): the floor is the lowest score at which the model
826
+ * makes no more false positives than the production root (`yolov9m-320-int8` at
827
+ * 0.65 / 0.50 / 0.50) on the same 409 hub frames, against an ensemble
828
+ * pseudo-ground-truth, rounded to 0.05, minimum 0.25. Floors carry about
829
+ * +/-0.05-0.10 of noise. Where a floor hinges on a single high-score false
830
+ * positive, the next-lower value the measurement gives is used instead (marked
831
+ * below). A re-measurement replaces the JSON and these rows together; a spec
832
+ * holds them equal.
833
+ *
834
+ * `package` is not calibrated (7 objects in the set) and stays at its global
835
+ * default. Every catalog model NOT listed here (the 256 builds, yolo26 l/x,
836
+ * the seg builds, the fp16 legacy IRs) is untuned and runs at the global
837
+ * defaults.
838
+ */
839
+ var OBJECT_DETECTION_CLASS_FLOORS = {
840
+ "ssd-mobilenet-v2-coco-edgetpu": {
841
+ person: .6,
842
+ vehicle: .35,
843
+ animal: .4
844
+ },
845
+ yolo26m: {
846
+ person: .4,
847
+ vehicle: .25,
848
+ animal: .3
849
+ },
850
+ "yolo26m-320": {
851
+ person: .7,
852
+ vehicle: .3,
853
+ animal: .4
854
+ },
855
+ "yolo26m-320-int8": {
856
+ person: .6,
857
+ vehicle: .4,
858
+ animal: .3
859
+ },
860
+ "yolo26m-int8": {
861
+ person: .4,
862
+ vehicle: .35,
863
+ animal: .45
864
+ },
865
+ yolo26n: {
866
+ person: .65,
867
+ vehicle: .4,
868
+ animal: .5
869
+ },
870
+ "yolo26n-320": {
871
+ person: .6,
872
+ vehicle: .6,
873
+ animal: .4
874
+ },
875
+ "yolo26n-320-int8": {
876
+ person: .45,
877
+ vehicle: .55,
878
+ animal: .35
879
+ },
880
+ "yolo26n-int8": {
881
+ person: .55,
882
+ vehicle: .3,
883
+ animal: .4
884
+ },
885
+ yolo26s: {
886
+ person: .4,
887
+ vehicle: .45,
888
+ animal: .4
889
+ },
890
+ "yolo26s-320": {
891
+ person: .6,
892
+ vehicle: .45,
893
+ animal: .45
894
+ },
895
+ "yolo26s-320-int8": {
896
+ person: .5,
897
+ vehicle: .55,
898
+ animal: .45
899
+ },
900
+ "yolo26s-int8": {
901
+ person: .4,
902
+ vehicle: .3,
903
+ animal: .4
904
+ },
905
+ "yolov9c-320": {
906
+ person: .7,
907
+ vehicle: .45,
908
+ animal: .45
909
+ },
910
+ "yolov9c-320-int8": {
911
+ person: .7,
912
+ vehicle: .5,
913
+ animal: .25
914
+ },
915
+ "yolov9c-640": {
916
+ person: .55,
917
+ vehicle: .45,
918
+ animal: .3
919
+ },
920
+ "yolov9c-640-int8": {
921
+ person: .45,
922
+ vehicle: .4,
923
+ animal: .3
924
+ },
925
+ "yolov9m-320": {
926
+ person: .7,
927
+ vehicle: .5,
928
+ animal: .55
929
+ },
930
+ "yolov9m-320-int8": {
931
+ person: .65,
932
+ vehicle: .4,
933
+ animal: .45
934
+ },
935
+ "yolov9m-640": {
936
+ person: .6,
937
+ vehicle: .4,
938
+ animal: .55
939
+ },
940
+ "yolov9m-640-int8": {
941
+ person: .55,
942
+ vehicle: .4,
943
+ animal: .7
944
+ },
945
+ "yolov9s-320": {
946
+ person: .7,
947
+ vehicle: .55,
948
+ animal: .4
949
+ },
950
+ "yolov9s-320-int8": {
951
+ person: .7,
952
+ vehicle: .45,
953
+ animal: .4
954
+ },
955
+ "yolov9s-640": {
956
+ person: .7,
957
+ vehicle: .4,
958
+ animal: .6
959
+ },
960
+ "yolov9s-640-int8": {
961
+ person: .5,
962
+ vehicle: .3,
963
+ animal: .55
964
+ },
965
+ "yolov9t-320": {
966
+ person: .55,
967
+ vehicle: .45,
968
+ animal: .3
969
+ },
970
+ "yolov9t-320-int8": {
971
+ person: .55,
972
+ vehicle: .4,
973
+ animal: .3
974
+ },
975
+ "yolov9t-640": {
976
+ person: .65,
977
+ vehicle: .5,
978
+ animal: .5
979
+ },
980
+ "yolov9t-640-int8": {
981
+ person: .6,
982
+ vehicle: .55,
983
+ animal: .55
984
+ }
985
+ };
986
+ /**
987
+ * The floor on the DETECTION score below which a root detector's own fine
988
+ * label (a species, a vehicle type — the D736 root supply) is not taken (D741).
989
+ * Keyed by root model, then by the supplied step. Below it the detection keeps
990
+ * its macro class with no fine label; it is never dropped. A floor of 1 means
991
+ * "never take this label from this root". A root or step absent here has no
992
+ * extra floor — the macro floor alone gates the label, as before D741.
993
+ *
994
+ * Measured 2026-10-07 (`docs/benchmarks/classifier-floors.json`): the
995
+ * lowest detection score from which the root's species was right ~90% of the
996
+ * time, against a two-model zero-shot reference on 219 animal crops dominated
997
+ * by one dog. Unlisted roots behave alike — ~0.89-0.90 at the macro floor for
998
+ * 640 roots, ~0.74 for 320 roots. Vehicle types needed no extra floor on any
999
+ * root (0.99-1.00 at the macro floor). The Coral SSD named the species wrongly
1000
+ * three times in four.
1001
+ */
1002
+ var ROOT_SUPPLIED_LABEL_FLOORS = {
1003
+ "yolov9m-320-int8": { "animal-classifier": .75 },
1004
+ "yolov9m-640-int8": { "animal-classifier": .7 },
1005
+ "yolov9c-640-int8": { "animal-classifier": .75 },
1006
+ yolo26s: { "animal-classifier": .45 },
1007
+ yolo26m: { "animal-classifier": .7 },
1008
+ "yolo26s-int8": { "animal-classifier": .55 },
1009
+ "ssd-mobilenet-v2-coco-edgetpu": { "animal-classifier": 1 }
1010
+ };
1011
+ /** Stamp each entry's row of `floors` on it as `suppliedLabelFloors`. Fresh objects only. */
1012
+ function withSuppliedLabelFloors(entries, floors) {
1013
+ return entries.map((entry) => {
1014
+ const row = floors[entry.id];
1015
+ return row === void 0 ? entry : {
1016
+ ...entry,
1017
+ suppliedLabelFloors: { ...row }
1018
+ };
1019
+ });
1020
+ }
1021
+ /** Stamp each entry's row of `floors` on it as `defaultClassFloors`. Fresh objects only. */
1022
+ function withDefaultClassFloors(entries, floors) {
1023
+ return entries.map((entry) => {
1024
+ const row = floors[entry.id];
1025
+ return row === void 0 ? entry : {
1026
+ ...entry,
1027
+ defaultClassFloors: { ...row }
1028
+ };
1029
+ });
1030
+ }
1031
+ /**
1032
+ * Object-detection IRs that need f32 inference on an Intel GPU
1033
+ * (`gpuInferencePrecision`). At the GPU's default f16 the YOLO26 FP32 IRs of
1034
+ * the larger tiers return no valid detection — measured 2026-10-07 on the Core
1035
+ * Ultra iGPU and the N100: `yolo26s` (640) 0 true / 146 false positives,
1036
+ * `yolo26m` and `yolo26m-320` NaN scores; at f32 they match the CPU, at ~60%
1037
+ * more GPU latency. `yolo26n`, `yolo26n-320` and `yolo26s-320` were measured
1038
+ * correct at f16 and are NOT listed. The rest of the list is the same pattern
1039
+ * not yet measured (tier m / l / x at any input, tier s at 640, the seg builds
1040
+ * of those tiers): f32 costs latency, f16 risks a detector that silently finds
1041
+ * nothing. INT8 IRs and every YOLOv9 IR are correct at the device default.
1042
+ */
1043
+ var OPENVINO_GPU_F32_MODEL_IDS = new Set([
1044
+ "yolo26s",
1045
+ "yolo26m",
1046
+ "yolo26m-320",
1047
+ "yolo26m-256",
1048
+ "yolo26l",
1049
+ "yolo26l-320",
1050
+ "yolo26l-256",
1051
+ "yolo26x",
1052
+ "yolo26s-seg",
1053
+ "yolo26m-seg"
1054
+ ]);
1055
+ /** Stamp `gpuInferencePrecision: 'f32'` on the listed entries. Fresh objects only. */
1056
+ function withGpuF32(entries, ids) {
1057
+ return entries.map((entry) => ids.has(entry.id) ? {
1058
+ ...entry,
1059
+ gpuInferencePrecision: "f32"
1060
+ } : entry);
1061
+ }
1062
+ [...OPENVINO_GPU_F32_MODEL_IDS];
1063
+ var OBJECT_DETECTION_MODELS = withSuppliedLabelFloors(withGpuF32(withDefaultClassFloors(OBJECT_DETECTION_MODEL_ENTRIES, OBJECT_DETECTION_CLASS_FLOORS), OPENVINO_GPU_F32_MODEL_IDS), ROOT_SUPPLIED_LABEL_FLOORS);
1064
+ var FACE_DETECTION_MODELS = [{
1065
+ id: "yunet-2023mar",
1066
+ license: YUNET_MIT,
1067
+ name: "YuNet 2023mar",
1068
+ 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).",
1069
+ inputSize: {
1070
+ width: 640,
1071
+ height: 640
1072
+ },
1073
+ labels: [{
1074
+ id: "face",
1075
+ name: "Face"
1076
+ }],
1077
+ preprocessMode: "letterbox",
1078
+ postprocessor: "yunet",
1079
+ defaultConfidence: .7,
1080
+ formats: {
1081
+ onnx: {
1082
+ url: hf("faceDetection/yunet/onnx/camstack-yunet-2023mar.onnx"),
1083
+ sizeMB: .23
1084
+ },
1085
+ coreml: {
1086
+ url: hf("faceDetection/yunet/coreml/camstack-yunet-2023mar.mlpackage"),
1087
+ sizeMB: .2,
1088
+ isDirectory: true,
1089
+ files: [...MLPACKAGE_FILES],
1090
+ runtimes: ["python"]
1091
+ },
1092
+ openvino: ovFormat(hf("faceDetection/yunet/openvino/camstack-yunet-2023mar.xml"), .36),
1093
+ tflite: {
1094
+ url: hf("faceDetection/yunet/tflite/camstack-yunet-2023mar_edgetpu.tflite"),
1095
+ sizeMB: .7,
1096
+ runtimes: ["python"]
1097
+ }
1098
+ }
1099
+ }];
1100
+ var FACE_EMBEDDING_MODELS = [{
1101
+ id: "auraface-r100",
1102
+ license: AURAFACE_APACHE,
1103
+ name: "AuraFace R100",
1104
+ description: "AuraFace v1 (fal.ai) — iResNet-100 ArcFace face recognition embeddings (512-d), Apache-2.0. Benchmarks published by fal: LFW 99.65, CFP-FP 95.19, AgeDB 96.10, CALFW 94.70, CPLFW 90.93. Genuinely a ResNet-100 (65 M params) — roughly twice the depth of the former `arcface-r100` entry, which was a ResNet34.",
1105
+ inputSize: {
1106
+ width: 112,
1107
+ height: 112
1108
+ },
1109
+ labels: [{
1110
+ id: "embedding",
1111
+ name: "Face Embedding"
1112
+ }],
1113
+ preprocessMode: "resize",
1114
+ faceAlignment: true,
1115
+ formats: {
1116
+ onnx: {
1117
+ url: hf("faceRecognition/auraface/onnx/camstack-auraface-r100.onnx"),
1118
+ sizeMB: 261
1119
+ },
1120
+ coreml: {
1121
+ url: hf("faceRecognition/auraface/coreml/camstack-auraface-r100.mlpackage"),
1122
+ sizeMB: 131,
1123
+ isDirectory: true,
1124
+ files: [...MLPACKAGE_FILES],
1125
+ runtimes: ["python"]
1126
+ },
1127
+ openvino: ovFormat(hf("faceRecognition/auraface/openvino/camstack-auraface-r100.xml"), 131)
1128
+ }
1129
+ }];
1130
+ var PLATE_DETECTION_MODELS = [{
1131
+ id: "yolox-tiny-plate",
1132
+ license: OPEN_LPR_YOLOX_APACHE,
1133
+ name: "YOLOX-tiny — License Plate",
1134
+ description: "YOLOX-tiny licence-plate detector trained by the open-lpr project (Apache-2.0)",
1135
+ inputSize: {
1136
+ width: 640,
1137
+ height: 640
1138
+ },
1139
+ labels: [{
1140
+ id: "plate",
1141
+ name: "License Plate"
1142
+ }],
1143
+ preprocessMode: "letterbox",
1144
+ postprocessor: "yolo",
1145
+ formats: {
1146
+ onnx: {
1147
+ url: hf("plateDetection/yolox-tiny-plate/onnx/camstack-yolox-tiny-plate.onnx"),
1148
+ sizeMB: 19.3
1149
+ },
1150
+ coreml: {
1151
+ url: hf("plateDetection/yolox-tiny-plate/coreml/camstack-yolox-tiny-plate.mlpackage"),
1152
+ sizeMB: 9.8,
1153
+ isDirectory: true,
1154
+ files: [...MLPACKAGE_FILES],
1155
+ runtimes: ["python"]
1156
+ },
1157
+ openvino: ovFormat(hf("plateDetection/yolox-tiny-plate/openvino/camstack-yolox-tiny-plate.xml"), 10),
1158
+ tflite: {
1159
+ url: hf("plateDetection/yolox-tiny-plate/tflite/camstack-yolox-tiny-plate_edgetpu.tflite"),
1160
+ sizeMB: 6.9,
1161
+ runtimes: ["python"]
1162
+ }
1163
+ }
1164
+ }];
1165
+ var PACKAGE_DETECTION_MODELS = [{
1166
+ id: "rfdetr-package",
1167
+ license: RFDETR_APACHE,
1168
+ name: "RF-DETR — Package",
1169
+ description: "RF-DETR parcel detector — DETR-style decode (onnx / coreml / openvino). Separates parcel from doormat far better than the former yolov8n-package (+0.86 vs +0.21 margin on 615) at ~4× the size and ~6× the latency",
1170
+ inputSize: {
1171
+ width: 576,
1172
+ height: 576
1173
+ },
1174
+ labels: [{
1175
+ id: "package",
1176
+ name: "Package"
1177
+ }],
1178
+ preprocessMode: "resize",
1179
+ inputNormalization: "imagenet",
1180
+ postprocessor: "rfdetr",
1181
+ formats: {
1182
+ onnx: {
1183
+ url: hf("packageDetection/rfdetr-package/onnx/camstack-rfdetr-package.onnx"),
1184
+ sizeMB: 115
1185
+ },
1186
+ coreml: {
1187
+ url: hf("packageDetection/rfdetr-package/coreml/camstack-rfdetr-package.mlpackage"),
1188
+ sizeMB: 58,
1189
+ isDirectory: true,
1190
+ files: [...MLPACKAGE_FILES],
1191
+ runtimes: ["python"]
1192
+ },
1193
+ openvino: ovFormat(hf("packageDetection/rfdetr-package/openvino/camstack-rfdetr-package.xml"), 58)
1194
+ }
1195
+ }];
1196
+ var PLATE_OCR_MODELS = [{
1197
+ id: "cct-s-v2-global",
1198
+ license: FAST_PLATE_OCR_MIT,
1199
+ name: "CCT-S v2 Global — License Plate",
1200
+ description: "fast-plate-ocr CCT-S v2 — a dedicated license-plate reader (66 regions incl. Germany). 19/21 exact on the cam-617 ground-truth set vs 4/21 for the generic VGG text recognizer, with zero false reads on 18 junk ROIs",
1201
+ inputSize: {
1202
+ width: 128,
1203
+ height: 64
1204
+ },
1205
+ inputLayout: "nhwc",
1206
+ labels: [{
1207
+ id: "text",
1208
+ name: "Plate Text"
1209
+ }],
1210
+ preprocessMode: "resize",
1211
+ postprocessor: "plate-slots",
1212
+ formats: {
1213
+ onnx: {
1214
+ url: hf("plateRecognition/cct-s-v2-global/onnx/camstack-cct-s-v2-global.onnx"),
1215
+ sizeMB: 5.3
1216
+ },
1217
+ coreml: {
1218
+ url: hf("plateRecognition/cct-s-v2-global/coreml/camstack-cct-s-v2-global.mlpackage"),
1219
+ sizeMB: 5.1,
1220
+ isDirectory: true,
1221
+ files: [...MLPACKAGE_FILES],
1222
+ runtimes: ["python"]
1223
+ },
1224
+ openvino: ovFormat(hf("plateRecognition/cct-s-v2-global/openvino/camstack-cct-s-v2-global.xml"), 5)
1225
+ }
1226
+ }];
1227
+ var ANIMAL_CLASSIFIER_MODELS = [{
1228
+ id: "animal-classifier",
1229
+ license: ANIMAL_CLASSIFIER_APACHE,
1230
+ name: "Animal Classifier (8)",
1231
+ description: "EfficientNet-Lite0 animal classifier — bird, cat, cow, deer, dog, horse, sheep, squirrel (Open Images V7, publicly distributable). Unreliable on home cameras: it has no reject class, so it names a species for anything it is given, and calls light curly-coated dogs sheep or cat at high confidence. Prefer a root detector that names animals itself.",
1232
+ defaultConfidence: .8,
1233
+ inputSize: {
1234
+ width: 224,
1235
+ height: 224
1236
+ },
1237
+ inputLayout: "nchw",
1238
+ inputNormalization: "imagenet",
1239
+ labels: [{
1240
+ id: "animal-type",
1241
+ name: "Animal Type"
1242
+ }],
1243
+ preprocessMode: "resize",
1244
+ formats: {
1245
+ onnx: {
1246
+ url: hf("animalClassification/animal-classifier/onnx/animal-classifier.onnx"),
1247
+ sizeMB: 13
1248
+ },
1249
+ coreml: {
1250
+ url: hf("animalClassification/animal-classifier/coreml/animal-classifier.mlpackage"),
1251
+ sizeMB: 6.5,
1252
+ isDirectory: true,
1253
+ files: [...MLPACKAGE_FILES],
1254
+ runtimes: ["python"]
1255
+ },
1256
+ openvino: ovFormat(hf("animalClassification/animal-classifier/openvino/animal-classifier.xml"), 6.9)
1257
+ },
1258
+ extraFiles: [{
1259
+ url: hf("animalClassification/animal-classifier/onnx/animal-classifier-labels.json"),
1260
+ filename: "animal-classifier-labels.json",
1261
+ sizeMB: .01
1262
+ }]
1263
+ }];
1264
+ var BIRD_CLASSIFIER_MODELS = [{
1265
+ id: "bird-classifier",
1266
+ license: AIY_BIRDS_APACHE,
1267
+ name: "Bird Classifier (AIY 965)",
1268
+ description: "Google AIY Birds V1 (MobileNetV2) — 964 species + background; publicly distributable (Apache-2.0)",
1269
+ inputSize: {
1270
+ width: 224,
1271
+ height: 224
1272
+ },
1273
+ inputLayout: "nhwc",
1274
+ inputNormalization: "none",
1275
+ outputProbabilities: true,
1276
+ labels: [{
1277
+ id: "species",
1278
+ name: "Bird Species"
1279
+ }],
1280
+ preprocessMode: "resize",
1281
+ formats: {
1282
+ onnx: {
1283
+ url: hf("animalClassification/bird-classifier/onnx/bird-classifier.onnx"),
1284
+ sizeMB: 14
1285
+ },
1286
+ coreml: {
1287
+ url: hf("animalClassification/bird-classifier/coreml/bird-classifier.mlpackage"),
1288
+ sizeMB: 6.8,
1289
+ isDirectory: true,
1290
+ files: [...MLPACKAGE_FILES],
1291
+ runtimes: ["python"]
1292
+ },
1293
+ openvino: ovFormat(hf("animalClassification/bird-classifier/openvino/bird-classifier.xml"), 14),
1294
+ tflite: {
1295
+ url: hf("animalClassification/bird-classifier/tflite/bird-classifier_edgetpu.tflite"),
1296
+ sizeMB: 3.9,
1297
+ runtimes: ["python"]
1298
+ }
1299
+ },
1300
+ extraFiles: [{
1301
+ url: hf("animalClassification/bird-classifier/onnx/bird-classifier-labels.json"),
1302
+ filename: "bird-classifier-labels.json",
1303
+ sizeMB: .03
1304
+ }]
1305
+ }];
1306
+ var VEHICLE_CLASSIFIER_MODELS = [{
1307
+ id: "vehicle-type-v1",
1308
+ license: VEHICLE_TYPE_V1_NC,
1309
+ name: "Vehicle Type (8)",
1310
+ description: "MobileNetV3-Large vehicle type classifier — Ambulance, Bicycle, Bus, Car, Motorcycle, Taxi, Truck, Van (val 89.4%)",
1311
+ defaultConfidence: .6,
1312
+ inputSize: {
1313
+ width: 224,
1314
+ height: 224
1315
+ },
1316
+ inputLayout: "nchw",
1317
+ inputNormalization: "imagenet",
1318
+ labels: [{
1319
+ id: "vehicle-type",
1320
+ name: "Vehicle Type"
1321
+ }],
1322
+ preprocessMode: "resize",
1323
+ formats: {
1324
+ onnx: {
1325
+ url: hf("vehicleClassification/vehicle-type-v1/onnx/vehicle-type-v1.onnx"),
1326
+ sizeMB: 17
1327
+ },
1328
+ coreml: {
1329
+ url: hf("vehicleClassification/vehicle-type-v1/coreml/vehicle-type-v1.mlpackage"),
1330
+ sizeMB: 8.1,
1331
+ isDirectory: true,
1332
+ files: [...MLPACKAGE_FILES],
1333
+ runtimes: ["python"]
1334
+ },
1335
+ openvino: ovFormat(hf("vehicleClassification/vehicle-type-v1/openvino/vehicle-type-v1.xml"), 8.7)
1336
+ },
1337
+ extraFiles: [{
1338
+ url: hf("vehicleClassification/vehicle-type-v1/onnx/vehicle-type-v1-labels.json"),
1339
+ filename: "vehicle-type-v1-labels.json",
1340
+ sizeMB: .01
1341
+ }]
1342
+ }];
1343
+ var SEGMENTATION_REFINER_MODELS = [{
1344
+ id: "u2netp",
1345
+ license: U2NET_APACHE,
1346
+ name: "U2-Net Portable",
1347
+ description: "U2-Net-P — ultra-lightweight salient object segmentation (4.7 MB)",
1348
+ inputSize: {
1349
+ width: 320,
1350
+ height: 320
1351
+ },
1352
+ labels: [{
1353
+ id: "mask",
1354
+ name: "Segmentation Mask"
1355
+ }],
1356
+ preprocessMode: "resize",
1357
+ formats: {
1358
+ onnx: {
1359
+ url: hf("segmentationRefiner/u2netp/onnx/camstack-u2netp.onnx"),
1360
+ sizeMB: 5
1361
+ },
1362
+ coreml: {
1363
+ url: hf("segmentationRefiner/u2netp/coreml/camstack-u2netp.mlpackage"),
1364
+ sizeMB: 3,
1365
+ isDirectory: true,
1366
+ files: [...MLPACKAGE_FILES],
1367
+ runtimes: ["python"]
1368
+ },
1369
+ openvino: ovFormat(hf("segmentationRefiner/u2netp/openvino/camstack-u2netp.xml"), 2.5)
1370
+ }
1371
+ }];
1372
+ /**
1373
+ * The dormant `instance-segmentation` step's catalog: the YOLO26-seg entries of
1374
+ * {@link OBJECT_DETECTION_MODELS}, by reference. One entry per model (D703) —
1375
+ * the artifact lives once, in the root's catalog, where it can be selected as
1376
+ * the camera root and supply the `segmentation` step's masks (D737).
1377
+ */
1378
+ var INSTANCE_SEGMENTATION_MODELS = OBJECT_DETECTION_MODELS.filter((m) => m.group?.family === YOLO26_SEG_FAMILY);
1379
+ var CLIP_EMBEDDING_MODELS = [{
1380
+ id: "siglip2-b16-224",
1381
+ license: SIGLIP2_APACHE,
1382
+ name: "SigLIP2 B/16",
1383
+ description: "Google SigLIP2 base, patch 16, 224×224 — Apache-2.0 CLIP vision encoder, 768-dim (fp16 OpenVINO/CoreML)",
1384
+ inputSize: {
1385
+ width: 224,
1386
+ height: 224
1387
+ },
1388
+ labels: [{
1389
+ id: "embedding",
1390
+ name: "CLIP Embedding"
1391
+ }],
1392
+ preprocessMode: "resize",
1393
+ inputNormalization: "none",
1394
+ formats: {
1395
+ openvino: ovFormat(hf("clip/siglip2/openvino/camstack-siglip2-b16-224-vision.xml"), 186),
1396
+ coreml: {
1397
+ url: hf("clip/siglip2/coreml/camstack-siglip2-b16-224-vision.mlpackage"),
1398
+ sizeMB: 185,
1399
+ isDirectory: true,
1400
+ files: [...MLPACKAGE_FILES],
1401
+ runtimes: ["python"]
1402
+ }
1403
+ }
1404
+ }];
1405
+ var AUDIO_CLASSIFIER_MODELS = [{
1406
+ id: "yamnet-onnx",
1407
+ license: YAMNET_APACHE,
1408
+ name: "YAMNet",
1409
+ description: "Google YAMNet — 521-class audio event classifier (16 MB ONNX, runs on any platform)",
1410
+ inputSize: {
1411
+ width: 1,
1412
+ height: 16e3
1413
+ },
1414
+ labels: [],
1415
+ preprocessMode: "resize",
1416
+ extraFiles: [{
1417
+ url: hf("audioClassification/yamnet/camstack-yamnet-labels.json"),
1418
+ filename: "camstack-yamnet-labels.json",
1419
+ sizeMB: .01
1420
+ }],
1421
+ formats: {
1422
+ onnx: {
1423
+ url: hf("audioClassification/yamnet/onnx/camstack-yamnet.onnx"),
1424
+ sizeMB: 16.1
1425
+ },
1426
+ openvino: ovFormat(hf("audioClassification/yamnet/openvino/camstack-yamnet.xml"), 8.2)
1427
+ }
1428
+ }, {
1429
+ id: "apple-soundanalysis",
1430
+ license: APPLE_SOUNDANALYSIS,
1431
+ name: "Apple SoundAnalysis",
1432
+ description: "macOS built-in — 303 sound categories, Neural Engine accelerated, zero download",
1433
+ inputSize: {
1434
+ width: 1,
1435
+ height: 16e3
1436
+ },
1437
+ labels: [],
1438
+ preprocessMode: "resize",
1439
+ formats: { coreml: {
1440
+ url: "",
1441
+ sizeMB: 0
1442
+ } }
1443
+ }];
1444
+ //#endregion
1445
+ export { FACE_DETECTION_MODELS as a, OBJECT_DETECTION_MODELS as c, PLATE_OCR_MODELS as d, SEGMENTATION_REFINER_MODELS as f, CLIP_EMBEDDING_MODELS as i, PACKAGE_DETECTION_MODELS as l, AUDIO_CLASSIFIER_MODELS as n, FACE_EMBEDDING_MODELS as o, VEHICLE_CLASSIFIER_MODELS as p, BIRD_CLASSIFIER_MODELS as r, INSTANCE_SEGMENTATION_MODELS as s, ANIMAL_CLASSIFIER_MODELS as t, PLATE_DETECTION_MODELS as u };