@camstack/addon-pipeline 1.2.3 → 1.2.5

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 (28) 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 +2 -2
  4. package/dist/detection-pipeline/index.mjs +2 -2
  5. package/dist/{dist-D7-LF079.js → dist-CtQsET1Q.js} +24 -2
  6. package/dist/{dist-DVjpngiC.mjs → dist-ZB-B8UrH.mjs} +24 -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 +2 -2
  10. package/dist/pipeline-runner/index.mjs +2 -2
  11. package/dist/recorder/index.js +1 -1
  12. package/dist/recorder/index.mjs +1 -1
  13. package/dist/{step-definitions-BPwND8Zg.mjs → step-definitions-BKJI5CXI.mjs} +172 -115
  14. package/dist/{step-definitions-BfXdDokR.js → step-definitions-DrRnEQPM.js} +172 -115
  15. package/dist/stream-broker/_stub.js +1 -1
  16. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BozTkBJG.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DPvS4Ex7.mjs} +3 -3
  17. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BdxY9zld.mjs +26 -0
  18. package/dist/stream-broker/{hostInit-BUab2768.mjs → hostInit-CG0IeE_e.mjs} +3 -3
  19. package/dist/stream-broker/index.js +1 -1
  20. package/dist/stream-broker/index.mjs +1 -1
  21. package/dist/stream-broker/remoteEntry.js +1 -1
  22. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-L6rscpzL.js → MaskShapeCanvas-DI4BY7W2-C-rkQ2rg.js} +1 -1
  23. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-CK9BVkOT.js → MotionZonesSettings-NcxxQN8r-BtbCLveu.js} +1 -1
  24. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-CNcYwFLg.js → PrivacyMaskSettings-APgPLF7p-C9CEgSlA.js} +1 -1
  25. package/embed-dist/assets/{index-CBhJRpiC.js → index-CgJ1frQY.js} +13 -13
  26. package/embed-dist/index.html +1 -1
  27. package/package.json +1 -1
  28. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-5Zc9wj-A.mjs +0 -26
@@ -3,7 +3,7 @@ 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-D7-LF079.js");
6
+ const require_dist = require("../dist-CtQsET1Q.js");
7
7
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
8
8
  const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Dv-oFwjN.js");
9
9
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { D as mapAudioLabelToMacro, H as errMsg, J as hydrateSchema, U as BaseAddon, _ as audioAnalysisCapability, d as HF_BASE_URL, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, v as audioAnalyzerCapability } from "../dist-DVjpngiC.mjs";
2
+ import { D as mapAudioLabelToMacro, H as errMsg, J as hydrateSchema, U as BaseAddon, _ as audioAnalysisCapability, d as HF_BASE_URL, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, v as audioAnalyzerCapability } from "../dist-ZB-B8UrH.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { i as downloadFile } from "../model-download-service-Cp9f4dk6-CwUb5v3Y.mjs";
5
5
  import * as fs from "node:fs";
@@ -3,8 +3,8 @@ 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-D7-LF079.js");
7
- const require_step_definitions = require("../step-definitions-BfXdDokR.js");
6
+ const require_dist = require("../dist-CtQsET1Q.js");
7
+ const require_step_definitions = require("../step-definitions-DrRnEQPM.js");
8
8
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
9
9
  const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Dv-oFwjN.js");
10
10
  let node_child_process = require("node:child_process");
@@ -1,6 +1,6 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { B as supportedRuntimes$1, C as detectionPipelineCapability, H as errMsg, J as hydrateSchema, L as runtimeDevices$1, M as pipelineExecutorCapability, Q as parseJsonUnknown, T as evaluateZoneRules, U as BaseAddon, dt as string, ft as union, h as YAMNET_TO_MACRO, j as nodePin, lt as object, pt as EventCategory, q as createEvent, rt as array, s as DEVICE_BACKEND_TO_FORMAT, t as APPLE_SA_TO_MACRO, tt as sleep, w as enumerateInferenceDevices, x as defaultDeviceFor$1 } from "../dist-DVjpngiC.mjs";
3
- import { a as getStepDefinition, i as getStep, n as ALL_STEPS, o as resolveModelForFormat, r as getDefaultModelForFormat, t as ALL_PIPELINE_STEPS } from "../step-definitions-BPwND8Zg.mjs";
2
+ import { B as supportedRuntimes$1, C as detectionPipelineCapability, H as errMsg, J as hydrateSchema, L as runtimeDevices$1, M as pipelineExecutorCapability, Q as parseJsonUnknown, T as evaluateZoneRules, U as BaseAddon, dt as string, ft as union, h as YAMNET_TO_MACRO, j as nodePin, lt as object, pt as EventCategory, q as createEvent, rt as array, s as DEVICE_BACKEND_TO_FORMAT, t as APPLE_SA_TO_MACRO, tt as sleep, w as enumerateInferenceDevices, x as defaultDeviceFor$1 } from "../dist-ZB-B8UrH.mjs";
3
+ import { a as getStepDefinition, i as getStep, n as ALL_STEPS, o as resolveModelForFormat, r as getDefaultModelForFormat, t as ALL_PIPELINE_STEPS } from "../step-definitions-BKJI5CXI.mjs";
4
4
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
5
5
  import { a as ensureModel, o as isModelDownloaded, r as deleteModelFromDisk } from "../model-download-service-Cp9f4dk6-CwUb5v3Y.mjs";
6
6
  import { spawn } from "node:child_process";
@@ -12388,6 +12388,12 @@ var motionCooldownMsField = {
12388
12388
  default: 3e4,
12389
12389
  step: 500
12390
12390
  };
12391
+ var maxSessionHoldMsField = {
12392
+ min: 0,
12393
+ max: 6e5,
12394
+ default: 12e4,
12395
+ step: 5e3
12396
+ };
12391
12397
  var motionFpsField = {
12392
12398
  min: 1,
12393
12399
  max: 30,
@@ -12535,6 +12541,19 @@ var RunnerCameraConfigSchema = object({
12535
12541
  "on-motion"
12536
12542
  ]).default("always-on"),
12537
12543
  motionCooldownMs: number().min(motionCooldownMsField.min).default(motionCooldownMsField.default),
12544
+ /**
12545
+ * Orchestrator-side on-motion session-hold cap (ms). While an on-motion
12546
+ * detection session is active and ≥1 confirmed non-stationary track is
12547
+ * still live, the orchestrator keeps the session open past
12548
+ * `motionCooldownMs` (a slowly-moving subject can stop re-triggering the
12549
+ * camera's VMD yet is still being tracked frame-to-frame) — up to this many
12550
+ * ms since the session opened, after which it closes regardless. `0`
12551
+ * disables the hold (legacy cooldown-only teardown). Not consumed by the
12552
+ * runner itself — carried here so it shares the per-camera device-settings
12553
+ * surface with `motionCooldownMs`; the orchestrator reads it off the
12554
+ * resolved `CameraDetectionConfig`.
12555
+ */
12556
+ maxSessionHoldMs: number().min(maxSessionHoldMsField.min).max(maxSessionHoldMsField.max).optional(),
12538
12557
  motionFps: number().min(motionFpsField.min).max(motionFpsField.max).default(motionFpsField.default),
12539
12558
  detectionFps: number().min(detectionFpsField.min).max(detectionFpsField.max).default(detectionFpsField.default),
12540
12559
  motionStreamId: string(),
@@ -12624,7 +12643,7 @@ var RunnerCameraConfigSchema = object({
12624
12643
  */
12625
12644
  inferenceDevices: array(RunnerInferenceDeviceSchema).readonly().optional()
12626
12645
  });
12627
- motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
12646
+ motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, maxSessionHoldMsField.min, maxSessionHoldMsField.max, maxSessionHoldMsField.step, maxSessionHoldMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
12628
12647
  /**
12629
12648
  * Runtime load summary returned by `getLocalLoad`. Used by the orchestrator's
12630
12649
  * load-balancing levels (L2 capacity-based, L3 hardware-aware) to decide
@@ -17998,7 +18017,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17998
18017
  }), method(object({
17999
18018
  eventId: string(),
18000
18019
  kind: MediaFileKindEnum.optional()
18001
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
18020
+ }), array(MediaFileSchema).readonly()), method(object({
18021
+ trackId: string(),
18022
+ kinds: array(MediaFileKindEnum).optional()
18023
+ }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
18002
18024
  deviceId: number(),
18003
18025
  timestamp: number(),
18004
18026
  frameWidth: number(),
@@ -12388,6 +12388,12 @@ var motionCooldownMsField = {
12388
12388
  default: 3e4,
12389
12389
  step: 500
12390
12390
  };
12391
+ var maxSessionHoldMsField = {
12392
+ min: 0,
12393
+ max: 6e5,
12394
+ default: 12e4,
12395
+ step: 5e3
12396
+ };
12391
12397
  var motionFpsField = {
12392
12398
  min: 1,
12393
12399
  max: 30,
@@ -12535,6 +12541,19 @@ var RunnerCameraConfigSchema = object({
12535
12541
  "on-motion"
12536
12542
  ]).default("always-on"),
12537
12543
  motionCooldownMs: number().min(motionCooldownMsField.min).default(motionCooldownMsField.default),
12544
+ /**
12545
+ * Orchestrator-side on-motion session-hold cap (ms). While an on-motion
12546
+ * detection session is active and ≥1 confirmed non-stationary track is
12547
+ * still live, the orchestrator keeps the session open past
12548
+ * `motionCooldownMs` (a slowly-moving subject can stop re-triggering the
12549
+ * camera's VMD yet is still being tracked frame-to-frame) — up to this many
12550
+ * ms since the session opened, after which it closes regardless. `0`
12551
+ * disables the hold (legacy cooldown-only teardown). Not consumed by the
12552
+ * runner itself — carried here so it shares the per-camera device-settings
12553
+ * surface with `motionCooldownMs`; the orchestrator reads it off the
12554
+ * resolved `CameraDetectionConfig`.
12555
+ */
12556
+ maxSessionHoldMs: number().min(maxSessionHoldMsField.min).max(maxSessionHoldMsField.max).optional(),
12538
12557
  motionFps: number().min(motionFpsField.min).max(motionFpsField.max).default(motionFpsField.default),
12539
12558
  detectionFps: number().min(detectionFpsField.min).max(detectionFpsField.max).default(detectionFpsField.default),
12540
12559
  motionStreamId: string(),
@@ -12624,7 +12643,7 @@ var RunnerCameraConfigSchema = object({
12624
12643
  */
12625
12644
  inferenceDevices: array(RunnerInferenceDeviceSchema).readonly().optional()
12626
12645
  });
12627
- motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
12646
+ motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, maxSessionHoldMsField.min, maxSessionHoldMsField.max, maxSessionHoldMsField.step, maxSessionHoldMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
12628
12647
  /**
12629
12648
  * Runtime load summary returned by `getLocalLoad`. Used by the orchestrator's
12630
12649
  * load-balancing levels (L2 capacity-based, L3 hardware-aware) to decide
@@ -17998,7 +18017,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17998
18017
  }), method(object({
17999
18018
  eventId: string(),
18000
18019
  kind: MediaFileKindEnum.optional()
18001
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
18020
+ }), array(MediaFileSchema).readonly()), method(object({
18021
+ trackId: string(),
18022
+ kinds: array(MediaFileKindEnum).optional()
18023
+ }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
18002
18024
  deviceId: number(),
18003
18025
  timestamp: number(),
18004
18026
  frameWidth: number(),
@@ -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-D7-LF079.js");
5
+ const require_dist = require("../dist-CtQsET1Q.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 { A as motionDetectionCapability, J as hydrateSchema, K as DeviceType, T as evaluateZoneRules, U as BaseAddon } from "../dist-DVjpngiC.mjs";
1
+ import { A as motionDetectionCapability, J as hydrateSchema, K as DeviceType, T as evaluateZoneRules, U as BaseAddon } from "../dist-ZB-B8UrH.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-D7-LF079.js");
6
+ const require_dist = require("../dist-CtQsET1Q.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-DextwlTX.js");
10
- const require_step_definitions = require("../step-definitions-BfXdDokR.js");
10
+ const require_step_definitions = require("../step-definitions-DrRnEQPM.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");
@@ -1,8 +1,8 @@
1
- import { H as errMsg, N as pipelineRunnerCapability, S as defineCustomActions, U as BaseAddon, b as customAction, ct as number, dt as string, it as boolean, j as nodePin, lt as object, nt as _enum, ot as lazy, pt as EventCategory, q as createEvent, rt as array, s as DEVICE_BACKEND_TO_FORMAT } from "../dist-DVjpngiC.mjs";
1
+ import { H as errMsg, N as pipelineRunnerCapability, S as defineCustomActions, U as BaseAddon, b as customAction, ct as number, dt as string, it as boolean, j as nodePin, lt as object, nt as _enum, ot as lazy, pt as EventCategory, q as createEvent, rt as array, s as DEVICE_BACKEND_TO_FORMAT } from "../dist-ZB-B8UrH.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-D7RzZIla.mjs";
5
- import { a as getStepDefinition } from "../step-definitions-BPwND8Zg.mjs";
5
+ import { a as getStepDefinition } from "../step-definitions-BKJI5CXI.mjs";
6
6
  import { fork } from "node:child_process";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import sharp from "sharp";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("../chunk-D6vf50IK.js");
2
- const require_dist = require("../dist-D7-LF079.js");
2
+ const require_dist = require("../dist-CtQsET1Q.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 { F as recordingExportCapability, H as errMsg, I as resolveScrubThumbnailGeometry, J as hydrateSchema, K as DeviceType, P as recordingCapability, R as storageEvictableCapability, U as BaseAddon, Y as isEvent, c as EVENT_PAD_MS, dt as string, et as selectAssignedProfileSlots, f as OpsLogEntrySchema, j as nodePin, k as migrateConfigToBands, p as RecordingConfigSchema, pt as EventCategory, rt as array, u as ExportRecordSchema, ut as record } from "../dist-DVjpngiC.mjs";
1
+ import { F as recordingExportCapability, H as errMsg, I as resolveScrubThumbnailGeometry, J as hydrateSchema, K as DeviceType, P as recordingCapability, R as storageEvictableCapability, U as BaseAddon, Y as isEvent, c as EVENT_PAD_MS, dt as string, et as selectAssignedProfileSlots, f as OpsLogEntrySchema, j as nodePin, k as migrateConfigToBands, p as RecordingConfigSchema, pt as EventCategory, rt as array, u as ExportRecordSchema, ut as record } from "../dist-ZB-B8UrH.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
- import { E as hfModelUrl, a as COCO_TO_MACRO, i as COCO_80_LABELS, r as AUDIO_MACRO_LABELS } from "./dist-DVjpngiC.mjs";
1
+ import { E as hfModelUrl, a as COCO_TO_MACRO, i as COCO_80_LABELS, r as AUDIO_MACRO_LABELS } from "./dist-ZB-B8UrH.mjs";
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";
@@ -469,61 +469,86 @@ var OBJECT_DETECTION_MODELS = [
469
469
  ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "fp16", 112, true),
470
470
  ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "int8", 56, true)
471
471
  ];
472
- var FACE_DETECTION_MODELS = [{
473
- id: "scrfd-2.5g",
474
- name: "SCRFD 2.5G",
475
- description: "SCRFD 2.5G — balanced face detection model",
476
- inputSize: {
477
- width: 640,
478
- height: 640
479
- },
480
- labels: [{
481
- id: "face",
482
- name: "Face"
483
- }],
484
- preprocessMode: "letterbox",
485
- formats: {
486
- onnx: {
487
- url: hf("faceDetection/scrfd/onnx/camstack-scrfd-2.5g.onnx"),
488
- sizeMB: 3.1
472
+ var FACE_DETECTION_MODELS = [
473
+ {
474
+ id: "scrfd-2.5g",
475
+ name: "SCRFD 2.5G",
476
+ description: "SCRFD 2.5G — balanced face detection model",
477
+ inputSize: {
478
+ width: 640,
479
+ height: 640
489
480
  },
490
- coreml: {
491
- url: hf("faceDetection/scrfd/coreml/camstack-scrfd-2.5g.mlpackage"),
492
- sizeMB: 1.7,
493
- isDirectory: true,
494
- files: [...MLPACKAGE_FILES],
495
- runtimes: ["python"]
481
+ labels: [{
482
+ id: "face",
483
+ name: "Face"
484
+ }],
485
+ preprocessMode: "letterbox",
486
+ formats: {
487
+ onnx: {
488
+ url: hf("faceDetection/scrfd/onnx/camstack-scrfd-2.5g.onnx"),
489
+ sizeMB: 3.1
490
+ },
491
+ coreml: {
492
+ url: hf("faceDetection/scrfd/coreml/camstack-scrfd-2.5g.mlpackage"),
493
+ sizeMB: 1.7,
494
+ isDirectory: true,
495
+ files: [...MLPACKAGE_FILES],
496
+ runtimes: ["python"]
497
+ },
498
+ openvino: ovFormat(hf("faceDetection/scrfd/openvino/camstack-scrfd-2.5g.xml"), 1.8)
499
+ }
500
+ },
501
+ {
502
+ id: "scrypted-yolov9t-face",
503
+ name: "YOLOv9t Face ReLU",
504
+ description: "YOLOv9t face detection — YOLO-based, fast, 320x320 ReLU",
505
+ inputSize: {
506
+ width: 320,
507
+ height: 320
496
508
  },
497
- openvino: ovFormat(hf("faceDetection/scrfd/openvino/camstack-scrfd-2.5g.xml"), 1.8)
498
- }
499
- }, {
500
- id: "scrypted-yolov9t-face",
501
- name: "YOLOv9t Face ReLU",
502
- description: "YOLOv9t face detection — YOLO-based, fast, 320x320 ReLU",
503
- inputSize: {
504
- width: 320,
505
- height: 320
509
+ labels: [{
510
+ id: "face",
511
+ name: "Face"
512
+ }],
513
+ preprocessMode: "letterbox",
514
+ formats: {
515
+ onnx: {
516
+ url: hfScrypted("onnx/scrypted_yolov9t_relu_face/scrypted_yolov9t_relu_face.onnx"),
517
+ sizeMB: 8.1
518
+ },
519
+ coreml: {
520
+ url: hfScrypted("coreml/scrypted_yolov9t_relu_face/scrypted_yolov9t_relu_face.mlpackage"),
521
+ sizeMB: 4,
522
+ isDirectory: true,
523
+ files: [...MLPACKAGE_FILES],
524
+ runtimes: ["python"]
525
+ },
526
+ openvino: ovFormat(hf("faceDetection/scrypted-yolov9-face/openvino/scrypted_yolov9t_relu_face.xml"), 6)
527
+ }
506
528
  },
507
- labels: [{
508
- id: "face",
509
- name: "Face"
510
- }],
511
- preprocessMode: "letterbox",
512
- formats: {
513
- onnx: {
514
- url: hfScrypted("onnx/scrypted_yolov9t_relu_face/scrypted_yolov9t_relu_face.onnx"),
515
- sizeMB: 8.1
529
+ {
530
+ id: "ssd-mobilenet-v2-face-edgetpu",
531
+ legacy: true,
532
+ name: "SSD MobileNet V2 Face (Coral)",
533
+ description: "SSD MobileNet V2 face detector — EdgeTPU-compiled full-integer TFLite, 320×320; runs on the Coral USB Edge TPU. Requires an ssd-face postprocessor (not yet available).",
534
+ inputSize: {
535
+ width: 320,
536
+ height: 320
516
537
  },
517
- coreml: {
518
- url: hfScrypted("coreml/scrypted_yolov9t_relu_face/scrypted_yolov9t_relu_face.mlpackage"),
519
- sizeMB: 4,
520
- isDirectory: true,
521
- files: [...MLPACKAGE_FILES],
538
+ labels: [{
539
+ id: "face",
540
+ name: "Face"
541
+ }],
542
+ preprocessMode: "letterbox",
543
+ postprocessor: "ssd",
544
+ license: "Apache-2.0",
545
+ formats: { tflite: {
546
+ url: "https://github.com/google-coral/test_data/raw/master/ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite",
547
+ sizeMB: 6.7,
522
548
  runtimes: ["python"]
523
- },
524
- openvino: ovFormat(hf("faceDetection/scrypted-yolov9-face/openvino/scrypted_yolov9t_relu_face.xml"), 6)
549
+ } }
525
550
  }
526
- }];
551
+ ];
527
552
  var FACE_EMBEDDING_MODELS = [{
528
553
  id: "arcface-r100",
529
554
  name: "ArcFace R100",
@@ -755,77 +780,109 @@ var ANIMAL_CLASSIFIER_MODELS = [{
755
780
  openvino: ovFormat(hf("animalClassification/animals-10/openvino/camstack-animals-10.xml"), 164)
756
781
  }
757
782
  }];
758
- var BIRD_CLASSIFIER_MODELS = [{
759
- id: "bird-classifier",
760
- name: "Bird Classifier (AIY 965)",
761
- description: "Google AIY Birds V1 (MobileNetV2) — 964 species + background; publicly distributable (Apache-2.0)",
762
- inputSize: {
763
- width: 224,
764
- height: 224
765
- },
766
- inputLayout: "nhwc",
767
- inputNormalization: "none",
768
- outputProbabilities: true,
769
- license: "Apache-2.0",
770
- labels: [{
771
- id: "species",
772
- name: "Bird Species"
773
- }],
774
- preprocessMode: "resize",
775
- formats: {
776
- onnx: {
777
- url: hf("animalClassification/bird-classifier/onnx/bird-classifier.onnx"),
778
- sizeMB: 14
783
+ var BIRD_CLASSIFIER_MODELS = [
784
+ {
785
+ id: "bird-classifier",
786
+ name: "Bird Classifier (AIY 965)",
787
+ description: "Google AIY Birds V1 (MobileNetV2) — 964 species + background; publicly distributable (Apache-2.0)",
788
+ inputSize: {
789
+ width: 224,
790
+ height: 224
779
791
  },
780
- coreml: {
781
- url: hf("animalClassification/bird-classifier/coreml/bird-classifier.mlpackage"),
782
- sizeMB: 6.8,
783
- isDirectory: true,
784
- files: [...MLPACKAGE_FILES],
785
- runtimes: ["python"]
792
+ inputLayout: "nhwc",
793
+ inputNormalization: "none",
794
+ outputProbabilities: true,
795
+ license: "Apache-2.0",
796
+ labels: [{
797
+ id: "species",
798
+ name: "Bird Species"
799
+ }],
800
+ preprocessMode: "resize",
801
+ formats: {
802
+ onnx: {
803
+ url: hf("animalClassification/bird-classifier/onnx/bird-classifier.onnx"),
804
+ sizeMB: 14
805
+ },
806
+ coreml: {
807
+ url: hf("animalClassification/bird-classifier/coreml/bird-classifier.mlpackage"),
808
+ sizeMB: 6.8,
809
+ isDirectory: true,
810
+ files: [...MLPACKAGE_FILES],
811
+ runtimes: ["python"]
812
+ },
813
+ openvino: ovFormat(hf("animalClassification/bird-classifier/openvino/bird-classifier.xml"), 14)
786
814
  },
787
- openvino: ovFormat(hf("animalClassification/bird-classifier/openvino/bird-classifier.xml"), 14)
815
+ extraFiles: [{
816
+ url: hf("animalClassification/bird-classifier/onnx/bird-classifier-labels.json"),
817
+ filename: "bird-classifier-labels.json",
818
+ sizeMB: .03
819
+ }]
788
820
  },
789
- extraFiles: [{
790
- url: hf("animalClassification/bird-classifier/onnx/bird-classifier-labels.json"),
791
- filename: "bird-classifier-labels.json",
792
- sizeMB: .03
793
- }]
794
- }, {
795
- id: "bird-nabirds-404",
796
- name: "NABirds (404 species)",
797
- description: "ResNet50 trained on NABirds — 404 North American species",
798
- legacy: true,
799
- inputSize: {
800
- width: 224,
801
- height: 224
802
- },
803
- inputNormalization: "imagenet",
804
- labels: [{
805
- id: "species",
806
- name: "Bird Species"
807
- }],
808
- preprocessMode: "resize",
809
- formats: {
810
- onnx: {
811
- url: hf("animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404.onnx"),
812
- sizeMB: 93
821
+ {
822
+ id: "bird-nabirds-404",
823
+ name: "NABirds (404 species)",
824
+ description: "ResNet50 trained on NABirds — 404 North American species",
825
+ legacy: true,
826
+ inputSize: {
827
+ width: 224,
828
+ height: 224
813
829
  },
814
- coreml: {
815
- url: hf("animalClassification/bird-nabirds/coreml/camstack-bird-nabirds-404.mlpackage"),
816
- sizeMB: 47,
817
- isDirectory: true,
818
- files: [...MLPACKAGE_FILES],
819
- runtimes: ["python"]
830
+ inputNormalization: "imagenet",
831
+ labels: [{
832
+ id: "species",
833
+ name: "Bird Species"
834
+ }],
835
+ preprocessMode: "resize",
836
+ formats: {
837
+ onnx: {
838
+ url: hf("animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404.onnx"),
839
+ sizeMB: 93
840
+ },
841
+ coreml: {
842
+ url: hf("animalClassification/bird-nabirds/coreml/camstack-bird-nabirds-404.mlpackage"),
843
+ sizeMB: 47,
844
+ isDirectory: true,
845
+ files: [...MLPACKAGE_FILES],
846
+ runtimes: ["python"]
847
+ },
848
+ openvino: ovFormat(hf("animalClassification/bird-nabirds/openvino/camstack-bird-nabirds-404.xml"), 47)
820
849
  },
821
- openvino: ovFormat(hf("animalClassification/bird-nabirds/openvino/camstack-bird-nabirds-404.xml"), 47)
850
+ extraFiles: [{
851
+ url: hf("animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404-labels.json"),
852
+ filename: "camstack-bird-nabirds-404-labels.json",
853
+ sizeMB: .02
854
+ }]
822
855
  },
823
- extraFiles: [{
824
- url: hf("animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404-labels.json"),
825
- filename: "camstack-bird-nabirds-404-labels.json",
826
- sizeMB: .02
827
- }]
828
- }];
856
+ {
857
+ id: "bird-classifier-aiy-edgetpu",
858
+ legacy: true,
859
+ name: "Bird Classifier AIY (Coral)",
860
+ description: "Google AIY Birds V1 (MobileNetV2) — EdgeTPU-compiled full-integer TFLite, 224×224, 964 species + background; runs on the Coral USB Edge TPU. Requires EdgeTPU classifier output dequantization (not yet available).",
861
+ inputSize: {
862
+ width: 224,
863
+ height: 224
864
+ },
865
+ inputLayout: "nhwc",
866
+ inputNormalization: "none",
867
+ outputProbabilities: true,
868
+ license: "Apache-2.0",
869
+ labels: [{
870
+ id: "species",
871
+ name: "Bird Species"
872
+ }],
873
+ preprocessMode: "resize",
874
+ formats: { tflite: {
875
+ url: "https://github.com/google-coral/test_data/raw/master/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite",
876
+ sizeMB: 4.3,
877
+ runtimes: ["python"]
878
+ } },
879
+ extraFiles: [{
880
+ url: hf("animalClassification/bird-classifier/onnx/bird-classifier-labels.json"),
881
+ filename: "bird-classifier-labels.json",
882
+ sizeMB: .03
883
+ }]
884
+ }
885
+ ];
829
886
  var VEHICLE_CLASSIFIER_MODELS = [{
830
887
  id: "vehicle-type-v1",
831
888
  name: "Vehicle Type (8)",