@camstack/addon-pipeline 1.2.325 → 1.2.327

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 (42) hide show
  1. package/THIRD_PARTY_MODELS.md +29 -55
  2. package/dist/audio-analyzer/index.js +2 -2
  3. package/dist/audio-analyzer/index.mjs +2 -2
  4. package/dist/{default-detection-model-4nJVRIT6.js → default-detection-model-CBIYdAJ5.js} +97 -483
  5. package/dist/{default-detection-model-lWMQATmQ.mjs → default-detection-model-hql6BX9-.mjs} +98 -478
  6. package/dist/detection-pipeline/index.js +10 -5
  7. package/dist/detection-pipeline/index.mjs +10 -5
  8. package/dist/{dist-CbRb0Zyj.mjs → dist-B9LnBPz9.mjs} +122 -76
  9. package/dist/{dist-DlgXwnqU.js → dist-BBZwYfSN.js} +122 -76
  10. package/dist/motion-wasm/index.js +1 -1
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-CZ5DXcvq.mjs → node-Ci0E-0VP.mjs} +1 -1
  13. package/dist/{node-s3wZnnJg.js → node-mJQBUiEc.js} +1 -1
  14. package/dist/pipeline-runner/index.js +41 -14
  15. package/dist/pipeline-runner/index.mjs +41 -15
  16. package/dist/{process-memory-CJsA4yRc.mjs → process-memory-B63Jlpev.mjs} +1 -1
  17. package/dist/{process-memory-C-mZ1LNi.js → process-memory-DgEfKdtC.js} +1 -1
  18. package/dist/recorder/index.js +10 -10
  19. package/dist/recorder/index.mjs +10 -10
  20. package/dist/{segment-demux-js-BbM0_Fmz.js → segment-demux-js-C2ufKMu0.js} +1 -1
  21. package/dist/{segment-demux-js-CuwXgwpj.mjs → segment-demux-js-DzwHW4Ey.mjs} +1 -1
  22. package/dist/stream-broker/_stub.js +2 -2
  23. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BobJEk9e.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B4fPzS-8.mjs} +3 -3
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BDGzcgLP.mjs +26 -0
  25. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BpXPNINd.mjs +26 -0
  26. package/dist/stream-broker/demux-worker-child.js +1 -1
  27. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  28. package/dist/stream-broker/{hostInit-C_x1pkx-.mjs → hostInit-Cg4IdtE5.mjs} +3 -3
  29. package/dist/stream-broker/index.js +5 -5
  30. package/dist/stream-broker/index.mjs +5 -5
  31. package/dist/stream-broker/remoteEntry.js +1 -1
  32. package/package.json +1 -1
  33. package/python/edgetpu_dequant.py +55 -0
  34. package/python/inference_pool.py +19 -3
  35. package/python/postprocessors/__init__.py +2 -0
  36. package/python/postprocessors/scrfd.py +2 -0
  37. package/python/postprocessors/test_ssd.py +5 -6
  38. package/python/postprocessors/test_yolo_split_dfl.py +135 -0
  39. package/python/postprocessors/yolo_split_dfl.py +255 -0
  40. package/python/test_dequant_edgetpu.py +65 -0
  41. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-NkeMtp-v.mjs +0 -26
  42. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-mEJkrfvj.mjs +0 -26
@@ -1,4 +1,4 @@
1
- import { G as audioKindId, Yt as stepModelRunsOnFormat, _t as hfModelUrl, f as COCO_80_LABELS, i as AUDIO_MACRO_LABELS, p as COCO_TO_MACRO, vt as inferModelProvider, y as DEVICE_BACKEND_TO_FORMAT } from "./dist-CbRb0Zyj.mjs";
1
+ import { G as audioKindId, Yt as stepModelRunsOnFormat, _t as hfModelUrl, f as COCO_80_LABELS, i as AUDIO_MACRO_LABELS, p as COCO_TO_MACRO, vt as inferModelProvider, y as DEVICE_BACKEND_TO_FORMAT } from "./dist-B9LnBPz9.mjs";
2
2
  import { t as isWorkerReply } from "./worker-protocol-D_NzPcnh.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  //#region src/detection-pipeline/registry/effective-confidence.ts
@@ -43,15 +43,16 @@ var ULTRALYTICS_AGPL = {
43
43
  url: "https://github.com/ultralytics/ultralytics"
44
44
  },
45
45
  url: "https://github.com/ultralytics/ultralytics/blob/main/LICENSE",
46
- attribution: "© Ultralytics, AGPL-3.0. Corresponding source: the upstream Ultralytics checkpoint and scripts/build-camstack-models.py in https://github.com/camstack/server.",
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
47
  modifications: "exported to ONNX, OpenVINO IR and CoreML (scripts/build-camstack-models.py)",
48
48
  hosting: "camstack-hf"
49
49
  };
50
50
  var ULTRALYTICS_YOLOV9_AGPL = {
51
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 scripts/build-camstack-models.py in https://github.com/camstack/server."
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
53
  };
54
- var CORAL_APACHE = {
54
+ /** The CamStack Coral COCO detector (SSD MobileNet V2). */
55
+ var CORAL_COCO_APACHE = {
55
56
  weights: "Apache-2.0",
56
57
  code: "Apache-2.0",
57
58
  upstream: {
@@ -60,19 +61,9 @@ var CORAL_APACHE = {
60
61
  },
61
62
  url: "https://github.com/google-coral/test_data/blob/master/LICENSE",
62
63
  attribution: "Coral Edge TPU models and AIY Vision Birds V1 © Google LLC, Apache-2.0.",
63
- hosting: "third-party"
64
- };
65
- /** The Coral COCO detectors (SSD MobileNet V2, EfficientDet-Lite0). */
66
- var CORAL_COCO_APACHE = {
67
- ...CORAL_APACHE,
64
+ hosting: "third-party",
68
65
  data: COCO_DATA
69
66
  };
70
- /** The Coral MobileDet build, mirrored byte for byte on the CamStack HF repo. */
71
- var CORAL_MOBILEDET_MIRRORED = {
72
- ...CORAL_COCO_APACHE,
73
- modifications: "none: ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite mirrored byte for byte (sha256 b69e508e…434a2e), with the CPU build and coco_labels.txt beside it (scripts/build-ssdlite-mobiledet-model.py)",
74
- hosting: "camstack-hf"
75
- };
76
67
  var RFDETR_APACHE = {
77
68
  weights: "Apache-2.0",
78
69
  code: "Apache-2.0",
@@ -89,20 +80,6 @@ var RFDETR_APACHE = {
89
80
  modifications: "RF-DETR-M fine-tuned to 2 classes at 576; exported to ONNX, OpenVINO IR and CoreML; training checkpoint .pth also published",
90
81
  hosting: "camstack-hf"
91
82
  };
92
- var INSIGHTFACE_SCRFD_NC = {
93
- weights: "LicenseRef-InsightFace-NonCommercial-Research",
94
- code: "MIT",
95
- data: WIDER_FACE_DATA,
96
- upstream: {
97
- name: "InsightFace SCRFD",
98
- url: "https://github.com/deepinsight/insightface/tree/master/detection/scrfd"
99
- },
100
- url: "https://github.com/deepinsight/insightface#license",
101
- attribution: "SCRFD © InsightFace. Pretrained models released for non-commercial research purposes only.",
102
- modifications: "obtained via RuteNL/SCRFD-face-detection-ONNX; converted to OpenVINO IR and CoreML FP16",
103
- hosting: "camstack-hf",
104
- nonCommercial: true
105
- };
106
83
  var YUNET_MIT = {
107
84
  weights: "MIT",
108
85
  code: "BSD-3-Clause",
@@ -116,27 +93,6 @@ var YUNET_MIT = {
116
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)",
117
94
  hosting: "camstack-hf"
118
95
  };
119
- var SCRYPTED_UNKNOWN = {
120
- weights: "UNKNOWN",
121
- upstream: {
122
- name: "Scrypted plugin-models (repository tagged MIT, no per-model terms)",
123
- url: "https://huggingface.co/scrypted/plugin-models"
124
- },
125
- url: "https://huggingface.co/scrypted/plugin-models",
126
- attribution: "Scrypted plugin models, Koushik Dutta: repository tagged MIT (licenses/models/MIT-scrypted-plugin-models.txt), no per-model terms.",
127
- modifications: "ONNX and CoreML fetched from scrypted/plugin-models; OpenVINO IR converted and re-hosted by CamStack",
128
- hosting: "camstack-hf"
129
- };
130
- var ARCFACE_UNKNOWN = {
131
- weights: "UNKNOWN",
132
- upstream: {
133
- name: "onnx-community/arcface-onnx (re-upload of garavv/arcface-onnx)",
134
- url: "https://huggingface.co/onnx-community/arcface-onnx"
135
- },
136
- url: "https://huggingface.co/onnx-community/arcface-onnx",
137
- modifications: "converted to OpenVINO IR and CoreML FP16",
138
- hosting: "camstack-hf"
139
- };
140
96
  var AURAFACE_APACHE = {
141
97
  weights: "Apache-2.0",
142
98
  upstream: {
@@ -164,18 +120,6 @@ var FAST_PLATE_OCR_MIT = {
164
120
  modifications: "input head removed (recorded in the ONNX doc_string); converted to OpenVINO IR and CoreML",
165
121
  hosting: "camstack-hf"
166
122
  };
167
- var EASYOCR_APACHE = {
168
- weights: "Apache-2.0",
169
- code: "Apache-2.0",
170
- upstream: {
171
- name: "JaidedAI EasyOCR (via Scrypted plugin-models)",
172
- url: "https://github.com/JaidedAI/EasyOCR"
173
- },
174
- url: "https://github.com/JaidedAI/EasyOCR/blob/master/LICENSE",
175
- attribution: "EasyOCR © JaidedAI, Apache-2.0.",
176
- modifications: "ONNX and CoreML fetched from scrypted/plugin-models; OpenVINO IR converted and re-hosted by CamStack",
177
- hosting: "camstack-hf"
178
- };
179
123
  var ANIMAL_CLASSIFIER_APACHE = {
180
124
  weights: "Apache-2.0",
181
125
  code: "Apache-2.0",
@@ -238,19 +182,6 @@ var U2NET_APACHE = {
238
182
  modifications: "converted to ONNX, OpenVINO IR and CoreML",
239
183
  hosting: "camstack-hf"
240
184
  };
241
- var APPLE_MOBILECLIP_AMLR = {
242
- weights: "LicenseRef-Apple-AMLR",
243
- code: "MIT",
244
- upstream: {
245
- name: "Apple ml-mobileclip",
246
- url: "https://github.com/apple/ml-mobileclip"
247
- },
248
- url: "https://github.com/apple/ml-mobileclip/blob/main/LICENSE_MODELS",
249
- attribution: "Apple Machine Learning Research Model is licensed under the Apple Machine Learning Research Model License Agreement.",
250
- modifications: "model derivative: vision encoders converted to OpenVINO IR and CoreML FP16",
251
- hosting: "camstack-hf",
252
- nonCommercial: true
253
- };
254
185
  var SIGLIP2_APACHE = {
255
186
  weights: "Apache-2.0",
256
187
  code: "Apache-2.0",
@@ -303,9 +234,7 @@ function licensed(base, overrides) {
303
234
  //#endregion
304
235
  //#region src/detection-pipeline/registry/model-catalogs.ts
305
236
  var HF_REPO = "camstack/camstack-models";
306
- var HF_SCRYPTED = "scrypted/plugin-models";
307
237
  var hf = (path) => hfModelUrl(HF_REPO, path);
308
- var hfScrypted = (path) => hfModelUrl(HF_SCRYPTED, path);
309
238
  /**
310
239
  * Build an OpenVINO format entry (always python runtime).
311
240
  *
@@ -664,42 +593,6 @@ var OBJECT_DETECTION_MODELS = [
664
593
  runtimes: ["python"]
665
594
  } }
666
595
  },
667
- {
668
- id: "efficientdet-lite0-edgetpu",
669
- license: CORAL_COCO_APACHE,
670
- name: "EfficientDet-Lite0 (Coral)",
671
- description: "EfficientDet-Lite0 COCO — EdgeTPU-compiled full-integer TFLite, 320×320; higher accuracy than SSD MobileNet on the Coral USB Edge TPU",
672
- inputSize: {
673
- width: 320,
674
- height: 320
675
- },
676
- labels: [],
677
- preprocessMode: "letterbox",
678
- postprocessor: "ssd",
679
- formats: { tflite: {
680
- url: "https://github.com/google-coral/test_data/raw/master/efficientdet_lite0_320_ptq_edgetpu.tflite",
681
- sizeMB: 5.7,
682
- runtimes: ["python"]
683
- } }
684
- },
685
- {
686
- id: "ssdlite-mobiledet-coco-edgetpu",
687
- license: CORAL_MOBILEDET_MIRRORED,
688
- name: "SSDLite MobileDet (Coral)",
689
- description: "SSDLite MobileDet COCO (QAT) — EdgeTPU-compiled full-integer TFLite, 320×320; runs on the Coral USB Edge TPU. More accurate than SSD MobileNet V2 (32.9 vs 25.6 % COCO mAP, Coral-published). Scores top out near 0.77.",
690
- inputSize: {
691
- width: 320,
692
- height: 320
693
- },
694
- labels: [],
695
- preprocessMode: "letterbox",
696
- postprocessor: "ssd",
697
- formats: { tflite: {
698
- url: hf("objectDetection/ssdlite-mobiledet/edgetpu/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite"),
699
- sizeMB: 5.1,
700
- runtimes: ["python"]
701
- } }
702
- },
703
596
  ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "fp16", 5, true),
704
597
  ovPrecisionVariant("yolo26n", "objectDetection/yolo26/openvino", "YOLO26 Nano", "int8", 3),
705
598
  ovPrecisionVariant("yolo26s", "objectDetection/yolo26/openvino", "YOLO26 Small", "fp16", 19, true),
@@ -807,199 +700,67 @@ var OBJECT_DETECTION_MODELS = [
807
700
  ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "fp16", 112, true),
808
701
  ovPrecisionVariant("yolo26x", "objectDetection/yolo26/openvino", "YOLO26 XLarge", "int8", 56, true)
809
702
  ];
810
- /**
811
- * Model ids REMOVED from a step's catalog, per step id (D643, D661).
812
- *
813
- * Not the same as `legacy` (still in the catalog, still runnable when chosen):
814
- * a retired id has nothing to download and nothing that can parse it. It is
815
- * listed rather than simply deleted because `resolveModelForFormat` passes an
816
- * id the catalog does not know through UNCHANGED — it reads as an operator's
817
- * custom model — so a saved pin would keep naming a model no node can load.
818
- * A retired id resolves to the step's format default instead.
819
- */
820
- var RETIRED_MODEL_IDS = {
821
- "face-detection": ["scrypted-yolov9t-face"],
822
- "animal-classifier": ["animals-10"],
823
- "bird-classifier": ["bird-nabirds-404"],
824
- "vehicle-classifier": ["vehicle-type-efficientnet"]
825
- };
826
- var FACE_DETECTION_MODELS = [
827
- {
828
- id: "scrfd-2.5g",
829
- license: INSIGHTFACE_SCRFD_NC,
830
- name: "SCRFD 2.5G",
831
- description: "SCRFD 2.5G bnkps — balanced face detection with 5 keypoints (WIDER FACE 93.80/92.02/77.13). InsightFace pretrained weights.",
832
- inputSize: {
833
- width: 640,
834
- height: 640
835
- },
836
- labels: [{
837
- id: "face",
838
- name: "Face"
839
- }],
840
- preprocessMode: "letterbox",
841
- inputNormalization: "scrfd",
842
- formats: {
843
- onnx: {
844
- url: hf("faceDetection/scrfd/onnx/camstack-scrfd-2.5g.onnx"),
845
- sizeMB: 3.1
846
- },
847
- coreml: {
848
- url: hf("faceDetection/scrfd/coreml/camstack-scrfd-2.5g.mlpackage"),
849
- sizeMB: 1.7,
850
- isDirectory: true,
851
- files: [...MLPACKAGE_FILES],
852
- runtimes: ["python"]
853
- },
854
- openvino: ovFormat(hf("faceDetection/scrfd/openvino/camstack-scrfd-2.5g.xml"), 1.8)
855
- }
856
- },
857
- {
858
- id: "yunet-2023mar",
859
- license: YUNET_MIT,
860
- name: "YuNet 2023mar",
861
- 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).",
862
- inputSize: {
863
- width: 640,
864
- height: 640
865
- },
866
- labels: [{
867
- id: "face",
868
- name: "Face"
869
- }],
870
- preprocessMode: "letterbox",
871
- postprocessor: "yunet",
872
- defaultConfidence: .85,
873
- formats: {
874
- onnx: {
875
- url: hf("faceDetection/yunet/onnx/camstack-yunet-2023mar.onnx"),
876
- sizeMB: .23
877
- },
878
- coreml: {
879
- url: hf("faceDetection/yunet/coreml/camstack-yunet-2023mar.mlpackage"),
880
- sizeMB: .2,
881
- isDirectory: true,
882
- files: [...MLPACKAGE_FILES],
883
- runtimes: ["python"]
884
- },
885
- openvino: ovFormat(hf("faceDetection/yunet/openvino/camstack-yunet-2023mar.xml"), .36)
886
- }
703
+ var FACE_DETECTION_MODELS = [{
704
+ id: "yunet-2023mar",
705
+ license: YUNET_MIT,
706
+ name: "YuNet 2023mar",
707
+ 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).",
708
+ inputSize: {
709
+ width: 640,
710
+ height: 640
887
711
  },
888
- {
889
- id: "ssd-mobilenet-v2-face-edgetpu",
890
- license: CORAL_APACHE,
891
- legacy: true,
892
- name: "SSD MobileNet V2 Face (Coral)",
893
- 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).",
894
- inputSize: {
895
- width: 320,
896
- height: 320
712
+ labels: [{
713
+ id: "face",
714
+ name: "Face"
715
+ }],
716
+ preprocessMode: "letterbox",
717
+ postprocessor: "yunet",
718
+ defaultConfidence: .85,
719
+ formats: {
720
+ onnx: {
721
+ url: hf("faceDetection/yunet/onnx/camstack-yunet-2023mar.onnx"),
722
+ sizeMB: .23
897
723
  },
898
- labels: [{
899
- id: "face",
900
- name: "Face"
901
- }],
902
- preprocessMode: "letterbox",
903
- postprocessor: "ssd",
904
- formats: { tflite: {
905
- url: "https://github.com/google-coral/test_data/raw/master/ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite",
906
- sizeMB: 6.7,
724
+ coreml: {
725
+ url: hf("faceDetection/yunet/coreml/camstack-yunet-2023mar.mlpackage"),
726
+ sizeMB: .2,
727
+ isDirectory: true,
728
+ files: [...MLPACKAGE_FILES],
907
729
  runtimes: ["python"]
908
- } }
909
- }
910
- ];
911
- var FACE_EMBEDDING_MODELS = [
912
- {
913
- id: "arcface-r100",
914
- license: ARCFACE_UNKNOWN,
915
- name: "ArcFace (ResNet34)",
916
- description: "ArcFace ResNet34 — face recognition embeddings (512-d). NOTE: despite the `arcface-r100` id this is a ResNet34, not a ResNet-100 (verified 2026-08-19).",
917
- inputSize: {
918
- width: 112,
919
- height: 112
920
730
  },
921
- inputLayout: "nhwc",
922
- labels: [{
923
- id: "embedding",
924
- name: "Face Embedding"
925
- }],
926
- preprocessMode: "resize",
927
- faceAlignment: true,
928
- formats: {
929
- onnx: {
930
- url: hf("faceRecognition/arcface/onnx/camstack-arcface-arcface.onnx"),
931
- sizeMB: 130
932
- },
933
- coreml: {
934
- url: hf("faceRecognition/arcface/coreml/camstack-arcface-r100.mlpackage"),
935
- sizeMB: 65,
936
- isDirectory: true,
937
- files: [...MLPACKAGE_FILES],
938
- runtimes: ["python"]
939
- },
940
- openvino: ovFormat(hf("faceRecognition/arcface/openvino/camstack-arcface-r100.xml"), 65)
941
- }
731
+ openvino: ovFormat(hf("faceDetection/yunet/openvino/camstack-yunet-2023mar.xml"), .36)
732
+ }
733
+ }];
734
+ var FACE_EMBEDDING_MODELS = [{
735
+ id: "auraface-r100",
736
+ license: AURAFACE_APACHE,
737
+ name: "AuraFace R100",
738
+ 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.",
739
+ inputSize: {
740
+ width: 112,
741
+ height: 112
942
742
  },
943
- {
944
- id: "auraface-r100",
945
- license: AURAFACE_APACHE,
946
- name: "AuraFace R100",
947
- 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 `arcface-r100` entry, which is a ResNet34.",
948
- inputSize: {
949
- width: 112,
950
- height: 112
743
+ labels: [{
744
+ id: "embedding",
745
+ name: "Face Embedding"
746
+ }],
747
+ preprocessMode: "resize",
748
+ faceAlignment: true,
749
+ formats: {
750
+ onnx: {
751
+ url: hf("faceRecognition/auraface/onnx/camstack-auraface-r100.onnx"),
752
+ sizeMB: 261
951
753
  },
952
- labels: [{
953
- id: "embedding",
954
- name: "Face Embedding"
955
- }],
956
- preprocessMode: "resize",
957
- faceAlignment: true,
958
- formats: {
959
- onnx: {
960
- url: hf("faceRecognition/auraface/onnx/camstack-auraface-r100.onnx"),
961
- sizeMB: 261
962
- },
963
- coreml: {
964
- url: hf("faceRecognition/auraface/coreml/camstack-auraface-r100.mlpackage"),
965
- sizeMB: 131,
966
- isDirectory: true,
967
- files: [...MLPACKAGE_FILES],
968
- runtimes: ["python"]
969
- },
970
- openvino: ovFormat(hf("faceRecognition/auraface/openvino/camstack-auraface-r100.xml"), 131)
971
- }
972
- },
973
- {
974
- id: "inception-resnet-v1",
975
- license: SCRYPTED_UNKNOWN,
976
- name: "Inception ResNet V1",
977
- description: "FaceNet-style face recognition embeddings (512-d) — hosted on plugin-models HF repo",
978
- inputSize: {
979
- width: 160,
980
- height: 160
754
+ coreml: {
755
+ url: hf("faceRecognition/auraface/coreml/camstack-auraface-r100.mlpackage"),
756
+ sizeMB: 131,
757
+ isDirectory: true,
758
+ files: [...MLPACKAGE_FILES],
759
+ runtimes: ["python"]
981
760
  },
982
- labels: [{
983
- id: "embedding",
984
- name: "Face Embedding"
985
- }],
986
- preprocessMode: "resize",
987
- formats: {
988
- onnx: {
989
- url: hfScrypted("onnx/inception_resnet_v1/inception_resnet_v1.onnx"),
990
- sizeMB: 89.6
991
- },
992
- coreml: {
993
- url: hfScrypted("coreml/inception_resnet_v1/inception_resnet_v1.mlpackage"),
994
- sizeMB: 45,
995
- isDirectory: true,
996
- files: [...MLPACKAGE_FILES],
997
- runtimes: ["python"]
998
- },
999
- openvino: ovFormat(hf("faceRecognition/inception-resnet-v1/openvino/camstack-inception-resnet-v1.xml"), 45)
1000
- }
761
+ openvino: ovFormat(hf("faceRecognition/auraface/openvino/camstack-auraface-r100.xml"), 131)
1001
762
  }
1002
- ];
763
+ }];
1003
764
  var PLATE_DETECTION_MODELS = [{
1004
765
  id: "yolov8n-plate",
1005
766
  license: licensed(ULTRALYTICS_AGPL, {
@@ -1037,46 +798,10 @@ var PLATE_DETECTION_MODELS = [{
1037
798
  }
1038
799
  }];
1039
800
  var PACKAGE_DETECTION_MODELS = [{
1040
- id: "yolov8n-package",
1041
- license: licensed(ULTRALYTICS_AGPL, {
1042
- data: {
1043
- name: "Roboflow Universe package-at-front-door (most likely)",
1044
- terms: "UNVERIFIED",
1045
- url: "https://universe.roboflow.com/package-detection/package-at-front-door"
1046
- },
1047
- attribution: "© Ultralytics, AGPL-3.0 (YOLOv8n base, fine-tuned by CamStack with Ultralytics). The fine-tuning checkpoint is not published yet.",
1048
- modifications: "fine-tuned by CamStack with Ultralytics; exported to ONNX, OpenVINO IR and CoreML"
1049
- }),
1050
- name: "YOLOv8 Nano — Package",
1051
- description: "YOLOv8 Nano fine-tuned for parcel/package detection (mAP50 0.93) — dedicated model, not the COCO suitcase/backpack proxy",
1052
- inputSize: {
1053
- width: 640,
1054
- height: 640
1055
- },
1056
- labels: [{
1057
- id: "package",
1058
- name: "Package"
1059
- }],
1060
- preprocessMode: "letterbox",
1061
- formats: {
1062
- onnx: {
1063
- url: hf("packageDetection/yolov8-package/onnx/camstack-yolov8n-package.onnx"),
1064
- sizeMB: 12
1065
- },
1066
- coreml: {
1067
- url: hf("packageDetection/yolov8-package/coreml/camstack-yolov8n-package.mlpackage"),
1068
- sizeMB: 12,
1069
- isDirectory: true,
1070
- files: [...MLPACKAGE_FILES],
1071
- runtimes: ["python"]
1072
- },
1073
- openvino: ovFormat(hf("packageDetection/yolov8-package/openvino/camstack-yolov8n-package.xml"), 12)
1074
- }
1075
- }, {
1076
801
  id: "rfdetr-package",
1077
802
  license: RFDETR_APACHE,
1078
803
  name: "RF-DETR — Package",
1079
- description: "RF-DETR parcel detector — DETR-style decode (onnx / coreml / openvino). Separates parcel from doormat far better than yolov8n-package (+0.86 vs +0.21 margin on 615) at ~4× the size and ~6× the latency",
804
+ 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",
1080
805
  inputSize: {
1081
806
  width: 576,
1082
807
  height: 576
@@ -1133,35 +858,6 @@ var PLATE_OCR_MODELS = [{
1133
858
  },
1134
859
  openvino: ovFormat(hf("plateRecognition/cct-s-v2-global/openvino/camstack-cct-s-v2-global.xml"), 5)
1135
860
  }
1136
- }, {
1137
- id: "vgg-english-g2",
1138
- license: EASYOCR_APACHE,
1139
- name: "VGG English G2",
1140
- description: "EasyOCR VGG English G2 — generic English text recognition. Superseded as the plate-OCR default by cct-s-v2-global (4/21 vs 19/21 exact on the cam-617 set); kept selectable for non-plate scene text and for any node pinned to it",
1141
- inputSize: {
1142
- width: 384,
1143
- height: 64
1144
- },
1145
- inputChannels: 1,
1146
- labels: [{
1147
- id: "text",
1148
- name: "Plate Text"
1149
- }],
1150
- preprocessMode: "resize",
1151
- formats: {
1152
- onnx: {
1153
- url: hfScrypted("onnx/vgg_english_g2/vgg_english_g2.onnx"),
1154
- sizeMB: 14.4
1155
- },
1156
- coreml: {
1157
- url: hfScrypted("coreml/vgg_english_g2/vgg_english_g2.mlpackage"),
1158
- sizeMB: 11.2,
1159
- isDirectory: true,
1160
- files: [...MLPACKAGE_FILES],
1161
- runtimes: ["python"]
1162
- },
1163
- openvino: ovFormat(hf("plateRecognition/vgg_english_g2/openvino/vgg_english_g2.xml"), 7.2)
1164
- }
1165
861
  }];
1166
862
  var ANIMAL_CLASSIFIER_MODELS = [{
1167
863
  id: "animal-classifier",
@@ -1235,34 +931,6 @@ var BIRD_CLASSIFIER_MODELS = [{
1235
931
  filename: "bird-classifier-labels.json",
1236
932
  sizeMB: .03
1237
933
  }]
1238
- }, {
1239
- id: "bird-classifier-aiy-edgetpu",
1240
- license: CORAL_APACHE,
1241
- legacy: true,
1242
- name: "Bird Classifier AIY (Coral)",
1243
- 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).",
1244
- inputSize: {
1245
- width: 224,
1246
- height: 224
1247
- },
1248
- inputLayout: "nhwc",
1249
- inputNormalization: "none",
1250
- outputProbabilities: true,
1251
- labels: [{
1252
- id: "species",
1253
- name: "Bird Species"
1254
- }],
1255
- preprocessMode: "resize",
1256
- formats: { tflite: {
1257
- url: "https://github.com/google-coral/test_data/raw/master/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite",
1258
- sizeMB: 4.3,
1259
- runtimes: ["python"]
1260
- } },
1261
- extraFiles: [{
1262
- url: hf("animalClassification/bird-classifier/onnx/bird-classifier-labels.json"),
1263
- filename: "bird-classifier-labels.json",
1264
- sizeMB: .03
1265
- }]
1266
934
  }];
1267
935
  var VEHICLE_CLASSIFIER_MODELS = [{
1268
936
  id: "vehicle-type-v1",
@@ -1409,86 +1077,32 @@ var INSTANCE_SEGMENTATION_MODELS = [
1409
1077
  }
1410
1078
  }
1411
1079
  ];
1412
- var CLIP_EMBEDDING_MODELS = [
1413
- {
1414
- id: "mobileclip-s1",
1415
- license: APPLE_MOBILECLIP_AMLR,
1416
- name: "MobileCLIP S1",
1417
- description: "MobileCLIP S1 — Apple balanced CLIP vision encoder, 512-dim, 256×256 (fp16 OpenVINO/CoreML)",
1418
- inputSize: {
1419
- width: 256,
1420
- height: 256
1421
- },
1422
- labels: [{
1423
- id: "embedding",
1424
- name: "CLIP Embedding"
1425
- }],
1426
- preprocessMode: "resize",
1427
- inputNormalization: "none",
1428
- formats: {
1429
- openvino: ovFormat(hf("clip/mobileclip-s1/openvino/camstack-mobileclip-s1-vision.xml"), 55),
1430
- coreml: {
1431
- url: hf("clip/mobileclip-s1/coreml/camstack-mobileclip-s1-vision.mlpackage"),
1432
- sizeMB: 65,
1433
- isDirectory: true,
1434
- files: [...MLPACKAGE_FILES],
1435
- runtimes: ["python"]
1436
- }
1437
- }
1438
- },
1439
- {
1440
- id: "mobileclip-s2",
1441
- license: APPLE_MOBILECLIP_AMLR,
1442
- name: "MobileCLIP S2",
1443
- description: "MobileCLIP S2 — Apple high-accuracy CLIP vision encoder, 512-dim, 256×256 (fp16 OpenVINO/CoreML)",
1444
- inputSize: {
1445
- width: 256,
1446
- height: 256
1447
- },
1448
- labels: [{
1449
- id: "embedding",
1450
- name: "CLIP Embedding"
1451
- }],
1452
- preprocessMode: "resize",
1453
- inputNormalization: "none",
1454
- formats: {
1455
- openvino: ovFormat(hf("clip/mobileclip-s2/openvino/camstack-mobileclip-s2-vision.xml"), 90),
1456
- coreml: {
1457
- url: hf("clip/mobileclip-s2/coreml/camstack-mobileclip-s2-vision.mlpackage"),
1458
- sizeMB: 110,
1459
- isDirectory: true,
1460
- files: [...MLPACKAGE_FILES],
1461
- runtimes: ["python"]
1462
- }
1463
- }
1080
+ var CLIP_EMBEDDING_MODELS = [{
1081
+ id: "siglip2-b16-224",
1082
+ license: SIGLIP2_APACHE,
1083
+ name: "SigLIP2 B/16",
1084
+ description: "Google SigLIP2 base, patch 16, 224×224 — Apache-2.0 CLIP vision encoder, 768-dim (fp16 OpenVINO/CoreML)",
1085
+ inputSize: {
1086
+ width: 224,
1087
+ height: 224
1464
1088
  },
1465
- {
1466
- id: "siglip2-b16-224",
1467
- license: SIGLIP2_APACHE,
1468
- name: "SigLIP2 B/16",
1469
- description: "Google SigLIP2 base, patch 16, 224×224 — Apache-2.0 CLIP vision encoder, 768-dim (fp16 OpenVINO/CoreML)",
1470
- inputSize: {
1471
- width: 224,
1472
- height: 224
1473
- },
1474
- labels: [{
1475
- id: "embedding",
1476
- name: "CLIP Embedding"
1477
- }],
1478
- preprocessMode: "resize",
1479
- inputNormalization: "none",
1480
- formats: {
1481
- openvino: ovFormat(hf("clip/siglip2/openvino/camstack-siglip2-b16-224-vision.xml"), 186),
1482
- coreml: {
1483
- url: hf("clip/siglip2/coreml/camstack-siglip2-b16-224-vision.mlpackage"),
1484
- sizeMB: 185,
1485
- isDirectory: true,
1486
- files: [...MLPACKAGE_FILES],
1487
- runtimes: ["python"]
1488
- }
1089
+ labels: [{
1090
+ id: "embedding",
1091
+ name: "CLIP Embedding"
1092
+ }],
1093
+ preprocessMode: "resize",
1094
+ inputNormalization: "none",
1095
+ formats: {
1096
+ openvino: ovFormat(hf("clip/siglip2/openvino/camstack-siglip2-b16-224-vision.xml"), 186),
1097
+ coreml: {
1098
+ url: hf("clip/siglip2/coreml/camstack-siglip2-b16-224-vision.mlpackage"),
1099
+ sizeMB: 185,
1100
+ isDirectory: true,
1101
+ files: [...MLPACKAGE_FILES],
1102
+ runtimes: ["python"]
1489
1103
  }
1490
1104
  }
1491
- ];
1105
+ }];
1492
1106
  var AUDIO_CLASSIFIER_MODELS = [{
1493
1107
  id: "yamnet-onnx",
1494
1108
  license: YAMNET_APACHE,
@@ -1950,7 +1564,7 @@ var STEP_CLIP_EMBEDDING = new PipelineStepBase({
1950
1564
  ],
1951
1565
  outputClasses: ["embedding"],
1952
1566
  models: [...CLIP_EMBEDDING_MODELS],
1953
- defaultModelId: "mobileclip-s1",
1567
+ defaultModelId: "siglip2-b16-224",
1954
1568
  modelScope: "cluster",
1955
1569
  enabledByDefault: true,
1956
1570
  backfillIntoExistingOverrides: true,
@@ -2163,10 +1777,11 @@ function getDefaultModelForFormatFromDef(def, format) {
2163
1777
  * provider `substituteIncompatibleModels`):
2164
1778
  *
2165
1779
  * - chosen === null → the addon's default model for `format`.
2166
- * - chosen is a catalog model → keep it if it has a `format` build; else
2167
- * the addon's default model for `format`
1780
+ * - chosen is a catalog model → keep it if it has a `format` build AND is
1781
+ * not `legacy`; a legacy pin falls back to
1782
+ * the format default (no longer offered).
1783
+ * Else the addon's default for `format`
2168
1784
  * (a substitution — the caller surfaces it).
2169
- * - chosen is RETIRED (`RETIRED_MODEL_IDS`) → the format default (D643).
2170
1785
  * - chosen is NOT in the catalog (custom/unknown) → returned unchanged; the
2171
1786
  * operator owns a custom model's format compat.
2172
1787
  * - unknown stepId → chosen returned unchanged (never throws).
@@ -2179,9 +1794,9 @@ function resolveModelForFormat(stepId, chosenModelId, format) {
2179
1794
  return chosenModelId ?? "";
2180
1795
  }
2181
1796
  if (chosenModelId === null) return getDefaultModelForFormat(stepId, format);
2182
- if (RETIRED_MODEL_IDS[stepId]?.includes(chosenModelId) === true) return getDefaultModelForFormat(stepId, format);
2183
1797
  const entry = def.models.find((m) => m.id === chosenModelId);
2184
1798
  if (!entry) return chosenModelId;
1799
+ if (entry.legacy === true) return getDefaultModelForFormat(stepId, format);
2185
1800
  if (entry.formats[format]) return chosenModelId;
2186
1801
  return getDefaultModelForFormat(stepId, format);
2187
1802
  }
@@ -3585,10 +3200,15 @@ var CustomModelCatalog = class {
3585
3200
  this.logger = logger;
3586
3201
  this.now = now;
3587
3202
  }
3588
- /** Re-read the registry when the snapshot is older than the TTL; answer the snapshot. */
3589
- async refresh(api) {
3203
+ /**
3204
+ * Re-read the registry when the snapshot is older than the TTL; answer the
3205
+ * snapshot. `force: true` bypasses the TTL — required right after a
3206
+ * Library register when Import+land downloads on the same tick (a warm
3207
+ * empty snapshot otherwise hides the brand-new id for up to 5 s).
3208
+ */
3209
+ async refresh(api, opts) {
3590
3210
  const now = this.now();
3591
- if (now - this.readAtMs < 5e3) return this.byStep;
3211
+ if (opts?.force !== true && now - this.readAtMs < 5e3) return this.byStep;
3592
3212
  this.readAtMs = now;
3593
3213
  if (api === void 0) return this.byStep;
3594
3214
  try {
@@ -3689,4 +3309,4 @@ function resolveDefaultDetectionModel(backend, device, format, getStepDef = getS
3689
3309
  return getDefaultModelForFormatFromDef(def, format);
3690
3310
  }
3691
3311
  //#endregion
3692
- export { resolveModelDefaultConfidence as S, getStep as _, buildSubtreeCanRun as a, RETIRED_MODEL_IDS as b, macroGateVerdict as c, isSessionDecodeReadGone as d, createSessionDecodeCoordinator as f, getDefaultModelForFormat as g, ALL_STEPS as h, mergeCustomModels as i, rootObjectGate as l, ALL_PIPELINE_STEPS as m, resolveDefaultDetectionModel as n, placeDetailStep as o, resolveFrameViewGeometry as p, CustomModelCatalog as r, stepsForElectedPool as s, OBJECT_DETECTION_STEP_ID as t, localFrameRegistry as u, getStepDefinition as v, landmarkPrecisionVerdict as x, resolveModelForFormat as y };
3312
+ export { getStep as _, buildSubtreeCanRun as a, landmarkPrecisionVerdict as b, macroGateVerdict as c, isSessionDecodeReadGone as d, createSessionDecodeCoordinator as f, getDefaultModelForFormat as g, ALL_STEPS as h, mergeCustomModels as i, rootObjectGate as l, ALL_PIPELINE_STEPS as m, resolveDefaultDetectionModel as n, placeDetailStep as o, resolveFrameViewGeometry as p, CustomModelCatalog as r, stepsForElectedPool as s, OBJECT_DETECTION_STEP_ID as t, localFrameRegistry as u, getStepDefinition as v, resolveModelDefaultConfidence as x, resolveModelForFormat as y };