@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.
- package/dist/addons/animal-classifier/index.d.mts +6 -1
- package/dist/addons/animal-classifier/index.d.ts +6 -1
- package/dist/addons/animal-classifier/index.js +513 -49
- package/dist/addons/animal-classifier/index.js.map +1 -1
- package/dist/addons/animal-classifier/index.mjs +6 -4
- package/dist/addons/audio-classification/index.d.mts +6 -1
- package/dist/addons/audio-classification/index.d.ts +6 -1
- package/dist/addons/audio-classification/index.js +86 -26
- package/dist/addons/audio-classification/index.js.map +1 -1
- package/dist/addons/audio-classification/index.mjs +3 -2
- package/dist/addons/bird-global-classifier/index.d.mts +6 -1
- package/dist/addons/bird-global-classifier/index.d.ts +6 -1
- package/dist/addons/bird-global-classifier/index.js +514 -50
- package/dist/addons/bird-global-classifier/index.js.map +1 -1
- package/dist/addons/bird-global-classifier/index.mjs +6 -4
- package/dist/addons/bird-nabirds-classifier/index.d.mts +6 -1
- package/dist/addons/bird-nabirds-classifier/index.d.ts +6 -1
- package/dist/addons/bird-nabirds-classifier/index.js +523 -60
- package/dist/addons/bird-nabirds-classifier/index.js.map +1 -1
- package/dist/addons/bird-nabirds-classifier/index.mjs +6 -4
- package/dist/addons/face-detection/index.d.mts +6 -1
- package/dist/addons/face-detection/index.d.ts +6 -1
- package/dist/addons/face-detection/index.js +538 -39
- package/dist/addons/face-detection/index.js.map +1 -1
- package/dist/addons/face-detection/index.mjs +5 -3
- package/dist/addons/face-recognition/index.d.mts +6 -1
- package/dist/addons/face-recognition/index.d.ts +6 -1
- package/dist/addons/face-recognition/index.js +487 -33
- package/dist/addons/face-recognition/index.js.map +1 -1
- package/dist/addons/face-recognition/index.mjs +5 -3
- package/dist/addons/motion-detection/index.d.mts +3 -1
- package/dist/addons/motion-detection/index.d.ts +3 -1
- package/dist/addons/motion-detection/index.js +11 -3
- package/dist/addons/motion-detection/index.js.map +1 -1
- package/dist/addons/motion-detection/index.mjs +140 -3
- package/dist/addons/motion-detection/index.mjs.map +1 -1
- package/dist/addons/object-detection/index.d.mts +6 -1
- package/dist/addons/object-detection/index.d.ts +6 -1
- package/dist/addons/object-detection/index.js +369 -72
- package/dist/addons/object-detection/index.js.map +1 -1
- package/dist/addons/object-detection/index.mjs +5 -3
- package/dist/addons/plate-detection/index.d.mts +6 -1
- package/dist/addons/plate-detection/index.d.ts +6 -1
- package/dist/addons/plate-detection/index.js +531 -31
- package/dist/addons/plate-detection/index.js.map +1 -1
- package/dist/addons/plate-detection/index.mjs +5 -3
- package/dist/addons/plate-recognition/index.d.mts +7 -1
- package/dist/addons/plate-recognition/index.d.ts +7 -1
- package/dist/addons/plate-recognition/index.js +176 -44
- package/dist/addons/plate-recognition/index.js.map +1 -1
- package/dist/addons/plate-recognition/index.mjs +4 -3
- package/dist/addons/segmentation-refiner/index.d.mts +30 -0
- package/dist/addons/segmentation-refiner/index.d.ts +30 -0
- package/dist/addons/segmentation-refiner/index.js +1048 -0
- package/dist/addons/segmentation-refiner/index.js.map +1 -0
- package/dist/addons/segmentation-refiner/index.mjs +209 -0
- package/dist/addons/segmentation-refiner/index.mjs.map +1 -0
- package/dist/addons/vehicle-classifier/index.d.mts +31 -0
- package/dist/addons/vehicle-classifier/index.d.ts +31 -0
- package/dist/addons/vehicle-classifier/index.js +688 -0
- package/dist/addons/vehicle-classifier/index.js.map +1 -0
- package/dist/addons/vehicle-classifier/index.mjs +250 -0
- package/dist/addons/vehicle-classifier/index.mjs.map +1 -0
- package/dist/{chunk-6OR5TE7A.mjs → chunk-22BHCDT5.mjs} +2 -2
- package/dist/chunk-22BHCDT5.mjs.map +1 -0
- package/dist/{chunk-LPI42WL6.mjs → chunk-2IOKI4ES.mjs} +23 -12
- package/dist/chunk-2IOKI4ES.mjs.map +1 -0
- package/dist/chunk-7DYHXUPZ.mjs +36 -0
- package/dist/chunk-7DYHXUPZ.mjs.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +11 -0
- package/dist/chunk-BP7H4NFS.mjs +412 -0
- package/dist/chunk-BP7H4NFS.mjs.map +1 -0
- package/dist/chunk-BR2FPGOX.mjs +98 -0
- package/dist/chunk-BR2FPGOX.mjs.map +1 -0
- package/dist/{chunk-5AIQSN32.mjs → chunk-D6WEHN33.mjs} +66 -17
- package/dist/chunk-D6WEHN33.mjs.map +1 -0
- package/dist/{chunk-3MQFUDRU.mjs → chunk-DRYFGARD.mjs} +76 -47
- package/dist/chunk-DRYFGARD.mjs.map +1 -0
- package/dist/{chunk-ISOIDU4U.mjs → chunk-DUN6XU3N.mjs} +23 -5
- package/dist/chunk-DUN6XU3N.mjs.map +1 -0
- package/dist/{chunk-MEVASN3P.mjs → chunk-ESLHNWWE.mjs} +104 -22
- package/dist/chunk-ESLHNWWE.mjs.map +1 -0
- package/dist/{chunk-B3R66MPF.mjs → chunk-JUQEW6ON.mjs} +58 -21
- package/dist/chunk-JUQEW6ON.mjs.map +1 -0
- package/dist/{chunk-AYBFB7ID.mjs → chunk-R5J3WAUI.mjs} +200 -318
- package/dist/chunk-R5J3WAUI.mjs.map +1 -0
- package/dist/chunk-XZ6ZMXXU.mjs +39 -0
- package/dist/chunk-XZ6ZMXXU.mjs.map +1 -0
- package/dist/{chunk-5JJZGKL7.mjs → chunk-YPU4WTXZ.mjs} +102 -19
- package/dist/chunk-YPU4WTXZ.mjs.map +1 -0
- package/dist/{chunk-J4WRYHHY.mjs → chunk-YUCD2TFH.mjs} +66 -36
- package/dist/chunk-YUCD2TFH.mjs.map +1 -0
- package/dist/{chunk-PDSHDDPV.mjs → chunk-ZTJENCFC.mjs} +159 -35
- package/dist/chunk-ZTJENCFC.mjs.map +1 -0
- package/dist/{chunk-Q3SQOYG6.mjs → chunk-ZWYXXCXP.mjs} +67 -37
- package/dist/chunk-ZWYXXCXP.mjs.map +1 -0
- package/dist/index.d.mts +17 -5
- package/dist/index.d.ts +17 -5
- package/dist/index.js +1343 -550
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +191 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +94 -18
- package/python/coreml_inference.py +61 -18
- package/python/openvino_inference.py +12 -4
- package/python/pytorch_inference.py +12 -4
- package/dist/addons/camera-native-detection/index.d.mts +0 -32
- package/dist/addons/camera-native-detection/index.d.ts +0 -32
- package/dist/addons/camera-native-detection/index.js +0 -99
- package/dist/addons/camera-native-detection/index.js.map +0 -1
- package/dist/addons/camera-native-detection/index.mjs +0 -7
- package/dist/chunk-3MQFUDRU.mjs.map +0 -1
- package/dist/chunk-5AIQSN32.mjs.map +0 -1
- package/dist/chunk-5JJZGKL7.mjs.map +0 -1
- package/dist/chunk-6OR5TE7A.mjs.map +0 -1
- package/dist/chunk-AYBFB7ID.mjs.map +0 -1
- package/dist/chunk-B3R66MPF.mjs.map +0 -1
- package/dist/chunk-DTOAB2CE.mjs +0 -79
- package/dist/chunk-DTOAB2CE.mjs.map +0 -1
- package/dist/chunk-ISOIDU4U.mjs.map +0 -1
- package/dist/chunk-J4WRYHHY.mjs.map +0 -1
- package/dist/chunk-LPI42WL6.mjs.map +0 -1
- package/dist/chunk-MEVASN3P.mjs.map +0 -1
- package/dist/chunk-PDSHDDPV.mjs.map +0 -1
- package/dist/chunk-Q3SQOYG6.mjs.map +0 -1
- package/dist/chunk-QIMDG34B.mjs +0 -229
- package/dist/chunk-QIMDG34B.mjs.map +0 -1
- package/python/__pycache__/coreml_inference.cpython-313.pyc +0 -0
- package/python/__pycache__/openvino_inference.cpython-313.pyc +0 -0
- package/python/__pycache__/pytorch_inference.cpython-313.pyc +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
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,
|
|
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
|
|
910
|
-
if (
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
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
|
|
1097
|
+
`resolveEngine: model file not found at ${modelPath} and no model service provided`
|
|
917
1098
|
);
|
|
918
1099
|
}
|
|
919
1100
|
}
|
|
920
|
-
if (selectedFormat === "onnx"
|
|
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
|
|
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: "
|
|
1006
|
-
runtime: "
|
|
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"] ?? "
|
|
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:
|
|
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
|
|
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
|
-
|
|
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)" },
|