@mauriciobenjamin700/ort-vision-sdk-web 0.6.1 → 0.7.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/CHANGELOG.md CHANGED
@@ -7,6 +7,78 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.1] - 2026-08-14
11
+
12
+ ### Fixed
13
+
14
+ - **A pipeline buffer that a consumer transferred away is replaced instead of
15
+ written into.** `LetterboxPipeline` and `ResizePipeline` hold one
16
+ `Float32Array` and hand the same one out every call, which is the whole point
17
+ of them — but `ort.env.wasm.proxy` (ONNX Runtime in a worker) posts the input
18
+ tensors with their `ArrayBuffer`s in the transfer list, and that **detaches**
19
+ them on this side. A detached `Float32Array` is silently `0` long: the writes
20
+ land nowhere and the next `InferenceSession.run` rejects with
21
+
22
+ ```text
23
+ Tensor's size(1228800) does not match data length(0).
24
+ ```
25
+
26
+ on every other call — the detached buffer throws, the throw leaves the claim
27
+ outstanding, so the call after it allocates a fresh array and succeeds.
28
+ Measured in Chromium against a 640×640 YOLO detector: run 1 ok (195 ms), run 2
29
+ rejected, run 3 ok (206 ms).
30
+
31
+ The buffer holder now treats a length that no longer matches the target as
32
+ spent and allocates a replacement, so the cost is one allocation per transfer
33
+ instead of a failure every second inference — and reuse still holds for every
34
+ consumer that copies the tensor rather than transferring it. Nothing about the
35
+ public shape changed: `run()` still reports `reused: true` when the returned
36
+ data is the pipeline's own buffer.
37
+
38
+ Without this, `env.wasm.proxy` is unusable with the built-in tasks, and that
39
+ flag is the only way to keep inference off the browser's main thread — measured
40
+ at 805 ms of frozen UI for one warm-up on a 32-core desktop, against 18 ms with
41
+ the worker.
42
+
43
+ ## [0.7.0] - 2026-08-08
44
+
45
+ ### Added
46
+
47
+ - **`Classifier.warmup(runs = 1)`.** The classifier was the one task left
48
+ without it — the documentation already claimed all four had it. The cost it
49
+ moves is the same one the other three move (WebGPU compiling shaders, the WASM
50
+ backend faulting in its arenas), and it lands worse here: an app running a
51
+ detector and then a classifier could warm the first and not the second, so an
52
+ unavoidable first-run cost sat right before the answer appears on screen.
53
+
54
+ - **`ResizePipeline`, the classification counterpart of `LetterboxPipeline`**
55
+ (plus `resizeToTensorData`, its one-shot form, and `writePlanarFloat32`, the
56
+ loop both pipelines share). A classifier stretches to the model's input rather
57
+ than letterboxing into it — no padding, no scale to invert afterwards — so it
58
+ could not reuse the letterbox path as it stands.
59
+
60
+ ### Changed
61
+
62
+ - **`Classifier` preprocessing allocates nothing per frame and walks the image
63
+ once.** It was still on the composable route (`resize` → `normalize` →
64
+ `toCHW`), which allocates an `RGBImage` and two `Float32Array`s and scans each
65
+ end to end: roughly 1.4 MB of fresh garbage per 224×224 `predict()`, produced
66
+ exactly when a phone near its ONNX memory ceiling can least afford it. It now
67
+ goes through `ResizePipeline`, which resizes with one `drawImage` and writes
68
+ normalized planar float32 into a buffer held across calls.
69
+
70
+ **The output is bit-identical** to the composable path — asserted value by
71
+ value against `normalize` → `toCHW`, including the `mean=[0,0,0]`,
72
+ `std=[1,1,1]` configuration an Ultralytics `-cls` export uses, where the old
73
+ route walked the whole buffer and allocated another one to change no value at
74
+ all.
75
+
76
+ ### Fixed
77
+
78
+ - **The web reference stopped listing `decodeYoloV8`, `decodeYoloV8Anchors` and
79
+ `decodeYoloV8Seg`.** They were removed in 0.6.0; the page kept advertising
80
+ them as current API. It documents both preprocessing pipelines now.
81
+
10
82
  ## [0.6.1] - 2026-08-08
11
83
 
12
84
  ### Fixed
@@ -463,7 +535,8 @@ console.log(r.boxes.xyxy, r.boxes.cls, r.boxes.conf, r.names);
463
535
  - Execution-provider resolution defaulting to `["webgpu", "wasm"]`.
464
536
  - Public types mirroring the Python SDK: `BoundingBox`, `ClassProbability`, `ClassificationResult`, `DetectionResult`, `RGBImage`.
465
537
 
466
- [Unreleased]: https://github.com/mauriciobenjamin700/ort-vision-sdk/compare/web-v0.6.1...HEAD
538
+ [Unreleased]: https://github.com/mauriciobenjamin700/ort-vision-sdk/compare/web-v0.7.0...HEAD
539
+ [0.7.0]: https://github.com/mauriciobenjamin700/ort-vision-sdk/compare/web-v0.6.1...web-v0.7.0
467
540
  [0.6.1]: https://github.com/mauriciobenjamin700/ort-vision-sdk/compare/web-v0.6.0...web-v0.6.1
468
541
  [0.6.0]: https://github.com/mauriciobenjamin700/ort-vision-sdk/compare/web-v0.5.1...web-v0.6.0
469
542
  [0.5.1]: https://github.com/mauriciobenjamin700/ort-vision-sdk/compare/web-v0.5.0...web-v0.5.1
package/dist/index.d.ts CHANGED
@@ -14,7 +14,7 @@ export { type Speed, SpeedTimer } from "./core/timing.js";
14
14
  export { type ImageInput, loadImage } from "./io/image.js";
15
15
  export { FUSION_KIND_DETECT_CLASSIFY, INPUT_IMAGE, INPUT_PAD, INPUT_SCALE, INPUT_SOURCE, METADATA_PREFIX, OUTPUT_BOXES, OUTPUT_CLASSES, OUTPUT_NUM_DETECTIONS, OUTPUT_PROBS, OUTPUT_SCORES, type CropSource, type FusionSpec, readFusionSpec, } from "./fusion.js";
16
16
  export { type LetterboxResult, fromCv2, letterbox, normalize, resize, toCHW, toCv2, toFloat32, toFloat32Tensor, toTensor, } from "./preprocess/image.js";
17
- export { type FusedLetterboxResult, LetterboxPipeline, letterboxToTensorData, zeroTensorData, } from "./preprocess/pipeline.js";
17
+ export { type FusedLetterboxResult, type FusedResizeResult, LetterboxPipeline, ResizePipeline, letterboxToTensorData, resizeToTensorData, writePlanarFloat32, zeroTensorData, } from "./preprocess/pipeline.js";
18
18
  export { type TopKResult, softmax, topK, } from "./postprocess/classification.js";
19
19
  export { type DecodeYoloAnchorsOptions, type DecodeYoloOptions, type DecodedAnchors, type DecodedDetection, batchedNms, decodeYolo, decodeYoloAnchors, nms, } from "./postprocess/detection.js";
20
20
  export { type DecodeYoloSegOptions, type DecodedSegmentation, decodeYoloSeg, } from "./postprocess/segmentation.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ export { SpeedTimer } from "./core/timing.js";
14
14
  export { loadImage } from "./io/image.js";
15
15
  export { FUSION_KIND_DETECT_CLASSIFY, INPUT_IMAGE, INPUT_PAD, INPUT_SCALE, INPUT_SOURCE, METADATA_PREFIX, OUTPUT_BOXES, OUTPUT_CLASSES, OUTPUT_NUM_DETECTIONS, OUTPUT_PROBS, OUTPUT_SCORES, readFusionSpec, } from "./fusion.js";
16
16
  export { fromCv2, letterbox, normalize, resize, toCHW, toCv2, toFloat32, toFloat32Tensor, toTensor, } from "./preprocess/image.js";
17
- export { LetterboxPipeline, letterboxToTensorData, zeroTensorData, } from "./preprocess/pipeline.js";
17
+ export { LetterboxPipeline, ResizePipeline, letterboxToTensorData, resizeToTensorData, writePlanarFloat32, zeroTensorData, } from "./preprocess/pipeline.js";
18
18
  export { softmax, topK, } from "./postprocess/classification.js";
19
19
  export { batchedNms, decodeYolo, decodeYoloAnchors, nms, } from "./postprocess/detection.js";
20
20
  export { decodeYoloSeg, } from "./postprocess/segmentation.js";
@@ -23,5 +23,5 @@ export { Classifier, } from "./tasks/classifier.js";
23
23
  export { DetectClassify, } from "./tasks/detectClassify.js";
24
24
  export { Detector, } from "./tasks/detector.js";
25
25
  export { Segmenter, } from "./tasks/segmenter.js";
26
- export const VERSION = "0.6.1";
26
+ export const VERSION = "0.7.1";
27
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,GAKT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EAGZ,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAGL,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAc,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAmB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,2BAA2B,EAC3B,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,aAAa,EAGb,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,EACN,KAAK,EACL,KAAK,EACL,SAAS,EACT,eAAe,EACf,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAEL,OAAO,EACP,IAAI,GACL,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAKL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,GAAG,GACJ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAGL,aAAa,GACd,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAGL,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAIL,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,GAKT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EAGZ,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAGL,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAc,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAmB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,2BAA2B,EAC3B,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,aAAa,EAGb,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,EACN,KAAK,EACL,KAAK,EACL,SAAS,EACT,eAAe,EACf,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGL,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAEL,OAAO,EACP,IAAI,GACL,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAKL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,GAAG,GACJ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAGL,aAAa,GACd,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAGL,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAIL,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAC"}
@@ -55,7 +55,6 @@ export declare class LetterboxPipeline {
55
55
  private readonly _buffer;
56
56
  private _source;
57
57
  private _sourceContext;
58
- private _bufferInUse;
59
58
  /**
60
59
  * @param targetWidth Model input width in pixels.
61
60
  * @param targetHeight Model input height in pixels.
@@ -71,7 +70,9 @@ export declare class LetterboxPipeline {
71
70
  * still checked out — {@link release} marks it free again. A second `run`
72
71
  * before the first is released allocates a fresh buffer rather than
73
72
  * corrupting it, so concurrent `predict()` calls on one task stay correct at
74
- * the cost of the allocation they were trying to avoid.
73
+ * the cost of the allocation they were trying to avoid. A buffer that was
74
+ * detached by a consumer that transferred it is replaced rather than written
75
+ * into — see {@link ReusableBuffer}.
75
76
  *
76
77
  * @param image Source image in the SDK's canonical HWC RGB layout.
77
78
  */
@@ -95,6 +96,122 @@ export declare class LetterboxPipeline {
95
96
  */
96
97
  private _ensureSource;
97
98
  }
99
+ /**
100
+ * Write an RGBA buffer as normalized planar float32.
101
+ *
102
+ * Shared by {@link ResizePipeline} and exported for a custom pipeline that
103
+ * already holds pixels and wants the SDK's exact arithmetic.
104
+ *
105
+ * The expression is `(value / 255 - mean) / std`, evaluated in that order on
106
+ * purpose: folding it into a single multiply-add (`value * k + b`) computes the
107
+ * same quantity but rounds differently, and the tasks' output is asserted to be
108
+ * bit-identical to the composable `normalize` → `toCHW` path.
109
+ *
110
+ * @param rgba Source pixels, 4 bytes per pixel, `width * height` long.
111
+ * @param width Image width in pixels.
112
+ * @param height Image height in pixels.
113
+ * @param mean Per-channel RGB mean, already in `[0, 1]`.
114
+ * @param std Per-channel RGB standard deviation.
115
+ * @param out Destination buffer, `3 * width * height` long.
116
+ * @param stride Bytes per source pixel: 4 for canvas RGBA, 3 for packed RGB.
117
+ */
118
+ export declare function writePlanarFloat32(rgba: Uint8ClampedArray | Uint8Array, width: number, height: number, mean: readonly [number, number, number], std: readonly [number, number, number], out: Float32Array, stride?: number): void;
119
+ /** Planar tensor data produced by {@link ResizePipeline}. */
120
+ export interface FusedResizeResult {
121
+ /** CHW float32, normalized, length `3 * targetHeight * targetWidth`. */
122
+ readonly data: Float32Array;
123
+ /**
124
+ * Whether {@link data} is the pipeline's reusable buffer.
125
+ *
126
+ * `true` means the next {@link ResizePipeline.run} overwrites it, so a caller
127
+ * keeping the values past its own inference has to copy them.
128
+ */
129
+ readonly reused: boolean;
130
+ }
131
+ /**
132
+ * Reusable stretch-resize → normalized tensor pipeline for one target size.
133
+ *
134
+ * The classification counterpart of {@link LetterboxPipeline}. A classifier
135
+ * stretches to the model's square input instead of letterboxing into it — no
136
+ * padding, no scale to invert later, because nothing is mapped back onto the
137
+ * source image afterwards. That difference is why it cannot simply reuse the
138
+ * letterbox path.
139
+ *
140
+ * What it does share is the technique. The composable route
141
+ * (`resize` → `normalize` → `toCHW`) allocates an `RGBImage` and two
142
+ * `Float32Array`s and walks each end to end on every call: about 1.4 MB of
143
+ * fresh garbage per 224×224 `predict()`, produced at the exact moment a phone
144
+ * near its memory ceiling can least afford it. Here one `drawImage` resizes,
145
+ * and one loop reads the resulting RGBA and writes normalized planar float32
146
+ * into a buffer held across calls.
147
+ *
148
+ * Create one per task, not per frame.
149
+ */
150
+ export declare class ResizePipeline {
151
+ private readonly _targetWidth;
152
+ private readonly _targetHeight;
153
+ private readonly _mean;
154
+ private readonly _std;
155
+ private readonly _buffer;
156
+ private _target;
157
+ private _targetContext;
158
+ private _source;
159
+ private _sourceContext;
160
+ /**
161
+ * @param targetWidth Model input width in pixels.
162
+ * @param targetHeight Model input height in pixels.
163
+ * @param mean Per-channel RGB mean in `[0, 1]`. Defaults to no shift.
164
+ * @param std Per-channel RGB standard deviation. Defaults to no scaling.
165
+ */
166
+ constructor(targetWidth: number, targetHeight: number, mean?: readonly [number, number, number], std?: readonly [number, number, number]);
167
+ /** The `[width, height]` this pipeline resizes into. */
168
+ get targetSize(): readonly [number, number];
169
+ /**
170
+ * Resize an image to the target size and write it as normalized planar float32.
171
+ *
172
+ * An image that already arrives at the target size skips the canvas entirely
173
+ * and is read straight out of its packed RGB — which is both faster and what
174
+ * keeps the result identical to `resize()`, whose own fast path returns the
175
+ * input untouched.
176
+ *
177
+ * Buffer reuse follows {@link ReusableBuffer}: held across calls, replaced when
178
+ * a consumer detached it by transferring the tensor.
179
+ *
180
+ * @param image Source image in the SDK's canonical HWC RGB layout.
181
+ */
182
+ run(image: RGBImage): FusedResizeResult;
183
+ /**
184
+ * Mark the reusable buffer free again.
185
+ *
186
+ * Call it once the tensor built from a {@link run} result has been handed to
187
+ * ONNX Runtime and the run has resolved — after that the values are inside
188
+ * the WASM heap and the buffer can be overwritten.
189
+ */
190
+ release(): void;
191
+ /**
192
+ * Build the target canvas on first use.
193
+ *
194
+ * Lazily, so a pipeline constructed where no canvas implementation exists
195
+ * (a Node test, a worker without OffscreenCanvas) only fails if it is asked
196
+ * to resize something.
197
+ */
198
+ private _ensureTarget;
199
+ /** Grow the scratch source canvas to fit an image, reusing it when possible. */
200
+ private _ensureSource;
201
+ }
202
+ /**
203
+ * Resize an image into normalized planar float32 without keeping any state.
204
+ *
205
+ * The allocation-free path is {@link ResizePipeline}; this is the one-shot
206
+ * form, for a caller who wants the fused behaviour without owning a pipeline.
207
+ *
208
+ * @param image Source image in the SDK's canonical HWC RGB layout.
209
+ * @param targetWidth Model input width in pixels.
210
+ * @param targetHeight Model input height in pixels.
211
+ * @param mean Per-channel RGB mean in `[0, 1]`. Defaults to no shift.
212
+ * @param std Per-channel RGB standard deviation. Defaults to no scaling.
213
+ */
214
+ export declare function resizeToTensorData(image: RGBImage, targetWidth: number, targetHeight: number, mean?: readonly [number, number, number], std?: readonly [number, number, number]): FusedResizeResult;
98
215
  /**
99
216
  * Build a zero-filled CHW tensor payload for a warm-up run.
100
217
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/preprocess/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;OAIG;gBAED,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAmB;IAe3D,4DAA4D;IAC5D,IAAI,UAAU,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAE1C;IAED;;;;;;;;;;OAUG;IACH,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,oBAAoB;IA4C1C;;;;;;OAMG;IACH,OAAO,IAAI,IAAI;IAIf;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;CAOtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAE1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAmB,GACxD,oBAAoB,CAEtB"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/preprocess/pipeline.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,55 @@
22
22
  */
23
23
  import { createCanvas, get2DContext, rgbToImageData } from "../core/canvas.js";
24
24
  const INV_255 = 1 / 255;
25
+ /**
26
+ * A `Float32Array` held across calls, handed out one claim at a time.
27
+ *
28
+ * Both pipelines want the same thing — allocate once, write into it every frame,
29
+ * and fall back to a fresh array when a previous result has not been released
30
+ * yet — so the bookkeeping lives here instead of twice.
31
+ *
32
+ * The part that is not obvious is {@link claim} re-allocating a buffer that is
33
+ * *detached*. `ort.env.wasm.proxy` runs ONNX Runtime in a worker and posts the
34
+ * input tensors with their `ArrayBuffer`s in the transfer list, which detaches
35
+ * them on this side. A detached `Float32Array` is silently 0 long: writing to it
36
+ * is a no-op, and the next `InferenceSession.run` rejects with
37
+ * `Tensor's size(N) does not match data length(0)` on every other call — once for
38
+ * the detached buffer, then the throw leaves the claim outstanding so the call
39
+ * after it allocates and succeeds. Treating a buffer that changed length as spent
40
+ * turns that into one extra allocation per transfer, which is what reuse was
41
+ * avoiding, and keeps it correct for any consumer that transfers the tensor
42
+ * rather than copying it.
43
+ */
44
+ class ReusableBuffer {
45
+ _size;
46
+ _buffer;
47
+ _inUse = false;
48
+ /** @param size Length in floats of every buffer this hands out. */
49
+ constructor(size) {
50
+ this._size = size;
51
+ this._buffer = new Float32Array(size);
52
+ }
53
+ /**
54
+ * Take the held buffer, or a fresh one when it is unavailable.
55
+ *
56
+ * Unavailable means either still checked out by an unreleased claim, or
57
+ * detached by whoever it was handed to. The first case allocates for this call
58
+ * only; the second replaces the held buffer, so the allocation is paid once per
59
+ * transfer rather than on every call after it.
60
+ */
61
+ claim() {
62
+ if (this._inUse)
63
+ return { data: new Float32Array(this._size), reused: false };
64
+ if (this._buffer.length !== this._size)
65
+ this._buffer = new Float32Array(this._size);
66
+ this._inUse = true;
67
+ return { data: this._buffer, reused: true };
68
+ }
69
+ /** Mark the held buffer free for the next {@link claim}. */
70
+ release() {
71
+ this._inUse = false;
72
+ }
73
+ }
25
74
  /**
26
75
  * Reusable letterbox → tensor pipeline for one target resolution.
27
76
  *
@@ -38,7 +87,6 @@ export class LetterboxPipeline {
38
87
  _buffer;
39
88
  _source = null;
40
89
  _sourceContext = null;
41
- _bufferInUse = false;
42
90
  /**
43
91
  * @param targetWidth Model input width in pixels.
44
92
  * @param targetHeight Model input height in pixels.
@@ -55,7 +103,7 @@ export class LetterboxPipeline {
55
103
  this._targetContext = get2DContext(this._target, { willReadFrequently: true });
56
104
  this._targetContext.imageSmoothingEnabled = true;
57
105
  this._targetContext.imageSmoothingQuality = "high";
58
- this._buffer = new Float32Array(3 * targetHeight * targetWidth);
106
+ this._buffer = new ReusableBuffer(3 * targetHeight * targetWidth);
59
107
  }
60
108
  /** The `[width, height]` this pipeline letterboxes into. */
61
109
  get targetSize() {
@@ -68,7 +116,9 @@ export class LetterboxPipeline {
68
116
  * still checked out — {@link release} marks it free again. A second `run`
69
117
  * before the first is released allocates a fresh buffer rather than
70
118
  * corrupting it, so concurrent `predict()` calls on one task stay correct at
71
- * the cost of the allocation they were trying to avoid.
119
+ * the cost of the allocation they were trying to avoid. A buffer that was
120
+ * detached by a consumer that transferred it is replaced rather than written
121
+ * into — see {@link ReusableBuffer}.
72
122
  *
73
123
  * @param image Source image in the SDK's canonical HWC RGB layout.
74
124
  */
@@ -89,9 +139,7 @@ export class LetterboxPipeline {
89
139
  }
90
140
  context.drawImage(this._source, 0, 0, image.width, image.height, padLeft, padTop, scaledWidth, scaledHeight);
91
141
  const rgba = context.getImageData(0, 0, targetWidth, targetHeight).data;
92
- const reused = !this._bufferInUse;
93
- const data = reused ? this._buffer : new Float32Array(3 * targetHeight * targetWidth);
94
- this._bufferInUse = true;
142
+ const { data, reused } = this._buffer.claim();
95
143
  const plane = targetWidth * targetHeight;
96
144
  for (let pixel = 0, offset = 0; pixel < plane; pixel++, offset += 4) {
97
145
  data[pixel] = rgba[offset] * INV_255;
@@ -108,7 +156,7 @@ export class LetterboxPipeline {
108
156
  * the WASM heap and the buffer can be overwritten.
109
157
  */
110
158
  release() {
111
- this._bufferInUse = false;
159
+ this._buffer.release();
112
160
  }
113
161
  /**
114
162
  * Grow the scratch source canvas to fit an image, reusing it when possible.
@@ -127,6 +175,167 @@ export class LetterboxPipeline {
127
175
  return this._sourceContext;
128
176
  }
129
177
  }
178
+ /**
179
+ * Write an RGBA buffer as normalized planar float32.
180
+ *
181
+ * Shared by {@link ResizePipeline} and exported for a custom pipeline that
182
+ * already holds pixels and wants the SDK's exact arithmetic.
183
+ *
184
+ * The expression is `(value / 255 - mean) / std`, evaluated in that order on
185
+ * purpose: folding it into a single multiply-add (`value * k + b`) computes the
186
+ * same quantity but rounds differently, and the tasks' output is asserted to be
187
+ * bit-identical to the composable `normalize` → `toCHW` path.
188
+ *
189
+ * @param rgba Source pixels, 4 bytes per pixel, `width * height` long.
190
+ * @param width Image width in pixels.
191
+ * @param height Image height in pixels.
192
+ * @param mean Per-channel RGB mean, already in `[0, 1]`.
193
+ * @param std Per-channel RGB standard deviation.
194
+ * @param out Destination buffer, `3 * width * height` long.
195
+ * @param stride Bytes per source pixel: 4 for canvas RGBA, 3 for packed RGB.
196
+ */
197
+ export function writePlanarFloat32(rgba, width, height, mean, std, out, stride = 4) {
198
+ const plane = width * height;
199
+ const m0 = mean[0];
200
+ const m1 = mean[1];
201
+ const m2 = mean[2];
202
+ const s0 = std[0];
203
+ const s1 = std[1];
204
+ const s2 = std[2];
205
+ for (let pixel = 0, offset = 0; pixel < plane; pixel++, offset += stride) {
206
+ out[pixel] = (rgba[offset] * INV_255 - m0) / s0;
207
+ out[plane + pixel] = (rgba[offset + 1] * INV_255 - m1) / s1;
208
+ out[2 * plane + pixel] = (rgba[offset + 2] * INV_255 - m2) / s2;
209
+ }
210
+ }
211
+ /**
212
+ * Reusable stretch-resize → normalized tensor pipeline for one target size.
213
+ *
214
+ * The classification counterpart of {@link LetterboxPipeline}. A classifier
215
+ * stretches to the model's square input instead of letterboxing into it — no
216
+ * padding, no scale to invert later, because nothing is mapped back onto the
217
+ * source image afterwards. That difference is why it cannot simply reuse the
218
+ * letterbox path.
219
+ *
220
+ * What it does share is the technique. The composable route
221
+ * (`resize` → `normalize` → `toCHW`) allocates an `RGBImage` and two
222
+ * `Float32Array`s and walks each end to end on every call: about 1.4 MB of
223
+ * fresh garbage per 224×224 `predict()`, produced at the exact moment a phone
224
+ * near its memory ceiling can least afford it. Here one `drawImage` resizes,
225
+ * and one loop reads the resulting RGBA and writes normalized planar float32
226
+ * into a buffer held across calls.
227
+ *
228
+ * Create one per task, not per frame.
229
+ */
230
+ export class ResizePipeline {
231
+ _targetWidth;
232
+ _targetHeight;
233
+ _mean;
234
+ _std;
235
+ _buffer;
236
+ _target = null;
237
+ _targetContext = null;
238
+ _source = null;
239
+ _sourceContext = null;
240
+ /**
241
+ * @param targetWidth Model input width in pixels.
242
+ * @param targetHeight Model input height in pixels.
243
+ * @param mean Per-channel RGB mean in `[0, 1]`. Defaults to no shift.
244
+ * @param std Per-channel RGB standard deviation. Defaults to no scaling.
245
+ */
246
+ constructor(targetWidth, targetHeight, mean = [0, 0, 0], std = [1, 1, 1]) {
247
+ if (targetWidth <= 0 || targetHeight <= 0) {
248
+ throw new Error(`Invalid resize target ${targetWidth}x${targetHeight}.`);
249
+ }
250
+ this._targetWidth = targetWidth;
251
+ this._targetHeight = targetHeight;
252
+ this._mean = mean;
253
+ this._std = std;
254
+ this._buffer = new ReusableBuffer(3 * targetHeight * targetWidth);
255
+ }
256
+ /** The `[width, height]` this pipeline resizes into. */
257
+ get targetSize() {
258
+ return [this._targetWidth, this._targetHeight];
259
+ }
260
+ /**
261
+ * Resize an image to the target size and write it as normalized planar float32.
262
+ *
263
+ * An image that already arrives at the target size skips the canvas entirely
264
+ * and is read straight out of its packed RGB — which is both faster and what
265
+ * keeps the result identical to `resize()`, whose own fast path returns the
266
+ * input untouched.
267
+ *
268
+ * Buffer reuse follows {@link ReusableBuffer}: held across calls, replaced when
269
+ * a consumer detached it by transferring the tensor.
270
+ *
271
+ * @param image Source image in the SDK's canonical HWC RGB layout.
272
+ */
273
+ run(image) {
274
+ const targetWidth = this._targetWidth;
275
+ const targetHeight = this._targetHeight;
276
+ const { data, reused } = this._buffer.claim();
277
+ if (image.width === targetWidth && image.height === targetHeight) {
278
+ writePlanarFloat32(image.data, targetWidth, targetHeight, this._mean, this._std, data, 3);
279
+ return { data, reused };
280
+ }
281
+ const source = this._ensureSource(image.width, image.height);
282
+ source.putImageData(rgbToImageData(image), 0, 0);
283
+ const context = this._ensureTarget();
284
+ context.drawImage(this._source, 0, 0, targetWidth, targetHeight);
285
+ const rgba = context.getImageData(0, 0, targetWidth, targetHeight).data;
286
+ writePlanarFloat32(rgba, targetWidth, targetHeight, this._mean, this._std, data);
287
+ return { data, reused };
288
+ }
289
+ /**
290
+ * Mark the reusable buffer free again.
291
+ *
292
+ * Call it once the tensor built from a {@link run} result has been handed to
293
+ * ONNX Runtime and the run has resolved — after that the values are inside
294
+ * the WASM heap and the buffer can be overwritten.
295
+ */
296
+ release() {
297
+ this._buffer.release();
298
+ }
299
+ /**
300
+ * Build the target canvas on first use.
301
+ *
302
+ * Lazily, so a pipeline constructed where no canvas implementation exists
303
+ * (a Node test, a worker without OffscreenCanvas) only fails if it is asked
304
+ * to resize something.
305
+ */
306
+ _ensureTarget() {
307
+ if (this._target === null) {
308
+ this._target = createCanvas(this._targetWidth, this._targetHeight);
309
+ this._targetContext = get2DContext(this._target, { willReadFrequently: true });
310
+ this._targetContext.imageSmoothingEnabled = true;
311
+ this._targetContext.imageSmoothingQuality = "high";
312
+ }
313
+ return this._targetContext;
314
+ }
315
+ /** Grow the scratch source canvas to fit an image, reusing it when possible. */
316
+ _ensureSource(width, height) {
317
+ if (this._source === null || this._source.width !== width || this._source.height !== height) {
318
+ this._source = createCanvas(width, height);
319
+ this._sourceContext = get2DContext(this._source);
320
+ }
321
+ return this._sourceContext;
322
+ }
323
+ }
324
+ /**
325
+ * Resize an image into normalized planar float32 without keeping any state.
326
+ *
327
+ * The allocation-free path is {@link ResizePipeline}; this is the one-shot
328
+ * form, for a caller who wants the fused behaviour without owning a pipeline.
329
+ *
330
+ * @param image Source image in the SDK's canonical HWC RGB layout.
331
+ * @param targetWidth Model input width in pixels.
332
+ * @param targetHeight Model input height in pixels.
333
+ * @param mean Per-channel RGB mean in `[0, 1]`. Defaults to no shift.
334
+ * @param std Per-channel RGB standard deviation. Defaults to no scaling.
335
+ */
336
+ export function resizeToTensorData(image, targetWidth, targetHeight, mean = [0, 0, 0], std = [1, 1, 1]) {
337
+ return new ResizePipeline(targetWidth, targetHeight, mean, std).run(image);
338
+ }
130
339
  /**
131
340
  * Build a zero-filled CHW tensor payload for a warm-up run.
132
341
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/preprocess/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/preprocess/pipeline.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,28 @@ export declare class Classifier extends VisionTask {
79
79
  private readonly _std;
80
80
  private readonly _applySoftmax;
81
81
  private constructor();
82
+ private _pipelineCache;
83
+ /**
84
+ * Run the model once on a zero tensor, paying one-time costs up front.
85
+ *
86
+ * The first inference of a session is not representative: WebGPU compiles its
87
+ * shaders on it and the WASM backend faults in its arenas. Calling this while
88
+ * a loading spinner is still up moves that cost somewhere the user is already
89
+ * waiting — which matters most for a classifier running as the last step of
90
+ * an on-device analysis, where the delay lands right before the answer shows.
91
+ *
92
+ * @param runs How many warm-up inferences to run. One is enough for WASM;
93
+ * WebGPU sometimes settles on the second.
94
+ */
95
+ warmup(runs?: number): Promise<void>;
96
+ /**
97
+ * The fused preprocessing pipeline, built on first use.
98
+ *
99
+ * Lazily, because constructing it reserves the output buffer: a task built in
100
+ * an environment without a canvas implementation stays constructible, and only
101
+ * fails if it is actually asked to preprocess something.
102
+ */
103
+ private get _pipeline();
82
104
  /** Load the model and resolve labels. */
83
105
  static create(model: ModelSource, options?: ClassifierOptions): Promise<Classifier>;
84
106
  /** Class labels indexed by class id. */
@@ -1 +1 @@
1
- {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/tasks/classifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAc,MAAM,oBAAoB,CAAC;AAE1F,OAAO,EAAE,KAAK,UAAU,EAAa,MAAM,gBAAgB,CAAC;AAG5D,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,cAAc,CAAC;AAQ7D,OAAO,EAAE,qBAAqB,EAAS,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAUvC,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,UAAW,SAAQ,UAAU;IAGtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAPhC,OAAO;IAYP,yCAAyC;WAC5B,MAAM,CACjB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC;IA0BtB,wCAAwC;IACxC,IAAI,MAAM,IAAI,SAAS,MAAM,EAAE,CAE9B;IAED,uEAAuE;IACvE,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAE5C;IAED;;;;;;OAMG;IACH,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzC;IAED,+CAA+C;IAC/C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,4EAA4E;IACtE,IAAI,CACR,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAInC,4CAA4C;IACtC,OAAO,CACX,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAiEnC,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/tasks/classifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAc,MAAM,oBAAoB,CAAC;AAE1F,OAAO,EAAE,KAAK,UAAU,EAAa,MAAM,gBAAgB,CAAC;AAG5D,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,cAAc,CAAC;AAI7D,OAAO,EAAE,qBAAqB,EAAS,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAUvC,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,UAAW,SAAQ,UAAU;IAGtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAPhC,OAAO;IAYP,OAAO,CAAC,cAAc,CAA+B;IAErD;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C;;;;;;OAMG;IACH,OAAO,KAAK,SAAS,GAMpB;IAED,yCAAyC;WAC5B,MAAM,CACjB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,CAAC;IA0BtB,wCAAwC;IACxC,IAAI,MAAM,IAAI,SAAS,MAAM,EAAE,CAE9B;IAED,uEAAuE;IACvE,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAE5C;IAED;;;;;;OAMG;IACH,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzC;IAED,+CAA+C;IAC/C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,4EAA4E;IACtE,IAAI,CACR,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAInC,4CAA4C;IACtC,OAAO,CACX,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAkEnC,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;CAGrB"}
@@ -8,7 +8,8 @@ import { classificationNumClasses, resolveInputSize } from "../core/graph.js";
8
8
  import { modelNames } from "../core/metadata.js";
9
9
  import { resolveLabels } from "../labels.js";
10
10
  import { softmax, topK } from "../postprocess/classification.js";
11
- import { normalize, resize, toCHW, toFloat32Tensor, } from "../preprocess/image.js";
11
+ import { toFloat32Tensor } from "../preprocess/image.js";
12
+ import { ResizePipeline, zeroTensorData } from "../preprocess/pipeline.js";
12
13
  import { ClassificationResults, Probs } from "../results.js";
13
14
  import { VisionTask } from "./base.js";
14
15
  const IMAGENET_MEAN = [0.485, 0.456, 0.406];
@@ -50,6 +51,40 @@ export class Classifier extends VisionTask {
50
51
  this._std = _std;
51
52
  this._applySoftmax = _applySoftmax;
52
53
  }
54
+ _pipelineCache = null;
55
+ /**
56
+ * Run the model once on a zero tensor, paying one-time costs up front.
57
+ *
58
+ * The first inference of a session is not representative: WebGPU compiles its
59
+ * shaders on it and the WASM backend faults in its arenas. Calling this while
60
+ * a loading spinner is still up moves that cost somewhere the user is already
61
+ * waiting — which matters most for a classifier running as the last step of
62
+ * an on-device analysis, where the delay lands right before the answer shows.
63
+ *
64
+ * @param runs How many warm-up inferences to run. One is enough for WASM;
65
+ * WebGPU sometimes settles on the second.
66
+ */
67
+ async warmup(runs = 1) {
68
+ const [tw, th] = this._inputSize;
69
+ for (let i = 0; i < runs; i++) {
70
+ const tensor = toFloat32Tensor(zeroTensorData(tw, th), [1, 3, th, tw]);
71
+ await this._session.run({ [this._session.inputName]: tensor });
72
+ }
73
+ }
74
+ /**
75
+ * The fused preprocessing pipeline, built on first use.
76
+ *
77
+ * Lazily, because constructing it reserves the output buffer: a task built in
78
+ * an environment without a canvas implementation stays constructible, and only
79
+ * fails if it is actually asked to preprocess something.
80
+ */
81
+ get _pipeline() {
82
+ if (this._pipelineCache === null) {
83
+ const [tw, th] = this._inputSize;
84
+ this._pipelineCache = new ResizePipeline(tw, th, this._mean, this._std);
85
+ }
86
+ return this._pipelineCache;
87
+ }
53
88
  /** Load the model and resolve labels. */
54
89
  static async create(model, options = {}) {
55
90
  const session = await OrtSession.create(model, options);
@@ -102,6 +137,7 @@ export class Classifier extends VisionTask {
102
137
  const tensor = this._preprocess(original);
103
138
  timer.stage("preprocess");
104
139
  const outputs = await this._session.run({ [this._session.inputName]: tensor });
140
+ this._pipeline.release();
105
141
  timer.stage("inference");
106
142
  const firstOutputName = this._session.outputNames[0];
107
143
  if (firstOutputName === undefined) {
@@ -149,10 +185,8 @@ export class Classifier extends VisionTask {
149
185
  }
150
186
  _preprocess(image) {
151
187
  const [tw, th] = this._inputSize;
152
- const resized = resize(image, tw, th);
153
- const normalized = normalize(resized, this._mean, this._std);
154
- const chw = toCHW(normalized, resized.width, resized.height, 3);
155
- return toFloat32Tensor(chw, [1, 3, resized.height, resized.width]);
188
+ const { data } = this._pipeline.run(image);
189
+ return toFloat32Tensor(data, [1, 3, th, tw]);
156
190
  }
157
191
  _postprocess(raw) {
158
192
  return this._applySoftmax ? softmax(raw) : new Float32Array(raw);
@@ -1 +1 @@
1
- {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/tasks/classifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/tasks/classifier.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mauriciobenjamin700/ort-vision-sdk-web",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "description": "High-level TypeScript SDK for browser computer vision inference with ONNX Runtime Web.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",