@camstack/addon-pipeline 1.1.67 → 1.1.69

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 (26) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/detection-pipeline/index.js +137 -27
  4. package/dist/detection-pipeline/index.mjs +137 -27
  5. package/dist/{dist-DkGHtAaK.mjs → dist-BT4Ug2Bf.mjs} +22 -2
  6. package/dist/{dist-BxxVKcnw.js → dist-DUcDVlg7.js} +22 -2
  7. package/dist/motion-wasm/index.js +1 -1
  8. package/dist/motion-wasm/index.mjs +1 -1
  9. package/dist/pipeline-runner/index.js +7 -3
  10. package/dist/pipeline-runner/index.mjs +7 -3
  11. package/dist/recorder/index.js +1 -1
  12. package/dist/recorder/index.mjs +1 -1
  13. package/dist/{step-definitions-CAs0RD2N.js → step-definitions-4tt-nRM4.js} +114 -187
  14. package/dist/{step-definitions-Delhq28w.mjs → step-definitions-DO0hIDMx.mjs} +114 -187
  15. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CfFsU700.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CP4DpABx.mjs} +1 -1
  16. package/dist/stream-broker/{hostInit-D-S5fCDx.mjs → hostInit-Do2ymS0O.mjs} +1 -1
  17. package/dist/stream-broker/index.js +1 -1
  18. package/dist/stream-broker/index.mjs +1 -1
  19. package/dist/stream-broker/remoteEntry.js +1 -1
  20. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-CRvzj7Of.js → MaskShapeCanvas-DI4BY7W2-DlI3udxg.js} +1 -1
  21. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-CBgvPUB-.js → MotionZonesSettings-NcxxQN8r-Du8J0kED.js} +1 -1
  22. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-DH07fe1k.js → PrivacyMaskSettings-APgPLF7p-DSST47WI.js} +1 -1
  23. package/embed-dist/assets/{index-BkoPcGtQ.js → index-B2ux2xJ7.js} +4 -4
  24. package/embed-dist/index.html +1 -1
  25. package/package.json +1 -1
  26. package/python/inference_pool.py +13 -3
@@ -12187,8 +12187,18 @@ var pipelineExecutorCapability = {
12187
12187
  * - `runtime` — main camera-serving engine (no idle TTL).
12188
12188
  * - `warm-override` — benchmark/test override held in the warm
12189
12189
  * cache; auto-disposed after the idle TTL.
12190
+ * - `device-pool` — a concurrent per-device pool (Phase 2
12191
+ * multi-device, keyed by `deviceKey`) resolved
12192
+ * via `resolveDeviceFactory`. Runs alongside the
12193
+ * `runtime` engine on a DIFFERENT accelerator
12194
+ * (NPU / iGPU / Coral) — this is how the
12195
+ * Engines tab shows all pools running at once.
12190
12196
  */
12191
- kind: _enum(["runtime", "warm-override"]),
12197
+ kind: _enum([
12198
+ "runtime",
12199
+ "warm-override",
12200
+ "device-pool"
12201
+ ]),
12192
12202
  /** Native pid of the underlying Python pool (null when no pool). */
12193
12203
  poolPid: number().nullable(),
12194
12204
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -18036,7 +18046,17 @@ var AgentPipelineSettingsSchema = object({
18036
18046
  * it already uses to reach the hub). Set this only when the auto-detected
18037
18047
  * address is wrong (multi-homed host, NAT, custom interface).
18038
18048
  */
18039
- reachableHost: string().optional()
18049
+ reachableHost: string().optional(),
18050
+ /**
18051
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
18052
+ * weight}. Absent / all-disabled ⇒ the node's single default accelerator
18053
+ * (safe default); two+ enabled ⇒ the dispatcher balances detection sessions
18054
+ * across them so they run CONCURRENTLY.
18055
+ */
18056
+ inferenceDevices: record(string(), object({
18057
+ enabled: boolean(),
18058
+ weight: number().positive().optional()
18059
+ })).optional()
18040
18060
  });
18041
18061
  var CameraPipelineForAgentSchema = object({
18042
18062
  steps: array(PipelineStepInputSchema).readonly(),
@@ -12187,8 +12187,18 @@ var pipelineExecutorCapability = {
12187
12187
  * - `runtime` — main camera-serving engine (no idle TTL).
12188
12188
  * - `warm-override` — benchmark/test override held in the warm
12189
12189
  * cache; auto-disposed after the idle TTL.
12190
+ * - `device-pool` — a concurrent per-device pool (Phase 2
12191
+ * multi-device, keyed by `deviceKey`) resolved
12192
+ * via `resolveDeviceFactory`. Runs alongside the
12193
+ * `runtime` engine on a DIFFERENT accelerator
12194
+ * (NPU / iGPU / Coral) — this is how the
12195
+ * Engines tab shows all pools running at once.
12190
12196
  */
12191
- kind: _enum(["runtime", "warm-override"]),
12197
+ kind: _enum([
12198
+ "runtime",
12199
+ "warm-override",
12200
+ "device-pool"
12201
+ ]),
12192
12202
  /** Native pid of the underlying Python pool (null when no pool). */
12193
12203
  poolPid: number().nullable(),
12194
12204
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -18036,7 +18046,17 @@ var AgentPipelineSettingsSchema = object({
18036
18046
  * it already uses to reach the hub). Set this only when the auto-detected
18037
18047
  * address is wrong (multi-homed host, NAT, custom interface).
18038
18048
  */
18039
- reachableHost: string().optional()
18049
+ reachableHost: string().optional(),
18050
+ /**
18051
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
18052
+ * weight}. Absent / all-disabled ⇒ the node's single default accelerator
18053
+ * (safe default); two+ enabled ⇒ the dispatcher balances detection sessions
18054
+ * across them so they run CONCURRENTLY.
18055
+ */
18056
+ inferenceDevices: record(string(), object({
18057
+ enabled: boolean(),
18058
+ weight: number().positive().optional()
18059
+ })).optional()
18040
18060
  });
18041
18061
  var CameraPipelineForAgentSchema = object({
18042
18062
  steps: array(PipelineStepInputSchema).readonly(),
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-BxxVKcnw.js");
5
+ const require_dist = require("../dist-DUcDVlg7.js");
6
6
  let node_fs = require("node:fs");
7
7
  let node_path = require("node:path");
8
8
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { C as evaluateZoneRules, K as hydrateSchema, O as motionDetectionCapability, V as BaseAddon, W as DeviceType } from "../dist-DkGHtAaK.mjs";
1
+ import { C as evaluateZoneRules, K as hydrateSchema, O as motionDetectionCapability, V as BaseAddon, W as DeviceType } from "../dist-BT4Ug2Bf.mjs";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-BxxVKcnw.js");
6
+ const require_dist = require("../dist-DUcDVlg7.js");
7
7
  const require_remote_restream = require("../remote-restream-CO36Sr30.js");
8
8
  const require_sheet_geometry = require("../sheet-geometry-BR-ip0CP.js");
9
9
  const require_worker_protocol = require("../worker-protocol-PP4jKHHJ.js");
10
- const require_step_definitions = require("../step-definitions-CAs0RD2N.js");
10
+ const require_step_definitions = require("../step-definitions-4tt-nRM4.js");
11
11
  let node_child_process = require("node:child_process");
12
12
  let node_url = require("node:url");
13
13
  let sharp = require("sharp");
@@ -3300,11 +3300,13 @@ var PipelineRunnerAddon = class extends require_dist.BaseAddon {
3300
3300
  async runDetailPipeline(steps, imageJpeg, deviceId) {
3301
3301
  const api = this.ctxIfReady?.api;
3302
3302
  if (!api) return null;
3303
+ const detailDeviceKey = this.attached.get(deviceId)?.config?.deviceKey;
3303
3304
  try {
3304
3305
  return await api.pipelineExecutor.runPipeline.mutate({
3305
3306
  steps: [...steps],
3306
3307
  image: new Uint8Array(imageJpeg),
3307
3308
  deviceId,
3309
+ ...detailDeviceKey ? { deviceKey: detailDeviceKey } : {},
3308
3310
  plane: "full"
3309
3311
  });
3310
3312
  } catch (err) {
@@ -3787,7 +3789,8 @@ var PipelineRunnerAddon = class extends require_dist.BaseAddon {
3787
3789
  log.error("runInference: this.ctx.api not available");
3788
3790
  return null;
3789
3791
  }
3790
- const steps = (this.attached.get(deviceId)?.config)?.steps;
3792
+ const camConfig = this.attached.get(deviceId)?.config;
3793
+ const steps = camConfig?.steps;
3791
3794
  if (!steps) {
3792
3795
  log.warn("runInference: no steps in attach config — skipping frame (legacy attach?)");
3793
3796
  return null;
@@ -3821,6 +3824,7 @@ var PipelineRunnerAddon = class extends require_dist.BaseAddon {
3821
3824
  steps: [...dispatchSteps],
3822
3825
  ...image !== void 0 ? { image } : { frame },
3823
3826
  deviceId,
3827
+ ...camConfig?.deviceKey ? { deviceKey: camConfig.deviceKey } : {},
3824
3828
  plane: "frame"
3825
3829
  });
3826
3830
  } catch (err) {
@@ -1,8 +1,8 @@
1
- import { B as errMsg, G as createEvent, V as BaseAddon, dt as EventCategory, et as _enum, it as lazy, j as pipelineRunnerCapability, k as nodePin, lt as string, nt as boolean, ot as number, st as object, tt as array, x as defineCustomActions, y as customAction } from "../dist-DkGHtAaK.mjs";
1
+ import { B as errMsg, G as createEvent, V as BaseAddon, dt as EventCategory, et as _enum, it as lazy, j as pipelineRunnerCapability, k as nodePin, lt as string, nt as boolean, ot as number, st as object, tt as array, x as defineCustomActions, y as customAction } from "../dist-BT4Ug2Bf.mjs";
2
2
  import { n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-BeHi78PZ.mjs";
3
3
  import { r as resolveHubHostname } from "../sheet-geometry-DcpuGTCm.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-CyVJTZEO.mjs";
5
- import { a as getStepDefinition } from "../step-definitions-Delhq28w.mjs";
5
+ import { a as getStepDefinition } from "../step-definitions-DO0hIDMx.mjs";
6
6
  import { fork } from "node:child_process";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import sharp from "sharp";
@@ -3294,11 +3294,13 @@ var PipelineRunnerAddon = class extends BaseAddon {
3294
3294
  async runDetailPipeline(steps, imageJpeg, deviceId) {
3295
3295
  const api = this.ctxIfReady?.api;
3296
3296
  if (!api) return null;
3297
+ const detailDeviceKey = this.attached.get(deviceId)?.config?.deviceKey;
3297
3298
  try {
3298
3299
  return await api.pipelineExecutor.runPipeline.mutate({
3299
3300
  steps: [...steps],
3300
3301
  image: new Uint8Array(imageJpeg),
3301
3302
  deviceId,
3303
+ ...detailDeviceKey ? { deviceKey: detailDeviceKey } : {},
3302
3304
  plane: "full"
3303
3305
  });
3304
3306
  } catch (err) {
@@ -3781,7 +3783,8 @@ var PipelineRunnerAddon = class extends BaseAddon {
3781
3783
  log.error("runInference: this.ctx.api not available");
3782
3784
  return null;
3783
3785
  }
3784
- const steps = (this.attached.get(deviceId)?.config)?.steps;
3786
+ const camConfig = this.attached.get(deviceId)?.config;
3787
+ const steps = camConfig?.steps;
3785
3788
  if (!steps) {
3786
3789
  log.warn("runInference: no steps in attach config — skipping frame (legacy attach?)");
3787
3790
  return null;
@@ -3815,6 +3818,7 @@ var PipelineRunnerAddon = class extends BaseAddon {
3815
3818
  steps: [...dispatchSteps],
3816
3819
  ...image !== void 0 ? { image } : { frame },
3817
3820
  deviceId,
3821
+ ...camConfig?.deviceKey ? { deviceKey: camConfig.deviceKey } : {},
3818
3822
  plane: "frame"
3819
3823
  });
3820
3824
  } catch (err) {
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("../chunk-D6vf50IK.js");
2
- const require_dist = require("../dist-BxxVKcnw.js");
2
+ const require_dist = require("../dist-DUcDVlg7.js");
3
3
  const require_sheet_geometry = require("../sheet-geometry-BR-ip0CP.js");
4
4
  const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Dv-oFwjN.js");
5
5
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { B as errMsg, D as migrateConfigToBands, I as storageEvictableCapability, K as hydrateSchema, M as recordingCapability, N as recordingExportCapability, P as resolveScrubThumbnailGeometry, Q as selectAssignedProfileSlots, V as BaseAddon, W as DeviceType, ct as record, d as OpsLogEntrySchema, dt as EventCategory, f as RecordingConfigSchema, k as nodePin, l as ExportRecordSchema, lt as string, q as isEvent, s as EVENT_PAD_MS, tt as array } from "../dist-DkGHtAaK.mjs";
1
+ import { B as errMsg, D as migrateConfigToBands, I as storageEvictableCapability, K as hydrateSchema, M as recordingCapability, N as recordingExportCapability, P as resolveScrubThumbnailGeometry, Q as selectAssignedProfileSlots, V as BaseAddon, W as DeviceType, ct as record, d as OpsLogEntrySchema, dt as EventCategory, f as RecordingConfigSchema, k as nodePin, l as ExportRecordSchema, lt as string, q as isEvent, s as EVENT_PAD_MS, tt as array } from "../dist-BT4Ug2Bf.mjs";
2
2
  import { n as computeSheetGeometry, r as resolveHubHostname, t as allTilePlacements } from "../sheet-geometry-DcpuGTCm.mjs";
3
3
  import { n as createFileDataPlaneHandler, s as parseRangeHeader, t as contentTypeFor } from "../model-download-service-Cp9f4dk6-CwUb5v3Y.mjs";
4
4
  import { spawn } from "node:child_process";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-BxxVKcnw.js");
1
+ const require_dist = require("./dist-DUcDVlg7.js");
2
2
  //#region src/detection-pipeline/registry/model-catalogs.ts
3
3
  var HF_REPO = "camstack/camstack-models";
4
4
  var HF_SCRYPTED = "scrypted/plugin-models";
@@ -61,6 +61,71 @@ var YOLO26_TIER_NAME = {
61
61
  m: "Medium",
62
62
  l: "Large"
63
63
  };
64
+ var YOLOV9_TIER_NAME = {
65
+ t: "Tiny",
66
+ s: "Small",
67
+ m: "Medium",
68
+ c: "Compact"
69
+ };
70
+ /**
71
+ * OUR YOLOv9 family (Ultralytics base) — the NPU-detection line. Unlike yolo26
72
+ * (whose arch the Intel NPU rejects → 0 frames), yolov9 COMPILES AND RUNS on the
73
+ * Intel NPU ("AI Boost"). Empirically: our yolov9t-320-int8 = ~298 fps on the
74
+ * NPU vs yolo26n = 103 on the iGPU (~2.9×). t/s/m/c × {320,640}; each size ships
75
+ * a base entry (onnx + coreml + openvino **fp16**) + an OpenVINO **int8** entry
76
+ * (the NPU/iGPU-optimal config). CoreML (fp16) runs on the Mac ANE — the
77
+ * apple-ane default detector (`default-detection-model.ts`).
78
+ */
79
+ var yolov9Reduced = (tier, res, sizes) => {
80
+ const name = YOLOV9_TIER_NAME[tier] ?? tier.toUpperCase();
81
+ return [{
82
+ id: `yolov9${tier}-${res}`,
83
+ group: {
84
+ family: "yolov9",
85
+ tier,
86
+ resolution: res
87
+ },
88
+ name: `YOLOv9 ${name} @${res}`,
89
+ description: `YOLOv9 ${name} @${res}×${res} (Ultralytics) — OpenVINO fp16, runs on Intel NPU + iGPU (NPU-compatible; yolo26 is not).`,
90
+ inputSize: {
91
+ width: res,
92
+ height: res
93
+ },
94
+ labels: [],
95
+ preprocessMode: "letterbox",
96
+ formats: {
97
+ onnx: {
98
+ url: hf(`objectDetection/yolov9/onnx/camstack-yolov9${tier}-${res}.onnx`),
99
+ sizeMB: sizes.onnx
100
+ },
101
+ coreml: {
102
+ url: hf(`objectDetection/yolov9/coreml/camstack-yolov9${tier}-${res}.mlpackage`),
103
+ sizeMB: sizes.coreml,
104
+ isDirectory: true,
105
+ files: [...MLPACKAGE_FILES],
106
+ runtimes: ["python"]
107
+ },
108
+ openvino: ovFormat(hf(`objectDetection/yolov9/openvino/camstack-yolov9${tier}-${res}-fp16.xml`), sizes.ovFp16)
109
+ }
110
+ }, {
111
+ id: `yolov9${tier}-${res}-int8`,
112
+ group: {
113
+ family: "yolov9",
114
+ tier,
115
+ precision: "int8",
116
+ resolution: res
117
+ },
118
+ name: `YOLOv9 ${name} @${res} (INT8)`,
119
+ description: `YOLOv9 ${name} @${res} — OpenVINO INT8 for the Intel NPU / iGPU. The NPU's fastest config (our-base detector).`,
120
+ inputSize: {
121
+ width: res,
122
+ height: res
123
+ },
124
+ labels: [],
125
+ preprocessMode: "letterbox",
126
+ formats: { openvino: ovFormat(hf(`objectDetection/yolov9/openvino/camstack-yolov9${tier}-${res}-int8.xml`), sizes.ovInt8) }
127
+ }];
128
+ };
64
129
  /**
65
130
  * Reduced-input YOLO26 variants (2026-07-11). A lower square input (320 / 256)
66
131
  * is the biggest, cheapest latency lever measured across every runtime — Mac
@@ -121,84 +186,6 @@ var yolo26Reduced = (tier, res, sizes) => {
121
186
  }];
122
187
  };
123
188
  var OBJECT_DETECTION_MODELS = [
124
- {
125
- id: "yolov9t",
126
- legacy: true,
127
- name: "YOLOv9 Tiny",
128
- description: "YOLOv9 Tiny — ultra-lightweight next-gen detector",
129
- inputSize: {
130
- width: 640,
131
- height: 640
132
- },
133
- labels: [],
134
- preprocessMode: "letterbox",
135
- formats: {
136
- onnx: {
137
- url: hf("objectDetection/yolov9/onnx/camstack-yolov9t.onnx"),
138
- sizeMB: 8
139
- },
140
- coreml: {
141
- url: hf("objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage"),
142
- sizeMB: 4,
143
- isDirectory: true,
144
- files: [...MLPACKAGE_FILES],
145
- runtimes: ["python"]
146
- },
147
- openvino: ovFormat(hf("objectDetection/yolov9/openvino/camstack-yolov9t.xml"), 6)
148
- }
149
- },
150
- {
151
- id: "yolov9s",
152
- legacy: true,
153
- name: "YOLOv9 Small",
154
- description: "YOLOv9 Small — improved efficiency over YOLOv8s",
155
- inputSize: {
156
- width: 640,
157
- height: 640
158
- },
159
- labels: [],
160
- preprocessMode: "letterbox",
161
- formats: {
162
- onnx: {
163
- url: hf("objectDetection/yolov9/onnx/camstack-yolov9s.onnx"),
164
- sizeMB: 28
165
- },
166
- coreml: {
167
- url: hf("objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage"),
168
- sizeMB: 14,
169
- isDirectory: true,
170
- files: [...MLPACKAGE_FILES],
171
- runtimes: ["python"]
172
- },
173
- openvino: ovFormat(hf("objectDetection/yolov9/openvino/camstack-yolov9s.xml"), 16)
174
- }
175
- },
176
- {
177
- id: "yolov9c",
178
- legacy: true,
179
- name: "YOLOv9 C",
180
- description: "YOLOv9 C — high-accuracy compact model",
181
- inputSize: {
182
- width: 640,
183
- height: 640
184
- },
185
- labels: [],
186
- preprocessMode: "letterbox",
187
- formats: {
188
- onnx: {
189
- url: hf("objectDetection/yolov9/onnx/camstack-yolov9c.onnx"),
190
- sizeMB: 97
191
- },
192
- coreml: {
193
- url: hf("objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage"),
194
- sizeMB: 48,
195
- isDirectory: true,
196
- files: [...MLPACKAGE_FILES],
197
- runtimes: ["python"]
198
- },
199
- openvino: ovFormat(hf("objectDetection/yolov9/openvino/camstack-yolov9c.xml"), 49)
200
- }
201
- },
202
189
  {
203
190
  id: "yolo26n",
204
191
  group: {
@@ -375,114 +362,6 @@ var OBJECT_DETECTION_MODELS = [
375
362
  runtimes: ["python"]
376
363
  } }
377
364
  },
378
- {
379
- id: "scrypted-yolov9t-relu",
380
- legacy: true,
381
- name: "YOLOv9 Tiny ReLU",
382
- description: "YOLOv9t ReLU — optimized for int8 quantization",
383
- inputSize: {
384
- width: 320,
385
- height: 320
386
- },
387
- labels: [],
388
- preprocessMode: "letterbox",
389
- formats: {
390
- onnx: {
391
- url: hfScrypted("onnx/scrypted_yolov9t_relu/scrypted_yolov9t_relu.onnx"),
392
- sizeMB: 8.1
393
- },
394
- coreml: {
395
- url: hfScrypted("coreml/scrypted_yolov9t_relu/scrypted_yolov9t_relu.mlpackage"),
396
- sizeMB: 4,
397
- isDirectory: true,
398
- files: [...MLPACKAGE_FILES],
399
- runtimes: ["python"]
400
- },
401
- openvino: ovFormat(hf("objectDetection/scrypted-yolov9-relu/openvino/scrypted_yolov9t_relu.xml"), 6)
402
- }
403
- },
404
- {
405
- id: "scrypted-yolov9s-relu",
406
- legacy: true,
407
- name: "YOLOv9 Small ReLU",
408
- description: "YOLOv9s ReLU — improved efficiency, int8 ready",
409
- inputSize: {
410
- width: 320,
411
- height: 320
412
- },
413
- labels: [],
414
- preprocessMode: "letterbox",
415
- formats: {
416
- onnx: {
417
- url: hfScrypted("onnx/scrypted_yolov9s_relu/scrypted_yolov9s_relu.onnx"),
418
- sizeMB: 27.9
419
- },
420
- coreml: {
421
- url: hfScrypted("coreml/scrypted_yolov9s_relu/scrypted_yolov9s_relu.mlpackage"),
422
- sizeMB: 14,
423
- isDirectory: true,
424
- files: [...MLPACKAGE_FILES],
425
- runtimes: ["python"]
426
- },
427
- openvino: ovFormat(hf("objectDetection/scrypted-yolov9-relu/openvino/scrypted_yolov9s_relu.xml"), 16)
428
- }
429
- },
430
- {
431
- id: "scrypted-yolov9c-relu",
432
- legacy: true,
433
- name: "YOLOv9 C ReLU",
434
- description: "YOLOv9c ReLU — high-accuracy, int8 ready",
435
- inputSize: {
436
- width: 320,
437
- height: 320
438
- },
439
- labels: [],
440
- preprocessMode: "letterbox",
441
- formats: {
442
- onnx: {
443
- url: hfScrypted("onnx/scrypted_yolov9c_relu/scrypted_yolov9c_relu.onnx"),
444
- sizeMB: 96.9
445
- },
446
- coreml: {
447
- url: hfScrypted("coreml/scrypted_yolov9c_relu/scrypted_yolov9c_relu.mlpackage"),
448
- sizeMB: 48,
449
- isDirectory: true,
450
- files: [...MLPACKAGE_FILES],
451
- runtimes: ["python"]
452
- },
453
- openvino: ovFormat(hf("objectDetection/scrypted-yolov9-relu/openvino/scrypted_yolov9c_relu.xml"), 49)
454
- }
455
- },
456
- {
457
- id: "scrypted-yolov9m-relu",
458
- legacy: true,
459
- name: "YOLOv9 M ReLU",
460
- description: "YOLOv9m ReLU — medium, int8 ready",
461
- inputSize: {
462
- width: 320,
463
- height: 320
464
- },
465
- labels: [],
466
- preprocessMode: "letterbox",
467
- formats: {
468
- onnx: {
469
- url: hfScrypted("onnx/scrypted_yolov9m_relu/scrypted_yolov9m_relu.onnx"),
470
- sizeMB: 76.6
471
- },
472
- coreml: {
473
- url: hfScrypted("coreml/scrypted_yolov9m_relu/scrypted_yolov9m_relu.mlpackage"),
474
- sizeMB: 38,
475
- isDirectory: true,
476
- files: [...MLPACKAGE_FILES],
477
- runtimes: ["python"]
478
- },
479
- openvino: ovFormat(hf("objectDetection/scrypted-yolov9-relu/openvino/scrypted_yolov9m_relu.xml"), 38)
480
- }
481
- },
482
- ovPrecisionVariant("yolov9t", "objectDetection/yolov9/openvino", "YOLOv9 Tiny", "fp16", 5, true),
483
- ovPrecisionVariant("yolov9t", "objectDetection/yolov9/openvino", "YOLOv9 Tiny", "int8", 3, true),
484
- ovPrecisionVariant("yolov9s", "objectDetection/yolov9/openvino", "YOLOv9 Small", "fp16", 15, true),
485
- ovPrecisionVariant("yolov9s", "objectDetection/yolov9/openvino", "YOLOv9 Small", "int8", 8, true),
486
365
  ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "fp16", 5, true),
487
366
  ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "int8", 3),
488
367
  ovPrecisionVariant("yolo26s", "objectDetection/yolo26/openvino", "YOLO26 Small", "fp16", 19, true),
@@ -539,6 +418,54 @@ var OBJECT_DETECTION_MODELS = [
539
418
  ovFp32: 99.85,
540
419
  ovInt8: 26.31
541
420
  }),
421
+ ...yolov9Reduced("t", 320, {
422
+ onnx: 8,
423
+ coreml: 8.3,
424
+ ovFp16: 4,
425
+ ovInt8: 3
426
+ }),
427
+ ...yolov9Reduced("t", 640, {
428
+ onnx: 8,
429
+ coreml: 8.4,
430
+ ovFp16: 4,
431
+ ovInt8: 3
432
+ }),
433
+ ...yolov9Reduced("s", 320, {
434
+ onnx: 27,
435
+ coreml: 27.8,
436
+ ovFp16: 14,
437
+ ovInt8: 8
438
+ }),
439
+ ...yolov9Reduced("s", 640, {
440
+ onnx: 27,
441
+ coreml: 27.9,
442
+ ovFp16: 14,
443
+ ovInt8: 8
444
+ }),
445
+ ...yolov9Reduced("m", 320, {
446
+ onnx: 76,
447
+ coreml: 76.8,
448
+ ovFp16: 38,
449
+ ovInt8: 20
450
+ }),
451
+ ...yolov9Reduced("m", 640, {
452
+ onnx: 76,
453
+ coreml: 76.9,
454
+ ovFp16: 38,
455
+ ovInt8: 20
456
+ }),
457
+ ...yolov9Reduced("c", 320, {
458
+ onnx: 97,
459
+ coreml: 97.1,
460
+ ovFp16: 49,
461
+ ovInt8: 25
462
+ }),
463
+ ...yolov9Reduced("c", 640, {
464
+ onnx: 97,
465
+ coreml: 97,
466
+ ovFp16: 49,
467
+ ovInt8: 25
468
+ }),
542
469
  ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "fp16", 112, true),
543
470
  ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "int8", 56, true)
544
471
  ];