@richardmcquiston01/ai-tools 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
// Pass a URL, ArrayBuffer or Uint8Array of the bundled `models/u2netp.onnx`.
|
|
26
26
|
const bg = await loadBackgroundRemovalModel("/models/u2netp.onnx", {
|
|
27
27
|
wasmPaths: "/ort/", // where ort-wasm*.wasm is served from (bundlers like Vite need this)
|
|
28
|
+
// executionProviders: ["wasm"], // the default; see the note below before adding "webgpu"
|
|
28
29
|
});
|
|
29
30
|
const cutout: ImageData = await bg.removeBackground(image);
|
|
30
31
|
|
|
@@ -36,6 +37,13 @@ const upscaler = await loadUpscaleModel(4);
|
|
|
36
37
|
const bigger: ImageData = await upscaler.upscale(image);
|
|
37
38
|
```
|
|
38
39
|
|
|
40
|
+
Background removal runs on WebAssembly by default. onnxruntime-web's WebGPU
|
|
41
|
+
provider can't run U²-Net-P's MaxPool layers (it fails with "using ceil() in
|
|
42
|
+
shape computation is not yet supported for MaxPool" when the model runs, not
|
|
43
|
+
when the session is created), so `"webgpu"` is opt-in through
|
|
44
|
+
`executionProviders`. If a run fails on WebGPU the model rebuilds its session
|
|
45
|
+
on WebAssembly and retries that run once.
|
|
46
|
+
|
|
39
47
|
## Entry points
|
|
40
48
|
|
|
41
49
|
TensorFlow.js and ONNX Runtime are large, and most apps need only one of them. Import from the entry point you need so a bundler never has to include the rest:
|
|
@@ -7,7 +7,21 @@ export interface LoadBackgroundRemovalModelOptions {
|
|
|
7
7
|
* copied. If omitted, onnxruntime-web's own default resolution is used.
|
|
8
8
|
*/
|
|
9
9
|
wasmPaths?: string;
|
|
10
|
+
/**
|
|
11
|
+
* onnxruntime-web execution providers to try, in order. Defaults to
|
|
12
|
+
* `["wasm"]` (the CPU/WebAssembly backend), which runs this model correctly
|
|
13
|
+
* everywhere and takes well under a second at 320x320.
|
|
14
|
+
*
|
|
15
|
+
* `"webgpu"` is opt-in because U2NETP's MaxPool layers use ceil mode, which
|
|
16
|
+
* onnxruntime-web's WebGPU provider rejects when the model *runs* ("using
|
|
17
|
+
* ceil() in shape computation is not yet supported for MaxPool"), not when
|
|
18
|
+
* the session is created, so listing it first can't fall back by itself.
|
|
19
|
+
* If you do opt in and a run fails on WebGPU, the model rebuilds its session
|
|
20
|
+
* on WebAssembly and retries that run once.
|
|
21
|
+
*/
|
|
22
|
+
executionProviders?: readonly ExecutionProvider[];
|
|
10
23
|
}
|
|
24
|
+
export type ExecutionProvider = "webgpu" | "wasm";
|
|
11
25
|
export interface SaliencyMask {
|
|
12
26
|
/** Row-major foreground-probability values in [0, 1], one per pixel of the source image. */
|
|
13
27
|
values: Float32Array;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-removal.d.ts","sourceRoot":"","sources":["../src/background-removal.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iCAAiC;IAChD;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"background-removal.d.ts","sourceRoot":"","sources":["../src/background-removal.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iCAAiC;IAChD;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACnD;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9D;AAgED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,EACxC,OAAO,CAAC,EAAE,iCAAiC,GAC1C,OAAO,CAAC,sBAAsB,CAAC,CAiEjC"}
|
|
@@ -66,17 +66,16 @@ function upsampleMask(mask, width, height) {
|
|
|
66
66
|
}
|
|
67
67
|
return result;
|
|
68
68
|
}
|
|
69
|
-
function supportsWebGpu() {
|
|
70
|
-
return typeof navigator !== "undefined" && "gpu" in navigator && navigator.gpu != null;
|
|
71
|
-
}
|
|
72
69
|
export async function loadBackgroundRemovalModel(model, options) {
|
|
73
70
|
if (options?.wasmPaths !== undefined) {
|
|
74
71
|
ort.env.wasm.wasmPaths = options.wasmPaths;
|
|
75
72
|
}
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
?
|
|
79
|
-
:
|
|
73
|
+
const source = typeof model === "string" || model instanceof Uint8Array ? model : new Uint8Array(model);
|
|
74
|
+
const createSession = (executionProviders) => typeof source === "string"
|
|
75
|
+
? ort.InferenceSession.create(source, { executionProviders: [...executionProviders] })
|
|
76
|
+
: ort.InferenceSession.create(source, { executionProviders: [...executionProviders] });
|
|
77
|
+
let providers = options?.executionProviders ?? ["wasm"];
|
|
78
|
+
let session = await createSession(providers);
|
|
80
79
|
const rawInputName = session.inputNames[0];
|
|
81
80
|
const rawOutputName = session.outputNames[0];
|
|
82
81
|
if (!rawInputName || !rawOutputName) {
|
|
@@ -84,9 +83,22 @@ export async function loadBackgroundRemovalModel(model, options) {
|
|
|
84
83
|
}
|
|
85
84
|
const inputName = rawInputName;
|
|
86
85
|
const outputName = rawOutputName;
|
|
86
|
+
/** Runs the model; a failure on WebGPU rebuilds the session on WebAssembly and retries once. */
|
|
87
|
+
async function runModel(feeds) {
|
|
88
|
+
try {
|
|
89
|
+
return await session.run(feeds);
|
|
90
|
+
}
|
|
91
|
+
catch (cause) {
|
|
92
|
+
if (!providers.includes("webgpu"))
|
|
93
|
+
throw cause;
|
|
94
|
+
providers = ["wasm"];
|
|
95
|
+
session = await createSession(providers);
|
|
96
|
+
return session.run(feeds);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
87
99
|
async function computeSaliencyMask(image) {
|
|
88
100
|
const tensor = preprocess(image);
|
|
89
|
-
const results = await
|
|
101
|
+
const results = await runModel({ [inputName]: tensor });
|
|
90
102
|
const output = results[outputName];
|
|
91
103
|
if (!output) {
|
|
92
104
|
throw new Error(`Background removal model did not produce output "${outputName}"`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-removal.js","sourceRoot":"","sources":["../src/background-removal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"background-removal.js","sourceRoot":"","sources":["../src/background-removal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@richardmcquiston01/ai-tools",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "In-browser AI image tools (background removal, upscaling, auto-crop) for laser/CNC/maker workflows",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"background-removal",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@richardmcquiston01/core-image": "0.3.
|
|
69
|
+
"@richardmcquiston01/core-image": "0.3.1",
|
|
70
70
|
"@tensorflow/tfjs": "4.11.0",
|
|
71
71
|
"@upscalerjs/esrgan-slim": "1.0.0",
|
|
72
72
|
"onnxruntime-web": "1.27.0",
|