@webex/ladon-ts 4.0.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/CHANGELOG.md +14 -0
- package/LICENSE +5 -0
- package/README.md +36 -0
- package/build/module/index.d.ts +6 -0
- package/build/module/index.js +7 -0
- package/build/module/lib/config.d.ts +61 -0
- package/build/module/lib/config.js +109 -0
- package/build/module/lib/generator.d.ts +52 -0
- package/build/module/lib/generator.js +202 -0
- package/build/module/lib/pipeline.d.ts +21 -0
- package/build/module/lib/pipeline.js +83 -0
- package/build/module/lib/renderer.d.ts +63 -0
- package/build/module/lib/renderer.js +463 -0
- package/build/module/lib/util.d.ts +1 -0
- package/build/module/lib/util.js +10 -0
- package/build/module/lib/version.d.ts +1 -0
- package/build/module/lib/version.js +2 -0
- package/package.json +81 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
|
+
|
|
5
|
+
## [4.0.0](https://github.com/beyonddunbar/ladon-ts/compare/v2.8.0...v4.0.0) (2023-02-11)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### ⚠ BREAKING CHANGES
|
|
9
|
+
|
|
10
|
+
* getConfig accepts model_url_resolver (#1)
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* getConfig accepts model_url_resolver ([#1](https://github.com/beyonddunbar/ladon-ts/issues/1)) ([a2699d6](https://github.com/beyonddunbar/ladon-ts/commit/a2699d67bd4d3efd8b1261ec5379d83554b90b6f))
|
package/LICENSE
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
* Coded instructions, statements, and computer programs are the
|
|
2
|
+
* copyrighted works and confidential proprietary information of Cisco, Inc.
|
|
3
|
+
* They may not be modified, copied, reproduced, distributed, or disclosed to
|
|
4
|
+
* third parties in any manner, medium, or form, in whole or in part, without
|
|
5
|
+
* the prior written consent of Cisco, Inc.
|
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Collaboration Video AI Client Library for Web
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
The Video AI Client Library for Web is designed for TypeScript client-application developers. It offers simple, flexible, and powerful APIs for video AI.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
### ML Annotations
|
|
10
|
+
|
|
11
|
+
- Person segmentation
|
|
12
|
+
|
|
13
|
+
### Rendering Effects
|
|
14
|
+
|
|
15
|
+
- Horizontal flip
|
|
16
|
+
- Variable strength, high quality background blur
|
|
17
|
+
- Static image background replacement
|
|
18
|
+
- Dynamic video background replacement
|
|
19
|
+
|
|
20
|
+
### Input/Output
|
|
21
|
+
|
|
22
|
+
The library supports a HTML canvas input and output interface.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Documentation
|
|
26
|
+
|
|
27
|
+
- [Getting Started](docs/START.md)
|
|
28
|
+
- [Self-Hosting](docs/HOSTING.md)
|
|
29
|
+
- [Content Security Policy](docs/CSP.md)
|
|
30
|
+
- [Development](docs/DEVELOPMENT.md)
|
|
31
|
+
|
|
32
|
+
## Links
|
|
33
|
+
|
|
34
|
+
- [Live Example](https://models.intelligence.webex.com/ladon/3.0.2/example/index.html)
|
|
35
|
+
- [Performance and Visual Tests](https://models.intelligence.webex.com/ladon/3.0.2/test/index.html)
|
|
36
|
+
- [Typedocs](https://sqbu-github.cisco.com/pages/WebexIntelligence/ladon-ts/)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './lib/config';
|
|
2
|
+
export * from './lib/generator';
|
|
3
|
+
export * from './lib/pipeline';
|
|
4
|
+
export * from './lib/renderer';
|
|
5
|
+
export * from './lib/util';
|
|
6
|
+
export * from './lib/version';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxlQUFlLENBQUMifQ==
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export declare type InputConfig = {
|
|
2
|
+
readonly height: number;
|
|
3
|
+
readonly width: number;
|
|
4
|
+
};
|
|
5
|
+
export declare type ModelUrlResolver = string | ((model_path: string) => Promise<string>);
|
|
6
|
+
export interface RenderConfig {
|
|
7
|
+
readonly type: 'blur' | 'passthrough' | 'replacement';
|
|
8
|
+
readonly horizontal_mirror?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface BlurConfig extends RenderConfig {
|
|
11
|
+
readonly type: 'blur';
|
|
12
|
+
readonly kernel_size: number;
|
|
13
|
+
readonly sigma: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ReplacementConfig extends RenderConfig {
|
|
16
|
+
readonly type: 'replacement';
|
|
17
|
+
background: HTMLCanvasElement;
|
|
18
|
+
readonly static: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare type Generator = 'local' | 'worker';
|
|
21
|
+
export declare type MaskConfig = {
|
|
22
|
+
readonly generator: Generator;
|
|
23
|
+
readonly generation_interval_ms: number;
|
|
24
|
+
readonly model_url_resolver: ModelUrlResolver;
|
|
25
|
+
readonly model_uri: string;
|
|
26
|
+
readonly worker_uri: string;
|
|
27
|
+
};
|
|
28
|
+
export declare type PipelineConfig = {
|
|
29
|
+
readonly base_url?: string;
|
|
30
|
+
readonly wasm_uri?: string;
|
|
31
|
+
readonly render: BlurConfig | RenderConfig | ReplacementConfig;
|
|
32
|
+
readonly input: InputConfig;
|
|
33
|
+
readonly mask: MaskConfig;
|
|
34
|
+
};
|
|
35
|
+
export declare enum Quality {
|
|
36
|
+
LOW = "LOW",
|
|
37
|
+
MEDIUM = "MEDIUM",
|
|
38
|
+
HIGH = "HIGH",
|
|
39
|
+
ULTRA = "ULTRA"
|
|
40
|
+
}
|
|
41
|
+
export declare enum BlurStrength {
|
|
42
|
+
WEAK = "WEAK",
|
|
43
|
+
MODERATE = "MODERATE",
|
|
44
|
+
STRONG = "STRONG",
|
|
45
|
+
STRONGER = "STRONGER",
|
|
46
|
+
STRONGEST = "STRONGEST"
|
|
47
|
+
}
|
|
48
|
+
export declare const getBlurConfig: (blur_strength: BlurStrength, horizontal_mirror?: boolean) => BlurConfig;
|
|
49
|
+
export declare const getConfig: (height: number, width: number, quality?: Quality, generator?: Generator, render_config?: BlurConfig | RenderConfig | ReplacementConfig, model_url_resolver?: ModelUrlResolver, base_url?: string) => {
|
|
50
|
+
mask: {
|
|
51
|
+
generator: Generator;
|
|
52
|
+
generation_interval_ms: number;
|
|
53
|
+
model_url_resolver: ModelUrlResolver;
|
|
54
|
+
model_uri: string;
|
|
55
|
+
worker_uri: string;
|
|
56
|
+
};
|
|
57
|
+
base_url?: string | undefined;
|
|
58
|
+
wasm_uri?: string | undefined;
|
|
59
|
+
render: BlurConfig | RenderConfig | ReplacementConfig;
|
|
60
|
+
input: InputConfig;
|
|
61
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { LIB_VERSION } from './version';
|
|
2
|
+
export var Quality;
|
|
3
|
+
(function (Quality) {
|
|
4
|
+
Quality["LOW"] = "LOW";
|
|
5
|
+
Quality["MEDIUM"] = "MEDIUM";
|
|
6
|
+
Quality["HIGH"] = "HIGH";
|
|
7
|
+
Quality["ULTRA"] = "ULTRA";
|
|
8
|
+
})(Quality || (Quality = {}));
|
|
9
|
+
export var BlurStrength;
|
|
10
|
+
(function (BlurStrength) {
|
|
11
|
+
BlurStrength["WEAK"] = "WEAK";
|
|
12
|
+
BlurStrength["MODERATE"] = "MODERATE";
|
|
13
|
+
BlurStrength["STRONG"] = "STRONG";
|
|
14
|
+
BlurStrength["STRONGER"] = "STRONGER";
|
|
15
|
+
BlurStrength["STRONGEST"] = "STRONGEST";
|
|
16
|
+
})(BlurStrength || (BlurStrength = {}));
|
|
17
|
+
export const getBlurConfig = (blur_strength, horizontal_mirror) => {
|
|
18
|
+
let kernel_size = 25;
|
|
19
|
+
let sigma = 11;
|
|
20
|
+
switch (blur_strength) {
|
|
21
|
+
case BlurStrength.WEAK:
|
|
22
|
+
kernel_size = 9;
|
|
23
|
+
sigma = 2;
|
|
24
|
+
break;
|
|
25
|
+
case BlurStrength.MODERATE:
|
|
26
|
+
kernel_size = 15;
|
|
27
|
+
sigma = 6;
|
|
28
|
+
break;
|
|
29
|
+
case BlurStrength.STRONG:
|
|
30
|
+
kernel_size = 25;
|
|
31
|
+
sigma = 11;
|
|
32
|
+
break;
|
|
33
|
+
case BlurStrength.STRONGER:
|
|
34
|
+
kernel_size = 37;
|
|
35
|
+
sigma = 17;
|
|
36
|
+
break;
|
|
37
|
+
case BlurStrength.STRONGEST:
|
|
38
|
+
kernel_size = 49;
|
|
39
|
+
sigma = 23;
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
type: 'blur',
|
|
46
|
+
horizontal_mirror,
|
|
47
|
+
kernel_size,
|
|
48
|
+
sigma,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
export const getConfig = (height, width, quality = Quality.LOW, generator = 'local', render_config = {
|
|
52
|
+
type: 'blur',
|
|
53
|
+
horizontal_mirror: false,
|
|
54
|
+
kernel_size: 37,
|
|
55
|
+
sigma: 17,
|
|
56
|
+
}, model_url_resolver = (model_path) => {
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
resolve(model_path);
|
|
59
|
+
});
|
|
60
|
+
}, base_url = '') => {
|
|
61
|
+
const model_version = '1.0.0';
|
|
62
|
+
const base_config = {
|
|
63
|
+
base_url,
|
|
64
|
+
wasm_uri: '/wasm/1.13.1/',
|
|
65
|
+
render: render_config,
|
|
66
|
+
input: {
|
|
67
|
+
height,
|
|
68
|
+
width,
|
|
69
|
+
},
|
|
70
|
+
mask: {
|
|
71
|
+
generation_interval_ms: 48,
|
|
72
|
+
generator,
|
|
73
|
+
model_url_resolver,
|
|
74
|
+
model_uri: `/models/${model_version}/mv2_dlv3plus_dynamic_dev_plus_dual_op11_mn3sm100.onnx`,
|
|
75
|
+
worker_uri: `/${LIB_VERSION}/worker/segmentation.js`,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
let mask_quality_config = {};
|
|
79
|
+
switch (quality) {
|
|
80
|
+
case Quality.LOW:
|
|
81
|
+
mask_quality_config = {
|
|
82
|
+
generation_interval_ms: 48,
|
|
83
|
+
model_uri: `/models/${model_version}/mv2_dlv3plus_dynamic_dev_plus_dual_op11_mn3sm100.onnx`,
|
|
84
|
+
};
|
|
85
|
+
break;
|
|
86
|
+
case Quality.MEDIUM:
|
|
87
|
+
mask_quality_config = {
|
|
88
|
+
generation_interval_ms: 24,
|
|
89
|
+
model_uri: `/models/${model_version}/mv2_dlv3plus_dynamic_dev_plus_dual_op11_mn3sm100.onnx`,
|
|
90
|
+
};
|
|
91
|
+
break;
|
|
92
|
+
case Quality.HIGH:
|
|
93
|
+
mask_quality_config = {
|
|
94
|
+
generation_interval_ms: 36,
|
|
95
|
+
model_uri: `/models/${model_version}/mv2_dlv3plus_dynamic_dev_plus_dual_op11_full_depth_2.onnx`,
|
|
96
|
+
};
|
|
97
|
+
break;
|
|
98
|
+
case Quality.ULTRA:
|
|
99
|
+
mask_quality_config = {
|
|
100
|
+
generation_interval_ms: 0,
|
|
101
|
+
model_uri: `/models/${model_version}/mv2_dlv3plus_dynamic_dev_plus_dual_op11_full_depth_2.onnx`,
|
|
102
|
+
};
|
|
103
|
+
break;
|
|
104
|
+
default:
|
|
105
|
+
throw new Error('[ladon-ts] - unknown quality option: ' + quality);
|
|
106
|
+
}
|
|
107
|
+
return Object.assign(Object.assign({}, base_config), { mask: Object.assign(Object.assign({}, base_config.mask), mask_quality_config) });
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQStDeEMsTUFBTSxDQUFOLElBQVksT0FLWDtBQUxELFdBQVksT0FBTztJQUNmLHNCQUFXLENBQUE7SUFDWCw0QkFBaUIsQ0FBQTtJQUNqQix3QkFBYSxDQUFBO0lBQ2IsMEJBQWUsQ0FBQTtBQUNuQixDQUFDLEVBTFcsT0FBTyxLQUFQLE9BQU8sUUFLbEI7QUFFRCxNQUFNLENBQU4sSUFBWSxZQU1YO0FBTkQsV0FBWSxZQUFZO0lBQ3BCLDZCQUFhLENBQUE7SUFDYixxQ0FBcUIsQ0FBQTtJQUNyQixpQ0FBaUIsQ0FBQTtJQUNqQixxQ0FBcUIsQ0FBQTtJQUNyQix1Q0FBdUIsQ0FBQTtBQUMzQixDQUFDLEVBTlcsWUFBWSxLQUFaLFlBQVksUUFNdkI7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FDekIsYUFBMkIsRUFDM0IsaUJBQTJCLEVBQ2pCLEVBQUU7SUFDWixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDckIsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRWYsUUFBUSxhQUFhLEVBQUU7UUFDbkIsS0FBSyxZQUFZLENBQUMsSUFBSTtZQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDVixNQUFNO1FBQ1YsS0FBSyxZQUFZLENBQUMsUUFBUTtZQUN0QixXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDVixNQUFNO1FBQ1YsS0FBSyxZQUFZLENBQUMsTUFBTTtZQUNwQixXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDWCxNQUFNO1FBQ1YsS0FBSyxZQUFZLENBQUMsUUFBUTtZQUN0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
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { PipelineConfig } from './config';
|
|
2
|
+
declare global {
|
|
3
|
+
interface ImportMeta {
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export interface MaskResult {
|
|
8
|
+
data: Float32Array;
|
|
9
|
+
warm: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface MaskGenerator {
|
|
12
|
+
getMask(input: Uint8ClampedArray): Promise<MaskResult>;
|
|
13
|
+
load(): Promise<void>;
|
|
14
|
+
isLoaded(): boolean;
|
|
15
|
+
postRender(input: Uint8ClampedArray): Promise<void>;
|
|
16
|
+
destroy(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class LocalGenerator implements MaskGenerator {
|
|
19
|
+
readonly config: PipelineConfig;
|
|
20
|
+
private last_mask;
|
|
21
|
+
private mask_model?;
|
|
22
|
+
private last_mask_generation;
|
|
23
|
+
constructor(config: PipelineConfig);
|
|
24
|
+
private preprocess;
|
|
25
|
+
getMask(input: Uint8ClampedArray): Promise<MaskResult>;
|
|
26
|
+
load(): Promise<void>;
|
|
27
|
+
isLoaded(): boolean;
|
|
28
|
+
postRender(_: Uint8ClampedArray): Promise<void>;
|
|
29
|
+
destroy(): void;
|
|
30
|
+
}
|
|
31
|
+
export declare class NullGenerator implements MaskGenerator {
|
|
32
|
+
readonly config: PipelineConfig;
|
|
33
|
+
private last_mask;
|
|
34
|
+
constructor(config: PipelineConfig);
|
|
35
|
+
getMask(_: Uint8ClampedArray): Promise<MaskResult>;
|
|
36
|
+
load(): Promise<void>;
|
|
37
|
+
isLoaded(): boolean;
|
|
38
|
+
postRender(_: Uint8ClampedArray): Promise<void>;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class WorkerGenerator implements MaskGenerator {
|
|
42
|
+
readonly config: PipelineConfig;
|
|
43
|
+
private last_mask;
|
|
44
|
+
private worker?;
|
|
45
|
+
private new_mask;
|
|
46
|
+
constructor(config: PipelineConfig);
|
|
47
|
+
getMask(_: Uint8ClampedArray): Promise<MaskResult>;
|
|
48
|
+
load(): Promise<void>;
|
|
49
|
+
isLoaded(): boolean;
|
|
50
|
+
postRender(input: Uint8ClampedArray): Promise<void>;
|
|
51
|
+
destroy(): void;
|
|
52
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import * as ort from 'onnxruntime-web';
|
|
11
|
+
import { toAbsoluteURI } from './util';
|
|
12
|
+
export class LocalGenerator {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.last_mask_generation = 0;
|
|
16
|
+
this.last_mask = new ort.Tensor('float32', new Float32Array(this.config.input.height * this.config.input.width), [1, 1, this.config.input.height, this.config.input.width]);
|
|
17
|
+
}
|
|
18
|
+
preprocess(input) {
|
|
19
|
+
const output = new Float32Array(this.config.input.width * this.config.input.height * 3);
|
|
20
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
21
|
+
for (let pixel = 0; pixel < input.length / 4; pixel++) {
|
|
22
|
+
output[pixel +
|
|
23
|
+
channel *
|
|
24
|
+
this.config.input.width *
|
|
25
|
+
this.config.input.height] = input[pixel * 4 + channel];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return output;
|
|
29
|
+
}
|
|
30
|
+
getMask(input) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
if (!this.mask_model) {
|
|
33
|
+
throw new Error('[ladon-ts] - mask model not loaded.');
|
|
34
|
+
}
|
|
35
|
+
const mask_generation_timeout = Date.now() - this.last_mask_generation >
|
|
36
|
+
this.config.mask.generation_interval_ms;
|
|
37
|
+
if (!mask_generation_timeout) {
|
|
38
|
+
return {
|
|
39
|
+
data: this.last_mask.data,
|
|
40
|
+
warm: false,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
this.last_mask_generation = Date.now();
|
|
44
|
+
const image_tns = new ort.Tensor('float32', this.preprocess(input), [
|
|
45
|
+
1,
|
|
46
|
+
3,
|
|
47
|
+
this.config.input.height,
|
|
48
|
+
this.config.input.width,
|
|
49
|
+
]);
|
|
50
|
+
const feeds = {
|
|
51
|
+
input_image: image_tns,
|
|
52
|
+
prev_mask: this.last_mask,
|
|
53
|
+
};
|
|
54
|
+
const results = yield this.mask_model.run(feeds);
|
|
55
|
+
this.last_mask = results['output_mask'];
|
|
56
|
+
return {
|
|
57
|
+
data: this.last_mask.data,
|
|
58
|
+
warm: true,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
load() {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
if (this.config.wasm_uri) {
|
|
65
|
+
ort.env.wasm.wasmPaths = toAbsoluteURI(this.config.wasm_uri, this.config.base_url);
|
|
66
|
+
}
|
|
67
|
+
ort.env.wasm.numThreads = 1;
|
|
68
|
+
let model_url;
|
|
69
|
+
if (typeof this.config.mask.model_url_resolver === 'string') {
|
|
70
|
+
model_url = this.config.mask.model_url_resolver;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
model_url = yield this.config.mask.model_url_resolver(this.config.mask.model_uri);
|
|
74
|
+
}
|
|
75
|
+
this.mask_model = yield ort.InferenceSession.create(model_url, {
|
|
76
|
+
executionProviders: ['wasm'],
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
isLoaded() {
|
|
81
|
+
return !!this.mask_model;
|
|
82
|
+
}
|
|
83
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
84
|
+
postRender(_) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
// empty for local generator
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
destroy() {
|
|
90
|
+
// empty for local generator
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export class NullGenerator {
|
|
94
|
+
constructor(config) {
|
|
95
|
+
this.config = config;
|
|
96
|
+
this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
|
|
97
|
+
}
|
|
98
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
99
|
+
getMask(_) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
return {
|
|
102
|
+
data: this.last_mask,
|
|
103
|
+
warm: false,
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
load() {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
// empty for null generator
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
isLoaded() {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
116
|
+
postRender(_) {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
// empty for null generator
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
destroy() {
|
|
122
|
+
// empty for null generator
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export class WorkerGenerator {
|
|
126
|
+
constructor(config) {
|
|
127
|
+
this.config = config;
|
|
128
|
+
this.new_mask = true;
|
|
129
|
+
this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
|
|
130
|
+
}
|
|
131
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
132
|
+
getMask(_) {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
const toReturn = {
|
|
135
|
+
data: this.last_mask,
|
|
136
|
+
warm: this.new_mask,
|
|
137
|
+
};
|
|
138
|
+
this.new_mask = false;
|
|
139
|
+
return toReturn;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
load() {
|
|
143
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
const cross_origin_script_url = toAbsoluteURI(this.config.mask.worker_uri, this.config.base_url);
|
|
145
|
+
const content = yield (yield fetch(cross_origin_script_url, { cache: 'force-cache' })).text();
|
|
146
|
+
const worker_url = URL.createObjectURL(new Blob([content], { type: 'text/javascript' }));
|
|
147
|
+
this.worker = new Worker(worker_url, { type: 'module' });
|
|
148
|
+
let model_url;
|
|
149
|
+
if (typeof this.config.mask.model_url_resolver === 'string') {
|
|
150
|
+
model_url = this.config.mask.model_url_resolver;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
model_url = yield this.config.mask.model_url_resolver(this.config.mask.model_uri);
|
|
154
|
+
}
|
|
155
|
+
const worker_config = {
|
|
156
|
+
base_url: this.config.base_url,
|
|
157
|
+
input: this.config.input,
|
|
158
|
+
mask: Object.assign(Object.assign({}, this.config.mask), { model_url_resolver: model_url }),
|
|
159
|
+
wasm_uri: this.config.wasm_uri,
|
|
160
|
+
render: { type: 'passthrough' },
|
|
161
|
+
};
|
|
162
|
+
this.worker.postMessage(worker_config);
|
|
163
|
+
let resolution_cb;
|
|
164
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
165
|
+
const result = new Promise((resolve, _) => {
|
|
166
|
+
resolution_cb = resolve;
|
|
167
|
+
});
|
|
168
|
+
this.worker.onmessage = (event) => {
|
|
169
|
+
if (event.data.mask) {
|
|
170
|
+
this.last_mask = event.data.mask;
|
|
171
|
+
this.new_mask = true;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
URL.revokeObjectURL(worker_url);
|
|
175
|
+
if (resolution_cb) {
|
|
176
|
+
resolution_cb();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
return result;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
isLoaded() {
|
|
184
|
+
return !!this.worker;
|
|
185
|
+
}
|
|
186
|
+
postRender(input) {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
+
// claim ownership of the input tensor's buffer and forward to worker
|
|
189
|
+
if (!this.worker) {
|
|
190
|
+
throw new Error('[ladon-ts] - worker is not defined.');
|
|
191
|
+
}
|
|
192
|
+
this.worker.postMessage({
|
|
193
|
+
image: input,
|
|
194
|
+
}, [input.buffer]);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
destroy() {
|
|
198
|
+
var _a;
|
|
199
|
+
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.terminate();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBcUJ2QyxNQUFNLE9BQU8sY0FBYztJQUt2QixZQUE0QixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUYxQyx5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFHN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQzNCLFNBQVMsRUFDVCxJQUFJLFlBQVksQ0FDWixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUNyRCxFQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQzVELENBQUM7SUFDTixDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQXdCO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDekQsQ0FBQztRQUVGLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxF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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PipelineConfig } from './config';
|
|
2
|
+
export interface IPipeline {
|
|
3
|
+
onFrame(): Promise<void>;
|
|
4
|
+
isLoaded(): boolean;
|
|
5
|
+
load(): Promise<void>;
|
|
6
|
+
destroy(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare class Pipeline implements IPipeline {
|
|
9
|
+
private input_canvas;
|
|
10
|
+
private output_canvas;
|
|
11
|
+
readonly config: PipelineConfig;
|
|
12
|
+
private generator?;
|
|
13
|
+
private renderer?;
|
|
14
|
+
private loaded;
|
|
15
|
+
private input_ctx;
|
|
16
|
+
constructor(input_canvas: HTMLCanvasElement, output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
17
|
+
onFrame(): Promise<void>;
|
|
18
|
+
isLoaded(): boolean;
|
|
19
|
+
load(): Promise<void>;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { LocalGenerator, NullGenerator, WorkerGenerator, } from './generator';
|
|
11
|
+
import { BlurRenderer, PassthroughRenderer, ReplacementRenderer, } from './renderer';
|
|
12
|
+
export class Pipeline {
|
|
13
|
+
constructor(input_canvas, output_canvas, config) {
|
|
14
|
+
this.input_canvas = input_canvas;
|
|
15
|
+
this.output_canvas = output_canvas;
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.loaded = false;
|
|
18
|
+
const input_ctx = this.input_canvas.getContext('2d', {
|
|
19
|
+
alpha: false,
|
|
20
|
+
});
|
|
21
|
+
if (!input_ctx) {
|
|
22
|
+
throw new Error('[ladon-ts] - error getting input context 2d');
|
|
23
|
+
}
|
|
24
|
+
this.input_ctx = input_ctx;
|
|
25
|
+
}
|
|
26
|
+
onFrame() {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
if (!this.generator || !this.renderer) {
|
|
29
|
+
throw new Error('[ladon-ts] - pipeline is not loaded.');
|
|
30
|
+
}
|
|
31
|
+
const raw_image_data = this.input_ctx.getImageData(0, 0, this.config.input.width, this.config.input.height).data;
|
|
32
|
+
const mask = yield this.generator.getMask(raw_image_data);
|
|
33
|
+
yield this.renderer.render(raw_image_data, mask);
|
|
34
|
+
yield this.generator.postRender(raw_image_data);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
isLoaded() {
|
|
38
|
+
return this.loaded;
|
|
39
|
+
}
|
|
40
|
+
load() {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
switch (this.config.render.type) {
|
|
43
|
+
case 'blur':
|
|
44
|
+
this.renderer = new BlurRenderer(this.output_canvas, this.config);
|
|
45
|
+
break;
|
|
46
|
+
case 'passthrough':
|
|
47
|
+
this.renderer = new PassthroughRenderer(this.output_canvas, this.config);
|
|
48
|
+
break;
|
|
49
|
+
case 'replacement':
|
|
50
|
+
this.renderer = new ReplacementRenderer(this.output_canvas, this.config);
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
throw new Error('[ladon-ts] - renderer not implemented.');
|
|
54
|
+
}
|
|
55
|
+
yield this.renderer.load();
|
|
56
|
+
if (this.config.render.type === 'passthrough') {
|
|
57
|
+
// automatically disable model evaluation when the renderer is set to passthrough
|
|
58
|
+
// Note: this may change when gestures are detected (model eval will be a dependency for more than rendering)
|
|
59
|
+
this.generator = new NullGenerator(this.config);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
switch (this.config.mask.generator) {
|
|
63
|
+
case 'local':
|
|
64
|
+
this.generator = new LocalGenerator(this.config);
|
|
65
|
+
break;
|
|
66
|
+
case 'worker':
|
|
67
|
+
this.generator = new WorkerGenerator(this.config);
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
throw new Error('[ladon-ts] - generator not implemented.');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
yield this.generator.load();
|
|
74
|
+
this.loaded = true;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
destroy() {
|
|
78
|
+
var _a, _b;
|
|
79
|
+
(_a = this.generator) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
80
|
+
(_b = this.renderer) === null || _b === void 0 ? void 0 : _b.destroy();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBLE9BQU8sRUFDSCxjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsR0FDbEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNILFlBQVksRUFFWixtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3RCLE1BQU0sWUFBWSxDQUFDO0FBU3BCLE1BQU0sT0FBTyxRQUFRO0lBT2pCLFlBQ1ksWUFBK0IsRUFDL0IsYUFBZ0MsRUFDeEIsTUFBc0I7UUFGOUIsaUJBQVksR0FBWixZQUFZLENBQW1CO1FBQy9CLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQVBsQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBU25CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNqRCxLQUFLLEVBQUUsS0FBSztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDbEU7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRVksT0FBTzs7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7YUFDM0Q7WUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FDOUMsQ0FBQyxFQUNELENBQUMsRUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxJQUFJLENBQUM7WUFFUCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTFELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsQ0FBQztLQUFBO0lBRU0sUUFBUTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRVksSUFBSTs7WUFDYixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDN0IsS0FBSyxNQUFNO29CQUNQLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQzVCLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FBQztvQkFDRixNQUFNO2dCQUNWLEtBQUssYUFBYTtvQkFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQ25DLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FBQztvQkFDRixNQUFNO2dCQUNWLEtBQUssYUFBYTtvQkFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQ25DLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxNQUFNLENBQ2QsQ0FBQztvQkFDRixNQUFNO2dCQUNWO29CQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQzthQUNqRTtZQUVELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUUzQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUU7Z0JBQzNDLGlGQUFpRjtnQkFDakYsNkdBQTZHO2dCQUM3RyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDSCxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDaEMsS0FBSyxPQUFPO3dCQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNqRCxNQUFNO29CQUNWLEtBQUssUUFBUTt3QkFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDbEQsTUFBTTtvQkFDVjt3QkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7aUJBQ2xFO2FBQ0o7WUFFRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBRU0sT0FBTzs7UUFDVixNQUFBLElBQUksQ0FBQyxTQUFTLDBDQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNKIn0=
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { PipelineConfig } from './config';
|
|
2
|
+
import { MaskResult } from './generator';
|
|
3
|
+
export interface LadonRenderer {
|
|
4
|
+
render(input: Uint8ClampedArray, mask: MaskResult): Promise<void>;
|
|
5
|
+
load(): Promise<void>;
|
|
6
|
+
destroy(): void;
|
|
7
|
+
}
|
|
8
|
+
declare abstract class WebGLRenderer {
|
|
9
|
+
output_canvas: HTMLCanvasElement;
|
|
10
|
+
readonly config: PipelineConfig;
|
|
11
|
+
protected intermediate_canvas?: HTMLCanvasElement;
|
|
12
|
+
protected output_canvas_2d?: CanvasRenderingContext2D;
|
|
13
|
+
protected gl: WebGL2RenderingContext;
|
|
14
|
+
protected image_texture: WebGLTexture;
|
|
15
|
+
protected mask_texture: WebGLTexture;
|
|
16
|
+
protected verts: Float32Array;
|
|
17
|
+
protected vertex_shader_src: string;
|
|
18
|
+
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
19
|
+
protected getUVCalculation(): "vec2 st = -(gl_FragCoord.xy / u_resolution) + 1.0;" | "vec2 st = vec2((gl_FragCoord.x / u_resolution.x), -(gl_FragCoord.y / u_resolution.y) + 1.0);";
|
|
20
|
+
protected setSharedUniforms(program: WebGLProgram): void;
|
|
21
|
+
protected uploadVideoStream(input: Uint8ClampedArray): void;
|
|
22
|
+
protected postDraw(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class PassthroughRenderer extends WebGLRenderer implements LadonRenderer {
|
|
25
|
+
output_canvas: HTMLCanvasElement;
|
|
26
|
+
readonly config: PipelineConfig;
|
|
27
|
+
private program;
|
|
28
|
+
private fragment_shader;
|
|
29
|
+
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
30
|
+
render(input: Uint8ClampedArray, _: MaskResult): Promise<void>;
|
|
31
|
+
load(): Promise<void>;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare class ReplacementRenderer extends WebGLRenderer implements LadonRenderer {
|
|
35
|
+
output_canvas: HTMLCanvasElement;
|
|
36
|
+
readonly config: PipelineConfig;
|
|
37
|
+
private program;
|
|
38
|
+
private background_canvas_ctx;
|
|
39
|
+
protected background_texture: WebGLTexture;
|
|
40
|
+
private fragment_shader;
|
|
41
|
+
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
42
|
+
render(input: Uint8ClampedArray, mask: MaskResult): Promise<void>;
|
|
43
|
+
load(): Promise<void>;
|
|
44
|
+
destroy(): void;
|
|
45
|
+
}
|
|
46
|
+
export declare class BlurRenderer extends WebGLRenderer implements LadonRenderer {
|
|
47
|
+
output_canvas: HTMLCanvasElement;
|
|
48
|
+
readonly config: PipelineConfig;
|
|
49
|
+
private program_1;
|
|
50
|
+
private program_2;
|
|
51
|
+
private framebuffer;
|
|
52
|
+
private transfer_texture;
|
|
53
|
+
private u_blur;
|
|
54
|
+
private fragment_shader_common;
|
|
55
|
+
private fragment_shader_pass_1_src;
|
|
56
|
+
fragment_shader_pass_2_src: string;
|
|
57
|
+
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
58
|
+
render(input: Uint8ClampedArray, mask: MaskResult): Promise<void>;
|
|
59
|
+
load(): Promise<void>;
|
|
60
|
+
destroy(): void;
|
|
61
|
+
private getBlurKernel;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
class WebGLRenderer {
|
|
11
|
+
constructor(output_canvas, config) {
|
|
12
|
+
this.output_canvas = output_canvas;
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.verts = new Float32Array([
|
|
15
|
+
-1.0, -1.0, 0.0, -1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
|
|
16
|
+
1.0, 1.0, 0.0, 1.0, -1.0, 0.0, -1.0, -1.0, 0.0,
|
|
17
|
+
]);
|
|
18
|
+
this.vertex_shader_src = `#version 300 es
|
|
19
|
+
|
|
20
|
+
in vec4 position;
|
|
21
|
+
|
|
22
|
+
void main() {
|
|
23
|
+
gl_Position = position;
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
const gl = this.output_canvas.getContext('webgl2');
|
|
27
|
+
if (!gl) {
|
|
28
|
+
const output_2d = this.output_canvas.getContext('2d');
|
|
29
|
+
if (!output_2d) {
|
|
30
|
+
throw new Error('[ladon-ts] - output canvas context must be webgl2 or 2d');
|
|
31
|
+
}
|
|
32
|
+
this.output_canvas_2d = output_2d;
|
|
33
|
+
this.intermediate_canvas = document.createElement('canvas');
|
|
34
|
+
this.intermediate_canvas.height = this.config.input.height;
|
|
35
|
+
this.intermediate_canvas.width = this.config.input.width;
|
|
36
|
+
const gl_intermediate = this.intermediate_canvas.getContext('webgl2');
|
|
37
|
+
if (!gl_intermediate) {
|
|
38
|
+
throw new Error('[ladon-ts] - error getting output context webgl');
|
|
39
|
+
}
|
|
40
|
+
this.gl = gl_intermediate;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.gl = gl;
|
|
44
|
+
}
|
|
45
|
+
const image_texture = this.gl.createTexture();
|
|
46
|
+
if (!image_texture) {
|
|
47
|
+
throw new Error('[ladon-ts] - error creating input texture');
|
|
48
|
+
}
|
|
49
|
+
this.image_texture = image_texture;
|
|
50
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);
|
|
51
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
|
|
52
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
|
53
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
|
54
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, null);
|
|
55
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
56
|
+
const mask_texture = this.gl.createTexture();
|
|
57
|
+
if (!mask_texture) {
|
|
58
|
+
throw new Error('[ladon-ts] - error creating mask texture');
|
|
59
|
+
}
|
|
60
|
+
this.mask_texture = mask_texture;
|
|
61
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
|
|
62
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);
|
|
63
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);
|
|
64
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
|
65
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
|
66
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R32F, this.config.input.width, this.config.input.height, 0, this.gl.RED, this.gl.FLOAT, null);
|
|
67
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
68
|
+
const vertex_array = this.gl.createVertexArray();
|
|
69
|
+
if (!vertex_array) {
|
|
70
|
+
throw new Error('[ladon-ts] - error creating vertex array');
|
|
71
|
+
}
|
|
72
|
+
this.gl.bindVertexArray(vertex_array);
|
|
73
|
+
const buffer = this.gl.createBuffer();
|
|
74
|
+
if (!buffer) {
|
|
75
|
+
throw new Error('[ladon-ts] - error creating buffer');
|
|
76
|
+
}
|
|
77
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);
|
|
78
|
+
this.gl.bufferData(this.gl.ARRAY_BUFFER, this.verts, this.gl.STATIC_DRAW);
|
|
79
|
+
this.gl.vertexAttribPointer(0, 3, this.gl.FLOAT, false, 0, 0);
|
|
80
|
+
this.gl.enableVertexAttribArray(0);
|
|
81
|
+
this.gl.viewport(0, 0, this.config.input.width, this.config.input.height);
|
|
82
|
+
}
|
|
83
|
+
getUVCalculation() {
|
|
84
|
+
if (this.config.render.horizontal_mirror) {
|
|
85
|
+
return `vec2 st = -(gl_FragCoord.xy / u_resolution) + 1.0;`;
|
|
86
|
+
}
|
|
87
|
+
return `vec2 st = vec2((gl_FragCoord.x / u_resolution.x), -(gl_FragCoord.y / u_resolution.y) + 1.0);`;
|
|
88
|
+
}
|
|
89
|
+
setSharedUniforms(program) {
|
|
90
|
+
const u_resolution = this.gl.getUniformLocation(program, 'u_resolution');
|
|
91
|
+
if (!u_resolution) {
|
|
92
|
+
throw new Error('[ladon-ts] - error finding "u_resolution" uniform');
|
|
93
|
+
}
|
|
94
|
+
this.gl.uniform2f(u_resolution, this.config.input.width, this.config.input.height);
|
|
95
|
+
const u_image = this.gl.getUniformLocation(program, 'u_image');
|
|
96
|
+
if (!u_image) {
|
|
97
|
+
throw new Error('[ladon-ts] - error finding "u_image" uniform');
|
|
98
|
+
}
|
|
99
|
+
this.gl.activeTexture(this.gl.TEXTURE0);
|
|
100
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);
|
|
101
|
+
this.gl.uniform1i(u_image, 0);
|
|
102
|
+
const u_mask = this.gl.getUniformLocation(program, 'u_mask');
|
|
103
|
+
if (u_mask) {
|
|
104
|
+
this.gl.activeTexture(this.gl.TEXTURE1);
|
|
105
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
|
|
106
|
+
this.gl.uniform1i(u_mask, 1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
uploadVideoStream(input) {
|
|
110
|
+
this.gl.activeTexture(this.gl.TEXTURE0);
|
|
111
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.image_texture);
|
|
112
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, input);
|
|
113
|
+
}
|
|
114
|
+
postDraw() {
|
|
115
|
+
if (this.output_canvas_2d && this.intermediate_canvas) {
|
|
116
|
+
this.output_canvas_2d.drawImage(this.intermediate_canvas, 0, 0, this.config.input.width, this.config.input.height);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export class PassthroughRenderer extends WebGLRenderer {
|
|
121
|
+
constructor(output_canvas, config) {
|
|
122
|
+
super(output_canvas, config);
|
|
123
|
+
this.output_canvas = output_canvas;
|
|
124
|
+
this.config = config;
|
|
125
|
+
this.fragment_shader = `#version 300 es
|
|
126
|
+
precision highp float;
|
|
127
|
+
|
|
128
|
+
out vec4 outColor;
|
|
129
|
+
|
|
130
|
+
uniform sampler2D u_image;
|
|
131
|
+
uniform vec2 u_resolution;
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
void main() {
|
|
135
|
+
${this.getUVCalculation()}
|
|
136
|
+
|
|
137
|
+
outColor = vec4(texture(u_image, st).rgb, 1.0);
|
|
138
|
+
}
|
|
139
|
+
`;
|
|
140
|
+
const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
|
|
141
|
+
const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader);
|
|
142
|
+
this.program = linkProgram(this.gl, vertex_shader, fragment_shader);
|
|
143
|
+
this.gl.useProgram(this.program);
|
|
144
|
+
this.setSharedUniforms(this.program);
|
|
145
|
+
}
|
|
146
|
+
render(input,
|
|
147
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
148
|
+
_) {
|
|
149
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
150
|
+
this.uploadVideoStream(input);
|
|
151
|
+
this.gl.useProgram(this.program);
|
|
152
|
+
this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
|
|
153
|
+
this.postDraw();
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
load() {
|
|
157
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
158
|
+
// empty
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
destroy() {
|
|
162
|
+
// empty
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export class ReplacementRenderer extends WebGLRenderer {
|
|
166
|
+
constructor(output_canvas, config) {
|
|
167
|
+
super(output_canvas, config);
|
|
168
|
+
this.output_canvas = output_canvas;
|
|
169
|
+
this.config = config;
|
|
170
|
+
this.fragment_shader = `#version 300 es
|
|
171
|
+
precision highp float;
|
|
172
|
+
|
|
173
|
+
out vec4 outColor;
|
|
174
|
+
|
|
175
|
+
uniform sampler2D u_background;
|
|
176
|
+
uniform sampler2D u_image;
|
|
177
|
+
uniform sampler2D u_mask;
|
|
178
|
+
uniform vec2 u_resolution;
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
float get_mask(vec2 st) {
|
|
182
|
+
return clamp(texture(u_mask, st).r, 0.0, 1.0);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
float get_inv_mask(vec2 st) {
|
|
186
|
+
return 1.0 - get_mask(st);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
void main() {
|
|
190
|
+
${this.getUVCalculation()}
|
|
191
|
+
|
|
192
|
+
outColor = vec4(texture(u_background, st).rgb * get_inv_mask(st) + texture(u_image, st).rgb * get_mask(st), 1.0);
|
|
193
|
+
}
|
|
194
|
+
`;
|
|
195
|
+
const background_canvas_ctx = this.config.render.background.getContext('2d');
|
|
196
|
+
if (!background_canvas_ctx) {
|
|
197
|
+
throw new Error('[ladon-ts] - could not get background canvas context 2d');
|
|
198
|
+
}
|
|
199
|
+
this.background_canvas_ctx = background_canvas_ctx;
|
|
200
|
+
const background_data = this.background_canvas_ctx.getImageData(0, 0, this.config.render.background.width, this.config.render.background.height).data;
|
|
201
|
+
if (this.config.render.kernel_size % 2 === 0) {
|
|
202
|
+
throw new Error('[ladon-ts] - kernel_size must be odd');
|
|
203
|
+
}
|
|
204
|
+
const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
|
|
205
|
+
const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader);
|
|
206
|
+
this.program = linkProgram(this.gl, vertex_shader, fragment_shader);
|
|
207
|
+
this.gl.useProgram(this.program);
|
|
208
|
+
this.setSharedUniforms(this.program);
|
|
209
|
+
const background_texture = this.gl.createTexture();
|
|
210
|
+
if (!background_texture) {
|
|
211
|
+
throw new Error('[ladon-ts] - error creating input texture');
|
|
212
|
+
}
|
|
213
|
+
this.background_texture = background_texture;
|
|
214
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);
|
|
215
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
|
|
216
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
|
217
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
|
218
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.render.background.width, this.config.render.background.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, background_data);
|
|
219
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
220
|
+
const u_background = this.gl.getUniformLocation(this.program, 'u_background');
|
|
221
|
+
if (!u_background) {
|
|
222
|
+
throw new Error('[ladon-ts] - error finding "u_background" uniform');
|
|
223
|
+
}
|
|
224
|
+
this.gl.activeTexture(this.gl.TEXTURE2);
|
|
225
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);
|
|
226
|
+
this.gl.uniform1i(u_background, 2);
|
|
227
|
+
}
|
|
228
|
+
render(input, mask) {
|
|
229
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
230
|
+
this.uploadVideoStream(input);
|
|
231
|
+
if (mask.warm) {
|
|
232
|
+
this.gl.activeTexture(this.gl.TEXTURE1);
|
|
233
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
|
|
234
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R32F, this.config.input.width, this.config.input.height, 0, this.gl.RED, this.gl.FLOAT, mask.data);
|
|
235
|
+
}
|
|
236
|
+
if (!this.config.render.static) {
|
|
237
|
+
const background_data = this.background_canvas_ctx.getImageData(0, 0, this.config.render.background.width, this.config.render.background.height).data;
|
|
238
|
+
this.gl.activeTexture(this.gl.TEXTURE2);
|
|
239
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.background_texture);
|
|
240
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, background_data);
|
|
241
|
+
}
|
|
242
|
+
this.gl.useProgram(this.program);
|
|
243
|
+
this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
|
|
244
|
+
this.postDraw();
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
load() {
|
|
248
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
249
|
+
// empty
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
destroy() {
|
|
253
|
+
// empty
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
export class BlurRenderer extends WebGLRenderer {
|
|
257
|
+
constructor(output_canvas, config) {
|
|
258
|
+
super(output_canvas, config);
|
|
259
|
+
this.output_canvas = output_canvas;
|
|
260
|
+
this.config = config;
|
|
261
|
+
this.fragment_shader_common = `#version 300 es
|
|
262
|
+
precision highp float;
|
|
263
|
+
|
|
264
|
+
#define KERNEL_SIZE ${this.config.render.kernel_size}
|
|
265
|
+
#define HORIZONTAL vec2(1.0, 0.0)
|
|
266
|
+
#define VERTICAL vec2(0.0, 1.0)
|
|
267
|
+
#define EPSILON 0.00001
|
|
268
|
+
|
|
269
|
+
out vec4 outColor;
|
|
270
|
+
|
|
271
|
+
uniform sampler2D u_image;
|
|
272
|
+
uniform float u_kernel[KERNEL_SIZE];
|
|
273
|
+
uniform sampler2D u_mask;
|
|
274
|
+
uniform vec2 u_resolution;
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
float get_mask(vec2 st) {
|
|
278
|
+
return clamp(texture(u_mask, st).r, 0.0, 1.0);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
float get_inv_mask(vec2 st) {
|
|
282
|
+
return 1.0 - get_mask(st);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
vec4 get_offset_mul(sampler2D src, vec2 uv, float weight) {
|
|
286
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
|
|
287
|
+
return vec4(vec3(0.0), weight);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// 4th channel is masked weight value
|
|
291
|
+
return vec4(vec3(texture(src, uv).rgb * get_inv_mask(uv) * weight), get_mask(uv) * weight);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
vec3 blur(sampler2D src, vec2 uv, vec2 direction) {
|
|
295
|
+
vec4 result = vec4(0.0);
|
|
296
|
+
|
|
297
|
+
vec2 step = (direction / u_resolution);
|
|
298
|
+
int offset = (KERNEL_SIZE - 1) / 2;
|
|
299
|
+
|
|
300
|
+
for (int i = 0; i < KERNEL_SIZE; i++) {
|
|
301
|
+
vec2 offset = step * float(i - offset);
|
|
302
|
+
result += get_offset_mul(src, uv + offset, u_kernel[i]);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (abs(result.a - 1.0) < EPSILON) {
|
|
306
|
+
return vec3(0.0);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// redistribute weights from masked areas
|
|
310
|
+
return result.rgb * (1.0 + (result.a / (1.0 - result.a)));
|
|
311
|
+
}
|
|
312
|
+
`;
|
|
313
|
+
this.fragment_shader_pass_1_src = this.fragment_shader_common +
|
|
314
|
+
`
|
|
315
|
+
void main() {
|
|
316
|
+
vec2 st = gl_FragCoord.xy / u_resolution;
|
|
317
|
+
|
|
318
|
+
outColor = vec4(blur(u_image, st, HORIZONTAL) * get_inv_mask(st), 1.0);
|
|
319
|
+
}
|
|
320
|
+
`;
|
|
321
|
+
this.fragment_shader_pass_2_src = this.fragment_shader_common +
|
|
322
|
+
`
|
|
323
|
+
uniform sampler2D u_blur;
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
void main() {
|
|
327
|
+
${this.getUVCalculation()}
|
|
328
|
+
|
|
329
|
+
vec3 blurred = blur(u_blur, st, VERTICAL);
|
|
330
|
+
vec3 image = texture(u_image, st).rgb;
|
|
331
|
+
float mask = texture(u_mask, st).r;
|
|
332
|
+
|
|
333
|
+
outColor = vec4(blurred * (1.0 - mask) + image * mask, 1.0);
|
|
334
|
+
}
|
|
335
|
+
`;
|
|
336
|
+
if (this.config.render.kernel_size % 2 === 0) {
|
|
337
|
+
throw new Error('[ladon-ts] - kernel_size must be odd');
|
|
338
|
+
}
|
|
339
|
+
// program pass 1 setup
|
|
340
|
+
{
|
|
341
|
+
const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
|
|
342
|
+
const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader_pass_1_src);
|
|
343
|
+
this.program_1 = linkProgram(this.gl, vertex_shader, fragment_shader);
|
|
344
|
+
this.gl.useProgram(this.program_1);
|
|
345
|
+
const framebuffer = this.gl.createFramebuffer();
|
|
346
|
+
if (!framebuffer) {
|
|
347
|
+
throw new Error('[ladon-ts] - error creating framebuffer');
|
|
348
|
+
}
|
|
349
|
+
this.framebuffer = framebuffer;
|
|
350
|
+
const transfer_texture = this.gl.createTexture();
|
|
351
|
+
if (!transfer_texture) {
|
|
352
|
+
throw new Error('[ladon-ts] - error creating output texture');
|
|
353
|
+
}
|
|
354
|
+
this.transfer_texture = transfer_texture;
|
|
355
|
+
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.framebuffer);
|
|
356
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.transfer_texture);
|
|
357
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
|
|
358
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
|
359
|
+
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
|
360
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.config.input.width, this.config.input.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, null);
|
|
361
|
+
this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, this.transfer_texture, 0);
|
|
362
|
+
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
|
|
363
|
+
this.setSharedUniforms(this.program_1);
|
|
364
|
+
const u_kernel = this.gl.getUniformLocation(this.program_1, 'u_kernel');
|
|
365
|
+
if (!u_kernel) {
|
|
366
|
+
throw new Error('[ladon-ts] - error finding "u_kernel" uniform');
|
|
367
|
+
}
|
|
368
|
+
this.gl.uniform1fv(u_kernel, this.getBlurKernel());
|
|
369
|
+
}
|
|
370
|
+
// program pass 2 setup
|
|
371
|
+
{
|
|
372
|
+
const vertex_shader = compileShader(this.gl, this.gl.VERTEX_SHADER, this.vertex_shader_src);
|
|
373
|
+
const fragment_shader = compileShader(this.gl, this.gl.FRAGMENT_SHADER, this.fragment_shader_pass_2_src);
|
|
374
|
+
this.program_2 = linkProgram(this.gl, vertex_shader, fragment_shader);
|
|
375
|
+
this.gl.useProgram(this.program_2);
|
|
376
|
+
const u_blur = this.gl.getUniformLocation(this.program_2, 'u_blur');
|
|
377
|
+
if (!u_blur) {
|
|
378
|
+
throw new Error('[ladon-ts] - error finding "u_blur" uniform');
|
|
379
|
+
}
|
|
380
|
+
this.u_blur = u_blur;
|
|
381
|
+
this.gl.activeTexture(this.gl.TEXTURE2);
|
|
382
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.transfer_texture);
|
|
383
|
+
this.gl.uniform1i(this.u_blur, 2);
|
|
384
|
+
this.setSharedUniforms(this.program_2);
|
|
385
|
+
const u_kernel = this.gl.getUniformLocation(this.program_2, 'u_kernel');
|
|
386
|
+
if (!u_kernel) {
|
|
387
|
+
throw new Error('[ladon-ts] - error finding "u_kernel" uniform');
|
|
388
|
+
}
|
|
389
|
+
this.gl.uniform1fv(u_kernel, this.getBlurKernel());
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
render(input, mask) {
|
|
393
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
394
|
+
this.uploadVideoStream(input);
|
|
395
|
+
if (mask.warm) {
|
|
396
|
+
this.gl.activeTexture(this.gl.TEXTURE1);
|
|
397
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
|
|
398
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R32F, this.config.input.width, this.config.input.height, 0, this.gl.RED, this.gl.FLOAT, mask.data);
|
|
399
|
+
}
|
|
400
|
+
// program pass 1 - blur in one direction & output to framebuffer
|
|
401
|
+
this.gl.useProgram(this.program_1);
|
|
402
|
+
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.framebuffer);
|
|
403
|
+
this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
|
|
404
|
+
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
|
|
405
|
+
// program pass 2 - blur in other direction & draw to screen
|
|
406
|
+
this.gl.useProgram(this.program_2);
|
|
407
|
+
this.gl.drawArrays(this.gl.TRIANGLES, 0, this.verts.length / 3);
|
|
408
|
+
this.postDraw();
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
load() {
|
|
412
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
413
|
+
// empty
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
destroy() {
|
|
417
|
+
// empty
|
|
418
|
+
}
|
|
419
|
+
getBlurKernel() {
|
|
420
|
+
const kernel = [];
|
|
421
|
+
let sum = 0;
|
|
422
|
+
for (let i = 0; i < this.config.render.kernel_size; i++) {
|
|
423
|
+
let w = i - (this.config.render.kernel_size - 1) / 2;
|
|
424
|
+
w = Math.exp(-(Math.pow(w, 2)) / Math.pow(this.config.render.sigma, 2));
|
|
425
|
+
kernel.push(w);
|
|
426
|
+
sum += w;
|
|
427
|
+
}
|
|
428
|
+
for (let i = 0; i < this.config.render.kernel_size; i++) {
|
|
429
|
+
kernel[i] = kernel[i] / sum;
|
|
430
|
+
}
|
|
431
|
+
return new Float32Array(kernel);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function compileShader(gl, shader_type, source) {
|
|
435
|
+
var _a;
|
|
436
|
+
const shader = gl.createShader(shader_type);
|
|
437
|
+
if (!shader) {
|
|
438
|
+
throw new Error('[ladon-ts] - error creating shader');
|
|
439
|
+
}
|
|
440
|
+
gl.shaderSource(shader, source);
|
|
441
|
+
gl.compileShader(shader);
|
|
442
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
443
|
+
const error = (_a = gl.getShaderInfoLog(shader)) !== null && _a !== void 0 ? _a : 'unknown error compiling shader.';
|
|
444
|
+
throw new Error('[ladon-ts] - ' + error);
|
|
445
|
+
}
|
|
446
|
+
return shader;
|
|
447
|
+
}
|
|
448
|
+
function linkProgram(gl, vertex_shader, fragment_shader) {
|
|
449
|
+
var _a;
|
|
450
|
+
const program = gl.createProgram();
|
|
451
|
+
if (!program) {
|
|
452
|
+
throw new Error('[ladon-ts] - error creating GPU program');
|
|
453
|
+
}
|
|
454
|
+
gl.attachShader(program, vertex_shader);
|
|
455
|
+
gl.attachShader(program, fragment_shader);
|
|
456
|
+
gl.linkProgram(program);
|
|
457
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
458
|
+
const error = (_a = gl.getProgramInfoLog(program)) !== null && _a !== void 0 ? _a : 'unknown error linking program.';
|
|
459
|
+
throw new Error('[ladon-ts] - ' + error);
|
|
460
|
+
}
|
|
461
|
+
return program;
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVNBLE1BQWUsYUFBYTtJQXdCeEIsWUFDVyxhQUFnQyxFQUN2QixNQUFzQjtRQUQvQixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFqQmhDLFVBQUssR0FBRyxJQUFJLFlBQVksQ0FBQztZQUMvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFFOUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHO1NBQ2pELENBQUMsQ0FBQztRQUVPLHNCQUFpQixHQUFHOzs7Ozs7O0NBT2pDLENBQUM7UUFNTSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ0wsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RCxDQUM1RCxDQUFDO2FBQ0w7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1lBRWxDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1B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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const toAbsoluteURI: (relativeURL: string, baseURL?: string) => string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const toAbsoluteURI = (relativeURL, baseURL) => {
|
|
2
|
+
// adapted from - https://github.com/axios/axios/blob/fe7d09bb08fa1c0e414956b7fc760c80459b0a43/lib/helpers/combineURLs.js
|
|
3
|
+
if (!baseURL || relativeURL.startsWith('http')) {
|
|
4
|
+
return new URL(relativeURL).href;
|
|
5
|
+
}
|
|
6
|
+
return relativeURL
|
|
7
|
+
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
|
|
8
|
+
: baseURL;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxXQUFtQixFQUFFLE9BQWdCLEVBQUUsRUFBRTtJQUNuRSx5SEFBeUg7SUFFekgsSUFBSSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzVDLE9BQU8sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQ3BDO0lBRUQsT0FBTyxXQUFXO1FBQ2QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDckUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNsQixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const LIB_VERSION = "4.0.0";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const LIB_VERSION = '4.0.0';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDIn0=
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webex/ladon-ts",
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "WebexIntelligence computer vision library",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "build/module/worker/segmentation.js",
|
|
7
|
+
"typings": "build/module/index.d.ts",
|
|
8
|
+
"module": "build/module/index.js",
|
|
9
|
+
"keywords": [],
|
|
10
|
+
"license": "SEE LICENSE in LICENSE",
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"registry": "https://registry.npmjs.org/",
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"update-version": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version).replaceAll('\\\"', '\\'') + ';'\" > src/lib/version.ts",
|
|
17
|
+
"build": "run-s build:*",
|
|
18
|
+
"build:module": "tsc -p tsconfig.module.json",
|
|
19
|
+
"build:worker": "npm --prefix ./worker run build",
|
|
20
|
+
"build:test": "npm --prefix ./test run build",
|
|
21
|
+
"fix": "run-s fix:*",
|
|
22
|
+
"fix:prettier": "prettier \"src/**/*.ts\" --write",
|
|
23
|
+
"fix:lint": "eslint src --ext .ts --fix",
|
|
24
|
+
"test": "run-s build test:*",
|
|
25
|
+
"test:lint": "eslint src --ext .ts",
|
|
26
|
+
"test:prettier": "prettier \"src/**/*.ts\" --list-different",
|
|
27
|
+
"check-cli": "run-s test diff-integration-tests check-integration-tests",
|
|
28
|
+
"check-integration-tests": "run-s check-integration-test:*",
|
|
29
|
+
"diff-integration-tests": "mkdir -p diff && rm -rf diff/test && cp -r test diff/test && rm -rf diff/test/test-*/.git && cd diff && git init --quiet && git add -A && git commit --quiet --no-verify --allow-empty -m 'WIP' && echo '\\n\\nCommitted most recent integration test output in the \"diff\" directory. Review the changes with \"cd diff && git diff HEAD\" or your preferred git diff viewer.'",
|
|
30
|
+
"watch:build": "tsc -p tsconfig.module.json -w",
|
|
31
|
+
"doc": "run-s doc:html && open-cli build/docs/index.html",
|
|
32
|
+
"doc:html": "typedoc src/ --exclude **/*.spec.ts --out build/docs",
|
|
33
|
+
"doc:json": "typedoc src/ --exclude **/*.spec.ts --json build/docs/typedoc.json",
|
|
34
|
+
"doc:publish": "gh-pages -m \"[ci skip] Updates\" -d build/docs",
|
|
35
|
+
"version": "standard-version",
|
|
36
|
+
"test-release": "run-s test build doc:html",
|
|
37
|
+
"prepare-release": "run-s test version update-version build doc:html doc:publish"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/chai": "^4.3.0",
|
|
41
|
+
"@types/mocha": "^9.0.0",
|
|
42
|
+
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
|
43
|
+
"@typescript-eslint/parser": "^4.0.1",
|
|
44
|
+
"chai": "^4.3.4",
|
|
45
|
+
"cz-conventional-changelog": "^3.3.0",
|
|
46
|
+
"eslint": "^7.8.0",
|
|
47
|
+
"eslint-config-prettier": "^6.11.0",
|
|
48
|
+
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
49
|
+
"eslint-plugin-functional": "^3.0.2",
|
|
50
|
+
"eslint-plugin-import": "^2.22.0",
|
|
51
|
+
"gh-pages": "^3.1.0",
|
|
52
|
+
"mocha": "^9.1.3",
|
|
53
|
+
"npm-run-all": "^4.1.5",
|
|
54
|
+
"open-cli": "^6.0.1",
|
|
55
|
+
"parcel": "^2.8.3",
|
|
56
|
+
"prettier": "^2.1.1",
|
|
57
|
+
"standard-version": "^9.0.0",
|
|
58
|
+
"typedoc": "^0.23.24",
|
|
59
|
+
"typescript": "^4.7.4"
|
|
60
|
+
},
|
|
61
|
+
"files": [
|
|
62
|
+
"build/main",
|
|
63
|
+
"build/module",
|
|
64
|
+
"!**/*.spec.*",
|
|
65
|
+
"!**/*.json",
|
|
66
|
+
"CHANGELOG.md",
|
|
67
|
+
"LICENSE",
|
|
68
|
+
"README.md"
|
|
69
|
+
],
|
|
70
|
+
"config": {
|
|
71
|
+
"commitizen": {
|
|
72
|
+
"path": "cz-conventional-changelog"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"prettier": {
|
|
76
|
+
"singleQuote": true
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"onnxruntime-web": "^1.13.1"
|
|
80
|
+
}
|
|
81
|
+
}
|