oidn-web 0.1.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/LICENSE +21 -0
- package/README.md +2 -0
- package/dist/oidn.mjs +22909 -0
- package/dist/oidn.umd.js +5905 -0
- package/lib/UNet.d.ts +54 -0
- package/lib/UNet.js +467 -0
- package/lib/UNet.js.map +1 -0
- package/lib/WGPUComputePass.d.ts +53 -0
- package/lib/WGPUComputePass.js +220 -0
- package/lib/WGPUComputePass.js.map +1 -0
- package/lib/WGPUFullQuadPass.d.ts +51 -0
- package/lib/WGPUFullQuadPass.js +261 -0
- package/lib/WGPUFullQuadPass.js.map +1 -0
- package/lib/backend.d.ts +5 -0
- package/lib/backend.js +41 -0
- package/lib/backend.js.map +1 -0
- package/lib/hdr.d.ts +31 -0
- package/lib/hdr.js +340 -0
- package/lib/hdr.js.map +1 -0
- package/lib/helper.d.ts +1 -0
- package/lib/helper.js +27 -0
- package/lib/helper.js.map +1 -0
- package/lib/kernels.d.ts +1 -0
- package/lib/kernels.js +26 -0
- package/lib/kernels.js.map +1 -0
- package/lib/main.d.ts +20 -0
- package/lib/main.js +20 -0
- package/lib/main.js.map +1 -0
- package/lib/process.d.ts +39 -0
- package/lib/process.js +309 -0
- package/lib/process.js.map +1 -0
- package/lib/tza.d.ts +15 -0
- package/lib/tza.js +114 -0
- package/lib/tza.js.map +1 -0
- package/package.json +26 -0
- package/src/UNet.ts +708 -0
- package/src/WGPUComputePass.ts +318 -0
- package/src/WGPUFullQuadPass.ts +348 -0
- package/src/backend.ts +53 -0
- package/src/hdr.ts +398 -0
- package/src/helper.ts +35 -0
- package/src/kernels.ts +31 -0
- package/src/main.ts +42 -0
- package/src/process.ts +362 -0
- package/src/tza.ts +136 -0
- package/weights/.gitattributes +1 -0
- package/weights/LICENSE.txt +202 -0
- package/weights/README.md +7 -0
- package/weights/rt_hdr.tza +0 -0
- package/weights/rt_hdr_alb_nrm.tza +0 -0
- package/weights/rt_ldr.tza +0 -0
- package/weights/rt_ldr_alb_nrm.tza +0 -0
package/lib/UNet.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types/dist" />
|
|
2
|
+
import { HostTensor } from './tza';
|
|
3
|
+
import { Tile } from './process';
|
|
4
|
+
import type { WebGPUBackend } from '@tensorflow/tfjs-backend-webgpu';
|
|
5
|
+
interface HDRImageData {
|
|
6
|
+
data: Float32Array;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
}
|
|
10
|
+
interface GPUImageData {
|
|
11
|
+
data: GPUBuffer;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}
|
|
15
|
+
declare class UNet {
|
|
16
|
+
private _tensors;
|
|
17
|
+
private _backend;
|
|
18
|
+
private _tfModel;
|
|
19
|
+
private _device;
|
|
20
|
+
private _tileWidth;
|
|
21
|
+
private _tileHeight;
|
|
22
|
+
private _tileOverlapX;
|
|
23
|
+
private _tileOverlapY;
|
|
24
|
+
private _aux;
|
|
25
|
+
private _hdr;
|
|
26
|
+
private _dataProcessGPU?;
|
|
27
|
+
private _maxTileSize;
|
|
28
|
+
constructor(_tensors: Map<string, HostTensor>, _backend: WebGPUBackend, opts?: {
|
|
29
|
+
aux?: boolean;
|
|
30
|
+
hdr?: boolean;
|
|
31
|
+
maxTileSize?: number;
|
|
32
|
+
});
|
|
33
|
+
private _createConv;
|
|
34
|
+
private _createConcatConv;
|
|
35
|
+
private _createPooling;
|
|
36
|
+
private _addUpsamplingLayer;
|
|
37
|
+
getDevice(): GPUDevice | undefined;
|
|
38
|
+
buildModel(): void;
|
|
39
|
+
private _updateModel;
|
|
40
|
+
private _getTileSizeWithOverlap;
|
|
41
|
+
private _processImageData;
|
|
42
|
+
private _readTile;
|
|
43
|
+
private _writeTile;
|
|
44
|
+
private _executeTile;
|
|
45
|
+
progressiveExecute<T extends ImageData | HDRImageData | GPUImageData>({ color, albedo, normal, done, progress }: {
|
|
46
|
+
color: T;
|
|
47
|
+
albedo?: ImageData | GPUImageData;
|
|
48
|
+
normal?: ImageData | GPUImageData;
|
|
49
|
+
done: (outputData: T) => void;
|
|
50
|
+
progress?: (outputData: T, tileData: T | undefined, tile: Tile, currentIdx: number, totalIdx: number) => void;
|
|
51
|
+
}): () => void;
|
|
52
|
+
dispose(): void;
|
|
53
|
+
}
|
|
54
|
+
export default UNet;
|
package/lib/UNet.js
ADDED
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { tensor } from '@tensorflow/tfjs-core/dist/ops/tensor';
|
|
2
|
+
import { tensor1d } from '@tensorflow/tfjs-core/dist/ops/tensor1d';
|
|
3
|
+
import { mirrorPad } from '@tensorflow/tfjs-core/dist/ops/mirror_pad';
|
|
4
|
+
import { pad4d } from '@tensorflow/tfjs-core/dist/ops/pad4d';
|
|
5
|
+
import { slice4d } from '@tensorflow/tfjs-core/dist/ops/slice4d';
|
|
6
|
+
import { concat4d } from '@tensorflow/tfjs-core/dist/ops/concat_4d';
|
|
7
|
+
import { Conv2D, UpSampling2D } from '@tensorflow/tfjs-layers/dist/layers/convolutional';
|
|
8
|
+
import { MaxPooling2D } from '@tensorflow/tfjs-layers/dist/layers/pooling';
|
|
9
|
+
import { Concatenate } from '@tensorflow/tfjs-layers/dist/layers/merge';
|
|
10
|
+
import { LayersModel } from '@tensorflow/tfjs-layers/dist/engine/training';
|
|
11
|
+
import { Input as TFInput } from '@tensorflow/tfjs-layers/dist/engine/input_layer';
|
|
12
|
+
import { Float16Array } from '@petamoriken/float16';
|
|
13
|
+
import { GPUDataProcess, Tile, avgLogLum, hdrTransferFuncCPU, hdrTransferFuncInverseCPU } from './process';
|
|
14
|
+
// import { profileAndLogKernelCode } from './helper';
|
|
15
|
+
function getTensorData(ubytes, type) {
|
|
16
|
+
const buffer = ubytes.buffer;
|
|
17
|
+
if (type === 'Float32') {
|
|
18
|
+
return new Float32Array(ubytes.buffer);
|
|
19
|
+
}
|
|
20
|
+
const float16Data = new Float16Array(buffer);
|
|
21
|
+
const float32Data = new Float32Array(float16Data.length);
|
|
22
|
+
for (let i = 0; i < float32Data.length; ++i) {
|
|
23
|
+
float32Data[i] = float16Data[i];
|
|
24
|
+
}
|
|
25
|
+
return float32Data;
|
|
26
|
+
}
|
|
27
|
+
function changeWeightShapes(weightData, dims) {
|
|
28
|
+
const [O, C, H, W] = dims;
|
|
29
|
+
const reorderedWeightData = new Float32Array(weightData.length);
|
|
30
|
+
for (let o = 0; o < O; ++o) {
|
|
31
|
+
for (let c = 0; c < C; ++c) {
|
|
32
|
+
for (let h = 0; h < H; ++h) {
|
|
33
|
+
for (let w = 0; w < W; ++w) {
|
|
34
|
+
// Change OCHW to HWCO
|
|
35
|
+
const idx = o * C * H * W + c * H * W + h * W + w;
|
|
36
|
+
const idx2 = h * W * C * O + w * C * O + c * O + o;
|
|
37
|
+
reorderedWeightData[idx2] = weightData[idx];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return reorderedWeightData;
|
|
43
|
+
}
|
|
44
|
+
function roundUp(a, b) {
|
|
45
|
+
return Math.ceil(a / b) * b;
|
|
46
|
+
}
|
|
47
|
+
// Returns the smallest integer larger than or equal to a which has remainder c when divided by b
|
|
48
|
+
function roundUp2(a, b, c) {
|
|
49
|
+
return Math.ceil((a - c) / b) * b + c;
|
|
50
|
+
}
|
|
51
|
+
function isGPUImageData(data) {
|
|
52
|
+
return data.data instanceof GPUBuffer;
|
|
53
|
+
}
|
|
54
|
+
const receptiveField = 174; // receptive field in pixels
|
|
55
|
+
// TODO metal is 32?
|
|
56
|
+
const minTileAlignment = 1;
|
|
57
|
+
const tileAlignment = 16; // required spatial alignment in pixels (padding may be necessary)
|
|
58
|
+
const defaultTileOverlap = roundUp(receptiveField / 2, tileAlignment);
|
|
59
|
+
class UNet {
|
|
60
|
+
_tensors;
|
|
61
|
+
_backend;
|
|
62
|
+
_tfModel;
|
|
63
|
+
_device;
|
|
64
|
+
// TODO calculate the tile size from memory size
|
|
65
|
+
// https://github.com/RenderKit/oidn/blob/713ec7838ba650f99e0a896549c0dca5eeb3652d/core/unet_filter.cpp#L287
|
|
66
|
+
_tileWidth = 0;
|
|
67
|
+
_tileHeight = 0;
|
|
68
|
+
_tileOverlapX = 0;
|
|
69
|
+
_tileOverlapY = 0;
|
|
70
|
+
_aux = false;
|
|
71
|
+
_hdr = false;
|
|
72
|
+
_dataProcessGPU;
|
|
73
|
+
_maxTileSize;
|
|
74
|
+
constructor(_tensors, _backend, opts = {}) {
|
|
75
|
+
this._tensors = _tensors;
|
|
76
|
+
this._backend = _backend;
|
|
77
|
+
this._aux = opts.aux || false;
|
|
78
|
+
this._hdr = opts.hdr || false;
|
|
79
|
+
this._maxTileSize = opts.maxTileSize ?? 512;
|
|
80
|
+
this._device = this._backend.device;
|
|
81
|
+
}
|
|
82
|
+
_createConv(name, source, activation) {
|
|
83
|
+
const unetWeightTensor = this._tensors.get(name + '.weight');
|
|
84
|
+
const unetBiasTensor = this._tensors.get(name + '.bias');
|
|
85
|
+
const weightDims = unetWeightTensor.desc.dims;
|
|
86
|
+
const weightTensor = tensor(changeWeightShapes(getTensorData(unetWeightTensor.data, unetWeightTensor.desc.dataType), weightDims), [weightDims[2], weightDims[3], weightDims[1], weightDims[0]], 'float32');
|
|
87
|
+
const biasTensor = tensor1d(getTensorData(unetBiasTensor.data, unetBiasTensor.desc.dataType), 'float32');
|
|
88
|
+
// TODO whats the purpose of padded dims ?
|
|
89
|
+
const convLayer = new Conv2D({
|
|
90
|
+
name,
|
|
91
|
+
filters: unetWeightTensor.desc.dims[0],
|
|
92
|
+
kernelSize: unetWeightTensor.desc.dims.slice(2, 4),
|
|
93
|
+
useBias: true,
|
|
94
|
+
activation,
|
|
95
|
+
padding: 'same',
|
|
96
|
+
weights: [weightTensor, biasTensor],
|
|
97
|
+
trainable: false
|
|
98
|
+
});
|
|
99
|
+
return convLayer.apply(source);
|
|
100
|
+
}
|
|
101
|
+
_createConcatConv(name, source1, source2) {
|
|
102
|
+
//https://github.com/RenderKit/oidn/blob/713ec7838ba650f99e0a896549c0dca5eeb3652d/training/model.py#L40
|
|
103
|
+
return this._createConv(name,
|
|
104
|
+
// Concat on the channel
|
|
105
|
+
new Concatenate({ trainable: false, axis: 3 }).apply([
|
|
106
|
+
// convLayer.apply(source2) as SymbolicTensor,
|
|
107
|
+
source1,
|
|
108
|
+
source2
|
|
109
|
+
]), 'relu');
|
|
110
|
+
}
|
|
111
|
+
_createPooling(source) {
|
|
112
|
+
// https://github.com/RenderKit/oidn/blob/713ec7838ba650f99e0a896549c0dca5eeb3652d/training/model.py#L33
|
|
113
|
+
return new MaxPooling2D({
|
|
114
|
+
name: source.name + '/pooling',
|
|
115
|
+
poolSize: [2, 2],
|
|
116
|
+
strides: [2, 2],
|
|
117
|
+
padding: 'same',
|
|
118
|
+
trainable: false
|
|
119
|
+
}).apply(source);
|
|
120
|
+
}
|
|
121
|
+
_addUpsamplingLayer(source) {
|
|
122
|
+
return new UpSampling2D({
|
|
123
|
+
name: source.name + '/upsampling',
|
|
124
|
+
size: [2, 2],
|
|
125
|
+
trainable: false
|
|
126
|
+
}).apply(source);
|
|
127
|
+
}
|
|
128
|
+
getDevice() {
|
|
129
|
+
return this._device;
|
|
130
|
+
}
|
|
131
|
+
buildModel() {
|
|
132
|
+
const aux = this._aux;
|
|
133
|
+
const channels = 3 + (aux ? 6 : 0);
|
|
134
|
+
const tileSize = this._getTileSizeWithOverlap();
|
|
135
|
+
// TODO input process transferFunc
|
|
136
|
+
// TODO input shape
|
|
137
|
+
const input = TFInput({
|
|
138
|
+
shape: [tileSize.height, tileSize.width, channels],
|
|
139
|
+
dtype: 'float32'
|
|
140
|
+
});
|
|
141
|
+
const encConv0 = this._createConv('enc_conv0', input, 'relu');
|
|
142
|
+
const pool1 = this._createPooling(this._createConv('enc_conv1', encConv0, 'relu'));
|
|
143
|
+
const pool2 = this._createPooling(this._createConv('enc_conv2', pool1, 'relu'));
|
|
144
|
+
const pool3 = this._createPooling(this._createConv('enc_conv3', pool2, 'relu'));
|
|
145
|
+
const pool4 = this._createPooling(this._createConv('enc_conv4', pool3, 'relu'));
|
|
146
|
+
const encConv5a = this._createConv('enc_conv5a', pool4, 'relu');
|
|
147
|
+
const upsample4 = this._addUpsamplingLayer(this._createConv('enc_conv5b', encConv5a, 'relu'));
|
|
148
|
+
const decConv4a = this._createConcatConv('dec_conv4a', upsample4, pool3);
|
|
149
|
+
const upsample3 = this._addUpsamplingLayer(this._createConv('dec_conv4b', decConv4a, 'relu'));
|
|
150
|
+
const decConv3a = this._createConcatConv('dec_conv3a', upsample3, pool2);
|
|
151
|
+
const upsample2 = this._addUpsamplingLayer(this._createConv('dec_conv3b', decConv3a, 'relu'));
|
|
152
|
+
const decConv2a = this._createConcatConv('dec_conv2a', upsample2, pool1);
|
|
153
|
+
const upsample1 = this._addUpsamplingLayer(this._createConv('dec_conv2b', decConv2a, 'relu'));
|
|
154
|
+
const decConv1a = this._createConcatConv('dec_conv1a', upsample1, input);
|
|
155
|
+
const decConv1b = this._createConv('dec_conv1b', decConv1a, 'relu');
|
|
156
|
+
const decConv0 = this._createConv('dec_conv0', decConv1b, 'relu');
|
|
157
|
+
this._tfModel = new LayersModel({
|
|
158
|
+
inputs: [input],
|
|
159
|
+
// TODO output process transferFunc
|
|
160
|
+
outputs: decConv0
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
_updateModel(width, height) {
|
|
164
|
+
const maxTileSize = this._maxTileSize;
|
|
165
|
+
let tileWidth = maxTileSize;
|
|
166
|
+
let tileHeight = maxTileSize;
|
|
167
|
+
let tileOverlapX = defaultTileOverlap;
|
|
168
|
+
let tileOverlapY = defaultTileOverlap;
|
|
169
|
+
if (width < maxTileSize + defaultTileOverlap * 2) {
|
|
170
|
+
tileWidth = roundUp(width, tileAlignment);
|
|
171
|
+
tileOverlapX = 0;
|
|
172
|
+
}
|
|
173
|
+
if (height < maxTileSize + defaultTileOverlap * 2) {
|
|
174
|
+
tileHeight = roundUp(height, tileAlignment);
|
|
175
|
+
tileOverlapY = 0;
|
|
176
|
+
}
|
|
177
|
+
if (tileWidth !== this._tileWidth ||
|
|
178
|
+
tileHeight !== this._tileHeight ||
|
|
179
|
+
tileOverlapX !== this._tileOverlapX ||
|
|
180
|
+
tileOverlapY !== this._tileOverlapY ||
|
|
181
|
+
!this._tfModel) {
|
|
182
|
+
this._tileWidth = tileWidth;
|
|
183
|
+
this._tileHeight = tileHeight;
|
|
184
|
+
this._tileOverlapX = tileOverlapX;
|
|
185
|
+
this._tileOverlapY = tileOverlapY;
|
|
186
|
+
if (this._tfModel) {
|
|
187
|
+
this._tfModel.dispose();
|
|
188
|
+
}
|
|
189
|
+
this.buildModel();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
_getTileSizeWithOverlap() {
|
|
193
|
+
return {
|
|
194
|
+
width: this._tileWidth + 2 * this._tileOverlapX,
|
|
195
|
+
height: this._tileHeight + 2 * this._tileOverlapY
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
_processImageData(color, albedo, normal, isHDR) {
|
|
199
|
+
const rawData = color.data;
|
|
200
|
+
const pixelsCount = rawData.length / 4;
|
|
201
|
+
const channels = this._aux ? 9 : 3;
|
|
202
|
+
const tensorData = new Float32Array(pixelsCount * channels);
|
|
203
|
+
if ((albedo && !normal) || (normal && !albedo)) {
|
|
204
|
+
throw new Error('Normal map and albedo map are both required');
|
|
205
|
+
}
|
|
206
|
+
if (albedo && normal) {
|
|
207
|
+
if (albedo.width !== normal.width ||
|
|
208
|
+
albedo.height !== normal.height ||
|
|
209
|
+
color.width !== albedo.width ||
|
|
210
|
+
color.height !== albedo.height) {
|
|
211
|
+
throw new Error('Image size mismatch');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const albedoData = albedo?.data;
|
|
215
|
+
const normalData = normal?.data;
|
|
216
|
+
for (let i = 0; i < rawData.length; i += 4) {
|
|
217
|
+
const i2 = (i / 4) * channels;
|
|
218
|
+
for (let c = 0; c < 3; c++) {
|
|
219
|
+
if (isHDR) {
|
|
220
|
+
tensorData[i2 + c] = rawData[i + c];
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
tensorData[i2 + c] = rawData[i + c] / 255;
|
|
224
|
+
}
|
|
225
|
+
if (albedoData) {
|
|
226
|
+
tensorData[i2 + c + 3] = albedoData[i + c] / 255;
|
|
227
|
+
}
|
|
228
|
+
if (normalData) {
|
|
229
|
+
tensorData[i2 + c + 6] = normalData[i + c] / 255;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return tensorData;
|
|
234
|
+
}
|
|
235
|
+
_readTile(data, channels, srcTile, width) {
|
|
236
|
+
const tileData = new Float32Array(srcTile.width * srcTile.height * channels);
|
|
237
|
+
for (let y = 0; y < srcTile.height; y++) {
|
|
238
|
+
for (let x = 0; x < srcTile.width; x++) {
|
|
239
|
+
const i2 = ((y + srcTile.y) * width + (x + srcTile.x)) * channels;
|
|
240
|
+
const i1 = (y * srcTile.width + x) * channels;
|
|
241
|
+
for (let c = 0; c < channels; c++) {
|
|
242
|
+
tileData[i1 + c] = data[i2 + c];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return tileData;
|
|
247
|
+
}
|
|
248
|
+
_writeTile(imageData, srcTile, dstTile, srcTileData, srcWidth, isHDR) {
|
|
249
|
+
const { data: outImageData, width } = imageData;
|
|
250
|
+
const dx = dstTile.x - srcTile.x;
|
|
251
|
+
const dy = dstTile.y - srcTile.y;
|
|
252
|
+
for (let y = 0; y < dstTile.height; y++) {
|
|
253
|
+
for (let x = 0; x < dstTile.width; x++) {
|
|
254
|
+
const i1 = ((y + dy) * srcWidth + x + dx) * 3;
|
|
255
|
+
const i2 = ((y + dstTile.y) * width + (x + dstTile.x)) * 4;
|
|
256
|
+
for (let c = 0; c < 3; c++) {
|
|
257
|
+
if (isHDR) {
|
|
258
|
+
outImageData[i2 + c] = srcTileData[i1 + c];
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
outImageData[i2 + c] = Math.min(Math.max(srcTileData[i1 + c] * 255, 0), 255);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
imageData.data[i2 + 3] = isHDR ? 1 : 255;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
_executeTile(inputData, outputTileData, outputImageData, i, j, width, height, isHDR) {
|
|
269
|
+
const channels = this._aux ? 9 : 3;
|
|
270
|
+
const tileOverlapX = this._tileOverlapX;
|
|
271
|
+
const tileOverlapY = this._tileOverlapY;
|
|
272
|
+
let srcTileSize = this._getTileSizeWithOverlap();
|
|
273
|
+
let dstTileSize = { width: this._tileWidth, height: this._tileHeight };
|
|
274
|
+
let srcX0 = i > 0 ? i * dstTileSize.width - tileOverlapX : 0;
|
|
275
|
+
let srcX1 = Math.min(srcX0 + srcTileSize.width, width);
|
|
276
|
+
srcX0 = Math.max(srcX1 - srcTileSize.width, 0);
|
|
277
|
+
let srcY0 = j > 0 ? j * dstTileSize.height - tileOverlapY : 0;
|
|
278
|
+
let srcY1 = Math.min(srcY0 + srcTileSize.height, height);
|
|
279
|
+
srcY0 = Math.max(srcY1 - srcTileSize.height, 0);
|
|
280
|
+
const srcTileWidth = Math.min(srcTileSize.width, width);
|
|
281
|
+
const srcTileHeight = Math.min(srcTileSize.height, height);
|
|
282
|
+
const needsResize = width < dstTileSize.width || height < dstTileSize.height;
|
|
283
|
+
const srcTile = new Tile(srcX0, srcY0, srcTileWidth, srcTileHeight);
|
|
284
|
+
let tileTensor;
|
|
285
|
+
let inputScale = 1;
|
|
286
|
+
const device = this._device;
|
|
287
|
+
let dataProcessGPU = this._dataProcessGPU;
|
|
288
|
+
if (inputData instanceof Float32Array) {
|
|
289
|
+
let tileData = this._readTile(inputData, channels, srcTile, width);
|
|
290
|
+
if (isHDR) {
|
|
291
|
+
inputScale = avgLogLum({
|
|
292
|
+
data: tileData,
|
|
293
|
+
channels: 9
|
|
294
|
+
});
|
|
295
|
+
tileData = hdrTransferFuncCPU({
|
|
296
|
+
data: tileData,
|
|
297
|
+
channels: 9,
|
|
298
|
+
inputScale
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
tileTensor = tensor(tileData, [1, srcTileHeight, srcTileWidth, channels], 'float32');
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
if (!isHDR) {
|
|
305
|
+
throw new Error('Only hdr is supported for webgpu data.');
|
|
306
|
+
}
|
|
307
|
+
if (!dataProcessGPU) {
|
|
308
|
+
dataProcessGPU = this._dataProcessGPU = new GPUDataProcess(device);
|
|
309
|
+
}
|
|
310
|
+
dataProcessGPU.setImageSize(width, height);
|
|
311
|
+
dataProcessGPU.setInputTile(srcTile);
|
|
312
|
+
// Display the noisy input instead of prev denoised result
|
|
313
|
+
if (i === 0 && j === 0) {
|
|
314
|
+
dataProcessGPU.copyInputDataToOutput(inputData.color);
|
|
315
|
+
}
|
|
316
|
+
const { color, albedo, normal } = dataProcessGPU.forward(inputData.color, inputData.albedo, inputData.normal);
|
|
317
|
+
const shape = [1, srcTileHeight, srcTileWidth, 4];
|
|
318
|
+
tileTensor = concat4d([color, albedo, normal].map((buffer) => {
|
|
319
|
+
const tmp = tensor({ buffer, zeroCopy: true }, shape);
|
|
320
|
+
const ret = slice4d(tmp, [0, 0, 0, 0], [1, srcTileHeight, srcTileWidth, 3]);
|
|
321
|
+
tmp.dispose();
|
|
322
|
+
return ret;
|
|
323
|
+
}), 3);
|
|
324
|
+
}
|
|
325
|
+
// We need resize if input size is smaller than tile size. And is rounded up.
|
|
326
|
+
if (needsResize) {
|
|
327
|
+
const rawTileTensor = tileTensor;
|
|
328
|
+
tileTensor = mirrorPad(rawTileTensor, [
|
|
329
|
+
[0, 0],
|
|
330
|
+
[0, srcTileSize.height - height],
|
|
331
|
+
[0, srcTileSize.width - width],
|
|
332
|
+
[0, 0]
|
|
333
|
+
], 'reflect');
|
|
334
|
+
rawTileTensor.dispose();
|
|
335
|
+
}
|
|
336
|
+
const outputTensor = this._tfModel.predict(tileTensor);
|
|
337
|
+
tileTensor.dispose();
|
|
338
|
+
const dstWidth = Math.min(dstTileSize.width, width);
|
|
339
|
+
const dstHeight = Math.min(dstTileSize.height, height);
|
|
340
|
+
const dstTile = new Tile(i * dstWidth, j * dstHeight, dstWidth, dstHeight);
|
|
341
|
+
dstTile.width = Math.min(dstTile.width, width - dstTile.x);
|
|
342
|
+
dstTile.height = Math.min(dstTile.height, height - dstTile.y);
|
|
343
|
+
if (inputData instanceof Float32Array) {
|
|
344
|
+
let denoisedData = outputTensor.dataSync();
|
|
345
|
+
if (isHDR) {
|
|
346
|
+
denoisedData = hdrTransferFuncInverseCPU({
|
|
347
|
+
data: denoisedData,
|
|
348
|
+
channels: 3,
|
|
349
|
+
inputScale
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
this._writeTile(outputImageData, srcTile, dstTile, denoisedData, srcTileSize.width, isHDR);
|
|
353
|
+
for (let y = 0; y < dstHeight; y++) {
|
|
354
|
+
for (let x = 0; x < dstWidth; x++) {
|
|
355
|
+
const i1 = (y * dstWidth + x) * 4;
|
|
356
|
+
const i2 = ((y + dstTile.y) * width + (x + dstTile.x)) * 4;
|
|
357
|
+
for (let c = 0; c < 4; c++) {
|
|
358
|
+
outputTileData.data[i1 + c] = outputImageData.data[i2 + c];
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
outputTensor.dispose();
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
dataProcessGPU.setOutputTile(dstTile, srcTile);
|
|
366
|
+
// IMPORTANT
|
|
367
|
+
// storage buffer has alignment. that 3 channels still needs 16 bytes data.
|
|
368
|
+
// So we need to pad it to 4 channels.
|
|
369
|
+
const outputTensor4Channnels = pad4d(outputTensor, [
|
|
370
|
+
[0, 0],
|
|
371
|
+
[0, 0],
|
|
372
|
+
[0, 0],
|
|
373
|
+
[0, 1]
|
|
374
|
+
]);
|
|
375
|
+
const outBuffer = dataProcessGPU.inverse(outputTensor4Channnels.dataToGPU().buffer, inputData.color);
|
|
376
|
+
outputTensor.dispose();
|
|
377
|
+
outputTensor4Channnels.dispose();
|
|
378
|
+
return outBuffer;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
progressiveExecute({ color, albedo, normal, done, progress }) {
|
|
382
|
+
if (this._aux && (!albedo || !normal)) {
|
|
383
|
+
throw new Error('Normal map and albedo map are both required');
|
|
384
|
+
}
|
|
385
|
+
if (!this._aux) {
|
|
386
|
+
if (albedo || normal) {
|
|
387
|
+
throw new Error('Normal map and albedo map are not required');
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
const width = color.width;
|
|
391
|
+
const height = color.height;
|
|
392
|
+
this._updateModel(width, height);
|
|
393
|
+
// TODO should fixed to be hdr when UNet is created.
|
|
394
|
+
// weights of hdr and ldr is different
|
|
395
|
+
const hdr = this._hdr || false;
|
|
396
|
+
let rawData;
|
|
397
|
+
if (!isGPUImageData(color)) {
|
|
398
|
+
rawData = this._processImageData(color, albedo, normal, hdr);
|
|
399
|
+
}
|
|
400
|
+
const tileWidth = this._tileWidth;
|
|
401
|
+
const tileHeight = this._tileHeight;
|
|
402
|
+
const tileCountH = Math.ceil(height / tileHeight);
|
|
403
|
+
const tileCountW = Math.ceil(width / tileWidth);
|
|
404
|
+
function makeImageData(width, height) {
|
|
405
|
+
return hdr
|
|
406
|
+
? {
|
|
407
|
+
data: new Float32Array(width * height * 4),
|
|
408
|
+
width,
|
|
409
|
+
height
|
|
410
|
+
}
|
|
411
|
+
: new ImageData(width, height);
|
|
412
|
+
}
|
|
413
|
+
const outputImageData = isGPUImageData(color)
|
|
414
|
+
? undefined
|
|
415
|
+
: makeImageData(width, height);
|
|
416
|
+
const outputTileData = isGPUImageData(color)
|
|
417
|
+
? undefined
|
|
418
|
+
: makeImageData(Math.min(tileWidth, width), Math.min(tileHeight, height));
|
|
419
|
+
let aborted = false;
|
|
420
|
+
const executeTile = (i, j) => {
|
|
421
|
+
if (aborted) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
let resGPUBuffer;
|
|
425
|
+
// profileAndLogKernelCode(() => {
|
|
426
|
+
resGPUBuffer = this._executeTile(isGPUImageData(color)
|
|
427
|
+
? {
|
|
428
|
+
color: color.data,
|
|
429
|
+
albedo: albedo.data,
|
|
430
|
+
normal: normal.data
|
|
431
|
+
}
|
|
432
|
+
: rawData, outputTileData, outputImageData, i, j, width, height, hdr);
|
|
433
|
+
// }, true);
|
|
434
|
+
const output = outputImageData || {
|
|
435
|
+
data: resGPUBuffer,
|
|
436
|
+
width,
|
|
437
|
+
height
|
|
438
|
+
};
|
|
439
|
+
progress?.(output,
|
|
440
|
+
// Is undefined if using webgpu buffer
|
|
441
|
+
outputTileData, new Tile(i * tileWidth, j * tileHeight, tileWidth, tileHeight), i + j * tileCountW, tileCountW * tileCountH);
|
|
442
|
+
if (i + 1 < tileCountW || j + 1 < tileCountH) {
|
|
443
|
+
requestAnimationFrame(() => {
|
|
444
|
+
if (i + 1 < tileCountW) {
|
|
445
|
+
executeTile(i + 1, j);
|
|
446
|
+
}
|
|
447
|
+
else if (j + 1 < tileCountH) {
|
|
448
|
+
executeTile(0, j + 1);
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
done(output);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
executeTile(0, 0);
|
|
457
|
+
return () => {
|
|
458
|
+
aborted = true;
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
dispose() {
|
|
462
|
+
this._tfModel?.dispose();
|
|
463
|
+
this._dataProcessGPU?.dispose();
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
export default UNet;
|
|
467
|
+
//# sourceMappingURL=UNet.js.map
|
package/lib/UNet.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UNet.js","sourceRoot":"","sources":["../src/UNet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types/dist" />
|
|
2
|
+
export declare const WORKGROUP_SIZE = 8;
|
|
3
|
+
export interface Uniform {
|
|
4
|
+
label: string;
|
|
5
|
+
type: string;
|
|
6
|
+
data: Float32Array | Int32Array | Uint32Array;
|
|
7
|
+
}
|
|
8
|
+
export interface WGPUComputePassInput {
|
|
9
|
+
buffer: GPUBuffer;
|
|
10
|
+
channels: number;
|
|
11
|
+
}
|
|
12
|
+
export interface WGPUComputePassOutput {
|
|
13
|
+
channels: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class WGPUComputePass<I extends string, O extends string> {
|
|
16
|
+
private _label;
|
|
17
|
+
private _device;
|
|
18
|
+
private _outputBuffers;
|
|
19
|
+
private _pipeline;
|
|
20
|
+
private _bindGroups;
|
|
21
|
+
private _needsUpdatePipeline;
|
|
22
|
+
private _inputs;
|
|
23
|
+
private _outputs;
|
|
24
|
+
private _uniforms;
|
|
25
|
+
private _uniformBuffers;
|
|
26
|
+
private _width;
|
|
27
|
+
private _height;
|
|
28
|
+
private _execWidth?;
|
|
29
|
+
private _execHeight?;
|
|
30
|
+
private _csCode;
|
|
31
|
+
private _csMain;
|
|
32
|
+
private _csDefine;
|
|
33
|
+
constructor(label: string, device: GPUDevice, opts: {
|
|
34
|
+
inputs: I[];
|
|
35
|
+
outputs: O[];
|
|
36
|
+
csMain: string;
|
|
37
|
+
csDefine?: string;
|
|
38
|
+
uniforms: Uniform[];
|
|
39
|
+
});
|
|
40
|
+
setSize(width: number, height: number): void;
|
|
41
|
+
setExecuteSize(width: number, height: number): void;
|
|
42
|
+
setOutputParams(outputParams: Record<O, WGPUComputePassOutput>): void;
|
|
43
|
+
setUniform(label: string, data: Float32Array | Int32Array | Uint32Array): void;
|
|
44
|
+
getOutputBuffer(name: O): GPUBuffer;
|
|
45
|
+
dispose(): void;
|
|
46
|
+
private _createBuffer;
|
|
47
|
+
private _resizeOutputBuffers;
|
|
48
|
+
private _updateOutputBuffers;
|
|
49
|
+
private _updatePipeline;
|
|
50
|
+
private _getFullCs;
|
|
51
|
+
private _updateBindGroups;
|
|
52
|
+
createPass(commandEncoder: GPUCommandEncoder, inputBuffers: Record<I, WGPUComputePassInput>): void;
|
|
53
|
+
}
|