@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
@@ -35,8 +35,417 @@ __export(plate_detection_exports, {
35
35
  module.exports = __toCommonJS(plate_detection_exports);
36
36
 
37
37
  // src/catalogs/plate-detection-models.ts
38
+ var import_types2 = require("@camstack/types");
39
+
40
+ // src/catalogs/object-detection-models.ts
38
41
  var import_types = require("@camstack/types");
39
42
  var HF_REPO = "camstack/camstack-models";
43
+ var MLPACKAGE_FILES = [
44
+ "Manifest.json",
45
+ "Data/com.apple.CoreML/model.mlmodel",
46
+ "Data/com.apple.CoreML/weights/weight.bin"
47
+ ];
48
+ var OBJECT_DETECTION_MODELS = [
49
+ // ── YOLOv8 ──────────────────────────────────────────────────────
50
+ {
51
+ id: "yolov8n",
52
+ name: "YOLOv8 Nano",
53
+ description: "YOLOv8 Nano \u2014 fastest, smallest object detection model",
54
+ inputSize: { width: 640, height: 640 },
55
+ labels: import_types.COCO_80_LABELS,
56
+ formats: {
57
+ onnx: {
58
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8n.onnx"),
59
+ sizeMB: 12
60
+ },
61
+ coreml: {
62
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8n.mlpackage"),
63
+ sizeMB: 6,
64
+ isDirectory: true,
65
+ files: MLPACKAGE_FILES,
66
+ runtimes: ["python"]
67
+ },
68
+ openvino: {
69
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8n.xml"),
70
+ sizeMB: 7,
71
+ runtimes: ["python"]
72
+ },
73
+ tflite: {
74
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8n_float32.tflite"),
75
+ sizeMB: 12,
76
+ runtimes: ["python"]
77
+ }
78
+ }
79
+ },
80
+ {
81
+ id: "yolov8s",
82
+ name: "YOLOv8 Small",
83
+ description: "YOLOv8 Small \u2014 balanced speed and accuracy",
84
+ inputSize: { width: 640, height: 640 },
85
+ labels: import_types.COCO_80_LABELS,
86
+ formats: {
87
+ onnx: {
88
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8s.onnx"),
89
+ sizeMB: 43
90
+ },
91
+ coreml: {
92
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8s.mlpackage"),
93
+ sizeMB: 21,
94
+ isDirectory: true,
95
+ files: MLPACKAGE_FILES,
96
+ runtimes: ["python"]
97
+ },
98
+ openvino: {
99
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8s.xml"),
100
+ sizeMB: 22,
101
+ runtimes: ["python"]
102
+ },
103
+ tflite: {
104
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8s_float32.tflite"),
105
+ sizeMB: 43,
106
+ runtimes: ["python"]
107
+ }
108
+ }
109
+ },
110
+ {
111
+ id: "yolov8s-relu",
112
+ name: "YOLOv8 Small ReLU",
113
+ description: "YOLOv8 Small with ReLU activation \u2014 better hardware compatibility",
114
+ inputSize: { width: 640, height: 640 },
115
+ labels: import_types.COCO_80_LABELS,
116
+ formats: {
117
+ onnx: {
118
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8s-relu.onnx"),
119
+ sizeMB: 43
120
+ }
121
+ }
122
+ },
123
+ {
124
+ id: "yolov8m",
125
+ name: "YOLOv8 Medium",
126
+ description: "YOLOv8 Medium \u2014 higher accuracy, moderate size",
127
+ inputSize: { width: 640, height: 640 },
128
+ labels: import_types.COCO_80_LABELS,
129
+ formats: {
130
+ onnx: {
131
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8m.onnx"),
132
+ sizeMB: 99
133
+ },
134
+ coreml: {
135
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8m.mlpackage"),
136
+ sizeMB: 49,
137
+ isDirectory: true,
138
+ files: MLPACKAGE_FILES,
139
+ runtimes: ["python"]
140
+ },
141
+ openvino: {
142
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8m.xml"),
143
+ sizeMB: 50,
144
+ runtimes: ["python"]
145
+ },
146
+ tflite: {
147
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8m_float32.tflite"),
148
+ sizeMB: 99,
149
+ runtimes: ["python"]
150
+ }
151
+ }
152
+ },
153
+ {
154
+ id: "yolov8l",
155
+ name: "YOLOv8 Large",
156
+ description: "YOLOv8 Large \u2014 high-accuracy large model",
157
+ inputSize: { width: 640, height: 640 },
158
+ labels: import_types.COCO_80_LABELS,
159
+ formats: {
160
+ onnx: {
161
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8l.onnx"),
162
+ sizeMB: 167
163
+ },
164
+ coreml: {
165
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8l.mlpackage"),
166
+ sizeMB: 83,
167
+ isDirectory: true,
168
+ files: MLPACKAGE_FILES,
169
+ runtimes: ["python"]
170
+ },
171
+ openvino: {
172
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8l.xml"),
173
+ sizeMB: 84,
174
+ runtimes: ["python"]
175
+ }
176
+ }
177
+ },
178
+ {
179
+ id: "yolov8x",
180
+ name: "YOLOv8 Extra-Large",
181
+ description: "YOLOv8 Extra-Large \u2014 maximum accuracy",
182
+ inputSize: { width: 640, height: 640 },
183
+ labels: import_types.COCO_80_LABELS,
184
+ formats: {
185
+ onnx: {
186
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8x.onnx"),
187
+ sizeMB: 260
188
+ },
189
+ coreml: {
190
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8x.mlpackage"),
191
+ sizeMB: 130,
192
+ isDirectory: true,
193
+ files: MLPACKAGE_FILES,
194
+ runtimes: ["python"]
195
+ },
196
+ openvino: {
197
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8x.xml"),
198
+ sizeMB: 131,
199
+ runtimes: ["python"]
200
+ }
201
+ }
202
+ },
203
+ // ── YOLOv9 ──────────────────────────────────────────────────────
204
+ {
205
+ id: "yolov9t",
206
+ name: "YOLOv9 Tiny",
207
+ description: "YOLOv9 Tiny \u2014 ultra-lightweight next-gen detector",
208
+ inputSize: { width: 640, height: 640 },
209
+ labels: import_types.COCO_80_LABELS,
210
+ formats: {
211
+ onnx: {
212
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/onnx/camstack-yolov9t.onnx"),
213
+ sizeMB: 8
214
+ },
215
+ coreml: {
216
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage"),
217
+ sizeMB: 4,
218
+ isDirectory: true,
219
+ files: MLPACKAGE_FILES,
220
+ runtimes: ["python"]
221
+ },
222
+ openvino: {
223
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9t.xml"),
224
+ sizeMB: 6,
225
+ runtimes: ["python"]
226
+ },
227
+ tflite: {
228
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9t_float32.tflite"),
229
+ sizeMB: 8,
230
+ runtimes: ["python"]
231
+ }
232
+ }
233
+ },
234
+ {
235
+ id: "yolov9s",
236
+ name: "YOLOv9 Small",
237
+ description: "YOLOv9 Small \u2014 improved efficiency over YOLOv8s",
238
+ inputSize: { width: 640, height: 640 },
239
+ labels: import_types.COCO_80_LABELS,
240
+ formats: {
241
+ onnx: {
242
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/onnx/camstack-yolov9s.onnx"),
243
+ sizeMB: 28
244
+ },
245
+ coreml: {
246
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage"),
247
+ sizeMB: 14,
248
+ isDirectory: true,
249
+ files: MLPACKAGE_FILES,
250
+ runtimes: ["python"]
251
+ },
252
+ openvino: {
253
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9s.xml"),
254
+ sizeMB: 16,
255
+ runtimes: ["python"]
256
+ },
257
+ tflite: {
258
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9s_float32.tflite"),
259
+ sizeMB: 28,
260
+ runtimes: ["python"]
261
+ }
262
+ }
263
+ },
264
+ {
265
+ id: "yolov9c",
266
+ name: "YOLOv9 C",
267
+ description: "YOLOv9 C \u2014 high-accuracy compact model",
268
+ inputSize: { width: 640, height: 640 },
269
+ labels: import_types.COCO_80_LABELS,
270
+ formats: {
271
+ onnx: {
272
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/onnx/camstack-yolov9c.onnx"),
273
+ sizeMB: 97
274
+ },
275
+ coreml: {
276
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage"),
277
+ sizeMB: 48,
278
+ isDirectory: true,
279
+ files: MLPACKAGE_FILES,
280
+ runtimes: ["python"]
281
+ },
282
+ openvino: {
283
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9c.xml"),
284
+ sizeMB: 49,
285
+ runtimes: ["python"]
286
+ },
287
+ tflite: {
288
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9c_float32.tflite"),
289
+ sizeMB: 97,
290
+ runtimes: ["python"]
291
+ }
292
+ }
293
+ },
294
+ // ── YOLO11 ────────────────────────────────────────────────────
295
+ {
296
+ id: "yolo11n",
297
+ name: "YOLO11 Nano",
298
+ description: "YOLO11 Nano \u2014 fastest, smallest YOLO11 detection model (mAP 39.5)",
299
+ inputSize: { width: 640, height: 640 },
300
+ labels: import_types.COCO_80_LABELS,
301
+ formats: {
302
+ onnx: {
303
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11n.onnx"),
304
+ sizeMB: 10
305
+ },
306
+ coreml: {
307
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11n.mlpackage"),
308
+ sizeMB: 5,
309
+ isDirectory: true,
310
+ files: MLPACKAGE_FILES,
311
+ runtimes: ["python"]
312
+ },
313
+ openvino: {
314
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11n.xml"),
315
+ sizeMB: 5,
316
+ runtimes: ["python"]
317
+ },
318
+ tflite: {
319
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11n_float32.tflite"),
320
+ sizeMB: 10,
321
+ runtimes: ["python"]
322
+ }
323
+ }
324
+ },
325
+ {
326
+ id: "yolo11s",
327
+ name: "YOLO11 Small",
328
+ description: "YOLO11 Small \u2014 balanced speed and accuracy (mAP 47.0)",
329
+ inputSize: { width: 640, height: 640 },
330
+ labels: import_types.COCO_80_LABELS,
331
+ formats: {
332
+ onnx: {
333
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11s.onnx"),
334
+ sizeMB: 36
335
+ },
336
+ coreml: {
337
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11s.mlpackage"),
338
+ sizeMB: 18,
339
+ isDirectory: true,
340
+ files: MLPACKAGE_FILES,
341
+ runtimes: ["python"]
342
+ },
343
+ openvino: {
344
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11s.xml"),
345
+ sizeMB: 18,
346
+ runtimes: ["python"]
347
+ },
348
+ tflite: {
349
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11s_float32.tflite"),
350
+ sizeMB: 36,
351
+ runtimes: ["python"]
352
+ }
353
+ }
354
+ },
355
+ {
356
+ id: "yolo11m",
357
+ name: "YOLO11 Medium",
358
+ description: "YOLO11 Medium \u2014 higher accuracy, moderate size (mAP 51.5)",
359
+ inputSize: { width: 640, height: 640 },
360
+ labels: import_types.COCO_80_LABELS,
361
+ formats: {
362
+ onnx: {
363
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11m.onnx"),
364
+ sizeMB: 77
365
+ },
366
+ coreml: {
367
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11m.mlpackage"),
368
+ sizeMB: 39,
369
+ isDirectory: true,
370
+ files: MLPACKAGE_FILES,
371
+ runtimes: ["python"]
372
+ },
373
+ openvino: {
374
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11m.xml"),
375
+ sizeMB: 39,
376
+ runtimes: ["python"]
377
+ },
378
+ tflite: {
379
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11m_float32.tflite"),
380
+ sizeMB: 77,
381
+ runtimes: ["python"]
382
+ }
383
+ }
384
+ },
385
+ {
386
+ id: "yolo11l",
387
+ name: "YOLO11 Large",
388
+ description: "YOLO11 Large \u2014 high-accuracy large model (mAP 53.4)",
389
+ inputSize: { width: 640, height: 640 },
390
+ labels: import_types.COCO_80_LABELS,
391
+ formats: {
392
+ onnx: {
393
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11l.onnx"),
394
+ sizeMB: 97
395
+ },
396
+ coreml: {
397
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11l.mlpackage"),
398
+ sizeMB: 49,
399
+ isDirectory: true,
400
+ files: MLPACKAGE_FILES,
401
+ runtimes: ["python"]
402
+ },
403
+ openvino: {
404
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11l.xml"),
405
+ sizeMB: 49,
406
+ runtimes: ["python"]
407
+ },
408
+ tflite: {
409
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11l_float32.tflite"),
410
+ sizeMB: 97,
411
+ runtimes: ["python"]
412
+ }
413
+ }
414
+ },
415
+ {
416
+ id: "yolo11x",
417
+ name: "YOLO11 Extra-Large",
418
+ description: "YOLO11 Extra-Large \u2014 maximum accuracy (mAP 54.7)",
419
+ inputSize: { width: 640, height: 640 },
420
+ labels: import_types.COCO_80_LABELS,
421
+ formats: {
422
+ onnx: {
423
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11x.onnx"),
424
+ sizeMB: 218
425
+ },
426
+ coreml: {
427
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11x.mlpackage"),
428
+ sizeMB: 109,
429
+ isDirectory: true,
430
+ files: MLPACKAGE_FILES,
431
+ runtimes: ["python"]
432
+ },
433
+ openvino: {
434
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11x.xml"),
435
+ sizeMB: 109,
436
+ runtimes: ["python"]
437
+ },
438
+ tflite: {
439
+ url: (0, import_types.hfModelUrl)(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11x_float32.tflite"),
440
+ sizeMB: 218,
441
+ runtimes: ["python"]
442
+ }
443
+ }
444
+ }
445
+ ];
446
+
447
+ // src/catalogs/plate-detection-models.ts
448
+ var HF_REPO2 = "camstack/camstack-models";
40
449
  var PLATE_LABELS = [
41
450
  { id: "plate", name: "License Plate" }
42
451
  ];
@@ -49,20 +458,25 @@ var PLATE_DETECTION_MODELS = [
49
458
  labels: PLATE_LABELS,
50
459
  formats: {
51
460
  onnx: {
52
- url: (0, import_types.hfModelUrl)(HF_REPO, "plateDetection/yolov8-plate/onnx/camstack-yolov8n-plate.onnx"),
461
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "plateDetection/yolov8-plate/onnx/camstack-yolov8n-plate.onnx"),
53
462
  sizeMB: 12
54
463
  },
55
464
  coreml: {
56
- url: (0, import_types.hfModelUrl)(HF_REPO, "plateDetection/yolov8-plate/coreml/camstack-yolov8n-plate.mlpackage"),
57
- sizeMB: 5.9
465
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "plateDetection/yolov8-plate/coreml/camstack-yolov8n-plate.mlpackage"),
466
+ sizeMB: 5.9,
467
+ isDirectory: true,
468
+ files: MLPACKAGE_FILES,
469
+ runtimes: ["python"]
58
470
  },
59
471
  openvino: {
60
- url: (0, import_types.hfModelUrl)(HF_REPO, "plateDetection/yolov8-plate/openvino/camstack-yolov8n-plate.xml"),
61
- sizeMB: 6.1
472
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "plateDetection/yolov8-plate/openvino/camstack-yolov8n-plate.xml"),
473
+ sizeMB: 6.1,
474
+ runtimes: ["python"]
62
475
  },
63
476
  tflite: {
64
- url: (0, import_types.hfModelUrl)(HF_REPO, "plateDetection/yolov8-plate/tflite/camstack-yolov8n-plate_float32.tflite"),
65
- sizeMB: 12
477
+ url: (0, import_types2.hfModelUrl)(HF_REPO2, "plateDetection/yolov8-plate/tflite/camstack-yolov8n-plate_float32.tflite"),
478
+ sizeMB: 12,
479
+ runtimes: ["python"]
66
480
  }
67
481
  }
68
482
  }
@@ -383,7 +797,7 @@ var PythonInferenceEngine = class {
383
797
  var AUTO_BACKEND_PRIORITY = ["coreml", "cuda", "tensorrt", "cpu"];
384
798
  var BACKEND_TO_FORMAT = {
385
799
  cpu: "onnx",
386
- coreml: "coreml",
800
+ coreml: "onnx",
387
801
  cuda: "onnx",
388
802
  tensorrt: "onnx"
389
803
  };
@@ -411,7 +825,7 @@ function modelExists(filePath) {
411
825
  }
412
826
  }
413
827
  async function resolveEngine(options) {
414
- const { runtime, backend, modelEntry, modelsDir, downloadModel } = options;
828
+ const { runtime, backend, modelEntry, modelsDir, models } = options;
415
829
  let selectedFormat;
416
830
  let selectedBackend;
417
831
  if (runtime === "auto") {
@@ -445,18 +859,18 @@ async function resolveEngine(options) {
445
859
  selectedFormat = fmt;
446
860
  selectedBackend = runtime === "onnx" ? backend || "cpu" : runtime;
447
861
  }
448
- let modelPath = modelFilePath(modelsDir, modelEntry, selectedFormat);
449
- if (!modelExists(modelPath)) {
450
- if (downloadModel) {
451
- const formatEntry = modelEntry.formats[selectedFormat];
452
- modelPath = await downloadModel(formatEntry.url, modelsDir);
453
- } else {
862
+ let modelPath;
863
+ if (models) {
864
+ modelPath = await models.ensure(modelEntry.id, selectedFormat);
865
+ } else {
866
+ modelPath = modelFilePath(modelsDir, modelEntry, selectedFormat);
867
+ if (!modelExists(modelPath)) {
454
868
  throw new Error(
455
- `resolveEngine: model file not found at ${modelPath} and no downloadModel function provided`
869
+ `resolveEngine: model file not found at ${modelPath} and no model service provided`
456
870
  );
457
871
  }
458
872
  }
459
- if (selectedFormat === "onnx" || selectedFormat === "coreml") {
873
+ if (selectedFormat === "onnx") {
460
874
  const engine = new NodeInferenceEngine(modelPath, selectedBackend);
461
875
  await engine.initialize();
462
876
  return { engine, format: selectedFormat, modelPath };
@@ -470,7 +884,18 @@ async function resolveEngine(options) {
470
884
  const effectiveRuntime = runtime === "auto" ? selectedBackend : runtime;
471
885
  const scriptName = PYTHON_SCRIPT_MAP[effectiveRuntime];
472
886
  if (scriptName && pythonPath) {
473
- const scriptPath = path2.join(__dirname, "../../python", scriptName);
887
+ const candidates = [
888
+ path2.join(__dirname, "../../python", scriptName),
889
+ path2.join(__dirname, "../python", scriptName),
890
+ path2.join(__dirname, "../../../python", scriptName)
891
+ ];
892
+ const scriptPath = candidates.find((p) => fs.existsSync(p));
893
+ if (!scriptPath) {
894
+ throw new Error(
895
+ `resolveEngine: Python script "${scriptName}" not found. Searched:
896
+ ${candidates.join("\n")}`
897
+ );
898
+ }
474
899
  const inputSize = Math.max(modelEntry.inputSize.width, modelEntry.inputSize.height);
475
900
  const engine = new PythonInferenceEngine(pythonPath, scriptPath, effectiveRuntime, modelPath, [
476
901
  `--input-size=${inputSize}`,
@@ -523,7 +948,6 @@ var PlateDetectionAddon = class {
523
948
  name: "License Plate Detection",
524
949
  version: "0.1.0",
525
950
  description: "YOLO-based license plate detector \u2014 crops plate regions from vehicle detections",
526
- packageName: "@camstack/addon-vision",
527
951
  slot: "cropper",
528
952
  inputClasses: ["vehicle"],
529
953
  outputClasses: ["plate"],
@@ -531,21 +955,34 @@ var PlateDetectionAddon = class {
531
955
  mayRequirePython: false,
532
956
  defaultConfig: {
533
957
  modelId: "yolov8n-plate",
534
- runtime: "auto",
958
+ runtime: "node",
535
959
  backend: "cpu",
536
960
  confidence: 0.5,
537
961
  iouThreshold: 0.45
538
962
  }
539
963
  };
540
- engine;
964
+ engine = null;
541
965
  modelEntry;
542
966
  confidence = 0.5;
543
967
  iouThreshold = 0.45;
968
+ resolvedConfig = null;
969
+ ctx = null;
970
+ getModelRequirements() {
971
+ return PLATE_DETECTION_MODELS.map((m) => ({
972
+ modelId: m.id,
973
+ name: m.name,
974
+ minRAM_MB: 80,
975
+ accuracyScore: 60,
976
+ formats: Object.keys(m.formats)
977
+ }));
978
+ }
979
+ configure(config) {
980
+ this.resolvedConfig = config;
981
+ }
544
982
  async initialize(ctx) {
983
+ this.ctx = ctx;
545
984
  const cfg = ctx.addonConfig;
546
- const modelId = cfg["modelId"] ?? "yolov8n-plate";
547
- const runtime = cfg["runtime"] ?? "auto";
548
- const backend = cfg["backend"] ?? "cpu";
985
+ const modelId = cfg["modelId"] ?? this.resolvedConfig?.modelId ?? "yolov8n-plate";
549
986
  this.confidence = cfg["confidence"] ?? 0.5;
550
987
  this.iouThreshold = cfg["iouThreshold"] ?? 0.45;
551
988
  const entry = PLATE_DETECTION_MODELS.find((m) => m.id === modelId);
@@ -553,15 +990,9 @@ var PlateDetectionAddon = class {
553
990
  throw new Error(`PlateDetectionAddon: unknown modelId "${modelId}"`);
554
991
  }
555
992
  this.modelEntry = entry;
556
- const resolved = await resolveEngine({
557
- runtime,
558
- backend,
559
- modelEntry: entry,
560
- modelsDir: ctx.locationPaths.models
561
- });
562
- this.engine = resolved.engine;
563
993
  }
564
994
  async crop(input) {
995
+ if (!this.engine) await this.ensureEngine();
565
996
  const start = Date.now();
566
997
  const { width: inputW, height: inputH } = this.modelEntry.inputSize;
567
998
  const targetSize = Math.max(inputW, inputH);
@@ -588,12 +1019,81 @@ var PlateDetectionAddon = class {
588
1019
  modelId: this.modelEntry.id
589
1020
  };
590
1021
  }
1022
+ async ensureEngine() {
1023
+ const config = this.resolvedConfig;
1024
+ const modelId = config?.modelId ?? this.modelEntry.id;
1025
+ const runtime = config?.runtime === "python" ? "coreml" : config?.runtime === "node" ? "onnx" : "auto";
1026
+ const backend = config?.backend ?? "cpu";
1027
+ const format = config?.format ?? "onnx";
1028
+ const entry = PLATE_DETECTION_MODELS.find((m) => m.id === modelId) ?? this.modelEntry;
1029
+ this.modelEntry = entry;
1030
+ const modelsDir = this.ctx.models?.getModelsDir() ?? this.ctx.locationPaths.models;
1031
+ if (this.ctx.models) {
1032
+ await this.ctx.models.ensure(modelId, format);
1033
+ }
1034
+ const resolved = await resolveEngine({
1035
+ runtime,
1036
+ backend,
1037
+ modelEntry: entry,
1038
+ modelsDir,
1039
+ models: this.ctx.models
1040
+ });
1041
+ this.engine = resolved.engine;
1042
+ }
591
1043
  async shutdown() {
592
1044
  await this.engine?.dispose();
593
1045
  }
594
1046
  getConfigSchema() {
595
1047
  return {
596
1048
  sections: [
1049
+ {
1050
+ id: "model",
1051
+ title: "Model",
1052
+ columns: 1,
1053
+ fields: [
1054
+ {
1055
+ key: "modelId",
1056
+ label: "Model",
1057
+ type: "model-selector",
1058
+ catalog: [...PLATE_DETECTION_MODELS],
1059
+ allowCustom: false,
1060
+ allowConversion: false,
1061
+ acceptFormats: ["onnx", "coreml", "openvino"],
1062
+ requiredMetadata: ["inputSize", "labels", "outputFormat"],
1063
+ outputFormatHint: "yolo"
1064
+ }
1065
+ ]
1066
+ },
1067
+ {
1068
+ id: "runtime",
1069
+ title: "Runtime",
1070
+ columns: 2,
1071
+ fields: [
1072
+ {
1073
+ key: "runtime",
1074
+ label: "Runtime",
1075
+ type: "select",
1076
+ options: [
1077
+ { value: "auto", label: "Auto" },
1078
+ { value: "onnx", label: "ONNX Runtime" },
1079
+ { value: "coreml", label: "CoreML (Apple)" },
1080
+ { value: "openvino", label: "OpenVINO (Intel)" }
1081
+ ]
1082
+ },
1083
+ {
1084
+ key: "backend",
1085
+ label: "Backend",
1086
+ type: "select",
1087
+ showWhen: { field: "runtime", equals: "onnx" },
1088
+ options: [
1089
+ { value: "auto", label: "Auto" },
1090
+ { value: "cpu", label: "CPU" },
1091
+ { value: "coreml", label: "CoreML" },
1092
+ { value: "cuda", label: "CUDA (NVIDIA)" }
1093
+ ]
1094
+ }
1095
+ ]
1096
+ },
597
1097
  {
598
1098
  id: "thresholds",
599
1099
  title: "Detection Thresholds",