@camstack/addon-pipeline 1.2.338 → 1.2.340

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