oidn-web 0.3.5 → 0.5.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +208 -8
  3. package/dist/oidn.js +4699 -22516
  4. package/dist/oidn.umd.cjs +989 -5796
  5. package/lib/UNet.d.ts +111 -26
  6. package/lib/UNet.js +310 -329
  7. package/lib/UNet.js.map +1 -1
  8. package/lib/WGPUComputePass.d.ts +1 -1
  9. package/lib/WGPUComputePass.js +6 -4
  10. package/lib/WGPUComputePass.js.map +1 -1
  11. package/lib/backend.d.ts +1 -4
  12. package/lib/backend.js +28 -44
  13. package/lib/backend.js.map +1 -1
  14. package/lib/finalRgbShader.d.ts +13 -0
  15. package/lib/finalRgbShader.js +160 -0
  16. package/lib/finalRgbShader.js.map +1 -0
  17. package/lib/graphOptimizer.d.ts +54 -0
  18. package/lib/graphOptimizer.js +215 -0
  19. package/lib/graphOptimizer.js.map +1 -0
  20. package/lib/hdrTransfer.d.ts +14 -0
  21. package/lib/hdrTransfer.js +61 -0
  22. package/lib/hdrTransfer.js.map +1 -0
  23. package/lib/main.d.ts +43 -11
  24. package/lib/main.js +9 -5
  25. package/lib/main.js.map +1 -1
  26. package/lib/modelSpec.d.ts +80 -0
  27. package/lib/modelSpec.js +270 -0
  28. package/lib/modelSpec.js.map +1 -0
  29. package/lib/nativeUNet.d.ts +103 -0
  30. package/lib/nativeUNet.js +2064 -0
  31. package/lib/nativeUNet.js.map +1 -0
  32. package/lib/process.d.ts +5 -11
  33. package/lib/process.js +38 -49
  34. package/lib/process.js.map +1 -1
  35. package/lib/resourceTracker.d.ts +26 -0
  36. package/lib/resourceTracker.js +65 -0
  37. package/lib/resourceTracker.js.map +1 -0
  38. package/lib/tileScheduler.d.ts +61 -0
  39. package/lib/tileScheduler.js +199 -0
  40. package/lib/tileScheduler.js.map +1 -0
  41. package/lib/webnnUNet.d.ts +52 -0
  42. package/lib/webnnUNet.js +535 -0
  43. package/lib/webnnUNet.js.map +1 -0
  44. package/package.json +16 -5
  45. package/src/UNet.ts +463 -437
  46. package/src/WGPUComputePass.ts +6 -4
  47. package/src/backend.ts +33 -59
  48. package/src/finalRgbShader.ts +186 -0
  49. package/src/graphOptimizer.ts +300 -0
  50. package/src/hdrTransfer.ts +88 -0
  51. package/src/main.ts +95 -20
  52. package/src/modelSpec.ts +414 -0
  53. package/src/nativeUNet.ts +2655 -0
  54. package/src/process.ts +46 -71
  55. package/src/resourceTracker.ts +94 -0
  56. package/src/tileScheduler.ts +330 -0
  57. package/src/webnnUNet.ts +812 -0
  58. package/lib/helper.d.ts +0 -4
  59. package/lib/helper.js +0 -33
  60. package/lib/helper.js.map +0 -1
  61. package/lib/kernels.d.ts +0 -1
  62. package/lib/kernels.js +0 -26
  63. package/lib/kernels.js.map +0 -1
  64. package/src/helper.ts +0 -43
  65. package/src/kernels.ts +0 -31
package/lib/UNet.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import { HostTensor } from './tza';
2
- import { Tile } from './process';
3
- import type { WebGPUBackend } from '@tensorflow/tfjs-backend-webgpu';
2
+ import { Tile, type HDRTransfer } from './process';
3
+ import { type DynamicTileSetting } from './tileScheduler';
4
+ import { type UNetModelSpec } from './modelSpec';
5
+ import { type NativeUNetGemmOptions, type NativeUNetKernelSetting, type NativeUNetPrecisionSetting } from './nativeUNet';
6
+ export type UNetEngineSetting = 'auto' | 'wgsl' | 'webnn';
4
7
  interface HDRImageData {
5
8
  data: Float32Array;
6
9
  width: number;
@@ -16,22 +19,41 @@ interface GPUImageDataOutput {
16
19
  width: number;
17
20
  height: number;
18
21
  }
22
+ export interface UNetExecutionStats {
23
+ width: number;
24
+ height: number;
25
+ tileCount: number;
26
+ tileColumns: number;
27
+ tileRows: number;
28
+ tileOverlap: number;
29
+ inputPixelCount: number;
30
+ inputShapeCount: number;
31
+ durationMs: number;
32
+ tileTimeMs: {
33
+ min: number;
34
+ median: number;
35
+ mean: number;
36
+ max: number;
37
+ };
38
+ }
19
39
  declare class UNet {
20
- private _hostTensors;
21
- private _backend;
22
- private _tfModel;
23
40
  private _device;
24
- private _tileWidth;
25
- private _tileHeight;
26
- private _tileOverlapX;
27
- private _tileOverlapY;
28
41
  private _aux;
29
42
  private _hdr;
43
+ private _hdrTransfer;
30
44
  private _dataProcessGPU?;
31
- private _maxTileSize;
32
- private _tensors;
33
- private _modelsCache;
34
- constructor(_hostTensors: Map<string, HostTensor>, _backend: WebGPUBackend, opts?: {
45
+ private _nativeExecutor?;
46
+ private _webNNExecutor?;
47
+ private _modelSpec;
48
+ private _inputChannels;
49
+ private _engine;
50
+ private _dynamicTileController;
51
+ private _lastExecution?;
52
+ private _activeExecutionFailures;
53
+ private _deviceLostObserved;
54
+ private _deviceLostSettled;
55
+ private _deviceLostReason;
56
+ constructor(hostTensors: Map<string, HostTensor>, device: GPUDevice, opts?: {
35
57
  /**
36
58
  * If use auxiliary data.
37
59
  */
@@ -40,23 +62,67 @@ declare class UNet {
40
62
  * If input is HDR image.
41
63
  */
42
64
  hdr?: boolean;
65
+ /** HDR transfer function expected by the trained model. */
66
+ hdrTransfer?: HDRTransfer;
43
67
  maxTileSize?: number;
68
+ dynamicTile?: DynamicTileSetting;
69
+ /** Native WGSL or the experimental WebNN backend. */
70
+ engine?: UNetEngineSetting;
71
+ /** Arithmetic/storage precision used by the native WGSL executor. */
72
+ precision?: NativeUNetPrecisionSetting;
73
+ /** Model-independent convolution kernel selection. */
74
+ kernel?: NativeUNetKernelSetting;
75
+ gemm?: NativeUNetGemmOptions;
76
+ /** Explicit descriptor for a new OIDN topology not in the built-in registry. */
77
+ modelSpec?: UNetModelSpec;
44
78
  });
45
- getDevice(): GPUDevice | undefined;
46
- private _buildModel;
47
- private _createConv;
48
- private _createConcatConv;
49
- private _createPooling;
50
- private _addUpsamplingLayer;
51
- private _addNet;
52
- private _addNetLarge;
53
- private _updateModel;
54
- private _getTileSizeWithOverlap;
79
+ getDevice(): GPUDevice;
80
+ /** Completes backend compilation before first interactive use. */
81
+ prepare(): Promise<void>;
82
+ /**
83
+ * Prepares the input shapes selected for an image before its first denoise.
84
+ * Hosts can call this while they still display their model-loading state.
85
+ */
86
+ prepareForImage(width: number, height: number, options?: {
87
+ tileOverlap?: number;
88
+ wholeImage?: boolean;
89
+ }): Promise<void>;
90
+ getRuntimeInfo(): {
91
+ configuredEngine: UNetEngineSetting;
92
+ gpuEngine: "wgsl" | "webnn";
93
+ precision: import("./nativeUNet").NativeUNetPrecision;
94
+ kernel: {
95
+ configured: NativeUNetKernelSetting;
96
+ gemm: Readonly<Required<NativeUNetGemmOptions>>;
97
+ maxSpatialInputBlocks: number;
98
+ subgroupsAvailable: boolean;
99
+ } | undefined;
100
+ webnn: import("./webnnUNet").WebNNRuntimeSupport | undefined;
101
+ resources: import("./resourceTracker").OIDNResourceSnapshot;
102
+ model: string;
103
+ modelFamily: (string & {}) | "oidn-unet-small" | "oidn-unet-large";
104
+ inputChannels: number;
105
+ hdrTransfer: HDRTransfer;
106
+ dynamicTile: {
107
+ enabled: boolean;
108
+ currentTileSize: number;
109
+ minTileSize: number;
110
+ maxTileSize: number;
111
+ targetTileTimeMs: number;
112
+ };
113
+ lastExecution: UNetExecutionStats | undefined;
114
+ activeExecutionCount: number;
115
+ };
116
+ private _observeDeviceLoss;
117
+ private _registerExecutionFailure;
118
+ /** Captures per-node GPU timestamps for the next native tile execution. */
119
+ profileNextExecution(): boolean;
120
+ getLastExecutionProfile(): Promise<import("./nativeUNet").NativeUNetExecutionProfile> | undefined;
55
121
  private _processImageData;
56
122
  private _readTile;
57
123
  private _writeTile;
58
124
  private _executeTile;
59
- tileExecute<T extends ImageData | HDRImageData | GPUImageData>({ color, albedo, normal, done, progress, denoiseAlpha }: {
125
+ tileExecute<T extends ImageData | HDRImageData | GPUImageData>({ color, albedo, normal, done, progress, denoiseAlpha, tileOverlap, wholeImage, scheduling, error }: {
60
126
  color: T;
61
127
  albedo?: ImageData | GPUImageData;
62
128
  normal?: ImageData | GPUImageData;
@@ -64,8 +130,27 @@ declare class UNet {
64
130
  * If denoise alpha channel. Otherwise denoise RGB channels.
65
131
  */
66
132
  denoiseAlpha?: boolean;
67
- done: (outputData: T extends GPUImageData ? GPUImageDataOutput : T) => void;
68
- progress?: (outputData: T extends GPUImageData ? GPUImageDataOutput : T, tileData: (T extends GPUImageData ? GPUImageDataOutput : T) | undefined, tile: Tile, currentIdx: number, totalIdx: number) => void;
133
+ /**
134
+ * Execute the complete input image as one tile, ignoring `maxTileSize`.
135
+ * The image must fit the device's buffer and dispatch limits.
136
+ */
137
+ wholeImage?: boolean;
138
+ /**
139
+ * Per-side context for boundaries shared with another tile. Defaults to
140
+ * half of the model receptive field rounded up to 16 pixels.
141
+ */
142
+ tileOverlap?: number;
143
+ /**
144
+ * How JavaScript yields between completed GPU tiles. `event-loop`
145
+ * (default) continues on the next macrotask. `animation-frame` waits for
146
+ * the next display frame, bounded by a short timer so hidden pages still
147
+ * complete.
148
+ */
149
+ scheduling?: 'animation-frame' | 'event-loop';
150
+ done: (outputData: T extends GPUImageData ? GPUImageDataOutput : T) => void | Promise<void>;
151
+ /** Receives asynchronous execution, queue, and callback failures. */
152
+ error?: (reason: unknown) => void | Promise<void>;
153
+ progress?: (outputData: T extends GPUImageData ? GPUImageDataOutput : T, tileData: (T extends GPUImageData ? GPUImageDataOutput : T) | undefined, tile: Tile, currentIdx: number, totalIdx: number) => void | Promise<void>;
69
154
  }): () => void;
70
155
  dispose(): void;
71
156
  }