@jax-data-science/sci-image-visualizer 0.3.2 → 0.4.0
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 +215 -11
- package/esm2022/index.mjs +20 -1
- package/esm2022/lib/contracts/display-types.mjs +20 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +36 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
- package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +5 -3
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
- package/esm2022/lib/routing-visualizer.service.mjs +223 -12
- package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
- package/esm2022/lib/spatial/gene-search.mjs +77 -0
- package/esm2022/lib/spatial/spatial-density.mjs +224 -0
- package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
- package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
- package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
- package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
- package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
- package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
- package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
- package/esm2022/lib/spatial/world-grid.mjs +77 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
- package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
- package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +2 -2
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +9 -9
- package/esm2022/lib/toolbar/toolbar.component.mjs +30 -7
- package/esm2022/lib/visualization.module.mjs +23 -5
- package/esm2022/lib/visualizer.component.mjs +283 -22
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15282 -7829
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/tsne.worker.js +19091 -0
- package/index.d.ts +15 -0
- package/lib/contracts/display-types.d.ts +131 -0
- package/lib/contracts/image.contract.d.ts +7 -0
- package/lib/contracts/plot-type.d.ts +42 -2
- package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
- package/lib/contracts/visualizer.contract.d.ts +99 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
- package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
- package/lib/implementations/osd/osd-zoom.d.ts +19 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
- package/lib/implementations/plotly/plotly.service.d.ts +9 -0
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
- package/lib/routing-visualizer.service.d.ts +45 -6
- package/lib/spatial/embedding-compute.d.ts +73 -0
- package/lib/spatial/gene-search.d.ts +48 -0
- package/lib/spatial/spatial-density.d.ts +73 -0
- package/lib/spatial/spatial-encoding.d.ts +155 -0
- package/lib/spatial/spatial-expression.d.ts +144 -0
- package/lib/spatial/spatial-framing.d.ts +37 -0
- package/lib/spatial/spatial-heatmap.d.ts +111 -0
- package/lib/spatial/spatial-hover.d.ts +49 -0
- package/lib/spatial/spatial-sections.d.ts +59 -0
- package/lib/spatial/spatial-selection.d.ts +113 -0
- package/lib/spatial/spatial-volume-image.d.ts +67 -0
- package/lib/spatial/tsne-worker.d.ts +7 -0
- package/lib/spatial/world-grid.d.ts +58 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
- package/lib/store/spatial-selection.service.d.ts +27 -0
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/lib/toolbar/toolbar.component.d.ts +19 -3
- package/lib/visualization.module.d.ts +28 -24
- package/lib/visualizer.component.d.ts +73 -2
- package/package.json +7 -3
- package/src/lib/assets/spatial-omics-3d.svg +31 -0
- package/src/lib/assets/spatial-omics.svg +27 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import * as ort from 'onnxruntime-web';
|
|
2
2
|
import { getOrtWasmBase } from './jax-data-science-sci-image-visualizer.mjs';
|
|
3
3
|
import '@angular/core';
|
|
4
|
+
import '@angular/common/http';
|
|
5
|
+
import 'rxjs';
|
|
6
|
+
import 'rxjs/operators';
|
|
4
7
|
import '@angular/common';
|
|
5
8
|
import '@angular/forms';
|
|
6
9
|
import 'primeng/toolbar';
|
|
@@ -22,13 +25,12 @@ import 'primeng/overlaypanel';
|
|
|
22
25
|
import 'primeng/confirmdialog';
|
|
23
26
|
import 'primeng/inputtext';
|
|
24
27
|
import 'primeng/checkbox';
|
|
28
|
+
import 'primeng/multiselect';
|
|
25
29
|
import 'primeng/radiobutton';
|
|
26
30
|
import 'primeng/selectbutton';
|
|
27
|
-
import '
|
|
28
|
-
import 'rxjs/operators';
|
|
31
|
+
import 'primeng/autocomplete';
|
|
29
32
|
import 'primeng/api';
|
|
30
33
|
import 'file-saver';
|
|
31
|
-
import '@angular/common/http';
|
|
32
34
|
import 'plotly.js-dist-min';
|
|
33
35
|
import 'image-js';
|
|
34
36
|
import 'buffer';
|
|
@@ -324,4 +326,4 @@ class OnnxSamSession {
|
|
|
324
326
|
}
|
|
325
327
|
|
|
326
328
|
export { OnnxSamSession };
|
|
327
|
-
//# sourceMappingURL=jax-data-science-sci-image-visualizer-onnx-sam-session-
|
|
329
|
+
//# sourceMappingURL=jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs","sources":["../../src/lib/toolbar/segmentation/sam-onnx-core.ts","../../src/lib/toolbar/segmentation/onnx-sam-session.ts"],"sourcesContent":["import * as ort from 'onnxruntime-web';\n\nimport type { SamPrompt } from '../../contracts/sam.contract';\n\n/**\n * Shared, DOM-free SAM inference primitives used by BOTH inference backends:\n * the in-process session (`OnnxSamSession`, main thread) and the dedicated\n * Web Worker (`onnx-sam.worker`). Keeping these here avoids duplicating the\n * preprocessing / decoder-prompt math and keeps the worker DOM-free (it can't\n * import sam-prompt.ts, which pulls in DOM types).\n */\n\nexport const PIXEL_MEAN = [123.675, 116.28, 103.53];\nexport const PIXEL_STD = [58.395, 57.12, 57.375];\nconst MODEL_CACHE = 'sam-onnx';\n\n/** Encoder output for one image, reused across prompts. */\nexport interface CoreEmbedding {\n data: Float32Array;\n dims: number[];\n scale: number;\n imageWidth: number;\n imageHeight: number;\n}\n\n/** Decoder output: a binary mask at original-image resolution. */\nexport interface CoreMask {\n mask: Uint8Array;\n width: number;\n height: number;\n iou: number;\n}\n\n/** Fetch a model as an ArrayBuffer, streaming progress and caching in the Cache\n * API (so it isn't re-downloaded). Cache hit → progress jumps to 1. Works on\n * the main thread and in a worker (both have `fetch` + `caches`). */\nexport async function fetchModel(url: string, onProgress?: (f: number) => void): Promise<ArrayBuffer> {\n const cache = typeof caches !== 'undefined' ? await caches.open(MODEL_CACHE).catch(() => null) : null;\n const hit = cache ? await cache.match(url) : null;\n if (hit) { onProgress?.(1); return await hit.arrayBuffer(); }\n\n const resp = await fetch(url);\n if (!resp.ok) throw new Error(`fetch ${url} failed: HTTP ${resp.status}`);\n const total = Number(resp.headers.get('content-length')) || 0;\n if (!resp.body || !total) {\n const buf = await resp.arrayBuffer();\n onProgress?.(1);\n if (cache) await cache.put(url, new Response(buf)).catch(() => undefined);\n return buf;\n }\n const reader = resp.body.getReader();\n const chunks: Uint8Array[] = [];\n let received = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n received += value.length;\n onProgress?.(received / total);\n }\n const out = new Uint8Array(received);\n let off = 0;\n for (const c of chunks) { out.set(c, off); off += c.length; }\n if (cache) {\n await cache.put(url, new Response(out.slice(), { headers: { 'content-length': String(received) } }))\n .catch(() => undefined);\n }\n onProgress?.(1);\n return out.buffer;\n}\n\n/** Resize (long side → size, bilinear), pad to size×size, SAM-normalize → CHW float32. */\nexport function preprocess(\n data: Uint8ClampedArray, width: number, height: number, size: number, scale: number,\n): Float32Array {\n const newW = Math.round(width * scale);\n const newH = Math.round(height * scale);\n const chw = new Float32Array(3 * size * size); // zero-padded\n for (let y = 0; y < newH; y++) {\n const sy = Math.min(height - 1, y / scale);\n const y0 = Math.floor(sy);\n const fy = sy - y0;\n const y1 = Math.min(height - 1, y0 + 1);\n for (let x = 0; x < newW; x++) {\n const sx = Math.min(width - 1, x / scale);\n const x0 = Math.floor(sx);\n const fx = sx - x0;\n const x1 = Math.min(width - 1, x0 + 1);\n for (let c = 0; c < 3; c++) {\n const p00 = data[(y0 * width + x0) * 4 + c];\n const p01 = data[(y0 * width + x1) * 4 + c];\n const p10 = data[(y1 * width + x0) * 4 + c];\n const p11 = data[(y1 * width + x1) * 4 + c];\n const top = p00 + (p01 - p00) * fx;\n const bot = p10 + (p11 - p10) * fx;\n const v = top + (bot - top) * fy;\n chw[c * size * size + y * size + x] = (v - PIXEL_MEAN[c]) / PIXEL_STD[c];\n }\n }\n }\n return chw;\n}\n\n/** Assemble decoder `point_coords`/`point_labels` from a prompt, in encoder\n * (resized) space. Box = two points labelled 2/3; points use 1/0; a points-only\n * prompt pads the absent box slot with `[0,0]` labelled -1. */\nexport function buildDecoderPrompt(\n prompt: SamPrompt, scale: number,\n): { pointCoords: Float32Array; pointLabels: Float32Array; numPoints: number } {\n const coords: number[] = [];\n const labels: number[] = [];\n for (const p of prompt.points ?? []) { coords.push(p.x * scale, p.y * scale); labels.push(p.label); }\n if (prompt.box) {\n const b = prompt.box;\n coords.push(b.x0 * scale, b.y0 * scale); labels.push(2);\n coords.push(b.x1 * scale, b.y1 * scale); labels.push(3);\n } else if (labels.length > 0) {\n coords.push(0, 0); labels.push(-1);\n }\n return {\n pointCoords: Float32Array.from(coords),\n pointLabels: Float32Array.from(labels),\n numPoints: labels.length,\n };\n}\n\n/** Binarize mask logits (`> threshold`) into a 0/1 mask. */\nexport function binarizeMask(logits: Float32Array, threshold = 0): Uint8Array {\n const out = new Uint8Array(logits.length);\n for (let i = 0; i < logits.length; i++) out[i] = logits[i] > threshold ? 1 : 0;\n return out;\n}\n\n/** Index of the highest-scoring mask in a multimask decoder output. */\nexport function bestMaskIndex(iou: Float32Array | number[]): number {\n let best = 0;\n for (let i = 1; i < iou.length; i++) if (iou[i] > iou[best]) best = i;\n return best;\n}\n\n/** Run the encoder on an RGBA image → a reusable embedding. */\nexport async function runEncoder(\n encoder: ort.InferenceSession, data: Uint8ClampedArray, width: number, height: number, inputSize: number,\n): Promise<CoreEmbedding> {\n const scale = inputSize / Math.max(width, height);\n const input = preprocess(data, width, height, inputSize, scale);\n const out = await encoder.run({\n [encoder.inputNames[0]]: new ort.Tensor('float32', input, [1, 3, inputSize, inputSize]),\n });\n const emb = out[encoder.outputNames[0]];\n return {\n data: emb.data as Float32Array, dims: emb.dims as number[],\n scale, imageWidth: width, imageHeight: height,\n };\n}\n\n/** Run the decoder for one prompt against a cached embedding → a binary mask. */\nexport async function runDecoder(\n decoder: ort.InferenceSession, e: CoreEmbedding, prompt: SamPrompt,\n): Promise<CoreMask> {\n const { pointCoords, pointLabels, numPoints } = buildDecoderPrompt(prompt, e.scale);\n const out = await decoder.run({\n image_embeddings: new ort.Tensor('float32', e.data, e.dims),\n point_coords: new ort.Tensor('float32', pointCoords, [1, numPoints, 2]),\n point_labels: new ort.Tensor('float32', pointLabels, [1, numPoints]),\n mask_input: new ort.Tensor('float32', new Float32Array(256 * 256), [1, 1, 256, 256]),\n has_mask_input: new ort.Tensor('float32', Float32Array.from([0]), [1]),\n orig_im_size: new ort.Tensor('float32', Float32Array.from([e.imageHeight, e.imageWidth]), [2]),\n });\n const masks = out['masks'] ?? out[decoder.outputNames[0]];\n const iou = (out['iou_predictions']?.data as Float32Array) ?? Float32Array.from([1]);\n const [, m, h, w] = masks.dims as number[];\n const idx = bestMaskIndex(iou.slice(0, m));\n const logits = (masks.data as Float32Array).subarray(idx * h * w, (idx + 1) * h * w);\n return { mask: binarizeMask(logits), width: w, height: h, iou: iou[idx] ?? 1 };\n}\n","import * as ort from 'onnxruntime-web';\n\nimport {\n ISamSession, SamEmbedding, SamMaskResult, SamModelDef, SamPrompt,\n} from '../../contracts/sam.contract';\nimport { fetchModel, runEncoder, runDecoder, type CoreEmbedding } from './sam-onnx-core';\nimport { getOrtWasmBase } from './ort-runtime-config';\n\n/**\n * onnxruntime-web implementation of {@link ISamSession} (jit-ui#90), with two\n * execution modes chosen per model:\n *\n * - **in-process** (main thread) — for small WASM models flagged `inProcess`\n * (e.g. micro-sam ViT-T). Fast load + inference with no Web Worker spawn /\n * second ORT runtime / message round-trips; the brief encode runs on the main\n * thread (fine for a tiny model).\n * - **worker** — for WebGPU models (e.g. ViT-B, patho-sam fp16) whose heavy\n * encode would otherwise freeze the tab. Runs in {@link ./onnx-sam.worker} so\n * the UI stays responsive (the spinner animates).\n *\n * Both modes share their inference math via {@link ./sam-onnx-core}. Lazy-imported\n * by the SAM tools so onnxruntime-web / the worker never load in unit tests or\n * the initial bundle.\n */\ntype Pending = {\n resolve: (msg: any) => void;\n reject: (err: Error) => void;\n onProgress?: (fraction: number) => void;\n};\n\nexport class OnnxSamSession implements ISamSession {\n private mode: 'inproc' | 'worker' | null = null;\n private loaded = false;\n private model: SamModelDef | null = null;\n private inputSize = 1024;\n\n // ── worker mode ──\n private worker: Worker | null = null;\n private seq = 0;\n private readonly pending = new Map<number, Pending>();\n\n // ── in-process mode ──\n private encoder: ort.InferenceSession | null = null;\n private decoder: ort.InferenceSession | null = null;\n private nextToken = 1;\n private readonly embeddings = new Map<number, CoreEmbedding>();\n\n async loadModel(model: SamModelDef, onProgress?: (fraction: number) => void): Promise<void> {\n if (!model.encoderUrl || !model.decoderUrl) {\n throw new Error(`SAM model \"${model.id}\" has no ONNX URLs configured.`);\n }\n this.model = model;\n this.inputSize = model.inputSize;\n const hasGpu = typeof navigator !== 'undefined' && 'gpu' in navigator;\n const eps: string[] = model.encoderProviders ?? (hasGpu ? ['webgpu', 'wasm'] : ['wasm']);\n const usesWebGpu = eps.includes('webgpu');\n // WebGPU must run in the worker (else it freezes the main thread); small\n // WASM models opt into the faster in-process path via `inProcess`.\n this.mode = !usesWebGpu && model.inProcess ? 'inproc' : 'worker';\n\n if (this.mode === 'inproc') {\n ort.env.wasm.wasmPaths = getOrtWasmBase();\n const encBuf = await fetchModel(model.encoderUrl, onProgress);\n const decBuf = await fetchModel(model.decoderUrl);\n this.encoder = await ort.InferenceSession.create(encBuf, { executionProviders: eps });\n this.decoder = await ort.InferenceSession.create(decBuf, { executionProviders: ['wasm'] });\n } else {\n await this.call({\n type: 'load',\n encoderUrl: model.encoderUrl,\n decoderUrl: model.decoderUrl,\n wasmPaths: getOrtWasmBase(),\n inputSize: model.inputSize,\n encoderProviders: model.encoderProviders,\n }, [], onProgress);\n }\n this.loaded = true;\n }\n\n isLoaded(): boolean {\n return this.loaded;\n }\n\n async embed(image: { data: Uint8ClampedArray; width: number; height: number }): Promise<SamEmbedding> {\n if (this.mode === 'inproc') {\n const e = await runEncoder(this.encoder!, image.data, image.width, image.height, this.inputSize);\n const token = this.nextToken++;\n this.embeddings.set(token, e);\n if (this.embeddings.size > 3) this.embeddings.delete(this.embeddings.keys().next().value as number);\n return {\n data: new Float32Array(0), dims: e.dims, scale: e.scale,\n imageWidth: e.imageWidth, imageHeight: e.imageHeight, token,\n };\n }\n // worker: transfer the RGBA buffer (callers pass a fresh frame buffer).\n const buffer = image.data.buffer;\n const res = await this.call({ type: 'embed', width: image.width, height: image.height, buffer }, [buffer]);\n return {\n data: new Float32Array(0), dims: res.dims, scale: res.scale,\n imageWidth: res.imageWidth, imageHeight: res.imageHeight, token: res.token,\n };\n }\n\n async decode(embedding: SamEmbedding, prompt: SamPrompt): Promise<SamMaskResult> {\n if (this.mode === 'inproc') {\n const e = this.embeddings.get(embedding.token as number);\n if (!e) throw new Error('SAM embedding expired; re-encode the image.');\n return runDecoder(this.decoder!, e, prompt);\n }\n const res = await this.call({ type: 'decode', token: embedding.token, prompt });\n return { mask: new Uint8Array(res.buffer), width: res.width, height: res.height, iou: res.iou };\n }\n\n dispose(): void {\n this.worker?.terminate();\n this.worker = null;\n this.pending.clear();\n this.encoder?.release?.();\n this.decoder?.release?.();\n this.encoder = this.decoder = null;\n this.embeddings.clear();\n this.loaded = false;\n this.mode = null;\n }\n\n // ── worker plumbing ──────────────────────────────────────────────────────\n private ensureWorker(): Worker {\n if (this.worker) return this.worker;\n const worker = new Worker(new URL('./onnx-sam.worker', import.meta.url), { type: 'module' });\n worker.onmessage = (ev: MessageEvent) => {\n const m = ev.data;\n const p = this.pending.get(m.id);\n if (!p) return;\n if (m.type === 'progress') { p.onProgress?.(m.fraction); return; }\n this.pending.delete(m.id);\n if (m.type === 'error') p.reject(new Error(m.error));\n else p.resolve(m);\n };\n worker.onerror = (ev: ErrorEvent) => {\n const err = new Error(ev.message || 'SAM worker crashed.');\n for (const p of this.pending.values()) p.reject(err);\n this.pending.clear();\n };\n this.worker = worker;\n return worker;\n }\n\n private call(msg: any, transfer: Transferable[] = [], onProgress?: (f: number) => void): Promise<any> {\n const id = ++this.seq;\n const worker = this.ensureWorker();\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, onProgress });\n worker.postMessage({ ...msg, id }, transfer);\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs","sources":["../../src/lib/toolbar/segmentation/sam-onnx-core.ts","../../src/lib/toolbar/segmentation/onnx-sam-session.ts"],"sourcesContent":["import * as ort from 'onnxruntime-web';\n\nimport type { SamPrompt } from '../../contracts/sam.contract';\n\n/**\n * Shared, DOM-free SAM inference primitives used by BOTH inference backends:\n * the in-process session (`OnnxSamSession`, main thread) and the dedicated\n * Web Worker (`onnx-sam.worker`). Keeping these here avoids duplicating the\n * preprocessing / decoder-prompt math and keeps the worker DOM-free (it can't\n * import sam-prompt.ts, which pulls in DOM types).\n */\n\nexport const PIXEL_MEAN = [123.675, 116.28, 103.53];\nexport const PIXEL_STD = [58.395, 57.12, 57.375];\nconst MODEL_CACHE = 'sam-onnx';\n\n/** Encoder output for one image, reused across prompts. */\nexport interface CoreEmbedding {\n data: Float32Array;\n dims: number[];\n scale: number;\n imageWidth: number;\n imageHeight: number;\n}\n\n/** Decoder output: a binary mask at original-image resolution. */\nexport interface CoreMask {\n mask: Uint8Array;\n width: number;\n height: number;\n iou: number;\n}\n\n/** Fetch a model as an ArrayBuffer, streaming progress and caching in the Cache\n * API (so it isn't re-downloaded). Cache hit → progress jumps to 1. Works on\n * the main thread and in a worker (both have `fetch` + `caches`). */\nexport async function fetchModel(url: string, onProgress?: (f: number) => void): Promise<ArrayBuffer> {\n const cache = typeof caches !== 'undefined' ? await caches.open(MODEL_CACHE).catch(() => null) : null;\n const hit = cache ? await cache.match(url) : null;\n if (hit) { onProgress?.(1); return await hit.arrayBuffer(); }\n\n const resp = await fetch(url);\n if (!resp.ok) throw new Error(`fetch ${url} failed: HTTP ${resp.status}`);\n const total = Number(resp.headers.get('content-length')) || 0;\n if (!resp.body || !total) {\n const buf = await resp.arrayBuffer();\n onProgress?.(1);\n if (cache) await cache.put(url, new Response(buf)).catch(() => undefined);\n return buf;\n }\n const reader = resp.body.getReader();\n const chunks: Uint8Array[] = [];\n let received = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n received += value.length;\n onProgress?.(received / total);\n }\n const out = new Uint8Array(received);\n let off = 0;\n for (const c of chunks) { out.set(c, off); off += c.length; }\n if (cache) {\n await cache.put(url, new Response(out.slice(), { headers: { 'content-length': String(received) } }))\n .catch(() => undefined);\n }\n onProgress?.(1);\n return out.buffer;\n}\n\n/** Resize (long side → size, bilinear), pad to size×size, SAM-normalize → CHW float32. */\nexport function preprocess(\n data: Uint8ClampedArray, width: number, height: number, size: number, scale: number,\n): Float32Array {\n const newW = Math.round(width * scale);\n const newH = Math.round(height * scale);\n const chw = new Float32Array(3 * size * size); // zero-padded\n for (let y = 0; y < newH; y++) {\n const sy = Math.min(height - 1, y / scale);\n const y0 = Math.floor(sy);\n const fy = sy - y0;\n const y1 = Math.min(height - 1, y0 + 1);\n for (let x = 0; x < newW; x++) {\n const sx = Math.min(width - 1, x / scale);\n const x0 = Math.floor(sx);\n const fx = sx - x0;\n const x1 = Math.min(width - 1, x0 + 1);\n for (let c = 0; c < 3; c++) {\n const p00 = data[(y0 * width + x0) * 4 + c];\n const p01 = data[(y0 * width + x1) * 4 + c];\n const p10 = data[(y1 * width + x0) * 4 + c];\n const p11 = data[(y1 * width + x1) * 4 + c];\n const top = p00 + (p01 - p00) * fx;\n const bot = p10 + (p11 - p10) * fx;\n const v = top + (bot - top) * fy;\n chw[c * size * size + y * size + x] = (v - PIXEL_MEAN[c]) / PIXEL_STD[c];\n }\n }\n }\n return chw;\n}\n\n/** Assemble decoder `point_coords`/`point_labels` from a prompt, in encoder\n * (resized) space. Box = two points labelled 2/3; points use 1/0; a points-only\n * prompt pads the absent box slot with `[0,0]` labelled -1. */\nexport function buildDecoderPrompt(\n prompt: SamPrompt, scale: number,\n): { pointCoords: Float32Array; pointLabels: Float32Array; numPoints: number } {\n const coords: number[] = [];\n const labels: number[] = [];\n for (const p of prompt.points ?? []) { coords.push(p.x * scale, p.y * scale); labels.push(p.label); }\n if (prompt.box) {\n const b = prompt.box;\n coords.push(b.x0 * scale, b.y0 * scale); labels.push(2);\n coords.push(b.x1 * scale, b.y1 * scale); labels.push(3);\n } else if (labels.length > 0) {\n coords.push(0, 0); labels.push(-1);\n }\n return {\n pointCoords: Float32Array.from(coords),\n pointLabels: Float32Array.from(labels),\n numPoints: labels.length,\n };\n}\n\n/** Binarize mask logits (`> threshold`) into a 0/1 mask. */\nexport function binarizeMask(logits: Float32Array, threshold = 0): Uint8Array {\n const out = new Uint8Array(logits.length);\n for (let i = 0; i < logits.length; i++) out[i] = logits[i] > threshold ? 1 : 0;\n return out;\n}\n\n/** Index of the highest-scoring mask in a multimask decoder output. */\nexport function bestMaskIndex(iou: Float32Array | number[]): number {\n let best = 0;\n for (let i = 1; i < iou.length; i++) if (iou[i] > iou[best]) best = i;\n return best;\n}\n\n/** Run the encoder on an RGBA image → a reusable embedding. */\nexport async function runEncoder(\n encoder: ort.InferenceSession, data: Uint8ClampedArray, width: number, height: number, inputSize: number,\n): Promise<CoreEmbedding> {\n const scale = inputSize / Math.max(width, height);\n const input = preprocess(data, width, height, inputSize, scale);\n const out = await encoder.run({\n [encoder.inputNames[0]]: new ort.Tensor('float32', input, [1, 3, inputSize, inputSize]),\n });\n const emb = out[encoder.outputNames[0]];\n return {\n data: emb.data as Float32Array, dims: emb.dims as number[],\n scale, imageWidth: width, imageHeight: height,\n };\n}\n\n/** Run the decoder for one prompt against a cached embedding → a binary mask. */\nexport async function runDecoder(\n decoder: ort.InferenceSession, e: CoreEmbedding, prompt: SamPrompt,\n): Promise<CoreMask> {\n const { pointCoords, pointLabels, numPoints } = buildDecoderPrompt(prompt, e.scale);\n const out = await decoder.run({\n image_embeddings: new ort.Tensor('float32', e.data, e.dims),\n point_coords: new ort.Tensor('float32', pointCoords, [1, numPoints, 2]),\n point_labels: new ort.Tensor('float32', pointLabels, [1, numPoints]),\n mask_input: new ort.Tensor('float32', new Float32Array(256 * 256), [1, 1, 256, 256]),\n has_mask_input: new ort.Tensor('float32', Float32Array.from([0]), [1]),\n orig_im_size: new ort.Tensor('float32', Float32Array.from([e.imageHeight, e.imageWidth]), [2]),\n });\n const masks = out['masks'] ?? out[decoder.outputNames[0]];\n const iou = (out['iou_predictions']?.data as Float32Array) ?? Float32Array.from([1]);\n const [, m, h, w] = masks.dims as number[];\n const idx = bestMaskIndex(iou.slice(0, m));\n const logits = (masks.data as Float32Array).subarray(idx * h * w, (idx + 1) * h * w);\n return { mask: binarizeMask(logits), width: w, height: h, iou: iou[idx] ?? 1 };\n}\n","import * as ort from 'onnxruntime-web';\n\nimport {\n ISamSession, SamEmbedding, SamMaskResult, SamModelDef, SamPrompt,\n} from '../../contracts/sam.contract';\nimport { fetchModel, runEncoder, runDecoder, type CoreEmbedding } from './sam-onnx-core';\nimport { getOrtWasmBase } from './ort-runtime-config';\n\n/**\n * onnxruntime-web implementation of {@link ISamSession} (jit-ui#90), with two\n * execution modes chosen per model:\n *\n * - **in-process** (main thread) — for small WASM models flagged `inProcess`\n * (e.g. micro-sam ViT-T). Fast load + inference with no Web Worker spawn /\n * second ORT runtime / message round-trips; the brief encode runs on the main\n * thread (fine for a tiny model).\n * - **worker** — for WebGPU models (e.g. ViT-B, patho-sam fp16) whose heavy\n * encode would otherwise freeze the tab. Runs in {@link ./onnx-sam.worker} so\n * the UI stays responsive (the spinner animates).\n *\n * Both modes share their inference math via {@link ./sam-onnx-core}. Lazy-imported\n * by the SAM tools so onnxruntime-web / the worker never load in unit tests or\n * the initial bundle.\n */\ntype Pending = {\n resolve: (msg: any) => void;\n reject: (err: Error) => void;\n onProgress?: (fraction: number) => void;\n};\n\nexport class OnnxSamSession implements ISamSession {\n private mode: 'inproc' | 'worker' | null = null;\n private loaded = false;\n private model: SamModelDef | null = null;\n private inputSize = 1024;\n\n // ── worker mode ──\n private worker: Worker | null = null;\n private seq = 0;\n private readonly pending = new Map<number, Pending>();\n\n // ── in-process mode ──\n private encoder: ort.InferenceSession | null = null;\n private decoder: ort.InferenceSession | null = null;\n private nextToken = 1;\n private readonly embeddings = new Map<number, CoreEmbedding>();\n\n async loadModel(model: SamModelDef, onProgress?: (fraction: number) => void): Promise<void> {\n if (!model.encoderUrl || !model.decoderUrl) {\n throw new Error(`SAM model \"${model.id}\" has no ONNX URLs configured.`);\n }\n this.model = model;\n this.inputSize = model.inputSize;\n const hasGpu = typeof navigator !== 'undefined' && 'gpu' in navigator;\n const eps: string[] = model.encoderProviders ?? (hasGpu ? ['webgpu', 'wasm'] : ['wasm']);\n const usesWebGpu = eps.includes('webgpu');\n // WebGPU must run in the worker (else it freezes the main thread); small\n // WASM models opt into the faster in-process path via `inProcess`.\n this.mode = !usesWebGpu && model.inProcess ? 'inproc' : 'worker';\n\n if (this.mode === 'inproc') {\n ort.env.wasm.wasmPaths = getOrtWasmBase();\n const encBuf = await fetchModel(model.encoderUrl, onProgress);\n const decBuf = await fetchModel(model.decoderUrl);\n this.encoder = await ort.InferenceSession.create(encBuf, { executionProviders: eps });\n this.decoder = await ort.InferenceSession.create(decBuf, { executionProviders: ['wasm'] });\n } else {\n await this.call({\n type: 'load',\n encoderUrl: model.encoderUrl,\n decoderUrl: model.decoderUrl,\n wasmPaths: getOrtWasmBase(),\n inputSize: model.inputSize,\n encoderProviders: model.encoderProviders,\n }, [], onProgress);\n }\n this.loaded = true;\n }\n\n isLoaded(): boolean {\n return this.loaded;\n }\n\n async embed(image: { data: Uint8ClampedArray; width: number; height: number }): Promise<SamEmbedding> {\n if (this.mode === 'inproc') {\n const e = await runEncoder(this.encoder!, image.data, image.width, image.height, this.inputSize);\n const token = this.nextToken++;\n this.embeddings.set(token, e);\n if (this.embeddings.size > 3) this.embeddings.delete(this.embeddings.keys().next().value as number);\n return {\n data: new Float32Array(0), dims: e.dims, scale: e.scale,\n imageWidth: e.imageWidth, imageHeight: e.imageHeight, token,\n };\n }\n // worker: transfer the RGBA buffer (callers pass a fresh frame buffer).\n const buffer = image.data.buffer;\n const res = await this.call({ type: 'embed', width: image.width, height: image.height, buffer }, [buffer]);\n return {\n data: new Float32Array(0), dims: res.dims, scale: res.scale,\n imageWidth: res.imageWidth, imageHeight: res.imageHeight, token: res.token,\n };\n }\n\n async decode(embedding: SamEmbedding, prompt: SamPrompt): Promise<SamMaskResult> {\n if (this.mode === 'inproc') {\n const e = this.embeddings.get(embedding.token as number);\n if (!e) throw new Error('SAM embedding expired; re-encode the image.');\n return runDecoder(this.decoder!, e, prompt);\n }\n const res = await this.call({ type: 'decode', token: embedding.token, prompt });\n return { mask: new Uint8Array(res.buffer), width: res.width, height: res.height, iou: res.iou };\n }\n\n dispose(): void {\n this.worker?.terminate();\n this.worker = null;\n this.pending.clear();\n this.encoder?.release?.();\n this.decoder?.release?.();\n this.encoder = this.decoder = null;\n this.embeddings.clear();\n this.loaded = false;\n this.mode = null;\n }\n\n // ── worker plumbing ──────────────────────────────────────────────────────\n private ensureWorker(): Worker {\n if (this.worker) return this.worker;\n const worker = new Worker(new URL('./onnx-sam.worker', import.meta.url), { type: 'module' });\n worker.onmessage = (ev: MessageEvent) => {\n const m = ev.data;\n const p = this.pending.get(m.id);\n if (!p) return;\n if (m.type === 'progress') { p.onProgress?.(m.fraction); return; }\n this.pending.delete(m.id);\n if (m.type === 'error') p.reject(new Error(m.error));\n else p.resolve(m);\n };\n worker.onerror = (ev: ErrorEvent) => {\n const err = new Error(ev.message || 'SAM worker crashed.');\n for (const p of this.pending.values()) p.reject(err);\n this.pending.clear();\n };\n this.worker = worker;\n return worker;\n }\n\n private call(msg: any, transfer: Transferable[] = [], onProgress?: (f: number) => void): Promise<any> {\n const id = ++this.seq;\n const worker = this.ensureWorker();\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, onProgress });\n worker.postMessage({ ...msg, id }, transfer);\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for the t-SNE Web Worker, isolated in its own module so the `import.meta.url`
|
|
3
|
+
* reference — which the bundler needs in order to locate the worker — is never pulled
|
|
4
|
+
* into the ts-jest CommonJS compile of anything that uses it. Unit tests `jest.mock` this
|
|
5
|
+
* module, or pass their own factory. Same arrangement as `mask-worker.ts`.
|
|
6
|
+
*/
|
|
7
|
+
function createTsneWorker() {
|
|
8
|
+
return new Worker(new URL('./tsne.worker', import.meta.url), { type: 'module' });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { createTsneWorker };
|
|
12
|
+
//# sourceMappingURL=jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs","sources":["../../src/lib/spatial/tsne-worker.ts"],"sourcesContent":["/**\n * Factory for the t-SNE Web Worker, isolated in its own module so the `import.meta.url`\n * reference — which the bundler needs in order to locate the worker — is never pulled\n * into the ts-jest CommonJS compile of anything that uses it. Unit tests `jest.mock` this\n * module, or pass their own factory. Same arrangement as `mask-worker.ts`.\n */\nexport function createTsneWorker(): Worker {\n return new Worker(new URL('./tsne.worker', import.meta.url), { type: 'module' });\n}\n"],"names":[],"mappings":"AAAA;;;;;AAKG;SACa,gBAAgB,GAAA;IAC9B,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAClF;;;;"}
|