@camstack/addon-vision 0.1.0 → 0.1.2

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 (131) hide show
  1. package/dist/addons/animal-classifier/index.d.mts +6 -1
  2. package/dist/addons/animal-classifier/index.d.ts +6 -1
  3. package/dist/addons/animal-classifier/index.js +513 -49
  4. package/dist/addons/animal-classifier/index.js.map +1 -1
  5. package/dist/addons/animal-classifier/index.mjs +6 -4
  6. package/dist/addons/audio-classification/index.d.mts +6 -1
  7. package/dist/addons/audio-classification/index.d.ts +6 -1
  8. package/dist/addons/audio-classification/index.js +86 -26
  9. package/dist/addons/audio-classification/index.js.map +1 -1
  10. package/dist/addons/audio-classification/index.mjs +3 -2
  11. package/dist/addons/bird-global-classifier/index.d.mts +6 -1
  12. package/dist/addons/bird-global-classifier/index.d.ts +6 -1
  13. package/dist/addons/bird-global-classifier/index.js +514 -50
  14. package/dist/addons/bird-global-classifier/index.js.map +1 -1
  15. package/dist/addons/bird-global-classifier/index.mjs +6 -4
  16. package/dist/addons/bird-nabirds-classifier/index.d.mts +6 -1
  17. package/dist/addons/bird-nabirds-classifier/index.d.ts +6 -1
  18. package/dist/addons/bird-nabirds-classifier/index.js +523 -60
  19. package/dist/addons/bird-nabirds-classifier/index.js.map +1 -1
  20. package/dist/addons/bird-nabirds-classifier/index.mjs +6 -4
  21. package/dist/addons/face-detection/index.d.mts +6 -1
  22. package/dist/addons/face-detection/index.d.ts +6 -1
  23. package/dist/addons/face-detection/index.js +538 -39
  24. package/dist/addons/face-detection/index.js.map +1 -1
  25. package/dist/addons/face-detection/index.mjs +5 -3
  26. package/dist/addons/face-recognition/index.d.mts +6 -1
  27. package/dist/addons/face-recognition/index.d.ts +6 -1
  28. package/dist/addons/face-recognition/index.js +487 -33
  29. package/dist/addons/face-recognition/index.js.map +1 -1
  30. package/dist/addons/face-recognition/index.mjs +5 -3
  31. package/dist/addons/motion-detection/index.d.mts +3 -1
  32. package/dist/addons/motion-detection/index.d.ts +3 -1
  33. package/dist/addons/motion-detection/index.js +11 -3
  34. package/dist/addons/motion-detection/index.js.map +1 -1
  35. package/dist/addons/motion-detection/index.mjs +140 -3
  36. package/dist/addons/motion-detection/index.mjs.map +1 -1
  37. package/dist/addons/object-detection/index.d.mts +6 -1
  38. package/dist/addons/object-detection/index.d.ts +6 -1
  39. package/dist/addons/object-detection/index.js +369 -72
  40. package/dist/addons/object-detection/index.js.map +1 -1
  41. package/dist/addons/object-detection/index.mjs +5 -3
  42. package/dist/addons/plate-detection/index.d.mts +6 -1
  43. package/dist/addons/plate-detection/index.d.ts +6 -1
  44. package/dist/addons/plate-detection/index.js +531 -31
  45. package/dist/addons/plate-detection/index.js.map +1 -1
  46. package/dist/addons/plate-detection/index.mjs +5 -3
  47. package/dist/addons/plate-recognition/index.d.mts +7 -1
  48. package/dist/addons/plate-recognition/index.d.ts +7 -1
  49. package/dist/addons/plate-recognition/index.js +176 -44
  50. package/dist/addons/plate-recognition/index.js.map +1 -1
  51. package/dist/addons/plate-recognition/index.mjs +4 -3
  52. package/dist/addons/segmentation-refiner/index.d.mts +30 -0
  53. package/dist/addons/segmentation-refiner/index.d.ts +30 -0
  54. package/dist/addons/segmentation-refiner/index.js +1048 -0
  55. package/dist/addons/segmentation-refiner/index.js.map +1 -0
  56. package/dist/addons/segmentation-refiner/index.mjs +209 -0
  57. package/dist/addons/segmentation-refiner/index.mjs.map +1 -0
  58. package/dist/addons/vehicle-classifier/index.d.mts +31 -0
  59. package/dist/addons/vehicle-classifier/index.d.ts +31 -0
  60. package/dist/addons/vehicle-classifier/index.js +688 -0
  61. package/dist/addons/vehicle-classifier/index.js.map +1 -0
  62. package/dist/addons/vehicle-classifier/index.mjs +250 -0
  63. package/dist/addons/vehicle-classifier/index.mjs.map +1 -0
  64. package/dist/{chunk-6OR5TE7A.mjs → chunk-22BHCDT5.mjs} +2 -2
  65. package/dist/chunk-22BHCDT5.mjs.map +1 -0
  66. package/dist/{chunk-LPI42WL6.mjs → chunk-2IOKI4ES.mjs} +23 -12
  67. package/dist/chunk-2IOKI4ES.mjs.map +1 -0
  68. package/dist/chunk-7DYHXUPZ.mjs +36 -0
  69. package/dist/chunk-7DYHXUPZ.mjs.map +1 -0
  70. package/dist/chunk-BJTO5JO5.mjs +11 -0
  71. package/dist/chunk-BP7H4NFS.mjs +412 -0
  72. package/dist/chunk-BP7H4NFS.mjs.map +1 -0
  73. package/dist/chunk-BR2FPGOX.mjs +98 -0
  74. package/dist/chunk-BR2FPGOX.mjs.map +1 -0
  75. package/dist/{chunk-5AIQSN32.mjs → chunk-D6WEHN33.mjs} +66 -17
  76. package/dist/chunk-D6WEHN33.mjs.map +1 -0
  77. package/dist/{chunk-3MQFUDRU.mjs → chunk-DRYFGARD.mjs} +76 -47
  78. package/dist/chunk-DRYFGARD.mjs.map +1 -0
  79. package/dist/{chunk-ISOIDU4U.mjs → chunk-DUN6XU3N.mjs} +23 -5
  80. package/dist/chunk-DUN6XU3N.mjs.map +1 -0
  81. package/dist/{chunk-MEVASN3P.mjs → chunk-ESLHNWWE.mjs} +104 -22
  82. package/dist/chunk-ESLHNWWE.mjs.map +1 -0
  83. package/dist/{chunk-B3R66MPF.mjs → chunk-JUQEW6ON.mjs} +58 -21
  84. package/dist/chunk-JUQEW6ON.mjs.map +1 -0
  85. package/dist/{chunk-AYBFB7ID.mjs → chunk-R5J3WAUI.mjs} +200 -318
  86. package/dist/chunk-R5J3WAUI.mjs.map +1 -0
  87. package/dist/chunk-XZ6ZMXXU.mjs +39 -0
  88. package/dist/chunk-XZ6ZMXXU.mjs.map +1 -0
  89. package/dist/{chunk-5JJZGKL7.mjs → chunk-YPU4WTXZ.mjs} +102 -19
  90. package/dist/chunk-YPU4WTXZ.mjs.map +1 -0
  91. package/dist/{chunk-J4WRYHHY.mjs → chunk-YUCD2TFH.mjs} +66 -36
  92. package/dist/chunk-YUCD2TFH.mjs.map +1 -0
  93. package/dist/{chunk-PDSHDDPV.mjs → chunk-ZTJENCFC.mjs} +159 -35
  94. package/dist/chunk-ZTJENCFC.mjs.map +1 -0
  95. package/dist/{chunk-Q3SQOYG6.mjs → chunk-ZWYXXCXP.mjs} +67 -37
  96. package/dist/chunk-ZWYXXCXP.mjs.map +1 -0
  97. package/dist/index.d.mts +17 -5
  98. package/dist/index.d.ts +17 -5
  99. package/dist/index.js +1343 -550
  100. package/dist/index.js.map +1 -1
  101. package/dist/index.mjs +191 -20
  102. package/dist/index.mjs.map +1 -1
  103. package/package.json +94 -18
  104. package/python/coreml_inference.py +61 -18
  105. package/python/openvino_inference.py +12 -4
  106. package/python/pytorch_inference.py +12 -4
  107. package/dist/addons/camera-native-detection/index.d.mts +0 -32
  108. package/dist/addons/camera-native-detection/index.d.ts +0 -32
  109. package/dist/addons/camera-native-detection/index.js +0 -99
  110. package/dist/addons/camera-native-detection/index.js.map +0 -1
  111. package/dist/addons/camera-native-detection/index.mjs +0 -7
  112. package/dist/chunk-3MQFUDRU.mjs.map +0 -1
  113. package/dist/chunk-5AIQSN32.mjs.map +0 -1
  114. package/dist/chunk-5JJZGKL7.mjs.map +0 -1
  115. package/dist/chunk-6OR5TE7A.mjs.map +0 -1
  116. package/dist/chunk-AYBFB7ID.mjs.map +0 -1
  117. package/dist/chunk-B3R66MPF.mjs.map +0 -1
  118. package/dist/chunk-DTOAB2CE.mjs +0 -79
  119. package/dist/chunk-DTOAB2CE.mjs.map +0 -1
  120. package/dist/chunk-ISOIDU4U.mjs.map +0 -1
  121. package/dist/chunk-J4WRYHHY.mjs.map +0 -1
  122. package/dist/chunk-LPI42WL6.mjs.map +0 -1
  123. package/dist/chunk-MEVASN3P.mjs.map +0 -1
  124. package/dist/chunk-PDSHDDPV.mjs.map +0 -1
  125. package/dist/chunk-Q3SQOYG6.mjs.map +0 -1
  126. package/dist/chunk-QIMDG34B.mjs +0 -229
  127. package/dist/chunk-QIMDG34B.mjs.map +0 -1
  128. package/python/__pycache__/coreml_inference.cpython-313.pyc +0 -0
  129. package/python/__pycache__/openvino_inference.cpython-313.pyc +0 -0
  130. package/python/__pycache__/pytorch_inference.cpython-313.pyc +0 -0
  131. /package/dist/{addons/camera-native-detection/index.mjs.map → chunk-BJTO5JO5.mjs.map} +0 -0
@@ -37,7 +37,13 @@ module.exports = __toCommonJS(object_detection_exports);
37
37
  // src/catalogs/object-detection-models.ts
38
38
  var import_types = require("@camstack/types");
39
39
  var HF_REPO = "camstack/camstack-models";
40
+ var MLPACKAGE_FILES = [
41
+ "Manifest.json",
42
+ "Data/com.apple.CoreML/model.mlmodel",
43
+ "Data/com.apple.CoreML/weights/weight.bin"
44
+ ];
40
45
  var OBJECT_DETECTION_MODELS = [
46
+ // ── YOLOv8 ──────────────────────────────────────────────────────
41
47
  {
42
48
  id: "yolov8n",
43
49
  name: "YOLOv8 Nano",
@@ -51,15 +57,20 @@ var OBJECT_DETECTION_MODELS = [
51
57
  },
52
58
  coreml: {
53
59
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8n.mlpackage"),
54
- sizeMB: 6
60
+ sizeMB: 6,
61
+ isDirectory: true,
62
+ files: MLPACKAGE_FILES,
63
+ runtimes: ["python"]
55
64
  },
56
65
  openvino: {
57
66
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8n.xml"),
58
- sizeMB: 7
67
+ sizeMB: 7,
68
+ runtimes: ["python"]
59
69
  },
60
70
  tflite: {
61
71
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8n_float32.tflite"),
62
- sizeMB: 12
72
+ sizeMB: 12,
73
+ runtimes: ["python"]
63
74
  }
64
75
  }
65
76
  },
@@ -76,14 +87,32 @@ var OBJECT_DETECTION_MODELS = [
76
87
  },
77
88
  coreml: {
78
89
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8s.mlpackage"),
79
- sizeMB: 21
90
+ sizeMB: 21,
91
+ isDirectory: true,
92
+ files: MLPACKAGE_FILES,
93
+ runtimes: ["python"]
80
94
  },
81
95
  openvino: {
82
96
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8s.xml"),
83
- sizeMB: 22
97
+ sizeMB: 22,
98
+ runtimes: ["python"]
84
99
  },
85
100
  tflite: {
86
101
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8s_float32.tflite"),
102
+ sizeMB: 43,
103
+ runtimes: ["python"]
104
+ }
105
+ }
106
+ },
107
+ {
108
+ id: "yolov8s-relu",
109
+ name: "YOLOv8 Small ReLU",
110
+ description: "YOLOv8 Small with ReLU activation \u2014 better hardware compatibility",
111
+ inputSize: { width: 640, height: 640 },
112
+ labels: import_types.COCO_80_LABELS,
113
+ formats: {
114
+ onnx: {
115
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8s-relu.onnx"),
87
116
  sizeMB: 43
88
117
  }
89
118
  }
@@ -101,18 +130,74 @@ var OBJECT_DETECTION_MODELS = [
101
130
  },
102
131
  coreml: {
103
132
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8m.mlpackage"),
104
- sizeMB: 49
133
+ sizeMB: 49,
134
+ isDirectory: true,
135
+ files: MLPACKAGE_FILES,
136
+ runtimes: ["python"]
105
137
  },
106
138
  openvino: {
107
139
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8m.xml"),
108
- sizeMB: 50
140
+ sizeMB: 50,
141
+ runtimes: ["python"]
109
142
  },
110
143
  tflite: {
111
144
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8m_float32.tflite"),
112
- sizeMB: 99
145
+ sizeMB: 99,
146
+ runtimes: ["python"]
147
+ }
148
+ }
149
+ },
150
+ {
151
+ id: "yolov8l",
152
+ name: "YOLOv8 Large",
153
+ description: "YOLOv8 Large \u2014 high-accuracy large model",
154
+ inputSize: { width: 640, height: 640 },
155
+ labels: import_types.COCO_80_LABELS,
156
+ formats: {
157
+ onnx: {
158
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8l.onnx"),
159
+ sizeMB: 167
160
+ },
161
+ coreml: {
162
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8l.mlpackage"),
163
+ sizeMB: 83,
164
+ isDirectory: true,
165
+ files: MLPACKAGE_FILES,
166
+ runtimes: ["python"]
167
+ },
168
+ openvino: {
169
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8l.xml"),
170
+ sizeMB: 84,
171
+ runtimes: ["python"]
113
172
  }
114
173
  }
115
174
  },
175
+ {
176
+ id: "yolov8x",
177
+ name: "YOLOv8 Extra-Large",
178
+ description: "YOLOv8 Extra-Large \u2014 maximum accuracy",
179
+ inputSize: { width: 640, height: 640 },
180
+ labels: import_types.COCO_80_LABELS,
181
+ formats: {
182
+ onnx: {
183
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8x.onnx"),
184
+ sizeMB: 260
185
+ },
186
+ coreml: {
187
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8x.mlpackage"),
188
+ sizeMB: 130,
189
+ isDirectory: true,
190
+ files: MLPACKAGE_FILES,
191
+ runtimes: ["python"]
192
+ },
193
+ openvino: {
194
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8x.xml"),
195
+ sizeMB: 131,
196
+ runtimes: ["python"]
197
+ }
198
+ }
199
+ },
200
+ // ── YOLOv9 ──────────────────────────────────────────────────────
116
201
  {
117
202
  id: "yolov9t",
118
203
  name: "YOLOv9 Tiny",
@@ -126,15 +211,20 @@ var OBJECT_DETECTION_MODELS = [
126
211
  },
127
212
  coreml: {
128
213
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage"),
129
- sizeMB: 4
214
+ sizeMB: 4,
215
+ isDirectory: true,
216
+ files: MLPACKAGE_FILES,
217
+ runtimes: ["python"]
130
218
  },
131
219
  openvino: {
132
220
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9t.xml"),
133
- sizeMB: 6
221
+ sizeMB: 6,
222
+ runtimes: ["python"]
134
223
  },
135
224
  tflite: {
136
225
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9t_float32.tflite"),
137
- sizeMB: 8
226
+ sizeMB: 8,
227
+ runtimes: ["python"]
138
228
  }
139
229
  }
140
230
  },
@@ -151,15 +241,20 @@ var OBJECT_DETECTION_MODELS = [
151
241
  },
152
242
  coreml: {
153
243
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage"),
154
- sizeMB: 14
244
+ sizeMB: 14,
245
+ isDirectory: true,
246
+ files: MLPACKAGE_FILES,
247
+ runtimes: ["python"]
155
248
  },
156
249
  openvino: {
157
250
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9s.xml"),
158
- sizeMB: 16
251
+ sizeMB: 16,
252
+ runtimes: ["python"]
159
253
  },
160
254
  tflite: {
161
255
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9s_float32.tflite"),
162
- sizeMB: 28
256
+ sizeMB: 28,
257
+ runtimes: ["python"]
163
258
  }
164
259
  }
165
260
  },
@@ -176,23 +271,28 @@ var OBJECT_DETECTION_MODELS = [
176
271
  },
177
272
  coreml: {
178
273
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage"),
179
- sizeMB: 48
274
+ sizeMB: 48,
275
+ isDirectory: true,
276
+ files: MLPACKAGE_FILES,
277
+ runtimes: ["python"]
180
278
  },
181
279
  openvino: {
182
280
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9c.xml"),
183
- sizeMB: 49
281
+ sizeMB: 49,
282
+ runtimes: ["python"]
184
283
  },
185
284
  tflite: {
186
285
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9c_float32.tflite"),
187
- sizeMB: 97
286
+ sizeMB: 97,
287
+ runtimes: ["python"]
188
288
  }
189
289
  }
190
290
  },
191
- // YOLO11 — no CoreML (coremltools incompatible)
291
+ // ── YOLO11 ────────────────────────────────────────────────────
192
292
  {
193
293
  id: "yolo11n",
194
294
  name: "YOLO11 Nano",
195
- description: "YOLO11 Nano \u2014 fastest, smallest YOLO11 detection model",
295
+ description: "YOLO11 Nano \u2014 fastest, smallest YOLO11 detection model (mAP 39.5)",
196
296
  inputSize: { width: 640, height: 640 },
197
297
  labels: import_types.COCO_80_LABELS,
198
298
  formats: {
@@ -200,20 +300,29 @@ var OBJECT_DETECTION_MODELS = [
200
300
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11n.onnx"),
201
301
  sizeMB: 10
202
302
  },
303
+ coreml: {
304
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11n.mlpackage"),
305
+ sizeMB: 5,
306
+ isDirectory: true,
307
+ files: MLPACKAGE_FILES,
308
+ runtimes: ["python"]
309
+ },
203
310
  openvino: {
204
311
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11n.xml"),
205
- sizeMB: 5.4
312
+ sizeMB: 5,
313
+ runtimes: ["python"]
206
314
  },
207
315
  tflite: {
208
316
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11n_float32.tflite"),
209
- sizeMB: 10
317
+ sizeMB: 10,
318
+ runtimes: ["python"]
210
319
  }
211
320
  }
212
321
  },
213
322
  {
214
323
  id: "yolo11s",
215
324
  name: "YOLO11 Small",
216
- description: "YOLO11 Small \u2014 balanced speed and accuracy",
325
+ description: "YOLO11 Small \u2014 balanced speed and accuracy (mAP 47.0)",
217
326
  inputSize: { width: 640, height: 640 },
218
327
  labels: import_types.COCO_80_LABELS,
219
328
  formats: {
@@ -221,20 +330,29 @@ var OBJECT_DETECTION_MODELS = [
221
330
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11s.onnx"),
222
331
  sizeMB: 36
223
332
  },
333
+ coreml: {
334
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11s.mlpackage"),
335
+ sizeMB: 18,
336
+ isDirectory: true,
337
+ files: MLPACKAGE_FILES,
338
+ runtimes: ["python"]
339
+ },
224
340
  openvino: {
225
341
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11s.xml"),
226
- sizeMB: 18
342
+ sizeMB: 18,
343
+ runtimes: ["python"]
227
344
  },
228
345
  tflite: {
229
346
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11s_float32.tflite"),
230
- sizeMB: 36
347
+ sizeMB: 36,
348
+ runtimes: ["python"]
231
349
  }
232
350
  }
233
351
  },
234
352
  {
235
353
  id: "yolo11m",
236
354
  name: "YOLO11 Medium",
237
- description: "YOLO11 Medium \u2014 higher accuracy, moderate size",
355
+ description: "YOLO11 Medium \u2014 higher accuracy, moderate size (mAP 51.5)",
238
356
  inputSize: { width: 640, height: 640 },
239
357
  labels: import_types.COCO_80_LABELS,
240
358
  formats: {
@@ -242,20 +360,29 @@ var OBJECT_DETECTION_MODELS = [
242
360
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11m.onnx"),
243
361
  sizeMB: 77
244
362
  },
363
+ coreml: {
364
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11m.mlpackage"),
365
+ sizeMB: 39,
366
+ isDirectory: true,
367
+ files: MLPACKAGE_FILES,
368
+ runtimes: ["python"]
369
+ },
245
370
  openvino: {
246
371
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11m.xml"),
247
- sizeMB: 39
372
+ sizeMB: 39,
373
+ runtimes: ["python"]
248
374
  },
249
375
  tflite: {
250
376
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11m_float32.tflite"),
251
- sizeMB: 77
377
+ sizeMB: 77,
378
+ runtimes: ["python"]
252
379
  }
253
380
  }
254
381
  },
255
382
  {
256
383
  id: "yolo11l",
257
384
  name: "YOLO11 Large",
258
- description: "YOLO11 Large \u2014 high-accuracy large model",
385
+ description: "YOLO11 Large \u2014 high-accuracy large model (mAP 53.4)",
259
386
  inputSize: { width: 640, height: 640 },
260
387
  labels: import_types.COCO_80_LABELS,
261
388
  formats: {
@@ -263,20 +390,29 @@ var OBJECT_DETECTION_MODELS = [
263
390
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11l.onnx"),
264
391
  sizeMB: 97
265
392
  },
393
+ coreml: {
394
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11l.mlpackage"),
395
+ sizeMB: 49,
396
+ isDirectory: true,
397
+ files: MLPACKAGE_FILES,
398
+ runtimes: ["python"]
399
+ },
266
400
  openvino: {
267
401
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11l.xml"),
268
- sizeMB: 49
402
+ sizeMB: 49,
403
+ runtimes: ["python"]
269
404
  },
270
405
  tflite: {
271
406
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11l_float32.tflite"),
272
- sizeMB: 97
407
+ sizeMB: 97,
408
+ runtimes: ["python"]
273
409
  }
274
410
  }
275
411
  },
276
412
  {
277
413
  id: "yolo11x",
278
414
  name: "YOLO11 Extra-Large",
279
- description: "YOLO11 Extra-Large \u2014 maximum accuracy",
415
+ description: "YOLO11 Extra-Large \u2014 maximum accuracy (mAP 54.7)",
280
416
  inputSize: { width: 640, height: 640 },
281
417
  labels: import_types.COCO_80_LABELS,
282
418
  formats: {
@@ -284,13 +420,22 @@ var OBJECT_DETECTION_MODELS = [
284
420
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11x.onnx"),
285
421
  sizeMB: 218
286
422
  },
423
+ coreml: {
424
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11x.mlpackage"),
425
+ sizeMB: 109,
426
+ isDirectory: true,
427
+ files: MLPACKAGE_FILES,
428
+ runtimes: ["python"]
429
+ },
287
430
  openvino: {
288
431
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11x.xml"),
289
- sizeMB: 109
432
+ sizeMB: 109,
433
+ runtimes: ["python"]
290
434
  },
291
435
  tflite: {
292
436
  url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11x_float32.tflite"),
293
- sizeMB: 218
437
+ sizeMB: 218,
438
+ runtimes: ["python"]
294
439
  }
295
440
  }
296
441
  }
@@ -300,7 +445,7 @@ var OBJECT_DETECTION_MODELS = [
300
445
  var import_types2 = require("@camstack/types");
301
446
  var HF_REPO2 = "camstack/camstack-models";
302
447
  var SEGMENTATION_MODELS = [
303
- // YOLO11-seg — no CoreML (coremltools incompatible)
448
+ // ── YOLO11-seg ───────────────────────────────────────────────
304
449
  {
305
450
  id: "yolo11n-seg",
306
451
  name: "YOLO11 Nano Segmentation",
@@ -312,9 +457,17 @@ var SEGMENTATION_MODELS = [
312
457
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/onnx/camstack-yolo11n-seg.onnx"),
313
458
  sizeMB: 11
314
459
  },
460
+ coreml: {
461
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/coreml/camstack-yolo11n-seg.mlpackage"),
462
+ sizeMB: 6,
463
+ isDirectory: true,
464
+ files: MLPACKAGE_FILES,
465
+ runtimes: ["python"]
466
+ },
315
467
  openvino: {
316
468
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/openvino/camstack-yolo11n-seg.xml"),
317
- sizeMB: 6
469
+ sizeMB: 6,
470
+ runtimes: ["python"]
318
471
  }
319
472
  }
320
473
  },
@@ -329,9 +482,17 @@ var SEGMENTATION_MODELS = [
329
482
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/onnx/camstack-yolo11s-seg.onnx"),
330
483
  sizeMB: 39
331
484
  },
485
+ coreml: {
486
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/coreml/camstack-yolo11s-seg.mlpackage"),
487
+ sizeMB: 20,
488
+ isDirectory: true,
489
+ files: MLPACKAGE_FILES,
490
+ runtimes: ["python"]
491
+ },
332
492
  openvino: {
333
493
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/openvino/camstack-yolo11s-seg.xml"),
334
- sizeMB: 20
494
+ sizeMB: 20,
495
+ runtimes: ["python"]
335
496
  }
336
497
  }
337
498
  },
@@ -346,13 +507,21 @@ var SEGMENTATION_MODELS = [
346
507
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/onnx/camstack-yolo11m-seg.onnx"),
347
508
  sizeMB: 86
348
509
  },
510
+ coreml: {
511
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/coreml/camstack-yolo11m-seg.mlpackage"),
512
+ sizeMB: 43,
513
+ isDirectory: true,
514
+ files: MLPACKAGE_FILES,
515
+ runtimes: ["python"]
516
+ },
349
517
  openvino: {
350
518
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolo11-seg/openvino/camstack-yolo11m-seg.xml"),
351
- sizeMB: 43
519
+ sizeMB: 43,
520
+ runtimes: ["python"]
352
521
  }
353
522
  }
354
523
  },
355
- // YOLOv8-seg — CoreML available
524
+ // ── YOLOv8-seg — CoreML supported ─────────────────────────────
356
525
  {
357
526
  id: "yolov8n-seg",
358
527
  name: "YOLOv8 Nano Segmentation",
@@ -366,11 +535,15 @@ var SEGMENTATION_MODELS = [
366
535
  },
367
536
  coreml: {
368
537
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolov8-seg/coreml/camstack-yolov8n-seg.mlpackage"),
369
- sizeMB: 7
538
+ sizeMB: 7,
539
+ isDirectory: true,
540
+ files: MLPACKAGE_FILES,
541
+ runtimes: ["python"]
370
542
  },
371
543
  openvino: {
372
544
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolov8-seg/openvino/camstack-yolov8n-seg.xml"),
373
- sizeMB: 7
545
+ sizeMB: 7,
546
+ runtimes: ["python"]
374
547
  }
375
548
  }
376
549
  },
@@ -387,11 +560,15 @@ var SEGMENTATION_MODELS = [
387
560
  },
388
561
  coreml: {
389
562
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolov8-seg/coreml/camstack-yolov8s-seg.mlpackage"),
390
- sizeMB: 23
563
+ sizeMB: 23,
564
+ isDirectory: true,
565
+ files: MLPACKAGE_FILES,
566
+ runtimes: ["python"]
391
567
  },
392
568
  openvino: {
393
569
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolov8-seg/openvino/camstack-yolov8s-seg.xml"),
394
- sizeMB: 23
570
+ sizeMB: 23,
571
+ runtimes: ["python"]
395
572
  }
396
573
  }
397
574
  },
@@ -408,11 +585,15 @@ var SEGMENTATION_MODELS = [
408
585
  },
409
586
  coreml: {
410
587
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolov8-seg/coreml/camstack-yolov8m-seg.mlpackage"),
411
- sizeMB: 52
588
+ sizeMB: 52,
589
+ isDirectory: true,
590
+ files: MLPACKAGE_FILES,
591
+ runtimes: ["python"]
412
592
  },
413
593
  openvino: {
414
594
  url: (0, import_types2.hfModelUrl)(HF_REPO2, "segmentation/yolov8-seg/openvino/camstack-yolov8m-seg.xml"),
415
- sizeMB: 53
595
+ sizeMB: 53,
596
+ runtimes: ["python"]
416
597
  }
417
598
  }
418
599
  }
@@ -844,7 +1025,7 @@ var PythonInferenceEngine = class {
844
1025
  var AUTO_BACKEND_PRIORITY = ["coreml", "cuda", "tensorrt", "cpu"];
845
1026
  var BACKEND_TO_FORMAT = {
846
1027
  cpu: "onnx",
847
- coreml: "coreml",
1028
+ coreml: "onnx",
848
1029
  cuda: "onnx",
849
1030
  tensorrt: "onnx"
850
1031
  };
@@ -872,7 +1053,7 @@ function modelExists(filePath) {
872
1053
  }
873
1054
  }
874
1055
  async function resolveEngine(options) {
875
- const { runtime, backend, modelEntry, modelsDir, downloadModel } = options;
1056
+ const { runtime, backend, modelEntry, modelsDir, models } = options;
876
1057
  let selectedFormat;
877
1058
  let selectedBackend;
878
1059
  if (runtime === "auto") {
@@ -906,18 +1087,18 @@ async function resolveEngine(options) {
906
1087
  selectedFormat = fmt;
907
1088
  selectedBackend = runtime === "onnx" ? backend || "cpu" : runtime;
908
1089
  }
909
- let modelPath = modelFilePath(modelsDir, modelEntry, selectedFormat);
910
- if (!modelExists(modelPath)) {
911
- if (downloadModel) {
912
- const formatEntry = modelEntry.formats[selectedFormat];
913
- modelPath = await downloadModel(formatEntry.url, modelsDir);
914
- } else {
1090
+ let modelPath;
1091
+ if (models) {
1092
+ modelPath = await models.ensure(modelEntry.id, selectedFormat);
1093
+ } else {
1094
+ modelPath = modelFilePath(modelsDir, modelEntry, selectedFormat);
1095
+ if (!modelExists(modelPath)) {
915
1096
  throw new Error(
916
- `resolveEngine: model file not found at ${modelPath} and no downloadModel function provided`
1097
+ `resolveEngine: model file not found at ${modelPath} and no model service provided`
917
1098
  );
918
1099
  }
919
1100
  }
920
- if (selectedFormat === "onnx" || selectedFormat === "coreml") {
1101
+ if (selectedFormat === "onnx") {
921
1102
  const engine = new NodeInferenceEngine(modelPath, selectedBackend);
922
1103
  await engine.initialize();
923
1104
  return { engine, format: selectedFormat, modelPath };
@@ -931,7 +1112,18 @@ async function resolveEngine(options) {
931
1112
  const effectiveRuntime = runtime === "auto" ? selectedBackend : runtime;
932
1113
  const scriptName = PYTHON_SCRIPT_MAP[effectiveRuntime];
933
1114
  if (scriptName && pythonPath) {
934
- const scriptPath = path2.join(__dirname, "../../python", scriptName);
1115
+ const candidates = [
1116
+ path2.join(__dirname, "../../python", scriptName),
1117
+ path2.join(__dirname, "../python", scriptName),
1118
+ path2.join(__dirname, "../../../python", scriptName)
1119
+ ];
1120
+ const scriptPath = candidates.find((p) => fs.existsSync(p));
1121
+ if (!scriptPath) {
1122
+ throw new Error(
1123
+ `resolveEngine: Python script "${scriptName}" not found. Searched:
1124
+ ${candidates.join("\n")}`
1125
+ );
1126
+ }
935
1127
  const inputSize = Math.max(modelEntry.inputSize.width, modelEntry.inputSize.height);
936
1128
  const engine = new PythonInferenceEngine(pythonPath, scriptPath, effectiveRuntime, modelPath, [
937
1129
  `--input-size=${inputSize}`,
@@ -984,6 +1176,50 @@ function applyClassMap(detections, classMap) {
984
1176
  class: classMap.mapping[d.class]
985
1177
  }));
986
1178
  }
1179
+ var RAM_ESTIMATES = {
1180
+ "yolov8n": 80,
1181
+ "yolov8s": 150,
1182
+ "yolov8s-relu": 150,
1183
+ "yolov8m": 300,
1184
+ "yolov8l": 500,
1185
+ "yolov8x": 800,
1186
+ "yolov9t": 60,
1187
+ "yolov9s": 120,
1188
+ "yolov9c": 300,
1189
+ "yolo11n": 70,
1190
+ "yolo11s": 130,
1191
+ "yolo11m": 280,
1192
+ "yolo11l": 450,
1193
+ "yolo11x": 750,
1194
+ "yolo11n-seg": 84,
1195
+ "yolo11s-seg": 156,
1196
+ "yolo11m-seg": 336,
1197
+ "yolov8n-seg": 96,
1198
+ "yolov8s-seg": 180,
1199
+ "yolov8m-seg": 360
1200
+ };
1201
+ var ACCURACY_SCORES = {
1202
+ "yolov8n": 55,
1203
+ "yolov8s": 70,
1204
+ "yolov8s-relu": 68,
1205
+ "yolov8m": 82,
1206
+ "yolov8l": 88,
1207
+ "yolov8x": 92,
1208
+ "yolov9t": 58,
1209
+ "yolov9s": 73,
1210
+ "yolov9c": 86,
1211
+ "yolo11n": 62,
1212
+ "yolo11s": 78,
1213
+ "yolo11m": 88,
1214
+ "yolo11l": 93,
1215
+ "yolo11x": 97,
1216
+ "yolo11n-seg": 62,
1217
+ "yolo11s-seg": 78,
1218
+ "yolo11m-seg": 88,
1219
+ "yolov8n-seg": 55,
1220
+ "yolov8s-seg": 70,
1221
+ "yolov8m-seg": 82
1222
+ };
987
1223
  var ObjectDetectionAddon = class {
988
1224
  id = "object-detection";
989
1225
  slot = "detector";
@@ -995,31 +1231,43 @@ var ObjectDetectionAddon = class {
995
1231
  name: "Object Detection",
996
1232
  version: "0.1.0",
997
1233
  description: "YOLO-based object detection \u2014 detects persons, vehicles, and animals",
998
- packageName: "@camstack/addon-vision",
999
1234
  slot: "detector",
1000
1235
  inputClasses: void 0,
1001
1236
  outputClasses: ["person", "vehicle", "animal"],
1002
1237
  supportsCustomModels: true,
1003
1238
  mayRequirePython: false,
1004
1239
  defaultConfig: {
1005
- modelId: "yolov8n",
1006
- runtime: "auto",
1240
+ modelId: "yolo11n",
1241
+ runtime: "node",
1007
1242
  backend: "cpu",
1008
1243
  confidence: 0.5,
1009
1244
  iouThreshold: 0.45,
1010
1245
  classMapMode: "macro"
1011
1246
  }
1012
1247
  };
1013
- engine;
1248
+ engine = null;
1014
1249
  modelEntry;
1015
1250
  confidence = 0.5;
1016
1251
  iouThreshold = 0.45;
1017
1252
  classMapMode = "macro";
1253
+ resolvedConfig = null;
1254
+ ctx = null;
1255
+ getModelRequirements() {
1256
+ return ALL_DETECTION_MODELS.map((m) => ({
1257
+ modelId: m.id,
1258
+ name: m.name,
1259
+ minRAM_MB: RAM_ESTIMATES[m.id] ?? 100,
1260
+ accuracyScore: ACCURACY_SCORES[m.id] ?? 60,
1261
+ formats: Object.keys(m.formats)
1262
+ }));
1263
+ }
1264
+ configure(config) {
1265
+ this.resolvedConfig = config;
1266
+ }
1018
1267
  async initialize(ctx) {
1268
+ this.ctx = ctx;
1019
1269
  const cfg = ctx.addonConfig;
1020
- const modelId = cfg["modelId"] ?? "yolov8n";
1021
- const runtime = cfg["runtime"] ?? "auto";
1022
- const backend = cfg["backend"] ?? "cpu";
1270
+ const modelId = cfg["modelId"] ?? this.resolvedConfig?.modelId ?? "yolo11n";
1023
1271
  this.confidence = cfg["confidence"] ?? 0.5;
1024
1272
  this.iouThreshold = cfg["iouThreshold"] ?? 0.45;
1025
1273
  this.classMapMode = cfg["classMapMode"] ?? "macro";
@@ -1028,16 +1276,30 @@ var ObjectDetectionAddon = class {
1028
1276
  throw new Error(`ObjectDetectionAddon: unknown modelId "${modelId}"`);
1029
1277
  }
1030
1278
  this.modelEntry = entry;
1031
- const resolved = await resolveEngine({
1032
- runtime,
1033
- backend,
1034
- modelEntry: entry,
1035
- modelsDir: ctx.locationPaths.models
1036
- });
1037
- this.engine = resolved.engine;
1038
1279
  }
1039
1280
  async detect(frame) {
1281
+ if (!this.engine) await this.ensureEngine();
1040
1282
  const start = Date.now();
1283
+ if ("runJpeg" in this.engine && typeof this.engine.runJpeg === "function") {
1284
+ const result = await this.engine.runJpeg(frame.data);
1285
+ const rawDets = result.detections ?? [];
1286
+ const detections2 = rawDets.map((d) => ({
1287
+ class: this.classMapMode === "all" ? d.className : import_types3.COCO_TO_MACRO.mapping[d.className] ?? d.className,
1288
+ originalClass: d.className,
1289
+ score: d.score,
1290
+ bbox: {
1291
+ x: d.bbox[0] * frame.width,
1292
+ y: d.bbox[1] * frame.height,
1293
+ w: (d.bbox[2] - d.bbox[0]) * frame.width,
1294
+ h: (d.bbox[3] - d.bbox[1]) * frame.height
1295
+ }
1296
+ })).filter((d) => this.classMapMode === "all" || import_types3.COCO_TO_MACRO.mapping[d.originalClass] !== void 0);
1297
+ return {
1298
+ detections: detections2,
1299
+ inferenceMs: result.inferenceMs ?? Date.now() - start,
1300
+ modelId: this.modelEntry.id
1301
+ };
1302
+ }
1041
1303
  const { width: inputW, height: inputH } = this.modelEntry.inputSize;
1042
1304
  const targetSize = Math.max(inputW, inputH);
1043
1305
  const lb = await letterbox(frame.data, targetSize);
@@ -1092,6 +1354,40 @@ var ObjectDetectionAddon = class {
1092
1354
  modelId: this.modelEntry.id
1093
1355
  };
1094
1356
  }
1357
+ async ensureEngine() {
1358
+ const config = this.resolvedConfig;
1359
+ const modelId = config?.modelId ?? this.modelEntry.id;
1360
+ const runtime = config?.runtime === "python" ? "coreml" : config?.runtime === "node" ? "onnx" : "auto";
1361
+ const backend = config?.backend ?? "cpu";
1362
+ const format = config?.format ?? "onnx";
1363
+ const entry = ALL_DETECTION_MODELS.find((m) => m.id === modelId) ?? this.modelEntry;
1364
+ this.modelEntry = entry;
1365
+ const modelsDir = this.ctx.models?.getModelsDir() ?? this.ctx.locationPaths.models;
1366
+ if (this.ctx.models) {
1367
+ await this.ctx.models.ensure(modelId, format);
1368
+ }
1369
+ let pythonPath;
1370
+ if (config?.runtime === "python") {
1371
+ for (const cmd of ["python3", "python"]) {
1372
+ try {
1373
+ const { execSync } = await import("child_process");
1374
+ execSync(`${cmd} --version`, { timeout: 3e3, stdio: "ignore" });
1375
+ pythonPath = cmd;
1376
+ break;
1377
+ } catch {
1378
+ }
1379
+ }
1380
+ }
1381
+ const resolved = await resolveEngine({
1382
+ runtime,
1383
+ backend,
1384
+ modelEntry: entry,
1385
+ modelsDir,
1386
+ pythonPath,
1387
+ models: this.ctx.models
1388
+ });
1389
+ this.engine = resolved.engine;
1390
+ }
1095
1391
  async shutdown() {
1096
1392
  await this.engine?.dispose();
1097
1393
  }
@@ -1101,7 +1397,7 @@ var ObjectDetectionAddon = class {
1101
1397
  {
1102
1398
  id: "model",
1103
1399
  title: "Model",
1104
- columns: 2,
1400
+ columns: 1,
1105
1401
  fields: [
1106
1402
  {
1107
1403
  key: "modelId",
@@ -1126,7 +1422,7 @@ var ObjectDetectionAddon = class {
1126
1422
  label: "Runtime",
1127
1423
  type: "select",
1128
1424
  options: [
1129
- { value: "auto", label: "Auto (recommended)" },
1425
+ { value: "auto", label: "Auto" },
1130
1426
  { value: "onnx", label: "ONNX Runtime" },
1131
1427
  { value: "coreml", label: "CoreML (Apple)" },
1132
1428
  { value: "openvino", label: "OpenVINO (Intel)" }
@@ -1136,8 +1432,9 @@ var ObjectDetectionAddon = class {
1136
1432
  key: "backend",
1137
1433
  label: "Backend",
1138
1434
  type: "select",
1139
- dependsOn: { runtime: "onnx" },
1435
+ showWhen: { field: "runtime", equals: "onnx" },
1140
1436
  options: [
1437
+ { value: "auto", label: "Auto" },
1141
1438
  { value: "cpu", label: "CPU" },
1142
1439
  { value: "coreml", label: "CoreML" },
1143
1440
  { value: "cuda", label: "CUDA (NVIDIA)" },