@camstack/addon-vision 0.1.0 → 0.1.1

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 +514 -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 +87 -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 +515 -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 +524 -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 +539 -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 +488 -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 +370 -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 +532 -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 +177 -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 +1049 -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 +689 -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-6DJZZR64.mjs} +24 -12
  67. package/dist/chunk-6DJZZR64.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-B3R66MPF.mjs → chunk-DNQNGDR4.mjs} +58 -21
  76. package/dist/chunk-DNQNGDR4.mjs.map +1 -0
  77. package/dist/{chunk-ISOIDU4U.mjs → chunk-DUN6XU3N.mjs} +23 -5
  78. package/dist/chunk-DUN6XU3N.mjs.map +1 -0
  79. package/dist/{chunk-MEVASN3P.mjs → chunk-EPNWLSCG.mjs} +104 -22
  80. package/dist/chunk-EPNWLSCG.mjs.map +1 -0
  81. package/dist/{chunk-AYBFB7ID.mjs → chunk-G32RCIUI.mjs} +200 -318
  82. package/dist/chunk-G32RCIUI.mjs.map +1 -0
  83. package/dist/{chunk-3MQFUDRU.mjs → chunk-GR65KM6X.mjs} +76 -47
  84. package/dist/chunk-GR65KM6X.mjs.map +1 -0
  85. package/dist/{chunk-5AIQSN32.mjs → chunk-H7LMBTS5.mjs} +66 -17
  86. package/dist/chunk-H7LMBTS5.mjs.map +1 -0
  87. package/dist/{chunk-J4WRYHHY.mjs → chunk-IK4XIQPC.mjs} +66 -36
  88. package/dist/chunk-IK4XIQPC.mjs.map +1 -0
  89. package/dist/{chunk-5JJZGKL7.mjs → chunk-J6VNIIYX.mjs} +102 -19
  90. package/dist/chunk-J6VNIIYX.mjs.map +1 -0
  91. package/dist/{chunk-Q3SQOYG6.mjs → chunk-ML2JX43J.mjs} +67 -37
  92. package/dist/chunk-ML2JX43J.mjs.map +1 -0
  93. package/dist/{chunk-PDSHDDPV.mjs → chunk-WUMV524J.mjs} +159 -35
  94. package/dist/chunk-WUMV524J.mjs.map +1 -0
  95. package/dist/chunk-XZ6ZMXXU.mjs +39 -0
  96. package/dist/chunk-XZ6ZMXXU.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 +1344 -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 +95 -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
  }
@@ -724,6 +905,7 @@ var NodeInferenceEngine = class {
724
905
 
725
906
  // src/shared/python-engine.ts
726
907
  var import_node_child_process = require("child_process");
908
+ var import_core = require("@camstack/core");
727
909
  var PythonInferenceEngine = class {
728
910
  constructor(pythonPath, scriptPath, runtime, modelPath, extraArgs = []) {
729
911
  this.pythonPath = pythonPath;
@@ -844,7 +1026,7 @@ var PythonInferenceEngine = class {
844
1026
  var AUTO_BACKEND_PRIORITY = ["coreml", "cuda", "tensorrt", "cpu"];
845
1027
  var BACKEND_TO_FORMAT = {
846
1028
  cpu: "onnx",
847
- coreml: "coreml",
1029
+ coreml: "onnx",
848
1030
  cuda: "onnx",
849
1031
  tensorrt: "onnx"
850
1032
  };
@@ -872,7 +1054,7 @@ function modelExists(filePath) {
872
1054
  }
873
1055
  }
874
1056
  async function resolveEngine(options) {
875
- const { runtime, backend, modelEntry, modelsDir, downloadModel } = options;
1057
+ const { runtime, backend, modelEntry, modelsDir, models } = options;
876
1058
  let selectedFormat;
877
1059
  let selectedBackend;
878
1060
  if (runtime === "auto") {
@@ -906,18 +1088,18 @@ async function resolveEngine(options) {
906
1088
  selectedFormat = fmt;
907
1089
  selectedBackend = runtime === "onnx" ? backend || "cpu" : runtime;
908
1090
  }
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 {
1091
+ let modelPath;
1092
+ if (models) {
1093
+ modelPath = await models.ensure(modelEntry.id, selectedFormat);
1094
+ } else {
1095
+ modelPath = modelFilePath(modelsDir, modelEntry, selectedFormat);
1096
+ if (!modelExists(modelPath)) {
915
1097
  throw new Error(
916
- `resolveEngine: model file not found at ${modelPath} and no downloadModel function provided`
1098
+ `resolveEngine: model file not found at ${modelPath} and no model service provided`
917
1099
  );
918
1100
  }
919
1101
  }
920
- if (selectedFormat === "onnx" || selectedFormat === "coreml") {
1102
+ if (selectedFormat === "onnx") {
921
1103
  const engine = new NodeInferenceEngine(modelPath, selectedBackend);
922
1104
  await engine.initialize();
923
1105
  return { engine, format: selectedFormat, modelPath };
@@ -931,7 +1113,18 @@ async function resolveEngine(options) {
931
1113
  const effectiveRuntime = runtime === "auto" ? selectedBackend : runtime;
932
1114
  const scriptName = PYTHON_SCRIPT_MAP[effectiveRuntime];
933
1115
  if (scriptName && pythonPath) {
934
- const scriptPath = path2.join(__dirname, "../../python", scriptName);
1116
+ const candidates = [
1117
+ path2.join(__dirname, "../../python", scriptName),
1118
+ path2.join(__dirname, "../python", scriptName),
1119
+ path2.join(__dirname, "../../../python", scriptName)
1120
+ ];
1121
+ const scriptPath = candidates.find((p) => fs.existsSync(p));
1122
+ if (!scriptPath) {
1123
+ throw new Error(
1124
+ `resolveEngine: Python script "${scriptName}" not found. Searched:
1125
+ ${candidates.join("\n")}`
1126
+ );
1127
+ }
935
1128
  const inputSize = Math.max(modelEntry.inputSize.width, modelEntry.inputSize.height);
936
1129
  const engine = new PythonInferenceEngine(pythonPath, scriptPath, effectiveRuntime, modelPath, [
937
1130
  `--input-size=${inputSize}`,
@@ -984,6 +1177,50 @@ function applyClassMap(detections, classMap) {
984
1177
  class: classMap.mapping[d.class]
985
1178
  }));
986
1179
  }
1180
+ var RAM_ESTIMATES = {
1181
+ "yolov8n": 80,
1182
+ "yolov8s": 150,
1183
+ "yolov8s-relu": 150,
1184
+ "yolov8m": 300,
1185
+ "yolov8l": 500,
1186
+ "yolov8x": 800,
1187
+ "yolov9t": 60,
1188
+ "yolov9s": 120,
1189
+ "yolov9c": 300,
1190
+ "yolo11n": 70,
1191
+ "yolo11s": 130,
1192
+ "yolo11m": 280,
1193
+ "yolo11l": 450,
1194
+ "yolo11x": 750,
1195
+ "yolo11n-seg": 84,
1196
+ "yolo11s-seg": 156,
1197
+ "yolo11m-seg": 336,
1198
+ "yolov8n-seg": 96,
1199
+ "yolov8s-seg": 180,
1200
+ "yolov8m-seg": 360
1201
+ };
1202
+ var ACCURACY_SCORES = {
1203
+ "yolov8n": 55,
1204
+ "yolov8s": 70,
1205
+ "yolov8s-relu": 68,
1206
+ "yolov8m": 82,
1207
+ "yolov8l": 88,
1208
+ "yolov8x": 92,
1209
+ "yolov9t": 58,
1210
+ "yolov9s": 73,
1211
+ "yolov9c": 86,
1212
+ "yolo11n": 62,
1213
+ "yolo11s": 78,
1214
+ "yolo11m": 88,
1215
+ "yolo11l": 93,
1216
+ "yolo11x": 97,
1217
+ "yolo11n-seg": 62,
1218
+ "yolo11s-seg": 78,
1219
+ "yolo11m-seg": 88,
1220
+ "yolov8n-seg": 55,
1221
+ "yolov8s-seg": 70,
1222
+ "yolov8m-seg": 82
1223
+ };
987
1224
  var ObjectDetectionAddon = class {
988
1225
  id = "object-detection";
989
1226
  slot = "detector";
@@ -995,31 +1232,43 @@ var ObjectDetectionAddon = class {
995
1232
  name: "Object Detection",
996
1233
  version: "0.1.0",
997
1234
  description: "YOLO-based object detection \u2014 detects persons, vehicles, and animals",
998
- packageName: "@camstack/addon-vision",
999
1235
  slot: "detector",
1000
1236
  inputClasses: void 0,
1001
1237
  outputClasses: ["person", "vehicle", "animal"],
1002
1238
  supportsCustomModels: true,
1003
1239
  mayRequirePython: false,
1004
1240
  defaultConfig: {
1005
- modelId: "yolov8n",
1006
- runtime: "auto",
1241
+ modelId: "yolo11n",
1242
+ runtime: "node",
1007
1243
  backend: "cpu",
1008
1244
  confidence: 0.5,
1009
1245
  iouThreshold: 0.45,
1010
1246
  classMapMode: "macro"
1011
1247
  }
1012
1248
  };
1013
- engine;
1249
+ engine = null;
1014
1250
  modelEntry;
1015
1251
  confidence = 0.5;
1016
1252
  iouThreshold = 0.45;
1017
1253
  classMapMode = "macro";
1254
+ resolvedConfig = null;
1255
+ ctx = null;
1256
+ getModelRequirements() {
1257
+ return ALL_DETECTION_MODELS.map((m) => ({
1258
+ modelId: m.id,
1259
+ name: m.name,
1260
+ minRAM_MB: RAM_ESTIMATES[m.id] ?? 100,
1261
+ accuracyScore: ACCURACY_SCORES[m.id] ?? 60,
1262
+ formats: Object.keys(m.formats)
1263
+ }));
1264
+ }
1265
+ configure(config) {
1266
+ this.resolvedConfig = config;
1267
+ }
1018
1268
  async initialize(ctx) {
1269
+ this.ctx = ctx;
1019
1270
  const cfg = ctx.addonConfig;
1020
- const modelId = cfg["modelId"] ?? "yolov8n";
1021
- const runtime = cfg["runtime"] ?? "auto";
1022
- const backend = cfg["backend"] ?? "cpu";
1271
+ const modelId = cfg["modelId"] ?? this.resolvedConfig?.modelId ?? "yolo11n";
1023
1272
  this.confidence = cfg["confidence"] ?? 0.5;
1024
1273
  this.iouThreshold = cfg["iouThreshold"] ?? 0.45;
1025
1274
  this.classMapMode = cfg["classMapMode"] ?? "macro";
@@ -1028,16 +1277,30 @@ var ObjectDetectionAddon = class {
1028
1277
  throw new Error(`ObjectDetectionAddon: unknown modelId "${modelId}"`);
1029
1278
  }
1030
1279
  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
1280
  }
1039
1281
  async detect(frame) {
1282
+ if (!this.engine) await this.ensureEngine();
1040
1283
  const start = Date.now();
1284
+ if ("runJpeg" in this.engine && typeof this.engine.runJpeg === "function") {
1285
+ const result = await this.engine.runJpeg(frame.data);
1286
+ const rawDets = result.detections ?? [];
1287
+ const detections2 = rawDets.map((d) => ({
1288
+ class: this.classMapMode === "all" ? d.className : import_types3.COCO_TO_MACRO.mapping[d.className] ?? d.className,
1289
+ originalClass: d.className,
1290
+ score: d.score,
1291
+ bbox: {
1292
+ x: d.bbox[0] * frame.width,
1293
+ y: d.bbox[1] * frame.height,
1294
+ w: (d.bbox[2] - d.bbox[0]) * frame.width,
1295
+ h: (d.bbox[3] - d.bbox[1]) * frame.height
1296
+ }
1297
+ })).filter((d) => this.classMapMode === "all" || import_types3.COCO_TO_MACRO.mapping[d.originalClass] !== void 0);
1298
+ return {
1299
+ detections: detections2,
1300
+ inferenceMs: result.inferenceMs ?? Date.now() - start,
1301
+ modelId: this.modelEntry.id
1302
+ };
1303
+ }
1041
1304
  const { width: inputW, height: inputH } = this.modelEntry.inputSize;
1042
1305
  const targetSize = Math.max(inputW, inputH);
1043
1306
  const lb = await letterbox(frame.data, targetSize);
@@ -1092,6 +1355,40 @@ var ObjectDetectionAddon = class {
1092
1355
  modelId: this.modelEntry.id
1093
1356
  };
1094
1357
  }
1358
+ async ensureEngine() {
1359
+ const config = this.resolvedConfig;
1360
+ const modelId = config?.modelId ?? this.modelEntry.id;
1361
+ const runtime = config?.runtime === "python" ? "coreml" : config?.runtime === "node" ? "onnx" : "auto";
1362
+ const backend = config?.backend ?? "cpu";
1363
+ const format = config?.format ?? "onnx";
1364
+ const entry = ALL_DETECTION_MODELS.find((m) => m.id === modelId) ?? this.modelEntry;
1365
+ this.modelEntry = entry;
1366
+ const modelsDir = this.ctx.models?.getModelsDir() ?? this.ctx.locationPaths.models;
1367
+ if (this.ctx.models) {
1368
+ await this.ctx.models.ensure(modelId, format);
1369
+ }
1370
+ let pythonPath;
1371
+ if (config?.runtime === "python") {
1372
+ for (const cmd of ["python3", "python"]) {
1373
+ try {
1374
+ const { execSync } = await import("child_process");
1375
+ execSync(`${cmd} --version`, { timeout: 3e3, stdio: "ignore" });
1376
+ pythonPath = cmd;
1377
+ break;
1378
+ } catch {
1379
+ }
1380
+ }
1381
+ }
1382
+ const resolved = await resolveEngine({
1383
+ runtime,
1384
+ backend,
1385
+ modelEntry: entry,
1386
+ modelsDir,
1387
+ pythonPath,
1388
+ models: this.ctx.models
1389
+ });
1390
+ this.engine = resolved.engine;
1391
+ }
1095
1392
  async shutdown() {
1096
1393
  await this.engine?.dispose();
1097
1394
  }
@@ -1101,7 +1398,7 @@ var ObjectDetectionAddon = class {
1101
1398
  {
1102
1399
  id: "model",
1103
1400
  title: "Model",
1104
- columns: 2,
1401
+ columns: 1,
1105
1402
  fields: [
1106
1403
  {
1107
1404
  key: "modelId",
@@ -1126,7 +1423,7 @@ var ObjectDetectionAddon = class {
1126
1423
  label: "Runtime",
1127
1424
  type: "select",
1128
1425
  options: [
1129
- { value: "auto", label: "Auto (recommended)" },
1426
+ { value: "auto", label: "Auto" },
1130
1427
  { value: "onnx", label: "ONNX Runtime" },
1131
1428
  { value: "coreml", label: "CoreML (Apple)" },
1132
1429
  { value: "openvino", label: "OpenVINO (Intel)" }
@@ -1136,8 +1433,9 @@ var ObjectDetectionAddon = class {
1136
1433
  key: "backend",
1137
1434
  label: "Backend",
1138
1435
  type: "select",
1139
- dependsOn: { runtime: "onnx" },
1436
+ showWhen: { field: "runtime", equals: "onnx" },
1140
1437
  options: [
1438
+ { value: "auto", label: "Auto" },
1141
1439
  { value: "cpu", label: "CPU" },
1142
1440
  { value: "coreml", label: "CoreML" },
1143
1441
  { value: "cuda", label: "CUDA (NVIDIA)" },