mirror of https://github.com/vladmandic/human
type definitions
parent
04defdf52b
commit
2265e12d69
|
@ -1,6 +1,6 @@
|
||||||
# @vladmandic/human
|
# @vladmandic/human
|
||||||
|
|
||||||
Version: **1.1.8**
|
Version: **1.1.9**
|
||||||
Description: **Human: AI-powered 3D Face Detection, Face Embedding & Recognition, Body Pose Tracking, Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction & Gesture Recognition**
|
Description: **Human: AI-powered 3D Face Detection, Face Embedding & Recognition, Body Pose Tracking, Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction & Gesture Recognition**
|
||||||
|
|
||||||
Author: **Vladimir Mandic <mandic00@live.com>**
|
Author: **Vladimir Mandic <mandic00@live.com>**
|
||||||
|
@ -11,6 +11,10 @@ Repository: **<git+https://github.com/vladmandic/human.git>**
|
||||||
|
|
||||||
### **HEAD -> main** 2021/03/17 mandic00@live.com
|
### **HEAD -> main** 2021/03/17 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
|
### **1.1.9** 2021/03/17 mandic00@live.com
|
||||||
|
|
||||||
|
- fix box clamping and raw output
|
||||||
- hierarchical readme notes
|
- hierarchical readme notes
|
||||||
|
|
||||||
### **1.1.8** 2021/03/17 mandic00@live.com
|
### **1.1.8** 2021/03/17 mandic00@live.com
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -6,7 +6,7 @@
|
||||||
"main": "dist/human.node.js",
|
"main": "dist/human.node.js",
|
||||||
"module": "dist/human.esm.js",
|
"module": "dist/human.esm.js",
|
||||||
"browser": "dist/human.esm.js",
|
"browser": "dist/human.esm.js",
|
||||||
"types": "types/src/human.d.ts",
|
"types": "types/human.d.ts",
|
||||||
"author": "Vladimir Mandic <mandic00@live.com>",
|
"author": "Vladimir Mandic <mandic00@live.com>",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/vladmandic/human/issues"
|
"url": "https://github.com/vladmandic/human/issues"
|
||||||
|
|
|
@ -175,7 +175,7 @@ async function getStats(json) {
|
||||||
|
|
||||||
// rebuild typings
|
// rebuild typings
|
||||||
async function compile(entryPoint, options) {
|
async function compile(entryPoint, options) {
|
||||||
log.info('Compile typings:', entryPoint);
|
log.info('Generate types:', entryPoint);
|
||||||
const program = ts.createProgram(entryPoint, options);
|
const program = ts.createProgram(entryPoint, options);
|
||||||
const emit = program.emit();
|
const emit = program.emit();
|
||||||
const diag = ts
|
const diag = ts
|
||||||
|
|
|
@ -1,7 +1,121 @@
|
||||||
/* eslint-disable indent */
|
/* eslint-disable indent */
|
||||||
/* eslint-disable no-multi-spaces */
|
/* eslint-disable no-multi-spaces */
|
||||||
|
|
||||||
export default {
|
/**
|
||||||
|
* Configuration interface definition for **Human** library
|
||||||
|
*
|
||||||
|
* Contains all configurable parameters
|
||||||
|
*/
|
||||||
|
export interface Config {
|
||||||
|
backend: String,
|
||||||
|
wasmPath: String,
|
||||||
|
debug: Boolean,
|
||||||
|
async: Boolean,
|
||||||
|
profile: Boolean,
|
||||||
|
deallocate: Boolean,
|
||||||
|
scoped: Boolean,
|
||||||
|
videoOptimized: Boolean,
|
||||||
|
warmup: String,
|
||||||
|
filter: {
|
||||||
|
enabled: Boolean,
|
||||||
|
width: Number,
|
||||||
|
height: Number,
|
||||||
|
return: Boolean,
|
||||||
|
brightness: Number,
|
||||||
|
contrast: Number,
|
||||||
|
sharpness: Number,
|
||||||
|
blur: Number
|
||||||
|
saturation: Number,
|
||||||
|
hue: Number,
|
||||||
|
negative: Boolean,
|
||||||
|
sepia: Boolean,
|
||||||
|
vintage: Boolean,
|
||||||
|
kodachrome: Boolean,
|
||||||
|
technicolor: Boolean,
|
||||||
|
polaroid: Boolean,
|
||||||
|
pixelate: Number,
|
||||||
|
},
|
||||||
|
gesture: {
|
||||||
|
enabled: Boolean,
|
||||||
|
},
|
||||||
|
face: {
|
||||||
|
enabled: Boolean,
|
||||||
|
detector: {
|
||||||
|
modelPath: String,
|
||||||
|
rotation: Boolean,
|
||||||
|
maxFaces: Number,
|
||||||
|
skipFrames: Number,
|
||||||
|
skipInitial: Boolean,
|
||||||
|
minConfidence: Number,
|
||||||
|
iouThreshold: Number,
|
||||||
|
scoreThreshold: Number,
|
||||||
|
return: Boolean,
|
||||||
|
},
|
||||||
|
mesh: {
|
||||||
|
enabled: Boolean,
|
||||||
|
modelPath: String,
|
||||||
|
},
|
||||||
|
iris: {
|
||||||
|
enabled: Boolean,
|
||||||
|
modelPath: String,
|
||||||
|
},
|
||||||
|
age: {
|
||||||
|
enabled: Boolean,
|
||||||
|
modelPath: String,
|
||||||
|
skipFrames: Number,
|
||||||
|
},
|
||||||
|
gender: {
|
||||||
|
enabled: Boolean,
|
||||||
|
minConfidence: Number,
|
||||||
|
modelPath: String,
|
||||||
|
skipFrames: Number,
|
||||||
|
},
|
||||||
|
emotion: {
|
||||||
|
enabled: Boolean,
|
||||||
|
minConfidence: Number,
|
||||||
|
skipFrames: Number,
|
||||||
|
modelPath: String,
|
||||||
|
},
|
||||||
|
embedding: {
|
||||||
|
enabled: Boolean,
|
||||||
|
modelPath: String,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
enabled: Boolean,
|
||||||
|
modelPath: String,
|
||||||
|
maxDetections: Number,
|
||||||
|
scoreThreshold: Number,
|
||||||
|
nmsRadius: Number,
|
||||||
|
},
|
||||||
|
hand: {
|
||||||
|
enabled: Boolean,
|
||||||
|
rotation: Boolean,
|
||||||
|
skipFrames: Number,
|
||||||
|
skipInitial: Boolean,
|
||||||
|
minConfidence: Number,
|
||||||
|
iouThreshold: Number,
|
||||||
|
scoreThreshold: Number,
|
||||||
|
maxHands: Number,
|
||||||
|
landmarks: Boolean,
|
||||||
|
detector: {
|
||||||
|
modelPath: String,
|
||||||
|
},
|
||||||
|
skeleton: {
|
||||||
|
modelPath: String,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
object: {
|
||||||
|
enabled: Boolean,
|
||||||
|
modelPath: String,
|
||||||
|
minConfidence: Number,
|
||||||
|
iouThreshold: Number,
|
||||||
|
maxResults: Number,
|
||||||
|
skipFrames: Number,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const config: Config = {
|
||||||
backend: 'webgl', // select tfjs backend to use
|
backend: 'webgl', // select tfjs backend to use
|
||||||
// can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl
|
// can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl
|
||||||
// leave as empty string to continue using default backend
|
// leave as empty string to continue using default backend
|
||||||
|
@ -177,3 +291,4 @@ export default {
|
||||||
skipFrames: 13, // how many frames to go without re-running the detector
|
skipFrames: 13, // how many frames to go without re-running the detector
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
export { config as defaults };
|
|
@ -1,5 +1,5 @@
|
||||||
import config from '../config';
|
import { defaults } from '../config';
|
||||||
import { TRI468 as triangulation } from './blazeface/coords';
|
import { TRI468 as triangulation } from '../blazeface/coords';
|
||||||
|
|
||||||
export const drawOptions = {
|
export const drawOptions = {
|
||||||
color: <string>'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
|
color: <string>'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
|
||||||
|
@ -86,7 +86,7 @@ function curves(ctx, points: number[] = []) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function gesture(inCanvas, result) {
|
export async function gesture(inCanvas: HTMLCanvasElement, result: Array<any>) {
|
||||||
if (!result || !inCanvas) return;
|
if (!result || !inCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
||||||
const ctx = inCanvas.getContext('2d');
|
const ctx = inCanvas.getContext('2d');
|
||||||
|
@ -112,7 +112,7 @@ export async function gesture(inCanvas, result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function face(inCanvas, result) {
|
export async function face(inCanvas: HTMLCanvasElement, result: Array<any>) {
|
||||||
if (!result || !inCanvas) return;
|
if (!result || !inCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
||||||
const ctx = inCanvas.getContext('2d');
|
const ctx = inCanvas.getContext('2d');
|
||||||
|
@ -196,7 +196,7 @@ export async function face(inCanvas, result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const lastDrawnPose:any[] = [];
|
const lastDrawnPose:any[] = [];
|
||||||
export async function body(inCanvas, result) {
|
export async function body(inCanvas: HTMLCanvasElement, result: Array<any>) {
|
||||||
if (!result || !inCanvas) return;
|
if (!result || !inCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
||||||
const ctx = inCanvas.getContext('2d');
|
const ctx = inCanvas.getContext('2d');
|
||||||
|
@ -232,70 +232,70 @@ export async function body(inCanvas, result) {
|
||||||
// torso
|
// torso
|
||||||
points.length = 0;
|
points.length = 0;
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
|
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
|
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightHip');
|
part = result[i].keypoints.find((a) => a.part === 'rightHip');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftHip');
|
part = result[i].keypoints.find((a) => a.part === 'leftHip');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
|
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
if (points.length === 5) lines(ctx, points); // only draw if we have complete torso
|
if (points.length === 5) lines(ctx, points); // only draw if we have complete torso
|
||||||
// leg left
|
// leg left
|
||||||
points.length = 0;
|
points.length = 0;
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftHip');
|
part = result[i].keypoints.find((a) => a.part === 'leftHip');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftKnee');
|
part = result[i].keypoints.find((a) => a.part === 'leftKnee');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftAnkle');
|
part = result[i].keypoints.find((a) => a.part === 'leftAnkle');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftHeel');
|
part = result[i].keypoints.find((a) => a.part === 'leftHeel');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftFoot');
|
part = result[i].keypoints.find((a) => a.part === 'leftFoot');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
curves(ctx, points);
|
curves(ctx, points);
|
||||||
// leg right
|
// leg right
|
||||||
points.length = 0;
|
points.length = 0;
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightHip');
|
part = result[i].keypoints.find((a) => a.part === 'rightHip');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightKnee');
|
part = result[i].keypoints.find((a) => a.part === 'rightKnee');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightAnkle');
|
part = result[i].keypoints.find((a) => a.part === 'rightAnkle');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightHeel');
|
part = result[i].keypoints.find((a) => a.part === 'rightHeel');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightFoot');
|
part = result[i].keypoints.find((a) => a.part === 'rightFoot');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
curves(ctx, points);
|
curves(ctx, points);
|
||||||
// arm left
|
// arm left
|
||||||
points.length = 0;
|
points.length = 0;
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
|
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftElbow');
|
part = result[i].keypoints.find((a) => a.part === 'leftElbow');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftWrist');
|
part = result[i].keypoints.find((a) => a.part === 'leftWrist');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'leftPalm');
|
part = result[i].keypoints.find((a) => a.part === 'leftPalm');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
curves(ctx, points);
|
curves(ctx, points);
|
||||||
// arm right
|
// arm right
|
||||||
points.length = 0;
|
points.length = 0;
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
|
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightElbow');
|
part = result[i].keypoints.find((a) => a.part === 'rightElbow');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightWrist');
|
part = result[i].keypoints.find((a) => a.part === 'rightWrist');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
part = result[i].keypoints.find((a) => a.part === 'rightPalm');
|
part = result[i].keypoints.find((a) => a.part === 'rightPalm');
|
||||||
if (part && part.score > config.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
if (part && part.score > defaults.body.scoreThreshold) points.push([part.position.x, part.position.y]);
|
||||||
curves(ctx, points);
|
curves(ctx, points);
|
||||||
// draw all
|
// draw all
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function hand(inCanvas, result) {
|
export async function hand(inCanvas: HTMLCanvasElement, result: Array<any>) {
|
||||||
if (!result || !inCanvas) return;
|
if (!result || !inCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
||||||
const ctx = inCanvas.getContext('2d');
|
const ctx = inCanvas.getContext('2d');
|
||||||
|
@ -348,7 +348,7 @@ export async function hand(inCanvas, result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function object(inCanvas, result) {
|
export async function object(inCanvas: HTMLCanvasElement, result: Array<any>) {
|
||||||
if (!result || !inCanvas) return;
|
if (!result || !inCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
||||||
const ctx = inCanvas.getContext('2d');
|
const ctx = inCanvas.getContext('2d');
|
||||||
|
@ -375,14 +375,14 @@ export async function object(inCanvas, result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function canvas(inCanvas, outCanvas) {
|
export async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {
|
||||||
if (!inCanvas || !outCanvas) return;
|
if (!inCanvas || !outCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;
|
||||||
const outCtx = inCanvas.getContext('2d');
|
const outCtx = inCanvas.getContext('2d');
|
||||||
outCtx?.drawImage(inCanvas, 0, 0);
|
outCtx?.drawImage(inCanvas, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function all(inCanvas, result) {
|
export async function all(inCanvas: HTMLCanvasElement, result:any) {
|
||||||
if (!result || !inCanvas) return;
|
if (!result || !inCanvas) return;
|
||||||
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
if (!(inCanvas instanceof HTMLCanvasElement)) return;
|
||||||
face(inCanvas, result.face);
|
face(inCanvas, result.face);
|
102
src/human.ts
102
src/human.ts
|
@ -12,12 +12,25 @@ import * as handpose from './handpose/handpose';
|
||||||
import * as blazepose from './blazepose/blazepose';
|
import * as blazepose from './blazepose/blazepose';
|
||||||
import * as nanodet from './nanodet/nanodet';
|
import * as nanodet from './nanodet/nanodet';
|
||||||
import * as gesture from './gesture/gesture';
|
import * as gesture from './gesture/gesture';
|
||||||
import * as image from './image';
|
import * as image from './image/image';
|
||||||
|
import * as draw from './draw/draw';
|
||||||
import * as profile from './profile';
|
import * as profile from './profile';
|
||||||
import * as config from '../config';
|
import { Config, defaults } from './config';
|
||||||
|
import { Result } from './result';
|
||||||
import * as sample from './sample';
|
import * as sample from './sample';
|
||||||
import * as app from '../package.json';
|
import * as app from '../package.json';
|
||||||
import * as draw from './draw';
|
|
||||||
|
type Tensor = {};
|
||||||
|
type Model = {};
|
||||||
|
|
||||||
|
export type { Config } from './config';
|
||||||
|
export type { Result } from './result';
|
||||||
|
|
||||||
|
/** Defines all possible input types for **Human** detection */
|
||||||
|
export type Input = Tensor | ImageData | ImageBitmap | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;
|
||||||
|
/** Error message */
|
||||||
|
export type Error = { error: String };
|
||||||
|
export type TensorFlow = typeof tf;
|
||||||
|
|
||||||
// helper function: gets elapsed time on both browser and nodejs
|
// helper function: gets elapsed time on both browser and nodejs
|
||||||
const now = () => {
|
const now = () => {
|
||||||
|
@ -25,50 +38,6 @@ const now = () => {
|
||||||
return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());
|
return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());
|
||||||
};
|
};
|
||||||
|
|
||||||
type Tensor = {};
|
|
||||||
type Model = {};
|
|
||||||
export type Result = {
|
|
||||||
face: Array<{
|
|
||||||
confidence: Number,
|
|
||||||
boxConfidence: Number,
|
|
||||||
faceConfidence: Number,
|
|
||||||
box: [Number, Number, Number, Number],
|
|
||||||
mesh: Array<[Number, Number, Number]>
|
|
||||||
meshRaw: Array<[Number, Number, Number]>
|
|
||||||
boxRaw: [Number, Number, Number, Number],
|
|
||||||
annotations: Array<{ part: String, points: Array<[Number, Number, Number]>[] }>,
|
|
||||||
age: Number,
|
|
||||||
gender: String,
|
|
||||||
genderConfidence: Number,
|
|
||||||
emotion: Array<{ score: Number, emotion: String }>,
|
|
||||||
embedding: Array<Number>,
|
|
||||||
iris: Number,
|
|
||||||
angle: { roll: Number, yaw: Number, pitch: Number },
|
|
||||||
}>,
|
|
||||||
body: Array<{
|
|
||||||
id: Number,
|
|
||||||
part: String,
|
|
||||||
position: { x: Number, y: Number, z: Number },
|
|
||||||
score: Number,
|
|
||||||
presence: Number }>,
|
|
||||||
hand: Array<{
|
|
||||||
confidence: Number,
|
|
||||||
box: [Number, Number, Number, Number],
|
|
||||||
boxRaw: [Number, Number, Number, Number],
|
|
||||||
landmarks: Array<[Number, Number, Number]>,
|
|
||||||
annotations: Array<{ part: String, points: Array<[Number, Number, Number]>[] }>,
|
|
||||||
}>,
|
|
||||||
gesture: Array<{
|
|
||||||
part: String,
|
|
||||||
gesture: String,
|
|
||||||
}>,
|
|
||||||
object: Array<{ score: Number, strideSize: Number, class: Number, label: String, center: Number[], centerRaw: Number[], box: Number[], boxRaw: Number[] }>,
|
|
||||||
performance: { any },
|
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement,
|
|
||||||
}
|
|
||||||
|
|
||||||
export type { default as Config } from '../config';
|
|
||||||
|
|
||||||
// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides
|
// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides
|
||||||
function mergeDeep(...objects) {
|
function mergeDeep(...objects) {
|
||||||
const isObject = (obj) => obj && typeof obj === 'object';
|
const isObject = (obj) => obj && typeof obj === 'object';
|
||||||
|
@ -83,15 +52,31 @@ function mergeDeep(...objects) {
|
||||||
return prev;
|
return prev;
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Main Class for `Human` library
|
||||||
|
*
|
||||||
|
* All methods and properties are available only as members of Human class
|
||||||
|
*
|
||||||
|
* Configuration object definition: @link Config
|
||||||
|
* Results object definition: @link Result
|
||||||
|
* Possible inputs: @link Input
|
||||||
|
*/
|
||||||
export class Human {
|
export class Human {
|
||||||
version: String;
|
version: String;
|
||||||
config: typeof config.default;
|
config: Config;
|
||||||
state: String;
|
state: String;
|
||||||
image: { tensor: Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
|
image: { tensor: Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
|
||||||
// classes
|
// classes
|
||||||
tf: typeof tf;
|
tf: TensorFlow;
|
||||||
draw: { drawOptions?: typeof draw.drawOptions, gesture: Function, face: Function, body: Function, hand: Function, canvas: Function, all: Function };
|
draw: {
|
||||||
|
drawOptions?: typeof draw.drawOptions,
|
||||||
|
gesture: typeof draw.gesture,
|
||||||
|
face: typeof draw.face,
|
||||||
|
body: typeof draw.body,
|
||||||
|
hand: typeof draw.hand,
|
||||||
|
canvas: typeof draw.canvas,
|
||||||
|
all: typeof draw.all,
|
||||||
|
};
|
||||||
// models
|
// models
|
||||||
models: {
|
models: {
|
||||||
face: facemesh.MediaPipeFaceMesh | null,
|
face: facemesh.MediaPipeFaceMesh | null,
|
||||||
|
@ -123,12 +108,12 @@ export class Human {
|
||||||
#firstRun: Boolean;
|
#firstRun: Boolean;
|
||||||
// definition end
|
// definition end
|
||||||
|
|
||||||
constructor(userConfig = {}) {
|
constructor(userConfig: Config | Object = {}) {
|
||||||
this.tf = tf;
|
this.tf = tf;
|
||||||
this.draw = draw;
|
this.draw = draw;
|
||||||
this.#package = app;
|
this.#package = app;
|
||||||
this.version = app.version;
|
this.version = app.version;
|
||||||
this.config = mergeDeep(config.default, userConfig);
|
this.config = mergeDeep(defaults, userConfig);
|
||||||
this.state = 'idle';
|
this.state = 'idle';
|
||||||
this.#numTensors = 0;
|
this.#numTensors = 0;
|
||||||
this.#analyzeMemoryLeaks = false;
|
this.#analyzeMemoryLeaks = false;
|
||||||
|
@ -150,7 +135,7 @@ export class Human {
|
||||||
};
|
};
|
||||||
// export access to image processing
|
// export access to image processing
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
this.image = (input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas) => image.process(input, this.config);
|
this.image = (input: Input) => image.process(input, this.config);
|
||||||
// export raw access to underlying models
|
// export raw access to underlying models
|
||||||
this.classes = {
|
this.classes = {
|
||||||
facemesh,
|
facemesh,
|
||||||
|
@ -211,7 +196,7 @@ export class Human {
|
||||||
}
|
}
|
||||||
|
|
||||||
// preload models, not explicitly required as it's done automatically on first use
|
// preload models, not explicitly required as it's done automatically on first use
|
||||||
async load(userConfig: Object = {}) {
|
async load(userConfig: Config | Object = {}) {
|
||||||
this.state = 'load';
|
this.state = 'load';
|
||||||
const timeStamp = now();
|
const timeStamp = now();
|
||||||
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
||||||
|
@ -480,7 +465,7 @@ export class Human {
|
||||||
}
|
}
|
||||||
|
|
||||||
// main detect function
|
// main detect function
|
||||||
async detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig: Object = {}): Promise<Result | { error: String }> {
|
async detect(input: Input, userConfig: Config | Object = {}): Promise<Result | Error> {
|
||||||
// detection happens inside a promise
|
// detection happens inside a promise
|
||||||
return new Promise(async (resolve) => {
|
return new Promise(async (resolve) => {
|
||||||
this.state = 'config';
|
this.state = 'config';
|
||||||
|
@ -675,7 +660,7 @@ export class Human {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
async warmup(userConfig: Object = {}): Promise<Result | { error }> {
|
async warmup(userConfig: Config | Object = {}): Promise<Result | { error }> {
|
||||||
const t0 = now();
|
const t0 = now();
|
||||||
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
||||||
const save = this.config.videoOptimized;
|
const save = this.config.videoOptimized;
|
||||||
|
@ -691,4 +676,7 @@ export class Human {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Human is also available as default export
|
||||||
|
*/
|
||||||
export { Human as default };
|
export { Human as default };
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// @ts-nocheck
|
// @ts-nocheck
|
||||||
|
|
||||||
import { log } from './log';
|
import { log } from '../log';
|
||||||
import * as tf from '../dist/tfjs.esm.js';
|
import * as tf from '../../dist/tfjs.esm.js';
|
||||||
import * as fxImage from './imagefx';
|
import * as fxImage from './imagefx';
|
||||||
|
|
||||||
const maxSize = 2048;
|
const maxSize = 2048;
|
|
@ -0,0 +1,112 @@
|
||||||
|
/**
|
||||||
|
* Result interface definition for **Human** library
|
||||||
|
*
|
||||||
|
* Contains all possible detection results
|
||||||
|
*/
|
||||||
|
export interface Result {
|
||||||
|
/** Face results
|
||||||
|
* Combined results of face detector, face mesh, age, gender, emotion, embedding, iris models
|
||||||
|
* Some values may be null if specific model is not enabled
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected face
|
||||||
|
* Each result has:
|
||||||
|
* - overal detection confidence value
|
||||||
|
* - box detection confidence value
|
||||||
|
* - mesh detection confidence value
|
||||||
|
* - box as array of [x, y, width, height], normalized to image resolution
|
||||||
|
* - boxRaw as array of [x, y, width, height], normalized to range 0..1
|
||||||
|
* - mesh as array of [x, y, z] points of face mesh, normalized to image resolution
|
||||||
|
* - meshRaw as array of [x, y, z] points of face mesh, normalized to range 0..1
|
||||||
|
* - annotations as array of annotated face mesh points
|
||||||
|
* - age as value
|
||||||
|
* - gender as value
|
||||||
|
* - genderConfidence as value
|
||||||
|
* - emotion as array of possible emotions with their individual scores
|
||||||
|
* - iris as distance value
|
||||||
|
* - angle as object with values for roll, yaw and pitch angles
|
||||||
|
*/
|
||||||
|
face: Array<{
|
||||||
|
confidence: Number,
|
||||||
|
boxConfidence: Number,
|
||||||
|
faceConfidence: Number,
|
||||||
|
box: [Number, Number, Number, Number],
|
||||||
|
boxRaw: [Number, Number, Number, Number],
|
||||||
|
mesh: Array<[Number, Number, Number]>
|
||||||
|
meshRaw: Array<[Number, Number, Number]>
|
||||||
|
annotations: Array<{ part: String, points: Array<[Number, Number, Number]>[] }>,
|
||||||
|
age: Number,
|
||||||
|
gender: String,
|
||||||
|
genderConfidence: Number,
|
||||||
|
emotion: Array<{ score: Number, emotion: String }>,
|
||||||
|
embedding: Array<Number>,
|
||||||
|
iris: Number,
|
||||||
|
angle: { roll: Number, yaw: Number, pitch: Number },
|
||||||
|
}>,
|
||||||
|
/** Body results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected body
|
||||||
|
* Each results has:
|
||||||
|
* - body id number
|
||||||
|
* - body part name
|
||||||
|
* - part position with x,y,z coordinates
|
||||||
|
* - body part score value
|
||||||
|
* - body part presence value
|
||||||
|
*/
|
||||||
|
body: Array<{
|
||||||
|
id: Number,
|
||||||
|
part: String,
|
||||||
|
position: { x: Number, y: Number, z: Number },
|
||||||
|
score: Number,
|
||||||
|
presence: Number }>,
|
||||||
|
/** Hand results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected hand
|
||||||
|
* Each result has:
|
||||||
|
* - confidence as value
|
||||||
|
* - box as array of [x, y, width, height], normalized to image resolution
|
||||||
|
* - boxRaw as array of [x, y, width, height], normalized to range 0..1
|
||||||
|
* - landmarks as array of [x, y, z] points of hand, normalized to image resolution
|
||||||
|
* - annotations as array of annotated face landmark points
|
||||||
|
*/
|
||||||
|
hand: Array<{
|
||||||
|
confidence: Number,
|
||||||
|
box: [Number, Number, Number, Number],
|
||||||
|
boxRaw: [Number, Number, Number, Number],
|
||||||
|
landmarks: Array<[Number, Number, Number]>,
|
||||||
|
annotations: Array<{ part: String, points: Array<[Number, Number, Number]>[] }>,
|
||||||
|
}>,
|
||||||
|
/** Gesture results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected gesture
|
||||||
|
* Each result has:
|
||||||
|
* - part where gesture was detected
|
||||||
|
* - gesture detected
|
||||||
|
*/
|
||||||
|
gesture: Array<{
|
||||||
|
part: String,
|
||||||
|
gesture: String,
|
||||||
|
}>,
|
||||||
|
/** Object results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected gesture
|
||||||
|
* Each result has:
|
||||||
|
* - score as value
|
||||||
|
* - label as detected class name
|
||||||
|
* - center as array of [x, y], normalized to image resolution
|
||||||
|
* - centerRaw as array of [x, y], normalized to range 0..1
|
||||||
|
* - box as array of [x, y, width, height], normalized to image resolution
|
||||||
|
* - boxRaw as array of [x, y, width, height], normalized to range 0..1
|
||||||
|
*/
|
||||||
|
object: Array<{
|
||||||
|
score: Number,
|
||||||
|
strideSize: Number,
|
||||||
|
class: Number,
|
||||||
|
label: String,
|
||||||
|
center: Number[],
|
||||||
|
centerRaw: Number[],
|
||||||
|
box: Number[],
|
||||||
|
boxRaw: Number[],
|
||||||
|
}>,
|
||||||
|
performance: { any },
|
||||||
|
canvas: OffscreenCanvas | HTMLCanvasElement,
|
||||||
|
}
|
|
@ -12,8 +12,8 @@
|
||||||
--color-comment-tag: #707070;
|
--color-comment-tag: #707070;
|
||||||
--color-comment-tag-text: #fff;
|
--color-comment-tag-text: #fff;
|
||||||
--color-code-background: rgba(#000, 0.04);
|
--color-code-background: rgba(#000, 0.04);
|
||||||
--color-ts: lightcoral;
|
--color-ts: lightyellow;
|
||||||
--color-ts-interface: #647f1b;
|
--color-ts-interface: lightgreen;
|
||||||
--color-ts-enum: #937210;
|
--color-ts-enum: #937210;
|
||||||
--color-ts-class: lightskyblue;
|
--color-ts-class: lightskyblue;
|
||||||
--color-ts-private: #707070;
|
--color-ts-private: #707070;
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,599 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html class="default no-js">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>Config | @vladmandic/human</title>
|
||||||
|
<meta name="description" content="Documentation for @vladmandic/human">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="../assets/css/main.css">
|
||||||
|
<script async src="../assets/js/search.js" id="search-script"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="tsd-page-toolbar">
|
||||||
|
<div class="container">
|
||||||
|
<div class="table-wrap">
|
||||||
|
<div class="table-cell" id="tsd-search" data-index="../assets/js/search.json" data-base="..">
|
||||||
|
<div class="field">
|
||||||
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
||||||
|
<input id="tsd-search-field" type="text" />
|
||||||
|
</div>
|
||||||
|
<ul class="results">
|
||||||
|
<li class="state loading">Preparing search index...</li>
|
||||||
|
<li class="state failure">The search index is not available</li>
|
||||||
|
</ul>
|
||||||
|
<a href="../index.html" class="title">@vladmandic/human</a>
|
||||||
|
</div>
|
||||||
|
<div class="table-cell" id="tsd-widgets">
|
||||||
|
<div id="tsd-filter">
|
||||||
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
||||||
|
<div class="tsd-filter-group">
|
||||||
|
<div class="tsd-select" id="tsd-filter-visibility">
|
||||||
|
<span class="tsd-select-label">All</span>
|
||||||
|
<ul class="tsd-select-list">
|
||||||
|
<li data-value="public">Public</li>
|
||||||
|
<li data-value="protected">Public/Protected</li>
|
||||||
|
<li data-value="private" class="selected">All</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
||||||
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tsd-page-title">
|
||||||
|
<div class="container">
|
||||||
|
<ul class="tsd-breadcrumb">
|
||||||
|
<li>
|
||||||
|
<a href="../index.html">@vladmandic/human</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="config.html">Config</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<h1>Interface Config</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container container-main">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-8 col-content">
|
||||||
|
<section class="tsd-panel tsd-comment">
|
||||||
|
<div class="tsd-comment tsd-typography">
|
||||||
|
<div class="lead">
|
||||||
|
<p>Configuration interface definition for <strong>Human</strong> library</p>
|
||||||
|
</div>
|
||||||
|
<p>Contains all configurable parameters</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-hierarchy">
|
||||||
|
<h3>Hierarchy</h3>
|
||||||
|
<ul class="tsd-hierarchy">
|
||||||
|
<li>
|
||||||
|
<span class="target">Config</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-index-group">
|
||||||
|
<h2>Index</h2>
|
||||||
|
<section class="tsd-panel tsd-index-panel">
|
||||||
|
<div class="tsd-index-content">
|
||||||
|
<section class="tsd-index-section ">
|
||||||
|
<h3>Properties</h3>
|
||||||
|
<ul class="tsd-index-list">
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#async" class="tsd-kind-icon">async</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#backend" class="tsd-kind-icon">backend</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#body" class="tsd-kind-icon">body</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#deallocate" class="tsd-kind-icon">deallocate</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#debug" class="tsd-kind-icon">debug</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#face" class="tsd-kind-icon">face</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#filter" class="tsd-kind-icon">filter</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#gesture" class="tsd-kind-icon">gesture</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#hand" class="tsd-kind-icon">hand</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#object" class="tsd-kind-icon">object</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#profile" class="tsd-kind-icon">profile</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#scoped" class="tsd-kind-icon">scoped</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#videooptimized" class="tsd-kind-icon">video<wbr>Optimized</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#warmup" class="tsd-kind-icon">warmup</a></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><a href="config.html#wasmpath" class="tsd-kind-icon">wasm<wbr>Path</a></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel-group tsd-member-group ">
|
||||||
|
<h2>Properties</h2>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="async" class="tsd-anchor"></a>
|
||||||
|
<h3>async</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">async<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Boolean</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="backend" class="tsd-anchor"></a>
|
||||||
|
<h3>backend</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">backend<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">String</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="body" class="tsd-anchor"></a>
|
||||||
|
<h3>body</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">body<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>maxDetections<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>nmsRadius<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>scoreThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-type-declaration">
|
||||||
|
<h4>Type declaration</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>max<wbr>Detections<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>nms<wbr>Radius<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>score<wbr>Threshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="deallocate" class="tsd-anchor"></a>
|
||||||
|
<h3>deallocate</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">deallocate<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Boolean</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="debug" class="tsd-anchor"></a>
|
||||||
|
<h3>debug</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">debug<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Boolean</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="face" class="tsd-anchor"></a>
|
||||||
|
<h3>face</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">face<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>age<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>detector<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>iouThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>maxFaces<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>return<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>rotation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>scoreThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>skipInitial<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>embedding<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>emotion<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>gender<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>iris<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>mesh<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> }</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-type-declaration">
|
||||||
|
<h4>Type declaration</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>age<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Frames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>detector<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>iouThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>maxFaces<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>return<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>rotation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>scoreThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>skipInitial<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>iou<wbr>Threshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>max<wbr>Faces<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>min<wbr>Confidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>return<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>rotation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>score<wbr>Threshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Frames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Initial<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>embedding<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>emotion<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>min<wbr>Confidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Frames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>gender<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>min<wbr>Confidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Frames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>iris<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>mesh<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="filter" class="tsd-anchor"></a>
|
||||||
|
<h3>filter</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">filter<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>blur<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>brightness<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>contrast<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>height<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>hue<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>kodachrome<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>negative<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>pixelate<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>polaroid<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>return<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>saturation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>sepia<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>sharpness<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>technicolor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>vintage<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>width<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-type-declaration">
|
||||||
|
<h4>Type declaration</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>blur<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>brightness<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>contrast<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>height<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>hue<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>kodachrome<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>negative<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>pixelate<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>polaroid<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>return<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>saturation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>sepia<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>sharpness<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>technicolor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>vintage<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>width<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="gesture" class="tsd-anchor"></a>
|
||||||
|
<h3>gesture</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">gesture<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol"> }</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-type-declaration">
|
||||||
|
<h4>Type declaration</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="hand" class="tsd-anchor"></a>
|
||||||
|
<h3>hand</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">hand<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>detector<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>iouThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>landmarks<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>maxHands<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>rotation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>scoreThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>skeleton<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>skipInitial<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol"> }</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-type-declaration">
|
||||||
|
<h4>Type declaration</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>detector<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>iou<wbr>Threshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>landmarks<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>max<wbr>Hands<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>min<wbr>Confidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>rotation<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>score<wbr>Threshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skeleton<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol"> }</span></h5>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Frames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Initial<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="object" class="tsd-anchor"></a>
|
||||||
|
<h3>object</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">object<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span><span class="tsd-signature-symbol">; </span>iouThreshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>maxResults<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>minConfidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol">; </span>modelPath<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span><span class="tsd-signature-symbol">; </span>skipFrames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span><span class="tsd-signature-symbol"> }</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
<div class="tsd-type-declaration">
|
||||||
|
<h4>Type declaration</h4>
|
||||||
|
<ul class="tsd-parameters">
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>enabled<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Boolean</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>iou<wbr>Threshold<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>max<wbr>Results<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>min<wbr>Confidence<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>model<wbr>Path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">String</span></h5>
|
||||||
|
</li>
|
||||||
|
<li class="tsd-parameter">
|
||||||
|
<h5>skip<wbr>Frames<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Number</span></h5>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="profile" class="tsd-anchor"></a>
|
||||||
|
<h3>profile</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">profile<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Boolean</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="scoped" class="tsd-anchor"></a>
|
||||||
|
<h3>scoped</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">scoped<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Boolean</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="videooptimized" class="tsd-anchor"></a>
|
||||||
|
<h3>video<wbr>Optimized</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">video<wbr>Optimized<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Boolean</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="warmup" class="tsd-anchor"></a>
|
||||||
|
<h3>warmup</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">warmup<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">String</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
<section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a name="wasmpath" class="tsd-anchor"></a>
|
||||||
|
<h3>wasm<wbr>Path</h3>
|
||||||
|
<div class="tsd-signature tsd-kind-icon">wasm<wbr>Path<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">String</span></div>
|
||||||
|
<aside class="tsd-sources">
|
||||||
|
</aside>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
|
||||||
|
<nav class="tsd-navigation primary">
|
||||||
|
<ul>
|
||||||
|
<li class=" ">
|
||||||
|
<a href="../index.html">Exports</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<nav class="tsd-navigation secondary menu-sticky">
|
||||||
|
<ul class="before-current">
|
||||||
|
<li class=" tsd-kind-reference">
|
||||||
|
<a href="../index.html#default" class="tsd-kind-icon">default</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-class">
|
||||||
|
<a href="../classes/human.html" class="tsd-kind-icon">Human</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="current">
|
||||||
|
<li class="current tsd-kind-interface">
|
||||||
|
<a href="config.html" class="tsd-kind-icon">Config</a>
|
||||||
|
<ul>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#async" class="tsd-kind-icon">async</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#backend" class="tsd-kind-icon">backend</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#body" class="tsd-kind-icon">body</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#deallocate" class="tsd-kind-icon">deallocate</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#debug" class="tsd-kind-icon">debug</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#face" class="tsd-kind-icon">face</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#filter" class="tsd-kind-icon">filter</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#gesture" class="tsd-kind-icon">gesture</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#hand" class="tsd-kind-icon">hand</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#object" class="tsd-kind-icon">object</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#profile" class="tsd-kind-icon">profile</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#scoped" class="tsd-kind-icon">scoped</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#videooptimized" class="tsd-kind-icon">video<wbr>Optimized</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#warmup" class="tsd-kind-icon">warmup</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-property tsd-parent-kind-interface">
|
||||||
|
<a href="config.html#wasmpath" class="tsd-kind-icon">wasm<wbr>Path</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="after-current">
|
||||||
|
<li class=" tsd-kind-interface">
|
||||||
|
<a href="result.html" class="tsd-kind-icon">Result</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-type-alias">
|
||||||
|
<a href="../index.html#error" class="tsd-kind-icon">Error</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-type-alias">
|
||||||
|
<a href="../index.html#input" class="tsd-kind-icon">Input</a>
|
||||||
|
</li>
|
||||||
|
<li class=" tsd-kind-type-alias">
|
||||||
|
<a href="../index.html#tensorflow" class="tsd-kind-icon">Tensor<wbr>Flow</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<div class="container">
|
||||||
|
<h2>Legend</h2>
|
||||||
|
<div class="tsd-legend-group">
|
||||||
|
<ul class="tsd-legend">
|
||||||
|
<li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li>
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li>
|
||||||
|
<li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="tsd-legend">
|
||||||
|
<li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<div class="overlay"></div>
|
||||||
|
<script src="../assets/js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
File diff suppressed because one or more lines are too long
|
@ -1,109 +1,115 @@
|
||||||
declare const _default: {
|
/**
|
||||||
backend: string;
|
* Configuration interface definition for **Human** library
|
||||||
wasmPath: string;
|
*
|
||||||
debug: boolean;
|
* Contains all configurable parameters
|
||||||
async: boolean;
|
*/
|
||||||
profile: boolean;
|
export interface Config {
|
||||||
deallocate: boolean;
|
backend: String;
|
||||||
scoped: boolean;
|
wasmPath: String;
|
||||||
videoOptimized: boolean;
|
debug: Boolean;
|
||||||
warmup: string;
|
async: Boolean;
|
||||||
|
profile: Boolean;
|
||||||
|
deallocate: Boolean;
|
||||||
|
scoped: Boolean;
|
||||||
|
videoOptimized: Boolean;
|
||||||
|
warmup: String;
|
||||||
filter: {
|
filter: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
width: number;
|
width: Number;
|
||||||
height: number;
|
height: Number;
|
||||||
return: boolean;
|
return: Boolean;
|
||||||
brightness: number;
|
brightness: Number;
|
||||||
contrast: number;
|
contrast: Number;
|
||||||
sharpness: number;
|
sharpness: Number;
|
||||||
blur: number;
|
blur: Number;
|
||||||
saturation: number;
|
saturation: Number;
|
||||||
hue: number;
|
hue: Number;
|
||||||
negative: boolean;
|
negative: Boolean;
|
||||||
sepia: boolean;
|
sepia: Boolean;
|
||||||
vintage: boolean;
|
vintage: Boolean;
|
||||||
kodachrome: boolean;
|
kodachrome: Boolean;
|
||||||
technicolor: boolean;
|
technicolor: Boolean;
|
||||||
polaroid: boolean;
|
polaroid: Boolean;
|
||||||
pixelate: number;
|
pixelate: Number;
|
||||||
};
|
};
|
||||||
gesture: {
|
gesture: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
};
|
};
|
||||||
face: {
|
face: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
detector: {
|
detector: {
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
rotation: boolean;
|
rotation: Boolean;
|
||||||
maxFaces: number;
|
maxFaces: Number;
|
||||||
skipFrames: number;
|
skipFrames: Number;
|
||||||
skipInitial: boolean;
|
skipInitial: Boolean;
|
||||||
minConfidence: number;
|
minConfidence: Number;
|
||||||
iouThreshold: number;
|
iouThreshold: Number;
|
||||||
scoreThreshold: number;
|
scoreThreshold: Number;
|
||||||
return: boolean;
|
return: Boolean;
|
||||||
};
|
};
|
||||||
mesh: {
|
mesh: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
};
|
};
|
||||||
iris: {
|
iris: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
};
|
};
|
||||||
age: {
|
age: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
skipFrames: number;
|
skipFrames: Number;
|
||||||
};
|
};
|
||||||
gender: {
|
gender: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
minConfidence: number;
|
minConfidence: Number;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
skipFrames: number;
|
skipFrames: Number;
|
||||||
};
|
};
|
||||||
emotion: {
|
emotion: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
minConfidence: number;
|
minConfidence: Number;
|
||||||
skipFrames: number;
|
skipFrames: Number;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
};
|
};
|
||||||
embedding: {
|
embedding: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
body: {
|
body: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
maxDetections: number;
|
maxDetections: Number;
|
||||||
scoreThreshold: number;
|
scoreThreshold: Number;
|
||||||
nmsRadius: number;
|
nmsRadius: Number;
|
||||||
};
|
};
|
||||||
hand: {
|
hand: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
rotation: boolean;
|
rotation: Boolean;
|
||||||
skipFrames: number;
|
skipFrames: Number;
|
||||||
skipInitial: boolean;
|
skipInitial: Boolean;
|
||||||
minConfidence: number;
|
minConfidence: Number;
|
||||||
iouThreshold: number;
|
iouThreshold: Number;
|
||||||
scoreThreshold: number;
|
scoreThreshold: Number;
|
||||||
maxHands: number;
|
maxHands: Number;
|
||||||
landmarks: boolean;
|
landmarks: Boolean;
|
||||||
detector: {
|
detector: {
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
};
|
};
|
||||||
skeleton: {
|
skeleton: {
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
object: {
|
object: {
|
||||||
enabled: boolean;
|
enabled: Boolean;
|
||||||
modelPath: string;
|
modelPath: String;
|
||||||
minConfidence: number;
|
minConfidence: Number;
|
||||||
iouThreshold: number;
|
iouThreshold: Number;
|
||||||
maxResults: number;
|
maxResults: Number;
|
||||||
skipFrames: number;
|
skipFrames: Number;
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
export default _default;
|
declare const config: Config;
|
||||||
|
export { config as defaults };
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
export declare const drawOptions: {
|
||||||
|
color: string;
|
||||||
|
labelColor: string;
|
||||||
|
shadowColor: string;
|
||||||
|
font: string;
|
||||||
|
lineHeight: number;
|
||||||
|
lineWidth: number;
|
||||||
|
pointSize: number;
|
||||||
|
roundRect: number;
|
||||||
|
drawPoints: Boolean;
|
||||||
|
drawLabels: Boolean;
|
||||||
|
drawBoxes: Boolean;
|
||||||
|
drawPolygons: Boolean;
|
||||||
|
fillPolygons: Boolean;
|
||||||
|
useDepth: Boolean;
|
||||||
|
useCurves: Boolean;
|
||||||
|
bufferedOutput: Boolean;
|
||||||
|
useRawBoxes: Boolean;
|
||||||
|
};
|
||||||
|
export declare function gesture(inCanvas: HTMLCanvasElement, result: Array<any>): Promise<void>;
|
||||||
|
export declare function face(inCanvas: HTMLCanvasElement, result: Array<any>): Promise<void>;
|
||||||
|
export declare function body(inCanvas: HTMLCanvasElement, result: Array<any>): Promise<void>;
|
||||||
|
export declare function hand(inCanvas: HTMLCanvasElement, result: Array<any>): Promise<void>;
|
||||||
|
export declare function object(inCanvas: HTMLCanvasElement, result: Array<any>): Promise<void>;
|
||||||
|
export declare function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement): Promise<void>;
|
||||||
|
export declare function all(inCanvas: HTMLCanvasElement, result: any): Promise<void>;
|
|
@ -0,0 +1,108 @@
|
||||||
|
import * as tf from '../dist/tfjs.esm.js';
|
||||||
|
import * as facemesh from './blazeface/facemesh';
|
||||||
|
import * as age from './age/age';
|
||||||
|
import * as gender from './gender/gender';
|
||||||
|
import * as emotion from './emotion/emotion';
|
||||||
|
import * as posenet from './posenet/posenet';
|
||||||
|
import * as handpose from './handpose/handpose';
|
||||||
|
import * as blazepose from './blazepose/blazepose';
|
||||||
|
import * as nanodet from './nanodet/nanodet';
|
||||||
|
import * as draw from './draw/draw';
|
||||||
|
import { Config } from './config';
|
||||||
|
import { Result } from './result';
|
||||||
|
declare type Tensor = {};
|
||||||
|
declare type Model = {};
|
||||||
|
export type { Config } from './config';
|
||||||
|
export type { Result } from './result';
|
||||||
|
/** Defines all possible input types for **Human** detection */
|
||||||
|
export declare type Input = Tensor | ImageData | ImageBitmap | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;
|
||||||
|
/** Error message */
|
||||||
|
export declare type Error = {
|
||||||
|
error: String;
|
||||||
|
};
|
||||||
|
export declare type TensorFlow = typeof tf;
|
||||||
|
/**
|
||||||
|
* Main Class for `Human` library
|
||||||
|
*
|
||||||
|
* All methods and properties are available only as members of Human class
|
||||||
|
*
|
||||||
|
* Configuration object definition: @link Config
|
||||||
|
* Results object definition: @link Result
|
||||||
|
* Possible inputs: @link Input
|
||||||
|
*/
|
||||||
|
export declare class Human {
|
||||||
|
#private;
|
||||||
|
version: String;
|
||||||
|
config: Config;
|
||||||
|
state: String;
|
||||||
|
image: {
|
||||||
|
tensor: Tensor;
|
||||||
|
canvas: OffscreenCanvas | HTMLCanvasElement;
|
||||||
|
};
|
||||||
|
tf: TensorFlow;
|
||||||
|
draw: {
|
||||||
|
drawOptions?: typeof draw.drawOptions;
|
||||||
|
gesture: typeof draw.gesture;
|
||||||
|
face: typeof draw.face;
|
||||||
|
body: typeof draw.body;
|
||||||
|
hand: typeof draw.hand;
|
||||||
|
canvas: typeof draw.canvas;
|
||||||
|
all: typeof draw.all;
|
||||||
|
};
|
||||||
|
models: {
|
||||||
|
face: facemesh.MediaPipeFaceMesh | null;
|
||||||
|
posenet: posenet.PoseNet | null;
|
||||||
|
blazepose: Model | null;
|
||||||
|
handpose: handpose.HandPose | null;
|
||||||
|
iris: Model | null;
|
||||||
|
age: Model | null;
|
||||||
|
gender: Model | null;
|
||||||
|
emotion: Model | null;
|
||||||
|
embedding: Model | null;
|
||||||
|
nanodet: Model | null;
|
||||||
|
};
|
||||||
|
classes: {
|
||||||
|
facemesh: typeof facemesh;
|
||||||
|
age: typeof age;
|
||||||
|
gender: typeof gender;
|
||||||
|
emotion: typeof emotion;
|
||||||
|
body: typeof posenet | typeof blazepose;
|
||||||
|
hand: typeof handpose;
|
||||||
|
nanodet: typeof nanodet;
|
||||||
|
};
|
||||||
|
sysinfo: {
|
||||||
|
platform: String;
|
||||||
|
agent: String;
|
||||||
|
};
|
||||||
|
constructor(userConfig?: Config | Object);
|
||||||
|
profileData(): {
|
||||||
|
newBytes: any;
|
||||||
|
newTensors: any;
|
||||||
|
peakBytes: any;
|
||||||
|
numKernelOps: any;
|
||||||
|
timeKernelOps: any;
|
||||||
|
slowestKernelOps: any;
|
||||||
|
largestKernelOps: any;
|
||||||
|
} | {};
|
||||||
|
simmilarity(embedding1: Array<Number>, embedding2: Array<Number>): Number;
|
||||||
|
enhance(input: Tensor): Tensor | null;
|
||||||
|
match(faceEmbedding: Array<Number>, db: Array<{
|
||||||
|
name: String;
|
||||||
|
source: String | undefined;
|
||||||
|
embedding: Array<Number>;
|
||||||
|
}>, threshold?: number): {
|
||||||
|
name: String;
|
||||||
|
source: String | undefined;
|
||||||
|
simmilarity: Number;
|
||||||
|
embedding: Array<Number>;
|
||||||
|
};
|
||||||
|
load(userConfig?: Config | Object): Promise<void>;
|
||||||
|
detect(input: Input, userConfig?: Config | Object): Promise<Result | Error>;
|
||||||
|
warmup(userConfig?: Config | Object): Promise<Result | {
|
||||||
|
error: any;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Class Human is also available as default export
|
||||||
|
*/
|
||||||
|
export { Human as default };
|
|
@ -1,4 +1,4 @@
|
||||||
import * as tf from '../dist/tfjs.esm.js';
|
import * as tf from '../../dist/tfjs.esm.js';
|
||||||
export declare function process(input: any, config: any): {
|
export declare function process(input: any, config: any): {
|
||||||
tensor: tf.Tensor;
|
tensor: tf.Tensor;
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement;
|
canvas: OffscreenCanvas | HTMLCanvasElement;
|
|
@ -0,0 +1,132 @@
|
||||||
|
/**
|
||||||
|
* Result interface definition for **Human** library
|
||||||
|
*
|
||||||
|
* Contains all possible detection results
|
||||||
|
*/
|
||||||
|
export interface Result {
|
||||||
|
/** Face results
|
||||||
|
* Combined results of face detector, face mesh, age, gender, emotion, embedding, iris models
|
||||||
|
* Some values may be null if specific model is not enabled
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected face
|
||||||
|
* Each result has:
|
||||||
|
* - overal detection confidence value
|
||||||
|
* - box detection confidence value
|
||||||
|
* - mesh detection confidence value
|
||||||
|
* - box as array of [x, y, width, height], normalized to image resolution
|
||||||
|
* - boxRaw as array of [x, y, width, height], normalized to range 0..1
|
||||||
|
* - mesh as array of [x, y, z] points of face mesh, normalized to image resolution
|
||||||
|
* - meshRaw as array of [x, y, z] points of face mesh, normalized to range 0..1
|
||||||
|
* - annotations as array of annotated face mesh points
|
||||||
|
* - age as value
|
||||||
|
* - gender as value
|
||||||
|
* - genderConfidence as value
|
||||||
|
* - emotion as array of possible emotions with their individual scores
|
||||||
|
* - iris as distance value
|
||||||
|
* - angle as object with values for roll, yaw and pitch angles
|
||||||
|
*/
|
||||||
|
face: Array<{
|
||||||
|
confidence: Number;
|
||||||
|
boxConfidence: Number;
|
||||||
|
faceConfidence: Number;
|
||||||
|
box: [Number, Number, Number, Number];
|
||||||
|
boxRaw: [Number, Number, Number, Number];
|
||||||
|
mesh: Array<[Number, Number, Number]>;
|
||||||
|
meshRaw: Array<[Number, Number, Number]>;
|
||||||
|
annotations: Array<{
|
||||||
|
part: String;
|
||||||
|
points: Array<[Number, Number, Number]>[];
|
||||||
|
}>;
|
||||||
|
age: Number;
|
||||||
|
gender: String;
|
||||||
|
genderConfidence: Number;
|
||||||
|
emotion: Array<{
|
||||||
|
score: Number;
|
||||||
|
emotion: String;
|
||||||
|
}>;
|
||||||
|
embedding: Array<Number>;
|
||||||
|
iris: Number;
|
||||||
|
angle: {
|
||||||
|
roll: Number;
|
||||||
|
yaw: Number;
|
||||||
|
pitch: Number;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
/** Body results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected body
|
||||||
|
* Each results has:
|
||||||
|
* - body id number
|
||||||
|
* - body part name
|
||||||
|
* - part position with x,y,z coordinates
|
||||||
|
* - body part score value
|
||||||
|
* - body part presence value
|
||||||
|
*/
|
||||||
|
body: Array<{
|
||||||
|
id: Number;
|
||||||
|
part: String;
|
||||||
|
position: {
|
||||||
|
x: Number;
|
||||||
|
y: Number;
|
||||||
|
z: Number;
|
||||||
|
};
|
||||||
|
score: Number;
|
||||||
|
presence: Number;
|
||||||
|
}>;
|
||||||
|
/** Hand results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected hand
|
||||||
|
* Each result has:
|
||||||
|
* - confidence as value
|
||||||
|
* - box as array of [x, y, width, height], normalized to image resolution
|
||||||
|
* - boxRaw as array of [x, y, width, height], normalized to range 0..1
|
||||||
|
* - landmarks as array of [x, y, z] points of hand, normalized to image resolution
|
||||||
|
* - annotations as array of annotated face landmark points
|
||||||
|
*/
|
||||||
|
hand: Array<{
|
||||||
|
confidence: Number;
|
||||||
|
box: [Number, Number, Number, Number];
|
||||||
|
boxRaw: [Number, Number, Number, Number];
|
||||||
|
landmarks: Array<[Number, Number, Number]>;
|
||||||
|
annotations: Array<{
|
||||||
|
part: String;
|
||||||
|
points: Array<[Number, Number, Number]>[];
|
||||||
|
}>;
|
||||||
|
}>;
|
||||||
|
/** Gesture results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected gesture
|
||||||
|
* Each result has:
|
||||||
|
* - part where gesture was detected
|
||||||
|
* - gesture detected
|
||||||
|
*/
|
||||||
|
gesture: Array<{
|
||||||
|
part: String;
|
||||||
|
gesture: String;
|
||||||
|
}>;
|
||||||
|
/** Object results
|
||||||
|
*
|
||||||
|
* Array of individual results with one object per detected gesture
|
||||||
|
* Each result has:
|
||||||
|
* - score as value
|
||||||
|
* - label as detected class name
|
||||||
|
* - center as array of [x, y], normalized to image resolution
|
||||||
|
* - centerRaw as array of [x, y], normalized to range 0..1
|
||||||
|
* - box as array of [x, y, width, height], normalized to image resolution
|
||||||
|
* - boxRaw as array of [x, y, width, height], normalized to range 0..1
|
||||||
|
*/
|
||||||
|
object: Array<{
|
||||||
|
score: Number;
|
||||||
|
strideSize: Number;
|
||||||
|
class: Number;
|
||||||
|
label: String;
|
||||||
|
center: Number[];
|
||||||
|
centerRaw: Number[];
|
||||||
|
box: Number[];
|
||||||
|
boxRaw: Number[];
|
||||||
|
}>;
|
||||||
|
performance: {
|
||||||
|
any: any;
|
||||||
|
};
|
||||||
|
canvas: OffscreenCanvas | HTMLCanvasElement;
|
||||||
|
}
|
|
@ -1,26 +0,0 @@
|
||||||
export declare const drawOptions: {
|
|
||||||
color: string;
|
|
||||||
labelColor: string;
|
|
||||||
shadowColor: string;
|
|
||||||
font: string;
|
|
||||||
lineHeight: number;
|
|
||||||
lineWidth: number;
|
|
||||||
pointSize: number;
|
|
||||||
roundRect: number;
|
|
||||||
drawPoints: Boolean;
|
|
||||||
drawLabels: Boolean;
|
|
||||||
drawBoxes: Boolean;
|
|
||||||
drawPolygons: Boolean;
|
|
||||||
fillPolygons: Boolean;
|
|
||||||
useDepth: Boolean;
|
|
||||||
useCurves: Boolean;
|
|
||||||
bufferedOutput: Boolean;
|
|
||||||
useRawBoxes: Boolean;
|
|
||||||
};
|
|
||||||
export declare function gesture(inCanvas: any, result: any): Promise<void>;
|
|
||||||
export declare function face(inCanvas: any, result: any): Promise<void>;
|
|
||||||
export declare function body(inCanvas: any, result: any): Promise<void>;
|
|
||||||
export declare function hand(inCanvas: any, result: any): Promise<void>;
|
|
||||||
export declare function object(inCanvas: any, result: any): Promise<void>;
|
|
||||||
export declare function canvas(inCanvas: any, outCanvas: any): Promise<void>;
|
|
||||||
export declare function all(inCanvas: any, result: any): Promise<void>;
|
|
|
@ -1,157 +0,0 @@
|
||||||
import * as tf from '../dist/tfjs.esm.js';
|
|
||||||
import * as facemesh from './blazeface/facemesh';
|
|
||||||
import * as age from './age/age';
|
|
||||||
import * as gender from './gender/gender';
|
|
||||||
import * as emotion from './emotion/emotion';
|
|
||||||
import * as posenet from './posenet/posenet';
|
|
||||||
import * as handpose from './handpose/handpose';
|
|
||||||
import * as blazepose from './blazepose/blazepose';
|
|
||||||
import * as nanodet from './nanodet/nanodet';
|
|
||||||
import * as config from '../config';
|
|
||||||
import * as draw from './draw';
|
|
||||||
declare type Tensor = {};
|
|
||||||
declare type Model = {};
|
|
||||||
export declare type Result = {
|
|
||||||
face: Array<{
|
|
||||||
confidence: Number;
|
|
||||||
boxConfidence: Number;
|
|
||||||
faceConfidence: Number;
|
|
||||||
box: [Number, Number, Number, Number];
|
|
||||||
mesh: Array<[Number, Number, Number]>;
|
|
||||||
meshRaw: Array<[Number, Number, Number]>;
|
|
||||||
boxRaw: [Number, Number, Number, Number];
|
|
||||||
annotations: Array<{
|
|
||||||
part: String;
|
|
||||||
points: Array<[Number, Number, Number]>[];
|
|
||||||
}>;
|
|
||||||
age: Number;
|
|
||||||
gender: String;
|
|
||||||
genderConfidence: Number;
|
|
||||||
emotion: Array<{
|
|
||||||
score: Number;
|
|
||||||
emotion: String;
|
|
||||||
}>;
|
|
||||||
embedding: Array<Number>;
|
|
||||||
iris: Number;
|
|
||||||
angle: {
|
|
||||||
roll: Number;
|
|
||||||
yaw: Number;
|
|
||||||
pitch: Number;
|
|
||||||
};
|
|
||||||
}>;
|
|
||||||
body: Array<{
|
|
||||||
id: Number;
|
|
||||||
part: String;
|
|
||||||
position: {
|
|
||||||
x: Number;
|
|
||||||
y: Number;
|
|
||||||
z: Number;
|
|
||||||
};
|
|
||||||
score: Number;
|
|
||||||
presence: Number;
|
|
||||||
}>;
|
|
||||||
hand: Array<{
|
|
||||||
confidence: Number;
|
|
||||||
box: [Number, Number, Number, Number];
|
|
||||||
boxRaw: [Number, Number, Number, Number];
|
|
||||||
landmarks: Array<[Number, Number, Number]>;
|
|
||||||
annotations: Array<{
|
|
||||||
part: String;
|
|
||||||
points: Array<[Number, Number, Number]>[];
|
|
||||||
}>;
|
|
||||||
}>;
|
|
||||||
gesture: Array<{
|
|
||||||
part: String;
|
|
||||||
gesture: String;
|
|
||||||
}>;
|
|
||||||
object: Array<{
|
|
||||||
score: Number;
|
|
||||||
strideSize: Number;
|
|
||||||
class: Number;
|
|
||||||
label: String;
|
|
||||||
center: Number[];
|
|
||||||
centerRaw: Number[];
|
|
||||||
box: Number[];
|
|
||||||
boxRaw: Number[];
|
|
||||||
}>;
|
|
||||||
performance: {
|
|
||||||
any: any;
|
|
||||||
};
|
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement;
|
|
||||||
};
|
|
||||||
export type { default as Config } from '../config';
|
|
||||||
export declare class Human {
|
|
||||||
#private;
|
|
||||||
version: String;
|
|
||||||
config: typeof config.default;
|
|
||||||
state: String;
|
|
||||||
image: {
|
|
||||||
tensor: Tensor;
|
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement;
|
|
||||||
};
|
|
||||||
tf: typeof tf;
|
|
||||||
draw: {
|
|
||||||
drawOptions?: typeof draw.drawOptions;
|
|
||||||
gesture: Function;
|
|
||||||
face: Function;
|
|
||||||
body: Function;
|
|
||||||
hand: Function;
|
|
||||||
canvas: Function;
|
|
||||||
all: Function;
|
|
||||||
};
|
|
||||||
models: {
|
|
||||||
face: facemesh.MediaPipeFaceMesh | null;
|
|
||||||
posenet: posenet.PoseNet | null;
|
|
||||||
blazepose: Model | null;
|
|
||||||
handpose: handpose.HandPose | null;
|
|
||||||
iris: Model | null;
|
|
||||||
age: Model | null;
|
|
||||||
gender: Model | null;
|
|
||||||
emotion: Model | null;
|
|
||||||
embedding: Model | null;
|
|
||||||
nanodet: Model | null;
|
|
||||||
};
|
|
||||||
classes: {
|
|
||||||
facemesh: typeof facemesh;
|
|
||||||
age: typeof age;
|
|
||||||
gender: typeof gender;
|
|
||||||
emotion: typeof emotion;
|
|
||||||
body: typeof posenet | typeof blazepose;
|
|
||||||
hand: typeof handpose;
|
|
||||||
nanodet: typeof nanodet;
|
|
||||||
};
|
|
||||||
sysinfo: {
|
|
||||||
platform: String;
|
|
||||||
agent: String;
|
|
||||||
};
|
|
||||||
constructor(userConfig?: {});
|
|
||||||
profileData(): {
|
|
||||||
newBytes: any;
|
|
||||||
newTensors: any;
|
|
||||||
peakBytes: any;
|
|
||||||
numKernelOps: any;
|
|
||||||
timeKernelOps: any;
|
|
||||||
slowestKernelOps: any;
|
|
||||||
largestKernelOps: any;
|
|
||||||
} | {};
|
|
||||||
simmilarity(embedding1: Array<Number>, embedding2: Array<Number>): Number;
|
|
||||||
enhance(input: Tensor): Tensor | null;
|
|
||||||
match(faceEmbedding: Array<Number>, db: Array<{
|
|
||||||
name: String;
|
|
||||||
source: String | undefined;
|
|
||||||
embedding: Array<Number>;
|
|
||||||
}>, threshold?: number): {
|
|
||||||
name: String;
|
|
||||||
source: String | undefined;
|
|
||||||
simmilarity: Number;
|
|
||||||
embedding: Array<Number>;
|
|
||||||
};
|
|
||||||
load(userConfig?: Object): Promise<void>;
|
|
||||||
detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig?: Object): Promise<Result | {
|
|
||||||
error: String;
|
|
||||||
}>;
|
|
||||||
warmup(userConfig?: Object): Promise<Result | {
|
|
||||||
error: any;
|
|
||||||
}>;
|
|
||||||
}
|
|
||||||
export { Human as default };
|
|
2
wiki
2
wiki
|
@ -1 +1 @@
|
||||||
Subproject commit 91af84e9543762c4f31be41dda15fb2a5549d8a6
|
Subproject commit 936e36ce0fd331030b48db735836381f2f22134a
|
Loading…
Reference in New Issue