@camstack/addon-vision 0.1.7 → 0.1.9
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 +30 -0
- package/dist/addons/animal-classifier/index.d.ts +30 -0
- package/dist/addons/animal-classifier/index.js +822 -999
- package/dist/addons/animal-classifier/index.js.map +1 -1
- package/dist/addons/animal-classifier/index.mjs +7 -242
- package/dist/addons/animal-classifier/index.mjs.map +1 -1
- package/dist/addons/audio-classification/index.d.mts +36 -0
- package/dist/addons/audio-classification/index.d.ts +36 -0
- package/dist/addons/audio-classification/index.js +378 -501
- package/dist/addons/audio-classification/index.js.map +1 -1
- package/dist/addons/audio-classification/index.mjs +4 -224
- package/dist/addons/audio-classification/index.mjs.map +1 -1
- package/dist/addons/bird-global-classifier/index.d.mts +31 -0
- package/dist/addons/bird-global-classifier/index.d.ts +31 -0
- package/dist/addons/bird-global-classifier/index.js +825 -1002
- package/dist/addons/bird-global-classifier/index.js.map +1 -1
- package/dist/addons/bird-global-classifier/index.mjs +7 -248
- package/dist/addons/bird-global-classifier/index.mjs.map +1 -1
- package/dist/addons/bird-nabirds-classifier/index.d.mts +33 -0
- package/dist/addons/bird-nabirds-classifier/index.d.ts +33 -0
- package/dist/addons/bird-nabirds-classifier/index.js +825 -1002
- package/dist/addons/bird-nabirds-classifier/index.js.map +1 -1
- package/dist/addons/bird-nabirds-classifier/index.mjs +7 -289
- package/dist/addons/bird-nabirds-classifier/index.mjs.map +1 -1
- package/dist/addons/face-detection/index.d.mts +29 -0
- package/dist/addons/face-detection/index.d.ts +29 -0
- package/dist/addons/face-detection/index.js +934 -1196
- package/dist/addons/face-detection/index.js.map +1 -1
- package/dist/addons/face-detection/index.mjs +7 -227
- package/dist/addons/face-detection/index.mjs.map +1 -1
- package/dist/addons/face-recognition/index.d.mts +29 -0
- package/dist/addons/face-recognition/index.d.ts +29 -0
- package/dist/addons/face-recognition/index.js +807 -1003
- package/dist/addons/face-recognition/index.js.map +1 -1
- package/dist/addons/face-recognition/index.mjs +6 -197
- package/dist/addons/face-recognition/index.mjs.map +1 -1
- package/dist/addons/motion-detection/index.d.mts +28 -0
- package/dist/addons/motion-detection/index.d.ts +28 -0
- package/dist/addons/motion-detection/index.js +111 -214
- package/dist/addons/motion-detection/index.js.map +1 -1
- package/dist/addons/motion-detection/index.mjs +9 -12
- package/dist/addons/motion-detection/index.mjs.map +1 -1
- package/dist/addons/object-detection/index.d.mts +31 -0
- package/dist/addons/object-detection/index.d.ts +31 -0
- package/dist/addons/object-detection/index.js +1082 -1287
- package/dist/addons/object-detection/index.js.map +1 -1
- package/dist/addons/object-detection/index.mjs +7 -373
- package/dist/addons/object-detection/index.mjs.map +1 -1
- package/dist/addons/plate-detection/index.d.mts +30 -0
- package/dist/addons/plate-detection/index.d.ts +30 -0
- package/dist/addons/plate-detection/index.js +868 -1075
- package/dist/addons/plate-detection/index.js.map +1 -1
- package/dist/addons/plate-detection/index.mjs +7 -230
- package/dist/addons/plate-detection/index.mjs.map +1 -1
- package/dist/addons/plate-recognition/index.d.mts +31 -0
- package/dist/addons/plate-recognition/index.d.ts +31 -0
- package/dist/addons/plate-recognition/index.js +505 -684
- package/dist/addons/plate-recognition/index.js.map +1 -1
- package/dist/addons/plate-recognition/index.mjs +5 -244
- package/dist/addons/plate-recognition/index.mjs.map +1 -1
- 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 +790 -967
- package/dist/addons/segmentation-refiner/index.js.map +1 -1
- package/dist/addons/segmentation-refiner/index.mjs +17 -21
- package/dist/addons/segmentation-refiner/index.mjs.map +1 -1
- 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 +410 -581
- package/dist/addons/vehicle-classifier/index.js.map +1 -1
- package/dist/addons/vehicle-classifier/index.mjs +16 -20
- package/dist/addons/vehicle-classifier/index.mjs.map +1 -1
- package/dist/chunk-22BHCDT5.mjs +101 -0
- package/dist/{chunk-WG66JYYW.mjs.map → chunk-22BHCDT5.mjs.map} +1 -1
- package/dist/chunk-2IOKI4ES.mjs +335 -0
- package/dist/{chunk-PIFS7AIT.mjs.map → chunk-2IOKI4ES.mjs.map} +1 -1
- package/dist/chunk-7DYHXUPZ.mjs +36 -0
- package/dist/{chunk-BS4DKYGN.mjs.map → chunk-7DYHXUPZ.mjs.map} +1 -1
- package/dist/chunk-BJTO5JO5.mjs +11 -0
- package/dist/chunk-BP7H4NFS.mjs +412 -0
- package/dist/{chunk-MGT6RUVX.mjs.map → chunk-BP7H4NFS.mjs.map} +1 -1
- package/dist/chunk-BR2FPGOX.mjs +98 -0
- package/dist/{chunk-YYDM6V2F.mjs.map → chunk-BR2FPGOX.mjs.map} +1 -1
- package/dist/chunk-D6WEHN33.mjs +276 -0
- package/dist/chunk-D6WEHN33.mjs.map +1 -0
- package/dist/chunk-DRYFGARD.mjs +289 -0
- package/dist/chunk-DRYFGARD.mjs.map +1 -0
- package/dist/chunk-DUN6XU3N.mjs +72 -0
- package/dist/{chunk-XD7WGXHZ.mjs.map → chunk-DUN6XU3N.mjs.map} +1 -1
- package/dist/chunk-ESLHNWWE.mjs +387 -0
- package/dist/chunk-ESLHNWWE.mjs.map +1 -0
- package/dist/chunk-JUQEW6ON.mjs +256 -0
- package/dist/chunk-JUQEW6ON.mjs.map +1 -0
- package/dist/chunk-KUO2BVFY.mjs +90 -0
- package/dist/{chunk-DE7I3VHO.mjs.map → chunk-KUO2BVFY.mjs.map} +1 -1
- package/dist/chunk-R5J3WAUI.mjs +645 -0
- package/dist/chunk-R5J3WAUI.mjs.map +1 -0
- package/dist/chunk-XZ6ZMXXU.mjs +39 -0
- package/dist/{chunk-K36R6HWY.mjs.map → chunk-XZ6ZMXXU.mjs.map} +1 -1
- package/dist/chunk-YPU4WTXZ.mjs +269 -0
- package/dist/chunk-YPU4WTXZ.mjs.map +1 -0
- package/dist/chunk-YUCD2TFH.mjs +242 -0
- package/dist/chunk-YUCD2TFH.mjs.map +1 -0
- package/dist/chunk-ZTJENCFC.mjs +379 -0
- package/dist/chunk-ZTJENCFC.mjs.map +1 -0
- package/dist/chunk-ZWYXXCXP.mjs +248 -0
- package/dist/chunk-ZWYXXCXP.mjs.map +1 -0
- package/dist/index.d.mts +183 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.js +3930 -4449
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +250 -2698
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-2YMA6QOV.mjs +0 -193
- package/dist/chunk-2YMA6QOV.mjs.map +0 -1
- package/dist/chunk-3IIFBJCD.mjs +0 -45
- package/dist/chunk-BS4DKYGN.mjs +0 -48
- package/dist/chunk-DE7I3VHO.mjs +0 -106
- package/dist/chunk-F6D2OZ36.mjs +0 -89
- package/dist/chunk-F6D2OZ36.mjs.map +0 -1
- package/dist/chunk-GAOIFQDX.mjs +0 -59
- package/dist/chunk-GAOIFQDX.mjs.map +0 -1
- package/dist/chunk-HUIX2XVR.mjs +0 -159
- package/dist/chunk-HUIX2XVR.mjs.map +0 -1
- package/dist/chunk-K36R6HWY.mjs +0 -51
- package/dist/chunk-MBTAI3WE.mjs +0 -78
- package/dist/chunk-MBTAI3WE.mjs.map +0 -1
- package/dist/chunk-MGT6RUVX.mjs +0 -423
- package/dist/chunk-PIFS7AIT.mjs +0 -446
- package/dist/chunk-WG66JYYW.mjs +0 -116
- package/dist/chunk-XD7WGXHZ.mjs +0 -82
- package/dist/chunk-YYDM6V2F.mjs +0 -113
- package/dist/chunk-ZK7P3TZN.mjs +0 -286
- package/dist/chunk-ZK7P3TZN.mjs.map +0 -1
- /package/dist/{chunk-3IIFBJCD.mjs.map → chunk-BJTO5JO5.mjs.map} +0 -0
package/dist/chunk-PIFS7AIT.mjs
DELETED
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__commonJS,
|
|
3
|
-
__require
|
|
4
|
-
} from "./chunk-3IIFBJCD.mjs";
|
|
5
|
-
|
|
6
|
-
// src/shared/node-engine.js
|
|
7
|
-
var require_node_engine = __commonJS({
|
|
8
|
-
"src/shared/node-engine.js"(exports) {
|
|
9
|
-
"use strict";
|
|
10
|
-
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === void 0) k2 = k;
|
|
12
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
-
desc = { enumerable: true, get: function() {
|
|
15
|
-
return m[k];
|
|
16
|
-
} };
|
|
17
|
-
}
|
|
18
|
-
Object.defineProperty(o, k2, desc);
|
|
19
|
-
}) : (function(o, m, k, k2) {
|
|
20
|
-
if (k2 === void 0) k2 = k;
|
|
21
|
-
o[k2] = m[k];
|
|
22
|
-
}));
|
|
23
|
-
var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? (function(o, v) {
|
|
24
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
-
}) : function(o, v) {
|
|
26
|
-
o["default"] = v;
|
|
27
|
-
});
|
|
28
|
-
var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() {
|
|
29
|
-
var ownKeys = function(o) {
|
|
30
|
-
ownKeys = Object.getOwnPropertyNames || function(o2) {
|
|
31
|
-
var ar = [];
|
|
32
|
-
for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
|
|
33
|
-
return ar;
|
|
34
|
-
};
|
|
35
|
-
return ownKeys(o);
|
|
36
|
-
};
|
|
37
|
-
return function(mod) {
|
|
38
|
-
if (mod && mod.__esModule) return mod;
|
|
39
|
-
var result = {};
|
|
40
|
-
if (mod != null) {
|
|
41
|
-
for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
-
}
|
|
43
|
-
__setModuleDefault(result, mod);
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
47
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.NodeInferenceEngine = void 0;
|
|
49
|
-
var path = __importStar(__require("path"));
|
|
50
|
-
var BACKEND_TO_PROVIDER = {
|
|
51
|
-
cpu: "cpu",
|
|
52
|
-
coreml: "coreml",
|
|
53
|
-
cuda: "cuda",
|
|
54
|
-
tensorrt: "tensorrt",
|
|
55
|
-
dml: "dml"
|
|
56
|
-
};
|
|
57
|
-
var BACKEND_TO_DEVICE = {
|
|
58
|
-
cpu: "cpu",
|
|
59
|
-
coreml: "gpu-mps",
|
|
60
|
-
cuda: "gpu-cuda",
|
|
61
|
-
tensorrt: "tensorrt"
|
|
62
|
-
};
|
|
63
|
-
var NodeInferenceEngine = class {
|
|
64
|
-
modelPath;
|
|
65
|
-
backend;
|
|
66
|
-
runtime = "onnx";
|
|
67
|
-
device;
|
|
68
|
-
session = null;
|
|
69
|
-
constructor(modelPath, backend) {
|
|
70
|
-
this.modelPath = modelPath;
|
|
71
|
-
this.backend = backend;
|
|
72
|
-
this.device = BACKEND_TO_DEVICE[backend] ?? "cpu";
|
|
73
|
-
}
|
|
74
|
-
async initialize() {
|
|
75
|
-
const ort = await Promise.resolve().then(() => __importStar(__require("onnxruntime-node")));
|
|
76
|
-
const provider = BACKEND_TO_PROVIDER[this.backend] ?? "cpu";
|
|
77
|
-
const absModelPath = path.isAbsolute(this.modelPath) ? this.modelPath : path.resolve(process.cwd(), this.modelPath);
|
|
78
|
-
const sessionOptions = {
|
|
79
|
-
executionProviders: [provider]
|
|
80
|
-
};
|
|
81
|
-
this.session = await ort.InferenceSession.create(absModelPath, sessionOptions);
|
|
82
|
-
}
|
|
83
|
-
async run(input, inputShape) {
|
|
84
|
-
if (!this.session) {
|
|
85
|
-
throw new Error("NodeInferenceEngine: not initialized \u2014 call initialize() first");
|
|
86
|
-
}
|
|
87
|
-
const ort = await Promise.resolve().then(() => __importStar(__require("onnxruntime-node")));
|
|
88
|
-
const sess = this.session;
|
|
89
|
-
const inputName = sess.inputNames[0];
|
|
90
|
-
const tensor = new ort.Tensor("float32", input, [...inputShape]);
|
|
91
|
-
const feeds = { [inputName]: tensor };
|
|
92
|
-
const results = await sess.run(feeds);
|
|
93
|
-
const outputName = sess.outputNames[0];
|
|
94
|
-
const outputTensor = results[outputName];
|
|
95
|
-
return outputTensor.data;
|
|
96
|
-
}
|
|
97
|
-
async runMultiOutput(input, inputShape) {
|
|
98
|
-
if (!this.session) {
|
|
99
|
-
throw new Error("NodeInferenceEngine: not initialized \u2014 call initialize() first");
|
|
100
|
-
}
|
|
101
|
-
const ort = await Promise.resolve().then(() => __importStar(__require("onnxruntime-node")));
|
|
102
|
-
const sess = this.session;
|
|
103
|
-
const inputName = sess.inputNames[0];
|
|
104
|
-
const tensor = new ort.Tensor("float32", input, [...inputShape]);
|
|
105
|
-
const feeds = { [inputName]: tensor };
|
|
106
|
-
const results = await sess.run(feeds);
|
|
107
|
-
const out = {};
|
|
108
|
-
for (const name of sess.outputNames) {
|
|
109
|
-
out[name] = results[name].data;
|
|
110
|
-
}
|
|
111
|
-
return out;
|
|
112
|
-
}
|
|
113
|
-
async dispose() {
|
|
114
|
-
this.session = null;
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
exports.NodeInferenceEngine = NodeInferenceEngine;
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// src/shared/python-engine.js
|
|
122
|
-
var require_python_engine = __commonJS({
|
|
123
|
-
"src/shared/python-engine.js"(exports) {
|
|
124
|
-
"use strict";
|
|
125
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
126
|
-
exports.PythonInferenceEngine = void 0;
|
|
127
|
-
exports.resolvePythonBinary = resolvePythonBinary;
|
|
128
|
-
var node_child_process_1 = __require("child_process");
|
|
129
|
-
var PythonInferenceEngine = class {
|
|
130
|
-
pythonPath;
|
|
131
|
-
scriptPath;
|
|
132
|
-
modelPath;
|
|
133
|
-
extraArgs;
|
|
134
|
-
runtime;
|
|
135
|
-
device;
|
|
136
|
-
process = null;
|
|
137
|
-
receiveBuffer = Buffer.alloc(0);
|
|
138
|
-
pendingResolve = null;
|
|
139
|
-
pendingReject = null;
|
|
140
|
-
constructor(pythonPath, scriptPath, runtime, modelPath, extraArgs = []) {
|
|
141
|
-
this.pythonPath = pythonPath;
|
|
142
|
-
this.scriptPath = scriptPath;
|
|
143
|
-
this.modelPath = modelPath;
|
|
144
|
-
this.extraArgs = extraArgs;
|
|
145
|
-
this.runtime = runtime;
|
|
146
|
-
const runtimeDeviceMap = {
|
|
147
|
-
onnx: "cpu",
|
|
148
|
-
coreml: "gpu-mps",
|
|
149
|
-
pytorch: "cpu",
|
|
150
|
-
openvino: "cpu",
|
|
151
|
-
tflite: "cpu"
|
|
152
|
-
};
|
|
153
|
-
this.device = runtimeDeviceMap[runtime];
|
|
154
|
-
}
|
|
155
|
-
async initialize() {
|
|
156
|
-
const args = [this.scriptPath, this.modelPath, ...this.extraArgs];
|
|
157
|
-
this.process = (0, node_child_process_1.spawn)(this.pythonPath, args, {
|
|
158
|
-
stdio: ["pipe", "pipe", "pipe"]
|
|
159
|
-
});
|
|
160
|
-
if (!this.process.stdout || !this.process.stdin) {
|
|
161
|
-
throw new Error("PythonInferenceEngine: failed to create process pipes");
|
|
162
|
-
}
|
|
163
|
-
this.process.stderr?.on("data", (chunk) => {
|
|
164
|
-
process.stderr.write(`[python-engine] ${chunk.toString()}`);
|
|
165
|
-
});
|
|
166
|
-
this.process.on("error", (err) => {
|
|
167
|
-
this.pendingReject?.(err);
|
|
168
|
-
this.pendingReject = null;
|
|
169
|
-
this.pendingResolve = null;
|
|
170
|
-
});
|
|
171
|
-
this.process.on("exit", (code) => {
|
|
172
|
-
if (code !== 0) {
|
|
173
|
-
const err = new Error(`PythonInferenceEngine: process exited with code ${code}`);
|
|
174
|
-
this.pendingReject?.(err);
|
|
175
|
-
this.pendingReject = null;
|
|
176
|
-
this.pendingResolve = null;
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
this.process.stdout.on("data", (chunk) => {
|
|
180
|
-
this.receiveBuffer = Buffer.concat([this.receiveBuffer, chunk]);
|
|
181
|
-
this._tryReceive();
|
|
182
|
-
});
|
|
183
|
-
await new Promise((resolve, reject) => {
|
|
184
|
-
const timeout = setTimeout(() => resolve(), 2e3);
|
|
185
|
-
this.process?.on("error", (err) => {
|
|
186
|
-
clearTimeout(timeout);
|
|
187
|
-
reject(err);
|
|
188
|
-
});
|
|
189
|
-
this.process?.on("exit", (code) => {
|
|
190
|
-
clearTimeout(timeout);
|
|
191
|
-
if (code !== 0) {
|
|
192
|
-
reject(new Error(`PythonInferenceEngine: process exited early with code ${code}`));
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
_tryReceive() {
|
|
198
|
-
if (this.receiveBuffer.length < 4)
|
|
199
|
-
return;
|
|
200
|
-
const length = this.receiveBuffer.readUInt32LE(0);
|
|
201
|
-
if (this.receiveBuffer.length < 4 + length)
|
|
202
|
-
return;
|
|
203
|
-
const jsonBytes = this.receiveBuffer.subarray(4, 4 + length);
|
|
204
|
-
this.receiveBuffer = this.receiveBuffer.subarray(4 + length);
|
|
205
|
-
const resolve = this.pendingResolve;
|
|
206
|
-
const reject = this.pendingReject;
|
|
207
|
-
this.pendingResolve = null;
|
|
208
|
-
this.pendingReject = null;
|
|
209
|
-
if (!resolve)
|
|
210
|
-
return;
|
|
211
|
-
try {
|
|
212
|
-
const parsed = JSON.parse(jsonBytes.toString("utf8"));
|
|
213
|
-
resolve(parsed);
|
|
214
|
-
} catch (err) {
|
|
215
|
-
reject?.(err instanceof Error ? err : new Error(String(err)));
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
/** Send JPEG buffer, receive JSON detection results */
|
|
219
|
-
async runJpeg(jpeg) {
|
|
220
|
-
if (!this.process?.stdin) {
|
|
221
|
-
throw new Error("PythonInferenceEngine: process not initialized");
|
|
222
|
-
}
|
|
223
|
-
return new Promise((resolve, reject) => {
|
|
224
|
-
this.pendingResolve = resolve;
|
|
225
|
-
this.pendingReject = reject;
|
|
226
|
-
const lengthBuf = Buffer.allocUnsafe(4);
|
|
227
|
-
lengthBuf.writeUInt32LE(jpeg.length, 0);
|
|
228
|
-
this.process.stdin.write(Buffer.concat([lengthBuf, jpeg]));
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
/** IInferenceEngine.run — wraps runJpeg for compatibility */
|
|
232
|
-
async run(_input, _inputShape) {
|
|
233
|
-
throw new Error("PythonInferenceEngine: use runJpeg() directly \u2014 this engine operates on JPEG input");
|
|
234
|
-
}
|
|
235
|
-
/** IInferenceEngine.runMultiOutput — not supported by Python engine (operates on JPEG input) */
|
|
236
|
-
async runMultiOutput(_input, _inputShape) {
|
|
237
|
-
throw new Error("PythonInferenceEngine: runMultiOutput() is not supported \u2014 this engine operates on JPEG input");
|
|
238
|
-
}
|
|
239
|
-
async dispose() {
|
|
240
|
-
if (this.process) {
|
|
241
|
-
this.process.stdin?.end();
|
|
242
|
-
this.process.kill("SIGTERM");
|
|
243
|
-
this.process = null;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
exports.PythonInferenceEngine = PythonInferenceEngine;
|
|
248
|
-
async function resolvePythonBinary(configPath, deps) {
|
|
249
|
-
if (configPath)
|
|
250
|
-
return configPath;
|
|
251
|
-
return deps.ensurePython();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
// src/shared/engine-resolver.js
|
|
257
|
-
var require_engine_resolver = __commonJS({
|
|
258
|
-
"src/shared/engine-resolver.js"(exports) {
|
|
259
|
-
"use strict";
|
|
260
|
-
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
261
|
-
if (k2 === void 0) k2 = k;
|
|
262
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
263
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
264
|
-
desc = { enumerable: true, get: function() {
|
|
265
|
-
return m[k];
|
|
266
|
-
} };
|
|
267
|
-
}
|
|
268
|
-
Object.defineProperty(o, k2, desc);
|
|
269
|
-
}) : (function(o, m, k, k2) {
|
|
270
|
-
if (k2 === void 0) k2 = k;
|
|
271
|
-
o[k2] = m[k];
|
|
272
|
-
}));
|
|
273
|
-
var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? (function(o, v) {
|
|
274
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
275
|
-
}) : function(o, v) {
|
|
276
|
-
o["default"] = v;
|
|
277
|
-
});
|
|
278
|
-
var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() {
|
|
279
|
-
var ownKeys = function(o) {
|
|
280
|
-
ownKeys = Object.getOwnPropertyNames || function(o2) {
|
|
281
|
-
var ar = [];
|
|
282
|
-
for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
|
|
283
|
-
return ar;
|
|
284
|
-
};
|
|
285
|
-
return ownKeys(o);
|
|
286
|
-
};
|
|
287
|
-
return function(mod) {
|
|
288
|
-
if (mod && mod.__esModule) return mod;
|
|
289
|
-
var result = {};
|
|
290
|
-
if (mod != null) {
|
|
291
|
-
for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
292
|
-
}
|
|
293
|
-
__setModuleDefault(result, mod);
|
|
294
|
-
return result;
|
|
295
|
-
};
|
|
296
|
-
})();
|
|
297
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
298
|
-
exports.resolveEngine = resolveEngine;
|
|
299
|
-
exports.probeOnnxBackends = probeOnnxBackends;
|
|
300
|
-
var fs = __importStar(__require("fs"));
|
|
301
|
-
var path = __importStar(__require("path"));
|
|
302
|
-
var node_engine_js_1 = require_node_engine();
|
|
303
|
-
var python_engine_js_1 = require_python_engine();
|
|
304
|
-
var AUTO_BACKEND_PRIORITY = ["coreml", "cuda", "tensorrt", "cpu"];
|
|
305
|
-
var BACKEND_TO_FORMAT = {
|
|
306
|
-
cpu: "onnx",
|
|
307
|
-
coreml: "onnx",
|
|
308
|
-
cuda: "onnx",
|
|
309
|
-
tensorrt: "onnx"
|
|
310
|
-
};
|
|
311
|
-
var RUNTIME_TO_FORMAT = {
|
|
312
|
-
onnx: "onnx",
|
|
313
|
-
coreml: "coreml",
|
|
314
|
-
openvino: "openvino",
|
|
315
|
-
tflite: "tflite",
|
|
316
|
-
pytorch: "pt"
|
|
317
|
-
};
|
|
318
|
-
function modelFilePath(modelsDir, modelEntry, format) {
|
|
319
|
-
const formatEntry = modelEntry.formats[format];
|
|
320
|
-
if (!formatEntry) {
|
|
321
|
-
throw new Error(`Model ${modelEntry.id} has no ${format} format`);
|
|
322
|
-
}
|
|
323
|
-
const urlParts = formatEntry.url.split("/");
|
|
324
|
-
const filename = urlParts[urlParts.length - 1] ?? `${modelEntry.id}.${format}`;
|
|
325
|
-
return path.join(modelsDir, filename);
|
|
326
|
-
}
|
|
327
|
-
function modelExists(filePath) {
|
|
328
|
-
try {
|
|
329
|
-
return fs.existsSync(filePath);
|
|
330
|
-
} catch {
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
async function resolveEngine(options) {
|
|
335
|
-
const { runtime, backend, modelEntry, modelsDir, models } = options;
|
|
336
|
-
let selectedFormat;
|
|
337
|
-
let selectedBackend;
|
|
338
|
-
if (runtime === "auto") {
|
|
339
|
-
const available = await probeOnnxBackends();
|
|
340
|
-
let chosen = null;
|
|
341
|
-
for (const b of AUTO_BACKEND_PRIORITY) {
|
|
342
|
-
if (!available.includes(b))
|
|
343
|
-
continue;
|
|
344
|
-
const fmt = BACKEND_TO_FORMAT[b];
|
|
345
|
-
if (!fmt)
|
|
346
|
-
continue;
|
|
347
|
-
if (!modelEntry.formats[fmt])
|
|
348
|
-
continue;
|
|
349
|
-
chosen = { backend: b, format: fmt };
|
|
350
|
-
break;
|
|
351
|
-
}
|
|
352
|
-
if (!chosen) {
|
|
353
|
-
throw new Error(`resolveEngine: no compatible backend found for model ${modelEntry.id}. Available backends: ${available.join(", ")}`);
|
|
354
|
-
}
|
|
355
|
-
selectedFormat = chosen.format;
|
|
356
|
-
selectedBackend = chosen.backend;
|
|
357
|
-
} else {
|
|
358
|
-
const fmt = RUNTIME_TO_FORMAT[runtime];
|
|
359
|
-
if (!fmt) {
|
|
360
|
-
throw new Error(`resolveEngine: unsupported runtime "${runtime}"`);
|
|
361
|
-
}
|
|
362
|
-
if (!modelEntry.formats[fmt]) {
|
|
363
|
-
throw new Error(`resolveEngine: model ${modelEntry.id} has no ${fmt} format for runtime ${runtime}`);
|
|
364
|
-
}
|
|
365
|
-
selectedFormat = fmt;
|
|
366
|
-
selectedBackend = runtime === "onnx" ? backend || "cpu" : runtime;
|
|
367
|
-
}
|
|
368
|
-
let modelPath;
|
|
369
|
-
if (models) {
|
|
370
|
-
modelPath = await models.ensure(modelEntry.id, selectedFormat);
|
|
371
|
-
} else {
|
|
372
|
-
modelPath = modelFilePath(modelsDir, modelEntry, selectedFormat);
|
|
373
|
-
if (!modelExists(modelPath)) {
|
|
374
|
-
throw new Error(`resolveEngine: model file not found at ${modelPath} and no model service provided`);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
if (selectedFormat === "onnx") {
|
|
378
|
-
const engine = new node_engine_js_1.NodeInferenceEngine(modelPath, selectedBackend);
|
|
379
|
-
await engine.initialize();
|
|
380
|
-
return { engine, format: selectedFormat, modelPath };
|
|
381
|
-
}
|
|
382
|
-
const { pythonPath } = options;
|
|
383
|
-
const PYTHON_SCRIPT_MAP = {
|
|
384
|
-
coreml: "coreml_inference.py",
|
|
385
|
-
pytorch: "pytorch_inference.py",
|
|
386
|
-
openvino: "openvino_inference.py"
|
|
387
|
-
};
|
|
388
|
-
const effectiveRuntime = runtime === "auto" ? selectedBackend : runtime;
|
|
389
|
-
const scriptName = PYTHON_SCRIPT_MAP[effectiveRuntime];
|
|
390
|
-
if (scriptName && pythonPath) {
|
|
391
|
-
const candidates = [
|
|
392
|
-
path.join(__dirname, "../../python", scriptName),
|
|
393
|
-
path.join(__dirname, "../python", scriptName),
|
|
394
|
-
path.join(__dirname, "../../../python", scriptName)
|
|
395
|
-
];
|
|
396
|
-
const scriptPath = candidates.find((p) => fs.existsSync(p));
|
|
397
|
-
if (!scriptPath) {
|
|
398
|
-
throw new Error(`resolveEngine: Python script "${scriptName}" not found. Searched:
|
|
399
|
-
${candidates.join("\n")}`);
|
|
400
|
-
}
|
|
401
|
-
const inputSize = Math.max(modelEntry.inputSize.width, modelEntry.inputSize.height);
|
|
402
|
-
const engine = new python_engine_js_1.PythonInferenceEngine(pythonPath, scriptPath, effectiveRuntime, modelPath, [
|
|
403
|
-
`--input-size=${inputSize}`,
|
|
404
|
-
`--confidence=0.25`
|
|
405
|
-
]);
|
|
406
|
-
await engine.initialize();
|
|
407
|
-
return { engine, format: selectedFormat, modelPath };
|
|
408
|
-
}
|
|
409
|
-
const fallbackPath = modelFilePath(modelsDir, modelEntry, "onnx");
|
|
410
|
-
if (modelEntry.formats["onnx"] && modelExists(fallbackPath)) {
|
|
411
|
-
const engine = new node_engine_js_1.NodeInferenceEngine(fallbackPath, "cpu");
|
|
412
|
-
await engine.initialize();
|
|
413
|
-
return { engine, format: "onnx", modelPath: fallbackPath };
|
|
414
|
-
}
|
|
415
|
-
throw new Error(`resolveEngine: format ${selectedFormat} is not yet supported by NodeInferenceEngine, no Python runtime is available, and no ONNX fallback exists`);
|
|
416
|
-
}
|
|
417
|
-
async function probeOnnxBackends() {
|
|
418
|
-
const available = ["cpu"];
|
|
419
|
-
try {
|
|
420
|
-
const ort = await Promise.resolve().then(() => __importStar(__require("onnxruntime-node")));
|
|
421
|
-
const providers = ort.env?.webgl?.disabled !== void 0 ? ort.InferenceSession?.getAvailableProviders?.() ?? [] : [];
|
|
422
|
-
for (const p of providers) {
|
|
423
|
-
const normalized = p.toLowerCase().replace("executionprovider", "");
|
|
424
|
-
if (normalized === "coreml")
|
|
425
|
-
available.push("coreml");
|
|
426
|
-
else if (normalized === "cuda")
|
|
427
|
-
available.push("cuda");
|
|
428
|
-
else if (normalized === "tensorrt")
|
|
429
|
-
available.push("tensorrt");
|
|
430
|
-
}
|
|
431
|
-
} catch {
|
|
432
|
-
}
|
|
433
|
-
if (process.platform === "darwin" && !available.includes("coreml")) {
|
|
434
|
-
available.push("coreml");
|
|
435
|
-
}
|
|
436
|
-
return [...new Set(available)];
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
});
|
|
440
|
-
|
|
441
|
-
export {
|
|
442
|
-
require_node_engine,
|
|
443
|
-
require_python_engine,
|
|
444
|
-
require_engine_resolver
|
|
445
|
-
};
|
|
446
|
-
//# sourceMappingURL=chunk-PIFS7AIT.mjs.map
|
package/dist/chunk-WG66JYYW.mjs
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__commonJS,
|
|
3
|
-
__require
|
|
4
|
-
} from "./chunk-3IIFBJCD.mjs";
|
|
5
|
-
|
|
6
|
-
// src/shared/image-utils.js
|
|
7
|
-
var require_image_utils = __commonJS({
|
|
8
|
-
"src/shared/image-utils.js"(exports) {
|
|
9
|
-
"use strict";
|
|
10
|
-
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
11
|
-
return mod && mod.__esModule ? mod : { "default": mod };
|
|
12
|
-
};
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.jpegToRgb = jpegToRgb;
|
|
15
|
-
exports.cropRegion = cropRegion;
|
|
16
|
-
exports.letterbox = letterbox;
|
|
17
|
-
exports.resizeAndNormalize = resizeAndNormalize;
|
|
18
|
-
exports.rgbToGrayscale = rgbToGrayscale;
|
|
19
|
-
var sharp_1 = __importDefault(__require("sharp"));
|
|
20
|
-
async function jpegToRgb(jpeg) {
|
|
21
|
-
const { data, info } = await (0, sharp_1.default)(jpeg).removeAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
22
|
-
return { data, width: info.width, height: info.height };
|
|
23
|
-
}
|
|
24
|
-
async function cropRegion(jpeg, roi) {
|
|
25
|
-
return (0, sharp_1.default)(jpeg).extract({
|
|
26
|
-
left: Math.round(roi.x),
|
|
27
|
-
top: Math.round(roi.y),
|
|
28
|
-
width: Math.round(roi.w),
|
|
29
|
-
height: Math.round(roi.h)
|
|
30
|
-
}).jpeg().toBuffer();
|
|
31
|
-
}
|
|
32
|
-
async function letterbox(jpeg, targetSize) {
|
|
33
|
-
const meta = await (0, sharp_1.default)(jpeg).metadata();
|
|
34
|
-
const originalWidth = meta.width ?? 0;
|
|
35
|
-
const originalHeight = meta.height ?? 0;
|
|
36
|
-
const scale = Math.min(targetSize / originalWidth, targetSize / originalHeight);
|
|
37
|
-
const scaledWidth = Math.round(originalWidth * scale);
|
|
38
|
-
const scaledHeight = Math.round(originalHeight * scale);
|
|
39
|
-
const padX = Math.floor((targetSize - scaledWidth) / 2);
|
|
40
|
-
const padY = Math.floor((targetSize - scaledHeight) / 2);
|
|
41
|
-
const { data } = await (0, sharp_1.default)(jpeg).resize(scaledWidth, scaledHeight).extend({
|
|
42
|
-
top: padY,
|
|
43
|
-
bottom: targetSize - scaledHeight - padY,
|
|
44
|
-
left: padX,
|
|
45
|
-
right: targetSize - scaledWidth - padX,
|
|
46
|
-
background: { r: 114, g: 114, b: 114 }
|
|
47
|
-
}).removeAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
48
|
-
const numPixels = targetSize * targetSize;
|
|
49
|
-
const float32 = new Float32Array(3 * numPixels);
|
|
50
|
-
for (let i = 0; i < numPixels; i++) {
|
|
51
|
-
const srcBase = i * 3;
|
|
52
|
-
float32[0 * numPixels + i] = data[srcBase] / 255;
|
|
53
|
-
float32[1 * numPixels + i] = data[srcBase + 1] / 255;
|
|
54
|
-
float32[2 * numPixels + i] = data[srcBase + 2] / 255;
|
|
55
|
-
}
|
|
56
|
-
return { data: float32, scale, padX, padY, originalWidth, originalHeight };
|
|
57
|
-
}
|
|
58
|
-
async function resizeAndNormalize(jpeg, targetWidth, targetHeight, normalization, layout) {
|
|
59
|
-
const { data } = await (0, sharp_1.default)(jpeg).resize(targetWidth, targetHeight, { fit: "fill" }).removeAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
60
|
-
const numPixels = targetWidth * targetHeight;
|
|
61
|
-
const float32 = new Float32Array(3 * numPixels);
|
|
62
|
-
const mean = [0.485, 0.456, 0.406];
|
|
63
|
-
const std = [0.229, 0.224, 0.225];
|
|
64
|
-
if (layout === "nchw") {
|
|
65
|
-
for (let i = 0; i < numPixels; i++) {
|
|
66
|
-
const srcBase = i * 3;
|
|
67
|
-
for (let c = 0; c < 3; c++) {
|
|
68
|
-
const raw = data[srcBase + c] / 255;
|
|
69
|
-
let val;
|
|
70
|
-
if (normalization === "zero-one") {
|
|
71
|
-
val = raw;
|
|
72
|
-
} else if (normalization === "imagenet") {
|
|
73
|
-
val = (raw - mean[c]) / std[c];
|
|
74
|
-
} else {
|
|
75
|
-
val = data[srcBase + c];
|
|
76
|
-
}
|
|
77
|
-
float32[c * numPixels + i] = val;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
} else {
|
|
81
|
-
for (let i = 0; i < numPixels; i++) {
|
|
82
|
-
const srcBase = i * 3;
|
|
83
|
-
for (let c = 0; c < 3; c++) {
|
|
84
|
-
const raw = data[srcBase + c] / 255;
|
|
85
|
-
let val;
|
|
86
|
-
if (normalization === "zero-one") {
|
|
87
|
-
val = raw;
|
|
88
|
-
} else if (normalization === "imagenet") {
|
|
89
|
-
val = (raw - mean[c]) / std[c];
|
|
90
|
-
} else {
|
|
91
|
-
val = data[srcBase + c];
|
|
92
|
-
}
|
|
93
|
-
float32[i * 3 + c] = val;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return float32;
|
|
98
|
-
}
|
|
99
|
-
function rgbToGrayscale(rgb, width, height) {
|
|
100
|
-
const numPixels = width * height;
|
|
101
|
-
const gray = new Uint8Array(numPixels);
|
|
102
|
-
for (let i = 0; i < numPixels; i++) {
|
|
103
|
-
const r = rgb[i * 3];
|
|
104
|
-
const g = rgb[i * 3 + 1];
|
|
105
|
-
const b = rgb[i * 3 + 2];
|
|
106
|
-
gray[i] = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
|
|
107
|
-
}
|
|
108
|
-
return gray;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
export {
|
|
114
|
-
require_image_utils
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=chunk-WG66JYYW.mjs.map
|
package/dist/chunk-XD7WGXHZ.mjs
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
require_object_detection_models
|
|
3
|
-
} from "./chunk-MGT6RUVX.mjs";
|
|
4
|
-
import {
|
|
5
|
-
__commonJS,
|
|
6
|
-
__require
|
|
7
|
-
} from "./chunk-3IIFBJCD.mjs";
|
|
8
|
-
|
|
9
|
-
// src/catalogs/animal-classification-models.js
|
|
10
|
-
var require_animal_classification_models = __commonJS({
|
|
11
|
-
"src/catalogs/animal-classification-models.js"(exports) {
|
|
12
|
-
"use strict";
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.ANIMAL_TYPE_MODELS = exports.BIRD_NABIRDS_MODELS = exports.BIRD_SPECIES_MODELS = void 0;
|
|
15
|
-
var types_1 = __require("@camstack/types");
|
|
16
|
-
var object_detection_models_js_1 = require_object_detection_models();
|
|
17
|
-
var HF_REPO = "camstack/camstack-models";
|
|
18
|
-
var hf = (path) => (0, types_1.hfModelUrl)(HF_REPO, path);
|
|
19
|
-
var BIRD_LABEL = { id: "species", name: "Bird Species" };
|
|
20
|
-
var ANIMAL_TYPE_LABEL = { id: "animal-type", name: "Animal Type" };
|
|
21
|
-
exports.BIRD_SPECIES_MODELS = [
|
|
22
|
-
{
|
|
23
|
-
id: "bird-species-525",
|
|
24
|
-
name: "Bird Species (525)",
|
|
25
|
-
description: "EfficientNet bird species classifier \u2014 525 species, MIT license",
|
|
26
|
-
inputSize: { width: 224, height: 224 },
|
|
27
|
-
inputNormalization: "imagenet",
|
|
28
|
-
labels: [BIRD_LABEL],
|
|
29
|
-
formats: {
|
|
30
|
-
onnx: { url: hf("animalClassification/bird-species/onnx/camstack-bird-species-525.onnx"), sizeMB: 32 }
|
|
31
|
-
},
|
|
32
|
-
extraFiles: [
|
|
33
|
-
{
|
|
34
|
-
url: hf("animalClassification/bird-species/onnx/camstack-bird-species-525-labels.json"),
|
|
35
|
-
filename: "camstack-bird-species-525-labels.json",
|
|
36
|
-
sizeMB: 0.02
|
|
37
|
-
}
|
|
38
|
-
]
|
|
39
|
-
}
|
|
40
|
-
];
|
|
41
|
-
exports.BIRD_NABIRDS_MODELS = [
|
|
42
|
-
{
|
|
43
|
-
id: "bird-nabirds-404",
|
|
44
|
-
name: "NABirds (404 species)",
|
|
45
|
-
description: "ResNet50 trained on NABirds \u2014 404 North American species with ONNX, CoreML, OpenVINO",
|
|
46
|
-
inputSize: { width: 224, height: 224 },
|
|
47
|
-
inputNormalization: "imagenet",
|
|
48
|
-
labels: [{ id: "species", name: "Bird Species" }],
|
|
49
|
-
formats: {
|
|
50
|
-
onnx: { url: hf("animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404.onnx"), sizeMB: 93 },
|
|
51
|
-
coreml: { url: hf("animalClassification/bird-nabirds/coreml/camstack-bird-nabirds-404.mlpackage"), sizeMB: 47, isDirectory: true, files: object_detection_models_js_1.MLPACKAGE_FILES, runtimes: ["python"] },
|
|
52
|
-
openvino: { url: hf("animalClassification/bird-nabirds/openvino/camstack-bird-nabirds-404.xml"), sizeMB: 47, runtimes: ["python"] }
|
|
53
|
-
},
|
|
54
|
-
extraFiles: [
|
|
55
|
-
{
|
|
56
|
-
url: hf("animalClassification/bird-nabirds/onnx/camstack-bird-nabirds-404-labels.json"),
|
|
57
|
-
filename: "camstack-bird-nabirds-404-labels.json",
|
|
58
|
-
sizeMB: 0.02
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
];
|
|
63
|
-
exports.ANIMAL_TYPE_MODELS = [
|
|
64
|
-
{
|
|
65
|
-
id: "animals-10",
|
|
66
|
-
name: "Animal Classifier (10)",
|
|
67
|
-
description: "ViT-based animal type classifier \u2014 cat, cow, dog, dolphin, eagle, panda, horse, monkey, sheep, spider",
|
|
68
|
-
inputSize: { width: 224, height: 224 },
|
|
69
|
-
inputNormalization: "imagenet",
|
|
70
|
-
labels: [ANIMAL_TYPE_LABEL],
|
|
71
|
-
formats: {
|
|
72
|
-
onnx: { url: hf("animalClassification/animals-10/onnx/camstack-animals-10.onnx"), sizeMB: 328 }
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
];
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
export {
|
|
80
|
-
require_animal_classification_models
|
|
81
|
-
};
|
|
82
|
-
//# sourceMappingURL=chunk-XD7WGXHZ.mjs.map
|