@camstack/addon-vision 0.1.7 → 0.1.10
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
|
@@ -1,293 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "../../chunk-
|
|
4
|
-
import "../../chunk-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import
|
|
9
|
-
require_engine_resolver
|
|
10
|
-
} from "../../chunk-PIFS7AIT.mjs";
|
|
11
|
-
import {
|
|
12
|
-
__toESM
|
|
13
|
-
} from "../../chunk-3IIFBJCD.mjs";
|
|
14
|
-
|
|
15
|
-
// src/addons/bird-nabirds-classifier/index.ts
|
|
16
|
-
var import_animal_classification_models = __toESM(require_animal_classification_models());
|
|
17
|
-
var import_image_utils = __toESM(require_image_utils());
|
|
18
|
-
var import_engine_resolver = __toESM(require_engine_resolver());
|
|
19
|
-
import * as fs from "fs";
|
|
20
|
-
import * as path from "path";
|
|
21
|
-
var SPECIES_LABEL = { id: "species", name: "Bird Species" };
|
|
22
|
-
var SPECIES_LABELS = [SPECIES_LABEL];
|
|
23
|
-
var BIRD_CLASS_MAP = { mapping: {}, preserveOriginal: true };
|
|
24
|
-
function loadLabels(modelsDir, modelId) {
|
|
25
|
-
const labelNames = [
|
|
26
|
-
`camstack-${modelId}-labels.json`,
|
|
27
|
-
`camstack-bird-nabirds-404-labels.json`
|
|
28
|
-
];
|
|
29
|
-
for (const name of labelNames) {
|
|
30
|
-
const labelPath = path.join(modelsDir, name);
|
|
31
|
-
if (fs.existsSync(labelPath)) {
|
|
32
|
-
const raw = fs.readFileSync(labelPath, "utf-8");
|
|
33
|
-
return JSON.parse(raw);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
throw new Error(`BirdNABirdsClassifierAddon: labels JSON not found in ${modelsDir}`);
|
|
37
|
-
}
|
|
38
|
-
function softmax(logits) {
|
|
39
|
-
const max = logits.reduce((a, b) => Math.max(a, b), -Infinity);
|
|
40
|
-
const exps = logits.map((v) => Math.exp(v - max));
|
|
41
|
-
const sum = exps.reduce((a, b) => a + b, 0);
|
|
42
|
-
return exps.map((v) => v / sum);
|
|
43
|
-
}
|
|
44
|
-
var BirdNABirdsClassifierAddon = class {
|
|
45
|
-
id = "bird-nabirds-classifier";
|
|
46
|
-
slot = "classifier";
|
|
47
|
-
inputClasses = ["animal"];
|
|
48
|
-
outputClasses = ["species:*"];
|
|
49
|
-
slotPriority = 0;
|
|
50
|
-
requiredSteps = [];
|
|
51
|
-
manifest = {
|
|
52
|
-
id: "bird-nabirds-classifier",
|
|
53
|
-
name: "Bird Classifier (NABirds, 404 species)",
|
|
54
|
-
version: "0.1.0",
|
|
55
|
-
description: "ResNet50 \u2014 404 North American bird species (NABirds dataset, ONNX + CoreML + OpenVINO)",
|
|
56
|
-
slot: "classifier",
|
|
57
|
-
labelOutputType: "classification",
|
|
58
|
-
inputClasses: ["animal"],
|
|
59
|
-
outputClasses: ["species:*"],
|
|
60
|
-
supportsCustomModels: false,
|
|
61
|
-
mayRequirePython: false,
|
|
62
|
-
defaultConfig: {
|
|
63
|
-
modelId: "bird-nabirds-404",
|
|
64
|
-
runtime: "node",
|
|
65
|
-
backend: "cpu",
|
|
66
|
-
minConfidence: 0.3
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
engine = null;
|
|
70
|
-
modelEntry;
|
|
71
|
-
labels = [];
|
|
72
|
-
minConfidence = 0.3;
|
|
73
|
-
allowedSpecies;
|
|
74
|
-
resolvedConfig = null;
|
|
75
|
-
ctx = null;
|
|
76
|
-
getModelRequirements() {
|
|
77
|
-
return import_animal_classification_models.BIRD_NABIRDS_MODELS.map((m) => ({
|
|
78
|
-
modelId: m.id,
|
|
79
|
-
name: m.name,
|
|
80
|
-
minRAM_MB: 300,
|
|
81
|
-
accuracyScore: 80,
|
|
82
|
-
formats: Object.keys(m.formats)
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
configure(config) {
|
|
86
|
-
this.resolvedConfig = config;
|
|
87
|
-
}
|
|
88
|
-
async initialize(ctx) {
|
|
89
|
-
this.ctx = ctx;
|
|
90
|
-
const cfg = ctx.addonConfig;
|
|
91
|
-
const modelId = cfg["modelId"] ?? this.resolvedConfig?.modelId ?? "bird-nabirds-404";
|
|
92
|
-
this.minConfidence = cfg["minConfidence"] ?? 0.3;
|
|
93
|
-
this.allowedSpecies = cfg["allowedSpecies"];
|
|
94
|
-
const entry = import_animal_classification_models.BIRD_NABIRDS_MODELS.find((m) => m.id === modelId);
|
|
95
|
-
if (!entry) {
|
|
96
|
-
throw new Error(`BirdNABirdsClassifierAddon: unknown modelId "${modelId}"`);
|
|
97
|
-
}
|
|
98
|
-
this.modelEntry = entry;
|
|
99
|
-
}
|
|
100
|
-
applyRegionFilter(scores, labels) {
|
|
101
|
-
if (!this.allowedSpecies || this.allowedSpecies.length === 0) return;
|
|
102
|
-
const allowedSet = new Set(this.allowedSpecies.map((s) => s.toLowerCase()));
|
|
103
|
-
for (let i = 0; i < scores.length; i++) {
|
|
104
|
-
if (!allowedSet.has(labels[i].toLowerCase())) {
|
|
105
|
-
scores[i] = 0;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
async classify(input) {
|
|
110
|
-
if (!this.engine) await this.ensureEngine();
|
|
111
|
-
const start = Date.now();
|
|
112
|
-
const { width: inputW, height: inputH } = this.modelEntry.inputSize;
|
|
113
|
-
const animalCrop = await (0, import_image_utils.cropRegion)(input.frame.data, input.roi);
|
|
114
|
-
const normalized = await (0, import_image_utils.resizeAndNormalize)(animalCrop, inputW, inputH, "imagenet", "nchw");
|
|
115
|
-
const rawOutput = await this.engine.run(normalized, [1, 3, inputH, inputW]);
|
|
116
|
-
const probs = softmax(rawOutput);
|
|
117
|
-
this.applyRegionFilter(probs, this.labels);
|
|
118
|
-
const filteredSum = probs.reduce((a, b) => a + b, 0);
|
|
119
|
-
if (filteredSum > 0) {
|
|
120
|
-
for (let i = 0; i < probs.length; i++) {
|
|
121
|
-
probs[i] = (probs[i] ?? 0) / filteredSum;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
let maxIdx = 0;
|
|
125
|
-
let maxScore = probs[0] ?? 0;
|
|
126
|
-
for (let i = 1; i < probs.length; i++) {
|
|
127
|
-
const score = probs[i] ?? 0;
|
|
128
|
-
if (score > maxScore) {
|
|
129
|
-
maxScore = score;
|
|
130
|
-
maxIdx = i;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (maxScore < this.minConfidence) {
|
|
134
|
-
return {
|
|
135
|
-
classifications: [],
|
|
136
|
-
inferenceMs: Date.now() - start,
|
|
137
|
-
modelId: this.modelEntry.id
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
const label = this.labels[maxIdx] ?? `species_${maxIdx}`;
|
|
141
|
-
return {
|
|
142
|
-
classifications: [
|
|
143
|
-
{
|
|
144
|
-
class: label,
|
|
145
|
-
score: maxScore
|
|
146
|
-
}
|
|
147
|
-
],
|
|
148
|
-
inferenceMs: Date.now() - start,
|
|
149
|
-
modelId: this.modelEntry.id
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
async ensureEngine() {
|
|
153
|
-
const config = this.resolvedConfig;
|
|
154
|
-
const modelId = config?.modelId ?? this.modelEntry.id;
|
|
155
|
-
const runtime = config?.runtime === "python" ? "coreml" : config?.runtime === "node" ? "onnx" : "auto";
|
|
156
|
-
const backend = config?.backend ?? "cpu";
|
|
157
|
-
const format = config?.format ?? "onnx";
|
|
158
|
-
const entry = import_animal_classification_models.BIRD_NABIRDS_MODELS.find((m) => m.id === modelId) ?? this.modelEntry;
|
|
159
|
-
this.modelEntry = entry;
|
|
160
|
-
const modelsDir = this.ctx.models?.getModelsDir() ?? this.ctx.locationPaths.models;
|
|
161
|
-
if (this.ctx.models) {
|
|
162
|
-
await this.ctx.models.ensure(modelId, format);
|
|
163
|
-
}
|
|
164
|
-
this.labels = loadLabels(modelsDir, modelId);
|
|
165
|
-
const resolved = await (0, import_engine_resolver.resolveEngine)({
|
|
166
|
-
runtime,
|
|
167
|
-
backend,
|
|
168
|
-
modelEntry: entry,
|
|
169
|
-
modelsDir,
|
|
170
|
-
models: this.ctx.models
|
|
171
|
-
});
|
|
172
|
-
this.engine = resolved.engine;
|
|
173
|
-
}
|
|
174
|
-
async shutdown() {
|
|
175
|
-
await this.engine?.dispose();
|
|
176
|
-
}
|
|
177
|
-
getConfigSchema() {
|
|
178
|
-
return {
|
|
179
|
-
sections: [
|
|
180
|
-
{
|
|
181
|
-
id: "model",
|
|
182
|
-
title: "Model",
|
|
183
|
-
columns: 1,
|
|
184
|
-
fields: [
|
|
185
|
-
{
|
|
186
|
-
key: "modelId",
|
|
187
|
-
label: "Model",
|
|
188
|
-
type: "model-selector",
|
|
189
|
-
catalog: [...import_animal_classification_models.BIRD_NABIRDS_MODELS],
|
|
190
|
-
allowCustom: false,
|
|
191
|
-
allowConversion: false,
|
|
192
|
-
acceptFormats: ["onnx", "coreml", "openvino"],
|
|
193
|
-
requiredMetadata: ["inputSize", "labels"],
|
|
194
|
-
outputFormatHint: "classification"
|
|
195
|
-
}
|
|
196
|
-
]
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
id: "runtime",
|
|
200
|
-
title: "Runtime",
|
|
201
|
-
columns: 2,
|
|
202
|
-
fields: [
|
|
203
|
-
{
|
|
204
|
-
key: "runtime",
|
|
205
|
-
label: "Runtime",
|
|
206
|
-
type: "select",
|
|
207
|
-
options: [
|
|
208
|
-
{ value: "auto", label: "Auto" },
|
|
209
|
-
{ value: "onnx", label: "ONNX Runtime" },
|
|
210
|
-
{ value: "coreml", label: "CoreML (Apple)" },
|
|
211
|
-
{ value: "openvino", label: "OpenVINO (Intel)" }
|
|
212
|
-
]
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
key: "backend",
|
|
216
|
-
label: "Backend",
|
|
217
|
-
type: "select",
|
|
218
|
-
showWhen: { field: "runtime", equals: "onnx" },
|
|
219
|
-
options: [
|
|
220
|
-
{ value: "auto", label: "Auto" },
|
|
221
|
-
{ value: "cpu", label: "CPU" },
|
|
222
|
-
{ value: "coreml", label: "CoreML" },
|
|
223
|
-
{ value: "cuda", label: "CUDA (NVIDIA)" }
|
|
224
|
-
]
|
|
225
|
-
}
|
|
226
|
-
]
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
id: "thresholds",
|
|
230
|
-
title: "Classification Settings",
|
|
231
|
-
columns: 1,
|
|
232
|
-
fields: [
|
|
233
|
-
{
|
|
234
|
-
key: "minConfidence",
|
|
235
|
-
label: "Minimum Confidence",
|
|
236
|
-
type: "slider",
|
|
237
|
-
min: 0.05,
|
|
238
|
-
max: 1,
|
|
239
|
-
step: 0.05,
|
|
240
|
-
default: 0.3
|
|
241
|
-
}
|
|
242
|
-
]
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
id: "region",
|
|
246
|
-
title: "Regional Filter",
|
|
247
|
-
columns: 1,
|
|
248
|
-
fields: [
|
|
249
|
-
{
|
|
250
|
-
key: "regionFilter",
|
|
251
|
-
label: "Region Preset",
|
|
252
|
-
type: "select",
|
|
253
|
-
options: [
|
|
254
|
-
{ value: "", label: "None (all 404 species)" },
|
|
255
|
-
{ value: "north-america-east", label: "North America \u2014 Eastern" },
|
|
256
|
-
{ value: "north-america-west", label: "North America \u2014 Western" },
|
|
257
|
-
{ value: "north-america-south", label: "North America \u2014 Southern" }
|
|
258
|
-
]
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
key: "allowedSpecies",
|
|
262
|
-
label: "Custom Allowed Species (comma-separated)",
|
|
263
|
-
type: "text"
|
|
264
|
-
}
|
|
265
|
-
]
|
|
266
|
-
}
|
|
267
|
-
]
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
getClassMap() {
|
|
271
|
-
return BIRD_CLASS_MAP;
|
|
272
|
-
}
|
|
273
|
-
getModelCatalog() {
|
|
274
|
-
return [...import_animal_classification_models.BIRD_NABIRDS_MODELS];
|
|
275
|
-
}
|
|
276
|
-
getAvailableModels() {
|
|
277
|
-
return [];
|
|
278
|
-
}
|
|
279
|
-
getActiveLabels() {
|
|
280
|
-
return SPECIES_LABELS;
|
|
281
|
-
}
|
|
282
|
-
async probe() {
|
|
283
|
-
return {
|
|
284
|
-
available: true,
|
|
285
|
-
runtime: this.engine?.runtime ?? "onnx",
|
|
286
|
-
device: this.engine?.device ?? "cpu",
|
|
287
|
-
capabilities: ["fp32"]
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
};
|
|
2
|
+
BirdNABirdsClassifierAddon
|
|
3
|
+
} from "../../chunk-DRYFGARD.mjs";
|
|
4
|
+
import "../../chunk-DUN6XU3N.mjs";
|
|
5
|
+
import "../../chunk-BP7H4NFS.mjs";
|
|
6
|
+
import "../../chunk-22BHCDT5.mjs";
|
|
7
|
+
import "../../chunk-2IOKI4ES.mjs";
|
|
8
|
+
import "../../chunk-BJTO5JO5.mjs";
|
|
291
9
|
export {
|
|
292
10
|
BirdNABirdsClassifierAddon as default
|
|
293
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/addons/bird-nabirds-classifier/index.ts"],"sourcesContent":["import type {\n IClassifierProvider,\n IDetectionAddon,\n AddonManifest,\n AddonContext,\n CropInput,\n ClassifierOutput,\n ConfigUISchema,\n ClassMapDefinition,\n ProbeResult,\n ModelCatalogEntry,\n DetectionModel,\n LabelDefinition,\n IInferenceEngine,\n ModelRequirement,\n ResolvedInferenceConfig,\n} from '@camstack/types'\nimport { BIRD_NABIRDS_MODELS } from '../../catalogs/animal-classification-models.js'\nimport { cropRegion, resizeAndNormalize } from '../../shared/image-utils.js'\nimport { resolveEngine } from '../../shared/engine-resolver.js'\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\n\nconst SPECIES_LABEL: LabelDefinition = { id: 'species', name: 'Bird Species' }\nconst SPECIES_LABELS: readonly LabelDefinition[] = [SPECIES_LABEL]\nconst BIRD_CLASS_MAP: ClassMapDefinition = { mapping: {}, preserveOriginal: true }\n\n/** Load NABirds labels from JSON file in modelsDir */\nfunction loadLabels(modelsDir: string, modelId: string): readonly string[] {\n const labelNames = [\n `camstack-${modelId}-labels.json`,\n `camstack-bird-nabirds-404-labels.json`,\n ]\n for (const name of labelNames) {\n const labelPath = path.join(modelsDir, name)\n if (fs.existsSync(labelPath)) {\n const raw = fs.readFileSync(labelPath, 'utf-8')\n return JSON.parse(raw) as string[]\n }\n }\n throw new Error(`BirdNABirdsClassifierAddon: labels JSON not found in ${modelsDir}`)\n}\n\nfunction softmax(logits: Float32Array): Float32Array {\n const max = logits.reduce((a, b) => Math.max(a, b), -Infinity)\n const exps = logits.map((v) => Math.exp(v - max))\n const sum = exps.reduce((a, b) => a + b, 0)\n return exps.map((v) => v / sum) as unknown as Float32Array\n}\n\nexport default class BirdNABirdsClassifierAddon implements IClassifierProvider, IDetectionAddon {\n readonly id = 'bird-nabirds-classifier'\n readonly slot = 'classifier' as const\n readonly inputClasses = ['animal'] as const\n readonly outputClasses = ['species:*'] as const\n readonly slotPriority = 0\n readonly requiredSteps = [] as const\n readonly manifest: AddonManifest = {\n id: 'bird-nabirds-classifier',\n name: 'Bird Classifier (NABirds, 404 species)',\n version: '0.1.0',\n\n description: 'ResNet50 — 404 North American bird species (NABirds dataset, ONNX + CoreML + OpenVINO)',\n\n slot: 'classifier',\n labelOutputType: 'classification',\n inputClasses: ['animal'],\n outputClasses: ['species:*'],\n supportsCustomModels: false,\n mayRequirePython: false,\n defaultConfig: {\n modelId: 'bird-nabirds-404',\n runtime: 'node',\n backend: 'cpu',\n minConfidence: 0.3,\n },\n }\n\n private engine: IInferenceEngine | null = null\n private modelEntry!: ModelCatalogEntry\n private labels: readonly string[] = []\n private minConfidence = 0.3\n private allowedSpecies: string[] | undefined\n private resolvedConfig: ResolvedInferenceConfig | null = null\n private ctx: AddonContext | null = null\n\n getModelRequirements(): ModelRequirement[] {\n return BIRD_NABIRDS_MODELS.map((m) => ({\n modelId: m.id,\n name: m.name,\n minRAM_MB: 300,\n accuracyScore: 80,\n formats: Object.keys(m.formats) as readonly string[],\n }))\n }\n\n configure(config: ResolvedInferenceConfig): void {\n this.resolvedConfig = config\n }\n\n async initialize(ctx: AddonContext): Promise<void> {\n this.ctx = ctx\n const cfg = ctx.addonConfig\n const modelId = (cfg['modelId'] as string | undefined) ?? this.resolvedConfig?.modelId ?? 'bird-nabirds-404'\n this.minConfidence = (cfg['minConfidence'] as number | undefined) ?? 0.3\n this.allowedSpecies = (cfg['allowedSpecies'] as string[] | undefined)\n\n const entry = BIRD_NABIRDS_MODELS.find((m) => m.id === modelId)\n if (!entry) {\n throw new Error(`BirdNABirdsClassifierAddon: unknown modelId \"${modelId}\"`)\n }\n this.modelEntry = entry\n }\n\n private applyRegionFilter(scores: Float32Array, labels: string[]): void {\n if (!this.allowedSpecies || this.allowedSpecies.length === 0) return\n const allowedSet = new Set(this.allowedSpecies.map(s => s.toLowerCase()))\n for (let i = 0; i < scores.length; i++) {\n if (!allowedSet.has(labels[i]!.toLowerCase())) {\n scores[i] = 0\n }\n }\n }\n\n async classify(input: CropInput): Promise<ClassifierOutput> {\n if (!this.engine) await this.ensureEngine()\n const start = Date.now()\n const { width: inputW, height: inputH } = this.modelEntry.inputSize\n\n // Crop the animal region\n const animalCrop = await cropRegion(input.frame.data, input.roi)\n\n // Resize to 224x224, ImageNet normalization, NCHW\n const normalized = await resizeAndNormalize(animalCrop, inputW, inputH, 'imagenet', 'nchw')\n\n // Run inference — output shape: [1, 404]\n const rawOutput = await this.engine!.run(normalized, [1, 3, inputH, inputW])\n\n // Softmax to get probabilities\n const probs = softmax(rawOutput)\n\n // Apply regional filter (zeroes out non-allowed species, then re-normalize)\n this.applyRegionFilter(probs, this.labels as string[])\n const filteredSum = probs.reduce((a, b) => a + b, 0)\n if (filteredSum > 0) {\n for (let i = 0; i < probs.length; i++) {\n probs[i] = (probs[i] ?? 0) / filteredSum\n }\n }\n\n // Find argmax\n let maxIdx = 0\n let maxScore = probs[0] ?? 0\n for (let i = 1; i < probs.length; i++) {\n const score = probs[i] ?? 0\n if (score > maxScore) {\n maxScore = score\n maxIdx = i\n }\n }\n\n if (maxScore < this.minConfidence) {\n return {\n classifications: [],\n inferenceMs: Date.now() - start,\n modelId: this.modelEntry.id,\n }\n }\n\n const label = this.labels[maxIdx] ?? `species_${maxIdx}`\n\n return {\n classifications: [\n {\n class: label,\n score: maxScore,\n },\n ],\n inferenceMs: Date.now() - start,\n modelId: this.modelEntry.id,\n }\n }\n\n private async ensureEngine(): Promise<void> {\n const config = this.resolvedConfig\n const modelId = config?.modelId ?? this.modelEntry.id\n const runtime = config?.runtime === 'python' ? 'coreml' : (config?.runtime === 'node' ? 'onnx' : 'auto')\n const backend = config?.backend ?? 'cpu'\n const format = config?.format ?? 'onnx'\n\n const entry = BIRD_NABIRDS_MODELS.find((m) => m.id === modelId) ?? this.modelEntry\n this.modelEntry = entry\n\n const modelsDir = this.ctx!.models?.getModelsDir() ?? this.ctx!.locationPaths.models\n\n // Ensure model + extra files (labels JSON) are downloaded via unified service\n if (this.ctx!.models) {\n await this.ctx!.models.ensure(modelId, format as any)\n }\n\n // Load labels from JSON file (lazy — only on first use)\n this.labels = loadLabels(modelsDir, modelId)\n\n const resolved = await resolveEngine({\n runtime: runtime as 'auto',\n backend,\n modelEntry: entry,\n modelsDir,\n models: this.ctx!.models,\n })\n this.engine = resolved.engine\n }\n\n async shutdown(): Promise<void> {\n await this.engine?.dispose()\n }\n\n getConfigSchema(): ConfigUISchema {\n return {\n sections: [\n {\n id: 'model',\n title: 'Model',\n columns: 1,\n fields: [\n {\n key: 'modelId',\n label: 'Model',\n type: 'model-selector',\n catalog: [...BIRD_NABIRDS_MODELS],\n allowCustom: false,\n allowConversion: false,\n acceptFormats: ['onnx', 'coreml', 'openvino'],\n requiredMetadata: ['inputSize', 'labels'],\n outputFormatHint: 'classification',\n },\n ],\n },\n {\n id: 'runtime',\n title: 'Runtime',\n columns: 2,\n fields: [\n {\n key: 'runtime',\n label: 'Runtime',\n type: 'select',\n options: [\n { value: 'auto', label: 'Auto' },\n { value: 'onnx', label: 'ONNX Runtime' },\n { value: 'coreml', label: 'CoreML (Apple)' },\n { value: 'openvino', label: 'OpenVINO (Intel)' },\n ],\n },\n {\n key: 'backend',\n label: 'Backend',\n type: 'select',\n showWhen: { field: 'runtime', equals: 'onnx' },\n options: [\n { value: 'auto', label: 'Auto' },\n { value: 'cpu', label: 'CPU' },\n { value: 'coreml', label: 'CoreML' },\n { value: 'cuda', label: 'CUDA (NVIDIA)' },\n ],\n },\n ],\n },\n {\n id: 'thresholds',\n title: 'Classification Settings',\n columns: 1,\n fields: [\n {\n key: 'minConfidence',\n label: 'Minimum Confidence',\n type: 'slider',\n min: 0.05,\n max: 1.0,\n step: 0.05,\n default: 0.3,\n },\n ],\n },\n {\n id: 'region',\n title: 'Regional Filter',\n columns: 1,\n fields: [\n {\n key: 'regionFilter',\n label: 'Region Preset',\n type: 'select',\n options: [\n { value: '', label: 'None (all 404 species)' },\n { value: 'north-america-east', label: 'North America — Eastern' },\n { value: 'north-america-west', label: 'North America — Western' },\n { value: 'north-america-south', label: 'North America — Southern' },\n ],\n },\n {\n key: 'allowedSpecies',\n label: 'Custom Allowed Species (comma-separated)',\n type: 'text',\n },\n ],\n },\n ],\n }\n }\n\n getClassMap(): ClassMapDefinition {\n return BIRD_CLASS_MAP\n }\n\n getModelCatalog(): ModelCatalogEntry[] {\n return [...BIRD_NABIRDS_MODELS]\n }\n\n getAvailableModels(): DetectionModel[] {\n return []\n }\n\n getActiveLabels(): readonly LabelDefinition[] {\n return SPECIES_LABELS\n }\n\n async probe(): Promise<ProbeResult> {\n return {\n available: true,\n runtime: this.engine?.runtime ?? 'onnx',\n device: this.engine?.device ?? 'cpu',\n capabilities: ['fp32'],\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ICropperProvider, IDetectionAddon, AddonManifest, ModelRequirement, ResolvedInferenceConfig, AddonContext, CropInput, CropperOutput, ConfigUISchema, ClassMapDefinition, ModelCatalogEntry, DetectionModel, LabelDefinition, ProbeResult } from '@camstack/types';
|
|
2
|
+
|
|
3
|
+
declare class FaceDetectionAddon implements ICropperProvider, IDetectionAddon {
|
|
4
|
+
readonly id = "face-detection";
|
|
5
|
+
readonly slot: "cropper";
|
|
6
|
+
readonly inputClasses: readonly ["person"];
|
|
7
|
+
readonly outputClasses: readonly ["face"];
|
|
8
|
+
readonly slotPriority = 0;
|
|
9
|
+
readonly manifest: AddonManifest;
|
|
10
|
+
private engine;
|
|
11
|
+
private modelEntry;
|
|
12
|
+
private confidence;
|
|
13
|
+
private resolvedConfig;
|
|
14
|
+
private ctx;
|
|
15
|
+
getModelRequirements(): ModelRequirement[];
|
|
16
|
+
configure(config: ResolvedInferenceConfig): void;
|
|
17
|
+
initialize(ctx: AddonContext): Promise<void>;
|
|
18
|
+
crop(input: CropInput): Promise<CropperOutput>;
|
|
19
|
+
private ensureEngine;
|
|
20
|
+
shutdown(): Promise<void>;
|
|
21
|
+
getConfigSchema(): ConfigUISchema;
|
|
22
|
+
getClassMap(): ClassMapDefinition;
|
|
23
|
+
getModelCatalog(): ModelCatalogEntry[];
|
|
24
|
+
getAvailableModels(): DetectionModel[];
|
|
25
|
+
getActiveLabels(): readonly LabelDefinition[];
|
|
26
|
+
probe(): Promise<ProbeResult>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { FaceDetectionAddon as default };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ICropperProvider, IDetectionAddon, AddonManifest, ModelRequirement, ResolvedInferenceConfig, AddonContext, CropInput, CropperOutput, ConfigUISchema, ClassMapDefinition, ModelCatalogEntry, DetectionModel, LabelDefinition, ProbeResult } from '@camstack/types';
|
|
2
|
+
|
|
3
|
+
declare class FaceDetectionAddon implements ICropperProvider, IDetectionAddon {
|
|
4
|
+
readonly id = "face-detection";
|
|
5
|
+
readonly slot: "cropper";
|
|
6
|
+
readonly inputClasses: readonly ["person"];
|
|
7
|
+
readonly outputClasses: readonly ["face"];
|
|
8
|
+
readonly slotPriority = 0;
|
|
9
|
+
readonly manifest: AddonManifest;
|
|
10
|
+
private engine;
|
|
11
|
+
private modelEntry;
|
|
12
|
+
private confidence;
|
|
13
|
+
private resolvedConfig;
|
|
14
|
+
private ctx;
|
|
15
|
+
getModelRequirements(): ModelRequirement[];
|
|
16
|
+
configure(config: ResolvedInferenceConfig): void;
|
|
17
|
+
initialize(ctx: AddonContext): Promise<void>;
|
|
18
|
+
crop(input: CropInput): Promise<CropperOutput>;
|
|
19
|
+
private ensureEngine;
|
|
20
|
+
shutdown(): Promise<void>;
|
|
21
|
+
getConfigSchema(): ConfigUISchema;
|
|
22
|
+
getClassMap(): ClassMapDefinition;
|
|
23
|
+
getModelCatalog(): ModelCatalogEntry[];
|
|
24
|
+
getAvailableModels(): DetectionModel[];
|
|
25
|
+
getActiveLabels(): readonly LabelDefinition[];
|
|
26
|
+
probe(): Promise<ProbeResult>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { FaceDetectionAddon as default };
|