added configuration validation

pull/193/head
Vladimir Mandic 2021-09-19 14:07:53 -04:00
parent 6b03eb4287
commit b07d0e823a
39 changed files with 1100 additions and 685 deletions

View File

@ -9,8 +9,9 @@
## Changelog ## Changelog
### **HEAD -> main** 2021/09/17 mandic00@live.com ### **HEAD -> main** 2021/09/18 mandic00@live.com
- prevent validation failed on some model combinations
- webgl exception handling - webgl exception handling
### **2.2.2** 2021/09/17 mandic00@live.com ### **2.2.2** 2021/09/17 mandic00@live.com

14
TODO.md
View File

@ -30,6 +30,15 @@ Feature is automatically disabled in NodeJS without user impact
<br> <br>
### Face Emotion Detection
Face Emotion detection using WASM backend has reduced precision due to math errors in backend
- Backend WASM incorrect handling of `int32` tensors
<https://github.com/tensorflow/tfjs/issues/5641>
<br>
### Hand Detection ### Hand Detection
Enhanced rotation correction for hand detection is not working in NodeJS due to missing kernel op in TFJS Enhanced rotation correction for hand detection is not working in NodeJS due to missing kernel op in TFJS
@ -38,7 +47,10 @@ Feature is automatically disabled in NodeJS without user impact
- Backend NodeJS missing kernel op `RotateWithOffset` - Backend NodeJS missing kernel op `RotateWithOffset`
<https://github.com/tensorflow/tfjs/issues/5473> <https://github.com/tensorflow/tfjs/issues/5473>
Hand detection using WASM backend has reduced precision due to math rounding errors in backend Hand detection using WASM backend has reduced precision due to math errors in backend
- Backend WASM incorrect handling of `int32` tensors
<https://github.com/tensorflow/tfjs/issues/5641>
<br> <br>

View File

@ -69,6 +69,23 @@ var now = () => {
return performance.now(); return performance.now();
return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString());
}; };
function validate(defaults, config3, parent = "config", msgs = []) {
for (const key of Object.keys(config3)) {
if (typeof config3[key] === "object") {
validate(defaults[key], config3[key], key, msgs);
} else {
const defined = typeof defaults[key] !== "undefined";
if (!defined)
msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` });
const same = typeof defaults[key] === typeof config3[key];
if (defined && !same)
msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] });
}
}
if (config3.debug && parent === "config" && msgs.length > 0)
log("invalid configuration", msgs);
return msgs;
}
function mergeDeep(...objects) { function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === "object"; const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => { return objects.reduce((prev, obj) => {
@ -4550,7 +4567,7 @@ function process2(input, config3) {
let pixels; let pixels;
if (outCanvas.data) { if (outCanvas.data) {
const shape = [outCanvas.height, outCanvas.width, 3]; const shape = [outCanvas.height, outCanvas.width, 3];
pixels = tfjs_esm_exports.tensor3d(outCanvas.data, shape, "int32"); pixels = tfjs_esm_exports.tensor3d(outCanvas.data, shape, "float32");
} else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) { } else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) {
pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(outCanvas) : null; pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") { } else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8619,7 +8636,7 @@ var HandDetector = class {
const scores = await t.scores.data(); const scores = await t.scores.data();
t.boxes = tfjs_esm_exports.slice(t.predictions, [0, 1], [-1, 4]); t.boxes = tfjs_esm_exports.slice(t.predictions, [0, 1], [-1, 4]);
t.norm = this.normalizeBoxes(t.boxes); t.norm = this.normalizeBoxes(t.boxes);
t.nms = await tfjs_esm_exports.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); t.nms = await tfjs_esm_exports.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence);
const nms = await t.nms.array(); const nms = await t.nms.array();
const hands = []; const hands = [];
for (const index of nms) { for (const index of nms) {
@ -8732,7 +8749,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands"); __publicField(this, "detectedHands");
this.handDetector = handDetector; this.handDetector = handDetector;
this.handPoseModel = handPoseModel2; this.handPoseModel = handPoseModel2;
this.inputSize = this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
this.storedBoxes = []; this.storedBoxes = [];
this.skipped = 0; this.skipped = 0;
this.detectedHands = 0; this.detectedHands = 0;
@ -8848,6 +8865,8 @@ var HandPipeline = class {
} }
this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length; this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands; return hands;
} }
}; };
@ -8909,6 +8928,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope; return slope;
} }
function getSlopes(point1, point2) { function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) if (point1.length === 2)
return slopeXY; return slopeXY;
@ -9207,6 +9228,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts // src/fingerpose/fingerpose.ts
var minConfidence = 0.7; var minConfidence = 0.7;
function analyze(keypoints3) { function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3); const estimatorRes = estimate(keypoints3);
const landmarks = {}; const landmarks = {};
for (const fingerIdx of Finger.all) { for (const fingerIdx of Finger.all) {
@ -9218,8 +9241,10 @@ function analyze(keypoints3) {
return landmarks; return landmarks;
} }
function match2(keypoints3) { function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = []; const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) { for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions); const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence) if (confidence >= minConfidence)
@ -10172,7 +10197,7 @@ async function load13(instance) {
instance.models.segmentation = await load12(instance.config); instance.models.segmentation = await load12(instance.config);
} }
} }
async function validate(instance) { async function validate2(instance) {
const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"];
for (const defined of Object.keys(instance.models)) { for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) { if (instance.models[defined]) {
@ -10500,7 +10525,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const fingers = []; const fingers = [];
for (const [finger, pos] of Object.entries(res[i]["annotations"])) { for (const [finger, pos] of Object.entries(res[i]["annotations"])) {
if (finger !== "palmBase" && Array.isArray(pos)) if (finger !== "palmBase" && Array.isArray(pos) && pos[0])
fingers.push({ name: finger.toLowerCase(), position: pos[0] }); fingers.push({ name: finger.toLowerCase(), position: pos[0] });
} }
if (fingers && fingers.length > 0) { if (fingers && fingers.length > 0) {
@ -12212,6 +12237,8 @@ var Human = class {
} }
return null; return null;
}); });
__publicField(this, "reset", () => this.config = JSON.parse(JSON.stringify(config)));
__publicField(this, "validate", (userConfig) => validate(config, userConfig || this.config));
__publicField(this, "image", (input) => process2(input, this.config)); __publicField(this, "image", (input) => process2(input, this.config));
__publicField(this, "emit", (event) => { __publicField(this, "emit", (event) => {
var _a; var _a;
@ -12224,7 +12251,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow"; config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = version10; this.version = version10;
Object.defineProperty(this, "version", { value: version10 }); Object.defineProperty(this, "version", { value: version10 });
this.config = mergeDeep(config, userConfig || {}); this.config = JSON.parse(JSON.stringify(config));
Object.seal(this.config);
if (userConfig)
this.config = mergeDeep(this.config, userConfig);
validate(config, this.config);
this.tf = tfjs_esm_exports; this.tf = tfjs_esm_exports;
this.state = "idle"; this.state = "idle";
__privateSet(this, _numTensors, 0); __privateSet(this, _numTensors, 0);
@ -12308,7 +12339,7 @@ var Human = class {
env.initial = false; env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length; const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) { if (loaded !== count2) {
await validate(this); await validate2(this);
this.emit("load"); this.emit("load");
} }
const current = Math.trunc(now() - timeStamp); const current = Math.trunc(now() - timeStamp);

File diff suppressed because one or more lines are too long

47
dist/human.esm.js vendored
View File

@ -58,6 +58,23 @@ var now = () => {
return performance.now(); return performance.now();
return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString());
}; };
function validate(defaults, config3, parent = "config", msgs = []) {
for (const key of Object.keys(config3)) {
if (typeof config3[key] === "object") {
validate(defaults[key], config3[key], key, msgs);
} else {
const defined = typeof defaults[key] !== "undefined";
if (!defined)
msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` });
const same = typeof defaults[key] === typeof config3[key];
if (defined && !same)
msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] });
}
}
if (config3.debug && parent === "config" && msgs.length > 0)
log("invalid configuration", msgs);
return msgs;
}
function mergeDeep(...objects) { function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === "object"; const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => { return objects.reduce((prev, obj) => {
@ -64607,7 +64624,7 @@ function process2(input2, config3) {
let pixels; let pixels;
if (outCanvas.data) { if (outCanvas.data) {
const shape = [outCanvas.height, outCanvas.width, 3]; const shape = [outCanvas.height, outCanvas.width, 3];
pixels = tensor3d(outCanvas.data, shape, "int32"); pixels = tensor3d(outCanvas.data, shape, "float32");
} else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) { } else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) {
pixels = browser_exports ? browser_exports.fromPixels(outCanvas) : null; pixels = browser_exports ? browser_exports.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") { } else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -68676,7 +68693,7 @@ var HandDetector = class {
const scores = await t.scores.data(); const scores = await t.scores.data();
t.boxes = slice(t.predictions, [0, 1], [-1, 4]); t.boxes = slice(t.predictions, [0, 1], [-1, 4]);
t.norm = this.normalizeBoxes(t.boxes); t.norm = this.normalizeBoxes(t.boxes);
t.nms = await image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); t.nms = await image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence);
const nms = await t.nms.array(); const nms = await t.nms.array();
const hands = []; const hands = [];
for (const index of nms) { for (const index of nms) {
@ -68789,7 +68806,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands"); __publicField(this, "detectedHands");
this.handDetector = handDetector; this.handDetector = handDetector;
this.handPoseModel = handPoseModel2; this.handPoseModel = handPoseModel2;
this.inputSize = this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
this.storedBoxes = []; this.storedBoxes = [];
this.skipped = 0; this.skipped = 0;
this.detectedHands = 0; this.detectedHands = 0;
@ -68905,6 +68922,8 @@ var HandPipeline = class {
} }
this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length; this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands; return hands;
} }
}; };
@ -68966,6 +68985,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope; return slope;
} }
function getSlopes(point1, point2) { function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) if (point1.length === 2)
return slopeXY; return slopeXY;
@ -69264,6 +69285,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts // src/fingerpose/fingerpose.ts
var minConfidence = 0.7; var minConfidence = 0.7;
function analyze(keypoints3) { function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3); const estimatorRes = estimate(keypoints3);
const landmarks = {}; const landmarks = {};
for (const fingerIdx of Finger.all) { for (const fingerIdx of Finger.all) {
@ -69275,8 +69298,10 @@ function analyze(keypoints3) {
return landmarks; return landmarks;
} }
function match2(keypoints3) { function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = []; const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) { for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions); const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence) if (confidence >= minConfidence)
@ -70229,7 +70254,7 @@ async function load13(instance) {
instance.models.segmentation = await load12(instance.config); instance.models.segmentation = await load12(instance.config);
} }
} }
async function validate(instance) { async function validate2(instance) {
const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"];
for (const defined of Object.keys(instance.models)) { for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) { if (instance.models[defined]) {
@ -70557,7 +70582,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const fingers = []; const fingers = [];
for (const [finger, pos] of Object.entries(res[i]["annotations"])) { for (const [finger, pos] of Object.entries(res[i]["annotations"])) {
if (finger !== "palmBase" && Array.isArray(pos)) if (finger !== "palmBase" && Array.isArray(pos) && pos[0])
fingers.push({ name: finger.toLowerCase(), position: pos[0] }); fingers.push({ name: finger.toLowerCase(), position: pos[0] });
} }
if (fingers && fingers.length > 0) { if (fingers && fingers.length > 0) {
@ -72269,6 +72294,8 @@ var Human = class {
} }
return null; return null;
}); });
__publicField(this, "reset", () => this.config = JSON.parse(JSON.stringify(config)));
__publicField(this, "validate", (userConfig) => validate(config, userConfig || this.config));
__publicField(this, "image", (input2) => process2(input2, this.config)); __publicField(this, "image", (input2) => process2(input2, this.config));
__publicField(this, "emit", (event) => { __publicField(this, "emit", (event) => {
var _a; var _a;
@ -72281,7 +72308,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow"; config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = version6; this.version = version6;
Object.defineProperty(this, "version", { value: version6 }); Object.defineProperty(this, "version", { value: version6 });
this.config = mergeDeep(config, userConfig || {}); this.config = JSON.parse(JSON.stringify(config));
Object.seal(this.config);
if (userConfig)
this.config = mergeDeep(this.config, userConfig);
validate(config, this.config);
this.tf = tfjs_esm_exports; this.tf = tfjs_esm_exports;
this.state = "idle"; this.state = "idle";
__privateSet(this, _numTensors, 0); __privateSet(this, _numTensors, 0);
@ -72365,7 +72396,7 @@ var Human = class {
env2.initial = false; env2.initial = false;
const loaded = Object.values(this.models).filter((model11) => model11).length; const loaded = Object.values(this.models).filter((model11) => model11).length;
if (loaded !== count3) { if (loaded !== count3) {
await validate(this); await validate2(this);
this.emit("load"); this.emit("load");
} }
const current = Math.trunc(now() - timeStamp); const current = Math.trunc(now() - timeStamp);

File diff suppressed because one or more lines are too long

506
dist/human.js vendored

File diff suppressed because one or more lines are too long

View File

@ -114,6 +114,23 @@ var now = () => {
return performance.now(); return performance.now();
return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString());
}; };
function validate(defaults, config3, parent = "config", msgs = []) {
for (const key of Object.keys(config3)) {
if (typeof config3[key] === "object") {
validate(defaults[key], config3[key], key, msgs);
} else {
const defined = typeof defaults[key] !== "undefined";
if (!defined)
msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` });
const same = typeof defaults[key] === typeof config3[key];
if (defined && !same)
msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] });
}
}
if (config3.debug && parent === "config" && msgs.length > 0)
log("invalid configuration", msgs);
return msgs;
}
function mergeDeep(...objects) { function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === "object"; const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => { return objects.reduce((prev, obj) => {
@ -4584,7 +4601,7 @@ function process2(input, config3) {
let pixels; let pixels;
if (outCanvas.data) { if (outCanvas.data) {
const shape = [outCanvas.height, outCanvas.width, 3]; const shape = [outCanvas.height, outCanvas.width, 3];
pixels = tf3.tensor3d(outCanvas.data, shape, "int32"); pixels = tf3.tensor3d(outCanvas.data, shape, "float32");
} else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) { } else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) {
pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null; pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") { } else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8665,7 +8682,7 @@ var HandDetector = class {
const scores = await t.scores.data(); const scores = await t.scores.data();
t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]); t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]);
t.norm = this.normalizeBoxes(t.boxes); t.norm = this.normalizeBoxes(t.boxes);
t.nms = await tf11.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); t.nms = await tf11.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence);
const nms = await t.nms.array(); const nms = await t.nms.array();
const hands = []; const hands = [];
for (const index of nms) { for (const index of nms) {
@ -8781,7 +8798,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands"); __publicField(this, "detectedHands");
this.handDetector = handDetector; this.handDetector = handDetector;
this.handPoseModel = handPoseModel2; this.handPoseModel = handPoseModel2;
this.inputSize = this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
this.storedBoxes = []; this.storedBoxes = [];
this.skipped = 0; this.skipped = 0;
this.detectedHands = 0; this.detectedHands = 0;
@ -8897,6 +8914,8 @@ var HandPipeline = class {
} }
this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length; this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands; return hands;
} }
}; };
@ -8958,6 +8977,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope; return slope;
} }
function getSlopes(point1, point2) { function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) if (point1.length === 2)
return slopeXY; return slopeXY;
@ -9256,6 +9277,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts // src/fingerpose/fingerpose.ts
var minConfidence = 0.7; var minConfidence = 0.7;
function analyze(keypoints3) { function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3); const estimatorRes = estimate(keypoints3);
const landmarks = {}; const landmarks = {};
for (const fingerIdx of Finger.all) { for (const fingerIdx of Finger.all) {
@ -9267,8 +9290,10 @@ function analyze(keypoints3) {
return landmarks; return landmarks;
} }
function match2(keypoints3) { function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = []; const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) { for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions); const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence) if (confidence >= minConfidence)
@ -10231,7 +10256,7 @@ async function load13(instance) {
instance.models.segmentation = await load12(instance.config); instance.models.segmentation = await load12(instance.config);
} }
} }
async function validate(instance) { async function validate2(instance) {
const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"];
for (const defined of Object.keys(instance.models)) { for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) { if (instance.models[defined]) {
@ -10560,7 +10585,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const fingers = []; const fingers = [];
for (const [finger, pos] of Object.entries(res[i]["annotations"])) { for (const [finger, pos] of Object.entries(res[i]["annotations"])) {
if (finger !== "palmBase" && Array.isArray(pos)) if (finger !== "palmBase" && Array.isArray(pos) && pos[0])
fingers.push({ name: finger.toLowerCase(), position: pos[0] }); fingers.push({ name: finger.toLowerCase(), position: pos[0] });
} }
if (fingers && fingers.length > 0) { if (fingers && fingers.length > 0) {
@ -12275,6 +12300,8 @@ var Human = class {
} }
return null; return null;
}); });
__publicField(this, "reset", () => this.config = JSON.parse(JSON.stringify(config)));
__publicField(this, "validate", (userConfig) => validate(config, userConfig || this.config));
__publicField(this, "image", (input) => process2(input, this.config)); __publicField(this, "image", (input) => process2(input, this.config));
__publicField(this, "emit", (event) => { __publicField(this, "emit", (event) => {
var _a; var _a;
@ -12287,7 +12314,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow"; config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = version; this.version = version;
Object.defineProperty(this, "version", { value: version }); Object.defineProperty(this, "version", { value: version });
this.config = mergeDeep(config, userConfig || {}); this.config = JSON.parse(JSON.stringify(config));
Object.seal(this.config);
if (userConfig)
this.config = mergeDeep(this.config, userConfig);
validate(config, this.config);
this.tf = tf24; this.tf = tf24;
this.state = "idle"; this.state = "idle";
__privateSet(this, _numTensors, 0); __privateSet(this, _numTensors, 0);
@ -12371,7 +12402,7 @@ var Human = class {
env.initial = false; env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length; const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) { if (loaded !== count2) {
await validate(this); await validate2(this);
this.emit("load"); this.emit("load");
} }
const current = Math.trunc(now() - timeStamp); const current = Math.trunc(now() - timeStamp);

View File

@ -115,6 +115,23 @@ var now = () => {
return performance.now(); return performance.now();
return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString());
}; };
function validate(defaults, config3, parent = "config", msgs = []) {
for (const key of Object.keys(config3)) {
if (typeof config3[key] === "object") {
validate(defaults[key], config3[key], key, msgs);
} else {
const defined = typeof defaults[key] !== "undefined";
if (!defined)
msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` });
const same = typeof defaults[key] === typeof config3[key];
if (defined && !same)
msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] });
}
}
if (config3.debug && parent === "config" && msgs.length > 0)
log("invalid configuration", msgs);
return msgs;
}
function mergeDeep(...objects) { function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === "object"; const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => { return objects.reduce((prev, obj) => {
@ -4585,7 +4602,7 @@ function process2(input, config3) {
let pixels; let pixels;
if (outCanvas.data) { if (outCanvas.data) {
const shape = [outCanvas.height, outCanvas.width, 3]; const shape = [outCanvas.height, outCanvas.width, 3];
pixels = tf3.tensor3d(outCanvas.data, shape, "int32"); pixels = tf3.tensor3d(outCanvas.data, shape, "float32");
} else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) { } else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) {
pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null; pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") { } else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8666,7 +8683,7 @@ var HandDetector = class {
const scores = await t.scores.data(); const scores = await t.scores.data();
t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]); t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]);
t.norm = this.normalizeBoxes(t.boxes); t.norm = this.normalizeBoxes(t.boxes);
t.nms = await tf11.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); t.nms = await tf11.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence);
const nms = await t.nms.array(); const nms = await t.nms.array();
const hands = []; const hands = [];
for (const index of nms) { for (const index of nms) {
@ -8782,7 +8799,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands"); __publicField(this, "detectedHands");
this.handDetector = handDetector; this.handDetector = handDetector;
this.handPoseModel = handPoseModel2; this.handPoseModel = handPoseModel2;
this.inputSize = this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
this.storedBoxes = []; this.storedBoxes = [];
this.skipped = 0; this.skipped = 0;
this.detectedHands = 0; this.detectedHands = 0;
@ -8898,6 +8915,8 @@ var HandPipeline = class {
} }
this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length; this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands; return hands;
} }
}; };
@ -8959,6 +8978,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope; return slope;
} }
function getSlopes(point1, point2) { function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) if (point1.length === 2)
return slopeXY; return slopeXY;
@ -9257,6 +9278,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts // src/fingerpose/fingerpose.ts
var minConfidence = 0.7; var minConfidence = 0.7;
function analyze(keypoints3) { function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3); const estimatorRes = estimate(keypoints3);
const landmarks = {}; const landmarks = {};
for (const fingerIdx of Finger.all) { for (const fingerIdx of Finger.all) {
@ -9268,8 +9291,10 @@ function analyze(keypoints3) {
return landmarks; return landmarks;
} }
function match2(keypoints3) { function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = []; const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) { for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions); const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence) if (confidence >= minConfidence)
@ -10232,7 +10257,7 @@ async function load13(instance) {
instance.models.segmentation = await load12(instance.config); instance.models.segmentation = await load12(instance.config);
} }
} }
async function validate(instance) { async function validate2(instance) {
const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"];
for (const defined of Object.keys(instance.models)) { for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) { if (instance.models[defined]) {
@ -10561,7 +10586,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const fingers = []; const fingers = [];
for (const [finger, pos] of Object.entries(res[i]["annotations"])) { for (const [finger, pos] of Object.entries(res[i]["annotations"])) {
if (finger !== "palmBase" && Array.isArray(pos)) if (finger !== "palmBase" && Array.isArray(pos) && pos[0])
fingers.push({ name: finger.toLowerCase(), position: pos[0] }); fingers.push({ name: finger.toLowerCase(), position: pos[0] });
} }
if (fingers && fingers.length > 0) { if (fingers && fingers.length > 0) {
@ -12276,6 +12301,8 @@ var Human = class {
} }
return null; return null;
}); });
__publicField(this, "reset", () => this.config = JSON.parse(JSON.stringify(config)));
__publicField(this, "validate", (userConfig) => validate(config, userConfig || this.config));
__publicField(this, "image", (input) => process2(input, this.config)); __publicField(this, "image", (input) => process2(input, this.config));
__publicField(this, "emit", (event) => { __publicField(this, "emit", (event) => {
var _a; var _a;
@ -12288,7 +12315,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow"; config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = version; this.version = version;
Object.defineProperty(this, "version", { value: version }); Object.defineProperty(this, "version", { value: version });
this.config = mergeDeep(config, userConfig || {}); this.config = JSON.parse(JSON.stringify(config));
Object.seal(this.config);
if (userConfig)
this.config = mergeDeep(this.config, userConfig);
validate(config, this.config);
this.tf = tf24; this.tf = tf24;
this.state = "idle"; this.state = "idle";
__privateSet(this, _numTensors, 0); __privateSet(this, _numTensors, 0);
@ -12372,7 +12403,7 @@ var Human = class {
env.initial = false; env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length; const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) { if (loaded !== count2) {
await validate(this); await validate2(this);
this.emit("load"); this.emit("load");
} }
const current = Math.trunc(now() - timeStamp); const current = Math.trunc(now() - timeStamp);

47
dist/human.node.js vendored
View File

@ -114,6 +114,23 @@ var now = () => {
return performance.now(); return performance.now();
return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString());
}; };
function validate(defaults, config3, parent = "config", msgs = []) {
for (const key of Object.keys(config3)) {
if (typeof config3[key] === "object") {
validate(defaults[key], config3[key], key, msgs);
} else {
const defined = typeof defaults[key] !== "undefined";
if (!defined)
msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` });
const same = typeof defaults[key] === typeof config3[key];
if (defined && !same)
msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] });
}
}
if (config3.debug && parent === "config" && msgs.length > 0)
log("invalid configuration", msgs);
return msgs;
}
function mergeDeep(...objects) { function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === "object"; const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => { return objects.reduce((prev, obj) => {
@ -4584,7 +4601,7 @@ function process2(input, config3) {
let pixels; let pixels;
if (outCanvas.data) { if (outCanvas.data) {
const shape = [outCanvas.height, outCanvas.width, 3]; const shape = [outCanvas.height, outCanvas.width, 3];
pixels = tf3.tensor3d(outCanvas.data, shape, "int32"); pixels = tf3.tensor3d(outCanvas.data, shape, "float32");
} else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) { } else if (typeof ImageData !== "undefined" && outCanvas instanceof ImageData) {
pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null; pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") { } else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8665,7 +8682,7 @@ var HandDetector = class {
const scores = await t.scores.data(); const scores = await t.scores.data();
t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]); t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]);
t.norm = this.normalizeBoxes(t.boxes); t.norm = this.normalizeBoxes(t.boxes);
t.nms = await tf11.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); t.nms = await tf11.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence);
const nms = await t.nms.array(); const nms = await t.nms.array();
const hands = []; const hands = [];
for (const index of nms) { for (const index of nms) {
@ -8781,7 +8798,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands"); __publicField(this, "detectedHands");
this.handDetector = handDetector; this.handDetector = handDetector;
this.handPoseModel = handPoseModel2; this.handPoseModel = handPoseModel2;
this.inputSize = this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
this.storedBoxes = []; this.storedBoxes = [];
this.skipped = 0; this.skipped = 0;
this.detectedHands = 0; this.detectedHands = 0;
@ -8897,6 +8914,8 @@ var HandPipeline = class {
} }
this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length; this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands; return hands;
} }
}; };
@ -8958,6 +8977,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope; return slope;
} }
function getSlopes(point1, point2) { function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) if (point1.length === 2)
return slopeXY; return slopeXY;
@ -9256,6 +9277,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts // src/fingerpose/fingerpose.ts
var minConfidence = 0.7; var minConfidence = 0.7;
function analyze(keypoints3) { function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3); const estimatorRes = estimate(keypoints3);
const landmarks = {}; const landmarks = {};
for (const fingerIdx of Finger.all) { for (const fingerIdx of Finger.all) {
@ -9267,8 +9290,10 @@ function analyze(keypoints3) {
return landmarks; return landmarks;
} }
function match2(keypoints3) { function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = []; const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) { for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions); const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence) if (confidence >= minConfidence)
@ -10231,7 +10256,7 @@ async function load13(instance) {
instance.models.segmentation = await load12(instance.config); instance.models.segmentation = await load12(instance.config);
} }
} }
async function validate(instance) { async function validate2(instance) {
const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"];
for (const defined of Object.keys(instance.models)) { for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) { if (instance.models[defined]) {
@ -10560,7 +10585,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const fingers = []; const fingers = [];
for (const [finger, pos] of Object.entries(res[i]["annotations"])) { for (const [finger, pos] of Object.entries(res[i]["annotations"])) {
if (finger !== "palmBase" && Array.isArray(pos)) if (finger !== "palmBase" && Array.isArray(pos) && pos[0])
fingers.push({ name: finger.toLowerCase(), position: pos[0] }); fingers.push({ name: finger.toLowerCase(), position: pos[0] });
} }
if (fingers && fingers.length > 0) { if (fingers && fingers.length > 0) {
@ -12275,6 +12300,8 @@ var Human = class {
} }
return null; return null;
}); });
__publicField(this, "reset", () => this.config = JSON.parse(JSON.stringify(config)));
__publicField(this, "validate", (userConfig) => validate(config, userConfig || this.config));
__publicField(this, "image", (input) => process2(input, this.config)); __publicField(this, "image", (input) => process2(input, this.config));
__publicField(this, "emit", (event) => { __publicField(this, "emit", (event) => {
var _a; var _a;
@ -12287,7 +12314,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow"; config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = version; this.version = version;
Object.defineProperty(this, "version", { value: version }); Object.defineProperty(this, "version", { value: version });
this.config = mergeDeep(config, userConfig || {}); this.config = JSON.parse(JSON.stringify(config));
Object.seal(this.config);
if (userConfig)
this.config = mergeDeep(this.config, userConfig);
validate(config, this.config);
this.tf = tf24; this.tf = tf24;
this.state = "idle"; this.state = "idle";
__privateSet(this, _numTensors, 0); __privateSet(this, _numTensors, 0);
@ -12371,7 +12402,7 @@ var Human = class {
env.initial = false; env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length; const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) { if (loaded !== count2) {
await validate(this); await validate2(this);
this.emit("load"); this.emit("load");
} }
const current = Math.trunc(now() - timeStamp); const current = Math.trunc(now() - timeStamp);

View File

@ -66,11 +66,11 @@
"@tensorflow/tfjs-layers": "^3.9.0", "@tensorflow/tfjs-layers": "^3.9.0",
"@tensorflow/tfjs-node": "^3.9.0", "@tensorflow/tfjs-node": "^3.9.0",
"@tensorflow/tfjs-node-gpu": "^3.9.0", "@tensorflow/tfjs-node-gpu": "^3.9.0",
"@types/node": "^16.9.2", "@types/node": "^16.9.3",
"@typescript-eslint/eslint-plugin": "^4.31.1", "@typescript-eslint/eslint-plugin": "^4.31.1",
"@typescript-eslint/parser": "^4.31.1", "@typescript-eslint/parser": "^4.31.1",
"@vladmandic/build": "^0.5.1", "@vladmandic/build": "^0.5.2",
"@vladmandic/pilogger": "^0.3.2", "@vladmandic/pilogger": "^0.3.3",
"canvas": "^2.8.0", "canvas": "^2.8.0",
"dayjs": "^1.10.7", "dayjs": "^1.10.7",
"esbuild": "^0.12.28", "esbuild": "^0.12.28",

View File

@ -21,6 +21,7 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
// point1, point2 are 2d or 3d point arrays (xy[z]) // point1, point2 are 2d or 3d point arrays (xy[z])
// returns either a single scalar (2d) or array of two slopes (3d) // returns either a single scalar (2d) or array of two slopes (3d)
function getSlopes(point1, point2) { function getSlopes(point1, point2) {
if (!point1 || !point2) return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) return slopeXY; if (point1.length === 2) return slopeXY;
const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]); const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);

View File

@ -7,6 +7,7 @@ import Gestures from './gestures';
const minConfidence = 0.7; const minConfidence = 0.7;
export function analyze(keypoints) { // get estimations of curl / direction for each finger export function analyze(keypoints) { // get estimations of curl / direction for each finger
if (!keypoints || keypoints.length === 0) return null;
const estimatorRes = estimator.estimate(keypoints); const estimatorRes = estimator.estimate(keypoints);
const landmarks = {}; const landmarks = {};
for (const fingerIdx of Finger.all) { for (const fingerIdx of Finger.all) {
@ -20,8 +21,9 @@ export function analyze(keypoints) { // get estimations of curl / direction for
} }
export function match(keypoints) { // compare gesture description to each known gesture export function match(keypoints) { // compare gesture description to each known gesture
const estimatorRes = estimator.estimate(keypoints);
const poses: Array<{ name: string, confidence: number }> = []; const poses: Array<{ name: string, confidence: number }> = [];
if (!keypoints || keypoints.length === 0) return poses;
const estimatorRes = estimator.estimate(keypoints);
for (const gesture of Gestures) { for (const gesture of Gestures) {
const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions); const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence }); if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });

View File

@ -124,7 +124,7 @@ export const hand = (res): GestureResult[] => {
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const fingers: Array<{ name: string, position: number }> = []; const fingers: Array<{ name: string, position: number }> = [];
for (const [finger, pos] of Object.entries(res[i]['annotations'])) { for (const [finger, pos] of Object.entries(res[i]['annotations'])) {
if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger if (finger !== 'palmBase' && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger
} }
if (fingers && fingers.length > 0) { if (fingers && fingers.length > 0) {
const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a)); const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));

View File

@ -47,7 +47,8 @@ export class HandDetector {
const scores = await t.scores.data(); const scores = await t.scores.data();
t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]); t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);
t.norm = this.normalizeBoxes(t.boxes); t.norm = this.normalizeBoxes(t.boxes);
t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence); // box detection is flaky so we look for 3x boxes than we need results
t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);
const nms = await t.nms.array() as Array<number>; const nms = await t.nms.array() as Array<number>;
const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = []; const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];
for (const index of nms) { for (const index of nms) {

View File

@ -22,7 +22,7 @@ export class HandPipeline {
constructor(handDetector, handPoseModel) { constructor(handDetector, handPoseModel) {
this.handDetector = handDetector; this.handDetector = handDetector;
this.handPoseModel = handPoseModel; this.handPoseModel = handPoseModel;
this.inputSize = this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
this.storedBoxes = []; this.storedBoxes = [];
this.skipped = 0; this.skipped = 0;
this.detectedHands = 0; this.detectedHands = 0;
@ -152,6 +152,7 @@ export class HandPipeline {
} }
this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length; this.detectedHands = hands.length;
if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;
return hands; return hands;
} }
} }

View File

@ -25,6 +25,23 @@ export const now = () => {
return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString()); return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());
}; };
// helper function: checks current config validity
export function validate(defaults, config, parent = 'config', msgs: Array<{ reason: string, where: string, expected?: string }> = []) {
for (const key of Object.keys(config)) {
if (typeof config[key] === 'object') {
validate(defaults[key], config[key], key, msgs);
} else {
const defined = (typeof defaults[key] !== 'undefined');
if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });
const same = typeof defaults[key] === typeof config[key];
if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });
}
// ok = ok && defined && same;
}
if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);
return msgs;
}
// 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
export function mergeDeep(...objects) { export function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === 'object'; const isObject = (obj) => obj && typeof obj === 'object';

View File

@ -2,7 +2,7 @@
* Human main module * Human main module
*/ */
import { log, now, mergeDeep } from './helpers'; import { log, now, mergeDeep, validate } from './helpers';
import { Config, defaults } from './config'; import { Config, defaults } from './config';
import type { Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult } from './result'; import type { Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult } from './result';
import * as tf from '../dist/tfjs.esm.js'; import * as tf from '../dist/tfjs.esm.js';
@ -173,7 +173,10 @@ export class Human {
defaults.backend = this.env.browser ? 'humangl' : 'tensorflow'; defaults.backend = this.env.browser ? 'humangl' : 'tensorflow';
this.version = app.version; // expose version property on instance of class this.version = app.version; // expose version property on instance of class
Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself
this.config = mergeDeep(defaults, userConfig || {}); this.config = JSON.parse(JSON.stringify(defaults));
Object.seal(this.config);
if (userConfig) this.config = mergeDeep(this.config, userConfig);
validate(defaults, this.config);
this.tf = tf; this.tf = tf;
this.state = 'idle'; this.state = 'idle';
this.#numTensors = 0; this.#numTensors = 0;
@ -248,6 +251,12 @@ export class Human {
return null; return null;
} }
/** Reset configuration to default values */
reset = () => this.config = JSON.parse(JSON.stringify(defaults));
/** Validate current configuration schema */
validate = (userConfig?: Partial<Config>) => validate(defaults, userConfig || this.config);
/** Process input as return canvas and tensor /** Process input as return canvas and tensor
* *
* @param input: {@link Input} * @param input: {@link Input}

View File

@ -166,7 +166,7 @@ export function process(input: Input, config: Config): { tensor: Tensor | null,
let pixels; let pixels;
if (outCanvas.data) { // if we have data, just convert to tensor if (outCanvas.data) { // if we have data, just convert to tensor
const shape = [outCanvas.height, outCanvas.width, 3]; const shape = [outCanvas.height, outCanvas.width, 3];
pixels = tf.tensor3d(outCanvas.data, shape, 'int32'); pixels = tf.tensor3d(outCanvas.data, shape, 'float32');
} else if ((typeof ImageData !== 'undefined') && (outCanvas instanceof ImageData)) { // if input is imagedata, just use it } else if ((typeof ImageData !== 'undefined') && (outCanvas instanceof ImageData)) { // if input is imagedata, just use it
pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null; pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null;
} else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata

View File

@ -1,24 +1,24 @@
2021-09-18 19:04:52 INFO:  @vladmandic/human version 2.2.2 2021-09-19 13:55:00 INFO:  @vladmandic/human version 2.2.2
2021-09-18 19:04:52 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0 2021-09-19 13:55:00 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0
2021-09-18 19:04:52 INFO:  Application: {"name":"@vladmandic/human","version":"2.2.2"} 2021-09-19 13:55:00 INFO:  Application: {"name":"@vladmandic/human","version":"2.2.2"}
2021-09-18 19:04:52 INFO:  Environment: {"profile":"production","config":"build.json","tsconfig":true,"eslintrc":true,"git":true} 2021-09-19 13:55:00 INFO:  Environment: {"profile":"production","config":"build.json","tsconfig":true,"eslintrc":true,"git":true}
2021-09-18 19:04:52 INFO:  Toolchain: {"build":"0.5.1","esbuild":"0.12.28","typescript":"4.4.3","typedoc":"0.22.4","eslint":"7.32.0"} 2021-09-19 13:55:00 INFO:  Toolchain: {"build":"0.5.2","esbuild":"0.12.28","typescript":"4.4.3","typedoc":"0.22.4","eslint":"7.32.0"}
2021-09-18 19:04:52 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} 2021-09-19 13:55:00 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
2021-09-18 19:04:52 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} 2021-09-19 13:55:00 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]}
2021-09-18 19:04:52 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1416} 2021-09-19 13:55:00 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1416}
2021-09-18 19:04:52 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":50,"inputBytes":480126,"outputBytes":407414} 2021-09-19 13:55:01 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":50,"inputBytes":481770,"outputBytes":408805}
2021-09-18 19:04:52 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1424} 2021-09-19 13:55:01 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1424}
2021-09-18 19:04:52 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":50,"inputBytes":480134,"outputBytes":407418} 2021-09-19 13:55:01 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":50,"inputBytes":481778,"outputBytes":408809}
2021-09-18 19:04:52 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1491} 2021-09-19 13:55:01 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1491}
2021-09-18 19:04:52 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":50,"inputBytes":480201,"outputBytes":407490} 2021-09-19 13:55:01 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":50,"inputBytes":481845,"outputBytes":408881}
2021-09-18 19:04:52 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":1631} 2021-09-19 13:55:01 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":1631}
2021-09-18 19:04:52 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":3088,"outputBytes":793} 2021-09-19 13:55:01 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":3088,"outputBytes":793}
2021-09-18 19:04:52 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":50,"inputBytes":479503,"outputBytes":408707} 2021-09-19 13:55:01 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":50,"inputBytes":481147,"outputBytes":410098}
2021-09-18 19:04:53 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":8,"inputBytes":3088,"outputBytes":2376809} 2021-09-19 13:55:01 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":8,"inputBytes":3088,"outputBytes":2376809}
2021-09-18 19:04:53 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":50,"inputBytes":2855519,"outputBytes":1408621} 2021-09-19 13:55:01 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":50,"inputBytes":2857163,"outputBytes":1409412}
2021-09-18 19:04:54 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":50,"inputBytes":2855519,"outputBytes":2612626} 2021-09-19 13:55:02 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":50,"inputBytes":2857163,"outputBytes":2614017}
2021-09-18 19:05:10 STATE: Typings: {"input":"src/human.ts","output":"types","files":94} 2021-09-19 13:55:18 STATE: Typings: {"input":"src/human.ts","output":"types","files":94}
2021-09-18 19:05:16 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":29,"generated":true} 2021-09-19 13:55:23 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":29,"generated":true}
2021-09-18 19:05:41 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":83,"errors":0,"warnings":0} 2021-09-19 13:55:51 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":83,"errors":0,"warnings":0}
2021-09-18 19:05:41 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} 2021-09-19 13:55:52 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
2021-09-18 19:05:41 INFO:  Done... 2021-09-19 13:55:52 INFO:  Done...

View File

@ -40,14 +40,16 @@ async function getImage(human, input) {
ctx.drawImage(img, 0, 0, img.width, img.height); ctx.drawImage(img, 0, 0, img.width, img.height);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const res = human.tf.tidy(() => { const res = human.tf.tidy(() => {
const tensor = human.tf.tensor(Array.from(imageData.data), [canvas.height, canvas.width, 4], 'int32'); // create rgba image tensor from flat array const tensor = human.tf.tensor(Array.from(imageData.data), [canvas.height, canvas.width, 4], 'float32'); // create rgba image tensor from flat array
const channels = human.tf.split(tensor, 4, 2); // split rgba to channels const channels = human.tf.split(tensor, 4, 2); // split rgba to channels
const rgb = human.tf.stack([channels[0], channels[1], channels[2]], 2); // stack channels back to rgb const rgb = human.tf.stack([channels[0], channels[1], channels[2]], 2); // stack channels back to rgb
const reshape = human.tf.reshape(rgb, [1, canvas.height, canvas.width, 3]); // move extra dim from the end of tensor and use it as batch number instead const reshape = human.tf.reshape(rgb, [1, canvas.height, canvas.width, 3]); // move extra dim from the end of tensor and use it as batch number instead
return reshape; return reshape;
}); });
if (res && res.shape[0] === 1 && res.shape[3] === 3) log('state', 'passed: load image:', input, res.shape); const sum = human.tf.sum(res);
if (res && res.shape[0] === 1 && res.shape[3] === 3) log('state', 'passed: load image:', input, res.shape, { checksum: sum.dataSync()[0] });
else log('error', 'failed: load image:', input, res); else log('error', 'failed: load image:', input, res);
human.tf.dispose(sum);
return res; return res;
} }
@ -98,10 +100,10 @@ async function testWarmup(human, title) {
// const count = human.tf.engine().state.numTensors; // const count = human.tf.engine().state.numTensors;
// if (count - tensors > 0) log('warn', 'failed: memory', config.warmup, title, 'tensors:', count - tensors); // if (count - tensors > 0) log('warn', 'failed: memory', config.warmup, title, 'tensors:', count - tensors);
printResults(warmup); printResults(warmup);
return true; } else {
}
log('error', 'failed: warmup:', config.warmup, title); log('error', 'failed: warmup:', config.warmup, title);
return false; }
return warmup;
} }
async function testDetect(human, input, title) { async function testDetect(human, input, title) {
@ -124,10 +126,10 @@ async function testDetect(human, input, title) {
// const count = human.tf.engine().state.numTensors; // const count = human.tf.engine().state.numTensors;
// if (count - tensors > 0) log('warn', 'failed: memory', config.warmup, title, 'tensors:', count - tensors); // if (count - tensors > 0) log('warn', 'failed: memory', config.warmup, title, 'tensors:', count - tensors);
printResults(detect); printResults(detect);
return true; } else {
}
log('error', 'failed: detect', input || 'random', title); log('error', 'failed: detect', input || 'random', title);
return false; }
return detect;
} }
const evt = { image: 0, detect: 0, warmup: 0 }; const evt = { image: 0, detect: 0, warmup: 0 };
async function events(event) { async function events(event) {
@ -144,33 +146,94 @@ async function test(Human, inputConfig) {
return; return;
} }
const t0 = process.hrtime.bigint(); const t0 = process.hrtime.bigint();
let human; let res;
// test event emitter // test event emitter
human = new Human(config); const human = new Human(config);
human.events.addEventListener('warmup', () => events('warmup')); human.events.addEventListener('warmup', () => events('warmup'));
human.events.addEventListener('image', () => events('image')); human.events.addEventListener('image', () => events('image'));
human.events.addEventListener('detect', () => events('detect')); human.events.addEventListener('detect', () => events('detect'));
// test configuration validation
let invalid = human.validate();
if (invalid.length === 0) log('state', 'passed: configuration default validation', invalid);
else log('error', 'failed: configuration default validation', invalid);
config.invalid = true;
invalid = human.validate(config);
if (invalid.length === 1) log('state', 'passed: configuration invalid validation', invalid);
else log('error', 'failed: configuration default validation', invalid);
delete config.invalid;
// test warmup sequences // test warmup sequences
await testInstance(human); await testInstance(human);
config.warmup = 'none'; config.warmup = 'none';
await testWarmup(human, 'default'); res = await testWarmup(human, 'default');
if (res.error !== 'null') log('error', 'failed: warmup none result mismatch');
else log('state', 'passed: warmup none result match');
config.warmup = 'face'; config.warmup = 'face';
await testWarmup(human, 'default'); res = await testWarmup(human, 'default');
if (!res || res?.face?.length !== 1 || res?.body?.length !== 1 || res?.hand?.length !== 0 || res?.gesture?.length !== 3) log('error', 'failed: warmup face result mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length);
else log('state', 'passed: warmup face result match');
config.warmup = 'body'; config.warmup = 'body';
await testWarmup(human, 'default'); res = await testWarmup(human, 'default');
if (!res || res?.face?.length !== 1 || res?.body?.length !== 1 || res?.hand?.length !== 0 || res?.gesture?.length !== 3) log('error', 'failed: warmup body result mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length);
else log('state', 'passed: warmup body result match');
// test default config // test default config
log('info', 'test default'); log('info', 'test default');
human = new Human(config); human.reset();
await testDetect(human, 'samples/ai-body.jpg', 'default'); config.cacheSensitivity = 0;
res = await testDetect(human, 'samples/ai-body.jpg', 'default');
if (!res || res?.face?.length !== 1 || res?.face[0].gender !== 'female') log('error', 'failed: default result face mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length);
else log('state', 'passed: default result face match');
// test default config
log('info', 'test object');
human.reset();
config.object = { enabled: true };
res = await testDetect(human, 'samples/ai-body.jpg', 'default');
if (!res || res?.object?.length !== 1 || res?.object[0]?.label !== 'person') log('error', 'failed: object result mismatch', res?.object?.length);
else log('state', 'passed: object result match');
// test sensitive config
log('info', 'test sensitive');
human.reset();
config.cacheSensitivity = 0;
config.face = { detector: { minConfidence: 0.0001, maxDetected: 1 } };
config.body = { minConfidence: 0.0001, maxDetected: 1 };
config.hand = { minConfidence: 0.0001, maxDetected: 3 };
res = await testDetect(human, 'samples/ai-body.jpg', 'default');
if (!res || res?.face?.length !== 1 || res?.body?.length !== 1 || res?.hand?.length !== 3 || res?.gesture?.length !== 9) log('error', 'failed: sensitive result mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length);
else log('state', 'passed: sensitive result match');
// test sensitive details face
const face = res && res.face ? res.face[0] : null;
if (!face || face?.box?.length !== 4 || face?.mesh?.length !== 478 || face?.emotion?.length !== 4 || face?.embedding?.length !== 1024 || face?.rotation?.matrix?.length !== 9) {
log('error', 'failed: sensitive face result mismatch', res?.face?.length, face?.box?.length, face?.mesh?.length, face?.emotion?.length, face?.embedding?.length, face?.rotation?.matrix?.length);
} else log('state', 'passed: sensitive face result match');
// test sensitive details body
const body = res && res.body ? res.body[0] : null;
if (!body || body?.box?.length !== 4 || body?.keypoints?.length !== 17) log('error', 'failed: sensitive body result mismatch', body);
else log('state', 'passed: sensitive body result match');
// test sensitive details hand
const hand = res && res.hand ? res.hand[0] : null;
if (!hand || hand?.box?.length !== 4 || hand?.keypoints?.length !== 21) log('error', 'failed: sensitive hand result mismatch', hand?.keypoints?.length);
else log('state', 'passed: sensitive hand result match');
// test detectors only // test detectors only
log('info', 'test detectors'); log('info', 'test detectors');
config.face = { mesh: { enabled: false }, iris: { enabled: false }, hand: { landmarks: false } }; human.reset();
human = new Human(config); config.face = { mesh: { enabled: false }, iris: { enabled: false }, description: { enabled: false }, emotion: { enabled: false } };
await testDetect(human, 'samples/ai-body.jpg', 'default'); config.hand = { landmarks: false };
res = await testDetect(human, 'samples/ai-body.jpg', 'default');
if (!res || res?.face?.length !== 1 || res?.face[0]?.gender || res?.face[0]?.age || res?.face[0]?.embedding) log('error', 'failed: detectors result face mismatch', res?.face);
else log('state', 'passed: detector result face match');
if (!res || res?.hand?.length !== 1 || res?.hand[0]?.landmarks) log('error', 'failed: detectors result hand mismatch', res?.hand?.length);
else log('state', 'passed: detector result hand match');
// test posenet and movenet // test posenet and movenet
log('info', 'test body variants'); log('info', 'test body variants');

View File

@ -8,7 +8,7 @@ const config = {
async: true, async: true,
face: { face: {
enabled: true, enabled: true,
detector: { enabled: true, rotation: true }, detector: { rotation: true },
mesh: { enabled: true }, mesh: { enabled: true },
iris: { enabled: true }, iris: { enabled: true },
description: { enabled: true }, description: { enabled: true },

View File

@ -19,7 +19,7 @@ const config = {
async: false, async: false,
face: { face: {
enabled: true, enabled: true,
detector: { enabled: true, rotation: false }, detector: { rotation: false },
mesh: { enabled: true }, mesh: { enabled: true },
iris: { enabled: true }, iris: { enabled: true },
description: { enabled: true }, description: { enabled: true },

View File

@ -5,19 +5,19 @@ const config = {
modelBasePath: 'file://models/', modelBasePath: 'file://models/',
backend: 'tensorflow', backend: 'tensorflow',
debug: false, debug: false,
async: false, async: true,
face: { face: {
enabled: true, enabled: true,
detector: { enabled: true, rotation: true }, detector: { rotation: true },
mesh: { enabled: true }, mesh: { enabled: true },
iris: { enabled: true }, iris: { enabled: true },
description: { enabled: true }, description: { enabled: true },
emotion: { enabled: true }, emotion: { enabled: true },
}, },
hand: { enabled: false, rotation: true }, hand: { enabled: true },
body: { enabled: false }, body: { enabled: true },
object: { enabled: false }, object: { enabled: true },
segmentation: { enabled: false }, segmentation: { enabled: true },
filter: { enabled: false }, filter: { enabled: false },
}; };

View File

@ -23,15 +23,18 @@ const ignoreMessages = [
'ExperimentalWarning', 'ExperimentalWarning',
]; ];
const status = { const status = {};
passed: 0,
failed: 0,
};
function logMessage(test, data) { function logMessage(test, data) {
if (!status[test]) status[test] = { passed: 0, failed: 0 };
if (log[data[0]]) {
log[data[0]](test, ...data[1]); log[data[0]](test, ...data[1]);
if (data[1][0].startsWith('passed')) status.passed++; } else {
if (data[1][0].startsWith('failed')) status.failed++; log.error('unknown facility', test, ...data[1]);
status[test].failed++;
}
if (data[1][0].startsWith('passed')) status[test].passed++;
if (data[1][0].startsWith('failed')) status[test].failed++;
} }
function logStdIO(ok, test, buffer) { function logStdIO(ok, test, buffer) {

View File

@ -1,297 +1,426 @@
2021-09-18 19:06:19 INFO:  @vladmandic/human version 2.2.2 2021-09-19 14:04:35 INFO:  @vladmandic/human version 2.2.2
2021-09-18 19:06:19 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0 2021-09-19 14:04:35 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0
2021-09-18 19:06:19 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] 2021-09-19 14:04:35 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"]
2021-09-18 19:06:19 INFO:  2021-09-19 14:04:35 INFO: 
2021-09-18 19:06:19 INFO:  test-node.js start 2021-09-19 14:04:35 INFO:  test-node.js start
2021-09-18 19:06:20 STATE: test-node.js passed: create human 2021-09-19 14:04:36 STATE: test-node.js passed: configuration default validation []
2021-09-18 19:06:20 INFO:  test-node.js human version: 2.2.2 2021-09-19 14:04:36 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2021-09-18 19:06:20 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.5.0 2021-09-19 14:04:36 STATE: test-node.js passed: create human
2021-09-18 19:06:20 INFO:  test-node.js tfjs version: 3.9.0 2021-09-19 14:04:36 INFO:  test-node.js human version: 2.2.2
2021-09-18 19:06:20 STATE: test-node.js passed: set backend: tensorflow 2021-09-19 14:04:36 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-18 19:06:20 STATE: test-node.js tensors 573 2021-09-19 14:04:36 INFO:  test-node.js tfjs version: 3.9.0
2021-09-18 19:06:20 STATE: test-node.js passed: load models 2021-09-19 14:04:36 STATE: test-node.js passed: set backend: tensorflow
2021-09-18 19:06:20 STATE: test-node.js result: defined models: 14 loaded models: 3 2021-09-19 14:04:36 STATE: test-node.js tensors 1456
2021-09-18 19:06:20 STATE: test-node.js passed: warmup: none default 2021-09-19 14:04:36 STATE: test-node.js passed: load models
2021-09-18 19:06:20 STATE: test-node.js event: image 2021-09-19 14:04:36 STATE: test-node.js result: defined models: 14 loaded models: 7
2021-09-18 19:06:21 STATE: test-node.js event: detect 2021-09-19 14:04:36 STATE: test-node.js passed: warmup: none default
2021-09-18 19:06:21 STATE: test-node.js event: warmup 2021-09-19 14:04:36 STATE: test-node.js passed: warmup none result match
2021-09-18 19:06:21 STATE: test-node.js passed: warmup: face default 2021-09-19 14:04:36 STATE: test-node.js event: image
2021-09-18 19:06:21 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {} 2021-09-19 14:04:37 STATE: test-node.js event: detect
2021-09-18 19:06:21 DATA:  test-node.js result: performance: load: 121 total: 577 2021-09-19 14:04:37 STATE: test-node.js event: warmup
2021-09-18 19:06:21 STATE: test-node.js event: image 2021-09-19 14:04:37 STATE: test-node.js passed: warmup: face default
2021-09-18 19:06:21 STATE: test-node.js event: detect 2021-09-19 14:04:37 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
2021-09-18 19:06:21 STATE: test-node.js event: warmup 2021-09-19 14:04:37 DATA:  test-node.js result: performance: load: 278 total: 994
2021-09-18 19:06:21 STATE: test-node.js passed: warmup: body default 2021-09-19 14:04:37 STATE: test-node.js passed: warmup face result match
2021-09-18 19:06:21 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} 2021-09-19 14:04:37 STATE: test-node.js event: image
2021-09-18 19:06:21 DATA:  test-node.js result: performance: load: 121 total: 320 2021-09-19 14:04:38 STATE: test-node.js event: detect
2021-09-18 19:06:21 INFO:  test-node.js test default 2021-09-19 14:04:38 STATE: test-node.js event: warmup
2021-09-18 19:06:22 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:38 STATE: test-node.js passed: warmup: body default
2021-09-18 19:06:22 STATE: test-node.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:04:38 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:22 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 2 object: 0 person: 1 {"score":1,"age":29.5,"gender":"female"} {} {} 2021-09-19 14:04:38 DATA:  test-node.js result: performance: load: 278 total: 1097
2021-09-18 19:06:22 DATA:  test-node.js result: performance: load: 0 total: 264 2021-09-19 14:04:38 STATE: test-node.js passed: warmup body result match
2021-09-18 19:06:22 INFO:  test-node.js test detectors 2021-09-19 14:04:38 INFO:  test-node.js test default
2021-09-18 19:06:23 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:39 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:23 STATE: test-node.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:04:39 STATE: test-node.js event: image
2021-09-18 19:06:23 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.93,"age":29.5,"gender":"female"} {} {} 2021-09-19 14:04:40 STATE: test-node.js event: detect
2021-09-18 19:06:23 DATA:  test-node.js result: performance: load: 1 total: 85 2021-09-19 14:04:40 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:23 INFO:  test-node.js test body variants 2021-09-19 14:04:40 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":28.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:24 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:40 DATA:  test-node.js result: performance: load: 278 total: 1050
2021-09-18 19:06:24 STATE: test-node.js passed: detect: samples/ai-body.jpg posenet 2021-09-19 14:04:40 STATE: test-node.js passed: default result face match
2021-09-18 19:06:24 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.93,"age":29.5,"gender":"female"} {} {} 2021-09-19 14:04:40 INFO:  test-node.js test object
2021-09-18 19:06:24 DATA:  test-node.js result: performance: load: 1 total: 102 2021-09-19 14:04:41 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:25 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:41 STATE: test-node.js event: image
2021-09-18 19:06:25 STATE: test-node.js passed: detect: samples/ai-body.jpg movenet 2021-09-19 14:04:42 STATE: test-node.js event: detect
2021-09-18 19:06:25 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.93,"age":29.5,"gender":"female"} {} {} 2021-09-19 14:04:42 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:25 DATA:  test-node.js result: performance: load: 1 total: 90 2021-09-19 14:04:42 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":28.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:25 STATE: test-node.js passed: detect: random default 2021-09-19 14:04:42 DATA:  test-node.js result: performance: load: 278 total: 1064
2021-09-18 19:06:25 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} 2021-09-19 14:04:42 STATE: test-node.js passed: object result match
2021-09-18 19:06:25 DATA:  test-node.js result: performance: load: 1 total: 77 2021-09-19 14:04:42 INFO:  test-node.js test sensitive
2021-09-18 19:06:25 INFO:  test-node.js test: first instance 2021-09-19 14:04:43 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:25 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:04:43 STATE: test-node.js event: image
2021-09-18 19:06:26 STATE: test-node.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:04:45 STATE: test-node.js event: detect
2021-09-18 19:06:26 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.96,"age":29.5,"gender":"female"} {} {"score":0.69,"keypoints":10} 2021-09-19 14:04:45 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:26 DATA:  test-node.js result: performance: load: 44 total: 286 2021-09-19 14:04:45 DATA:  test-node.js result: face: 1 body: 1 hand: 3 gesture: 9 object: 1 person: 1 {"score":1,"age":28.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:26 INFO:  test-node.js test: second instance 2021-09-19 14:04:45 DATA:  test-node.js result: performance: load: 278 total: 1706
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:04:45 STATE: test-node.js passed: sensitive result match
2021-09-18 19:06:26 STATE: test-node.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:04:45 STATE: test-node.js passed: sensitive face result match
2021-09-18 19:06:26 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.96,"age":29.5,"gender":"female"} {} {"score":0.69,"keypoints":10} 2021-09-19 14:04:45 STATE: test-node.js passed: sensitive body result match
2021-09-18 19:06:26 DATA:  test-node.js result: performance: load: 0 total: 73 2021-09-19 14:04:45 STATE: test-node.js passed: sensitive hand result match
2021-09-18 19:06:26 INFO:  test-node.js test: concurrent 2021-09-19 14:04:45 INFO:  test-node.js test detectors
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:04:45 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:04:45 STATE: test-node.js event: image
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:04:46 STATE: test-node.js event: detect
2021-09-18 19:06:27 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:46 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:28 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:46 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:29 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:04:46 DATA:  test-node.js result: performance: load: 278 total: 554
2021-09-18 19:06:29 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:04:46 STATE: test-node.js passed: detector result face match
2021-09-18 19:06:29 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:04:46 STATE: test-node.js passed: detector result hand match
2021-09-18 19:06:30 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:04:46 INFO:  test-node.js test body variants
2021-09-18 19:06:31 STATE: test-node.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:04:47 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:31 DATA:  test-node.js result: face: 1 body: 0 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.91,"age":23.6,"gender":"female"} {} {} 2021-09-19 14:04:47 STATE: test-node.js event: image
2021-09-18 19:06:31 DATA:  test-node.js result: performance: load: 1 total: 1598 2021-09-19 14:04:48 STATE: test-node.js event: detect
2021-09-18 19:06:32 STATE: test-node.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:04:48 STATE: test-node.js passed: detect: samples/ai-body.jpg posenet
2021-09-18 19:06:32 DATA:  test-node.js result: face: 2 body: 1 hand: 0 gesture: 0 object: 0 person: 2 {"score":0.91,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":4} 2021-09-19 14:04:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.91,"keypoints":17}
2021-09-18 19:06:32 DATA:  test-node.js result: performance: load: 44 total: 2782 2021-09-19 14:04:48 DATA:  test-node.js result: performance: load: 278 total: 728
2021-09-18 19:06:32 STATE: test-node.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:04:48 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:32 DATA:  test-node.js result: face: 3 body: 1 hand: 0 gesture: 0 object: 0 person: 3 {"score":0.91,"age":29.2,"gender":"male"} {} {"score":0.47,"keypoints":4} 2021-09-19 14:04:48 STATE: test-node.js event: image
2021-09-18 19:06:32 DATA:  test-node.js result: performance: load: 0 total: 2839 2021-09-19 14:04:49 STATE: test-node.js event: detect
2021-09-18 19:06:33 STATE: test-node.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:04:49 STATE: test-node.js passed: detect: samples/ai-body.jpg movenet
2021-09-18 19:06:33 DATA:  test-node.js result: face: 4 body: 0 hand: 0 gesture: 0 object: 0 person: 4 {"score":0.91,"age":29.2,"gender":"male"} {} {} 2021-09-19 14:04:49 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:33 DATA:  test-node.js result: performance: load: 1 total: 3302 2021-09-19 14:04:49 DATA:  test-node.js result: performance: load: 278 total: 648
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:04:49 STATE: test-node.js event: image
2021-09-18 19:06:34 DATA:  test-node.js result: face: 5 body: 1 hand: 0 gesture: 1 object: 0 person: 5 {"score":0.91,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:04:50 STATE: test-node.js event: detect
2021-09-18 19:06:34 DATA:  test-node.js result: performance: load: 44 total: 4027 2021-09-19 14:04:50 STATE: test-node.js passed: detect: random default
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:04:50 DATA:  test-node.js result: face: 0 body: 1 hand: 1 gesture: 1 object: 0 person: 0 {} {} {"score":0.08,"keypoints":17}
2021-09-18 19:06:34 DATA:  test-node.js result: face: 6 body: 1 hand: 0 gesture: 1 object: 0 person: 6 {"score":0.91,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:04:50 DATA:  test-node.js result: performance: load: 278 total: 564
2021-09-18 19:06:34 DATA:  test-node.js result: performance: load: 0 total: 4066 2021-09-19 14:04:50 INFO:  test-node.js test: first instance
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:04:50 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:06:34 DATA:  test-node.js result: face: 7 body: 0 hand: 0 gesture: 0 object: 0 person: 7 {"score":0.91,"age":29.2,"gender":"male"} {} {} 2021-09-19 14:04:51 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:06:34 DATA:  test-node.js result: performance: load: 1 total: 4331 2021-09-19 14:04:51 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:04:51 DATA:  test-node.js result: performance: load: 2 total: 684
2021-09-18 19:06:34 DATA:  test-node.js result: face: 8 body: 1 hand: 0 gesture: 1 object: 0 person: 8 {"score":0.91,"age":29.2,"gender":"male"} {} {"score":0.69,"keypoints":10} 2021-09-19 14:04:51 INFO:  test-node.js test: second instance
2021-09-18 19:06:34 DATA:  test-node.js result: performance: load: 44 total: 4601 2021-09-19 14:04:51 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:04:52 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:06:34 DATA:  test-node.js result: face: 9 body: 1 hand: 0 gesture: 1 object: 0 person: 9 {"score":0.91,"age":29.2,"gender":"male"} {} {"score":0.69,"keypoints":10} 2021-09-19 14:04:52 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:06:34 DATA:  test-node.js result: performance: load: 0 total: 4601 2021-09-19 14:04:52 DATA:  test-node.js result: performance: load: 4 total: 685
2021-09-18 19:06:34 STATE: test-node.js passeed: no memory leak 2021-09-19 14:04:52 INFO:  test-node.js test: concurrent
2021-09-18 19:06:34 STATE: test-node.js passeed: equal usage 2021-09-19 14:04:52 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2021-09-18 19:06:34 INFO:  test-node.js events: {"image":2,"detect":2,"warmup":2} 2021-09-19 14:04:52 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2021-09-18 19:06:34 INFO:  test-node.js test complete: 14111 ms 2021-09-19 14:04:52 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2021-09-18 19:06:34 INFO:  2021-09-19 14:04:53 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:34 INFO:  test-node-gpu.js start 2021-09-19 14:04:54 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:35 WARN:  test-node-gpu.js stderr: 2021-09-18 19:06:35.339859: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory 2021-09-19 14:04:54 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:35 WARN:  test-node-gpu.js stderr: 2021-09-18 19:06:35.517226: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory 2021-09-19 14:04:55 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:06:35 WARN:  test-node-gpu.js stderr: 2021-09-18 19:06:35.517278: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (wyse): /proc/driver/nvidia/version does not exist 2021-09-19 14:04:55 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: create human 2021-09-19 14:04:55 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:06:35 INFO:  test-node-gpu.js human version: 2.2.2 2021-09-19 14:04:55 STATE: test-node.js event: image
2021-09-18 19:06:35 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.5.0 2021-09-19 14:04:55 STATE: test-node.js event: image
2021-09-18 19:06:35 INFO:  test-node-gpu.js tfjs version: 3.9.0 2021-09-19 14:04:55 STATE: test-node.js event: image
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: set backend: tensorflow 2021-09-19 14:05:00 STATE: test-node.js event: detect
2021-09-18 19:06:35 STATE: test-node-gpu.js tensors 1456 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-face.jpg default
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: load models 2021-09-19 14:05:00 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10}
2021-09-18 19:06:35 STATE: test-node-gpu.js result: defined models: 14 loaded models: 7 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 278 total: 5047
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: warmup: none default 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-face.jpg default
2021-09-18 19:06:35 STATE: test-node-gpu.js event: image 2021-09-19 14:05:00 DATA:  test-node.js result: face: 2 body: 1 hand: 0 gesture: 1 object: 1 person: 2 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10}
2021-09-18 19:06:37 STATE: test-node-gpu.js event: detect 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5049
2021-09-18 19:06:37 STATE: test-node-gpu.js event: warmup 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-face.jpg default
2021-09-18 19:06:37 STATE: test-node-gpu.js passed: warmup: face default 2021-09-19 14:05:00 DATA:  test-node.js result: face: 3 body: 1 hand: 0 gesture: 1 object: 1 person: 3 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10}
2021-09-18 19:06:37 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5050
2021-09-18 19:06:37 DATA:  test-node-gpu.js result: performance: load: 289 total: 1125 2021-09-19 14:05:00 STATE: test-node.js event: detect
2021-09-18 19:06:37 STATE: test-node-gpu.js event: image 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:38 STATE: test-node-gpu.js event: detect 2021-09-19 14:05:00 DATA:  test-node.js result: face: 4 body: 1 hand: 1 gesture: 1 object: 1 person: 4 {"score":0.91} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10}
2021-09-18 19:06:38 STATE: test-node-gpu.js event: warmup 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 278 total: 5044
2021-09-18 19:06:38 STATE: test-node-gpu.js passed: warmup: body default 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:38 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2021-09-19 14:05:00 DATA:  test-node.js result: face: 5 body: 1 hand: 1 gesture: 1 object: 1 person: 5 {"score":0.91} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10}
2021-09-18 19:06:38 DATA:  test-node-gpu.js result: performance: load: 289 total: 1084 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5044
2021-09-18 19:06:38 INFO:  test-node-gpu.js test default 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:39 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:00 DATA:  test-node.js result: face: 6 body: 1 hand: 1 gesture: 1 object: 1 person: 6 {"score":0.91} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10}
2021-09-18 19:06:39 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5045
2021-09-18 19:06:39 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2021-09-19 14:05:00 STATE: test-node.js event: detect
2021-09-18 19:06:39 DATA:  test-node-gpu.js result: performance: load: 6 total: 591 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:06:39 INFO:  test-node-gpu.js test detectors 2021-09-19 14:05:00 DATA:  test-node.js result: face: 7 body: 1 hand: 0 gesture: 1 object: 1 person: 7 {"score":0.91} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:06:40 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 278 total: 5045
2021-09-18 19:06:41 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:06:41 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.93,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2021-09-19 14:05:00 DATA:  test-node.js result: face: 8 body: 1 hand: 0 gesture: 1 object: 1 person: 8 {"score":0.91} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:06:41 DATA:  test-node-gpu.js result: performance: load: 2 total: 592 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5046
2021-09-18 19:06:41 INFO:  test-node-gpu.js test body variants 2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:06:41 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:00 DATA:  test-node.js result: face: 9 body: 1 hand: 0 gesture: 1 object: 1 person: 9 {"score":0.91} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:06:42 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg posenet 2021-09-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5046
2021-09-18 19:06:42 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.93,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.96,"keypoints":16} 2021-09-19 14:05:00 STATE: test-node.js passeed: no memory leak
2021-09-18 19:06:42 DATA:  test-node-gpu.js result: performance: load: 35 total: 185 2021-09-19 14:05:00 STATE: test-node.js passeed: equal usage
2021-09-18 19:06:42 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:00 INFO:  test-node.js events: {"image":12,"detect":12,"warmup":2}
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg movenet 2021-09-19 14:05:00 INFO:  test-node.js test complete: 24579 ms
2021-09-18 19:06:43 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.93,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2021-09-19 14:05:00 INFO: 
2021-09-18 19:06:43 DATA:  test-node-gpu.js result: performance: load: 35 total: 75 2021-09-19 14:05:00 INFO:  test-node-gpu.js start
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: detect: random default 2021-09-19 14:05:01 WARN:  test-node-gpu.js stderr: 2021-09-19 14:05:01.311010: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
2021-09-18 19:06:43 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 1 person: 0 {} {"score":0.72,"class":"person"} {"score":0,"keypoints":0} 2021-09-19 14:05:01 WARN:  test-node-gpu.js stderr: 2021-09-19 14:05:01.358349: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
2021-09-18 19:06:43 DATA:  test-node-gpu.js result: performance: load: 35 total: 155 2021-09-19 14:05:01 WARN:  test-node-gpu.js stderr: 2021-09-19 14:05:01.358430: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (wyse): /proc/driver/nvidia/version does not exist
2021-09-18 19:06:43 INFO:  test-node-gpu.js test: first instance 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: configuration default validation []
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: create human
2021-09-18 19:06:43 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.96,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:01 INFO:  test-node-gpu.js human version: 2.2.2
2021-09-18 19:06:43 DATA:  test-node-gpu.js result: performance: load: 4 total: 340 2021-09-19 14:05:01 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-18 19:06:43 INFO:  test-node-gpu.js test: second instance 2021-09-19 14:05:01 INFO:  test-node-gpu.js tfjs version: 3.9.0
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: set backend: tensorflow
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:01 STATE: test-node-gpu.js tensors 1456
2021-09-18 19:06:44 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.96,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: load models
2021-09-18 19:06:44 DATA:  test-node-gpu.js result: performance: load: 3 total: 230 2021-09-19 14:05:01 STATE: test-node-gpu.js result: defined models: 14 loaded models: 7
2021-09-18 19:06:44 INFO:  test-node-gpu.js test: concurrent 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: warmup: none default
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:05:01 STATE: test-node-gpu.js passed: warmup none result match
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:05:01 STATE: test-node-gpu.js event: image
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:05:02 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:45 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:02 STATE: test-node-gpu.js event: warmup
2021-09-18 19:06:46 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:02 STATE: test-node-gpu.js passed: warmup: face default
2021-09-18 19:06:47 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
2021-09-18 19:06:47 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:02 DATA:  test-node-gpu.js result: performance: load: 282 total: 992
2021-09-18 19:06:47 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:02 STATE: test-node-gpu.js passed: warmup face result match
2021-09-18 19:06:48 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:02 STATE: test-node-gpu.js event: image
2021-09-18 19:06:52 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:05:03 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:52 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.91,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10} 2021-09-19 14:05:03 STATE: test-node-gpu.js event: warmup
2021-09-18 19:06:52 DATA:  test-node-gpu.js result: performance: load: 35 total: 3949 2021-09-19 14:05:03 STATE: test-node-gpu.js passed: warmup: body default
2021-09-18 19:06:52 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:05:03 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:52 DATA:  test-node-gpu.js result: face: 2 body: 1 hand: 0 gesture: 1 object: 1 person: 2 {"score":0.91,"age":23.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:03 DATA:  test-node-gpu.js result: performance: load: 282 total: 1081
2021-09-18 19:06:52 DATA:  test-node-gpu.js result: performance: load: 7 total: 4514 2021-09-19 14:05:03 STATE: test-node-gpu.js passed: warmup body result match
2021-09-18 19:06:53 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:05:03 INFO:  test-node-gpu.js test default
2021-09-18 19:06:53 DATA:  test-node-gpu.js result: face: 3 body: 1 hand: 0 gesture: 1 object: 1 person: 3 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.72,"class":"person"} {"score":0.47,"keypoints":10} 2021-09-19 14:05:04 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:53 DATA:  test-node-gpu.js result: performance: load: 7 total: 4975 2021-09-19 14:05:04 STATE: test-node-gpu.js event: image
2021-09-18 19:06:53 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:05 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:53 DATA:  test-node-gpu.js result: face: 4 body: 1 hand: 0 gesture: 1 object: 1 person: 4 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10} 2021-09-19 14:05:05 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:53 DATA:  test-node-gpu.js result: performance: load: 35 total: 5373 2021-09-19 14:05:05 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":28.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:53 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:05 DATA:  test-node-gpu.js result: performance: load: 282 total: 1060
2021-09-18 19:06:53 DATA:  test-node-gpu.js result: face: 5 body: 1 hand: 0 gesture: 1 object: 1 person: 5 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:05 STATE: test-node-gpu.js passed: default result face match
2021-09-18 19:06:53 DATA:  test-node-gpu.js result: performance: load: 7 total: 5730 2021-09-19 14:05:05 INFO:  test-node-gpu.js test object
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:06 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: face: 6 body: 1 hand: 0 gesture: 1 object: 1 person: 6 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10} 2021-09-19 14:05:06 STATE: test-node-gpu.js event: image
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 7 total: 5956 2021-09-19 14:05:07 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:07 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: face: 7 body: 1 hand: 0 gesture: 1 object: 1 person: 7 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:07 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 1 person: 1 {"score":1,"age":28.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 35 total: 6115 2021-09-19 14:05:07 DATA:  test-node-gpu.js result: performance: load: 282 total: 1122
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:07 STATE: test-node-gpu.js passed: object result match
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: face: 8 body: 1 hand: 0 gesture: 1 object: 1 person: 8 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:07 INFO:  test-node-gpu.js test sensitive
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 7 total: 6200 2021-09-19 14:05:08 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:08 STATE: test-node-gpu.js event: image
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: face: 9 body: 1 hand: 0 gesture: 1 object: 1 person: 9 {"score":0.91,"age":29.2,"gender":"male"} {"score":0.72,"class":"person"} {"score":0.69,"keypoints":10} 2021-09-19 14:05:10 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 7 total: 6201 2021-09-19 14:05:10 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:54 STATE: test-node-gpu.js passeed: no memory leak 2021-09-19 14:05:10 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 3 gesture: 9 object: 1 person: 1 {"score":1,"age":28.5,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:54 STATE: test-node-gpu.js passeed: equal usage 2021-09-19 14:05:10 DATA:  test-node-gpu.js result: performance: load: 282 total: 1754
2021-09-18 19:06:54 INFO:  test-node-gpu.js events: {"image":2,"detect":2,"warmup":2} 2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive result match
2021-09-18 19:06:54 INFO:  test-node-gpu.js test complete: 18686 ms 2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive face result match
2021-09-18 19:06:54 INFO:  2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive body result match
2021-09-18 19:06:54 INFO:  test-node-wasm.js start 2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive hand result match
2021-09-18 19:06:54 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/ 2021-09-19 14:05:10 INFO:  test-node-gpu.js test detectors
2021-09-18 19:06:54 STATE: test-node-wasm.js passed: create human 2021-09-19 14:05:11 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:54 INFO:  test-node-wasm.js human version: 2.2.2 2021-09-19 14:05:11 STATE: test-node-gpu.js event: image
2021-09-18 19:06:54 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.5.0 2021-09-19 14:05:11 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:54 INFO:  test-node-wasm.js tfjs version: 3.9.0 2021-09-19 14:05:11 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:06:56 STATE: test-node-wasm.js passed: set backend: wasm 2021-09-19 14:05:11 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:06:56 STATE: test-node-wasm.js tensors 1189 2021-09-19 14:05:11 DATA:  test-node-gpu.js result: performance: load: 282 total: 560
2021-09-18 19:06:56 STATE: test-node-wasm.js passed: load models 2021-09-19 14:05:11 STATE: test-node-gpu.js passed: detector result face match
2021-09-18 19:06:56 STATE: test-node-wasm.js result: defined models: 14 loaded models: 6 2021-09-19 14:05:11 STATE: test-node-gpu.js passed: detector result hand match
2021-09-18 19:06:56 STATE: test-node-wasm.js passed: warmup: none default 2021-09-19 14:05:11 INFO:  test-node-gpu.js test body variants
2021-09-18 19:06:57 STATE: test-node-wasm.js event: image 2021-09-19 14:05:12 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:06:57 STATE: test-node-wasm.js event: detect 2021-09-19 14:05:12 STATE: test-node-gpu.js event: image
2021-09-18 19:06:57 STATE: test-node-wasm.js event: warmup 2021-09-19 14:05:13 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:57 STATE: test-node-wasm.js passed: warmup: face default 2021-09-19 14:05:13 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg posenet
2021-09-18 19:06:57 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {"score":0.47,"keypoints":4} 2021-09-19 14:05:13 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.91,"keypoints":17}
2021-09-18 19:06:57 DATA:  test-node-wasm.js result: performance: load: 1917 total: 1032 2021-09-19 14:05:13 DATA:  test-node-gpu.js result: performance: load: 282 total: 725
2021-09-18 19:07:01 STATE: test-node-wasm.js event: image 2021-09-19 14:05:14 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:07:02 STATE: test-node-wasm.js event: detect 2021-09-19 14:05:14 STATE: test-node-gpu.js event: image
2021-09-18 19:07:02 STATE: test-node-wasm.js event: warmup 2021-09-19 14:05:14 STATE: test-node-gpu.js event: detect
2021-09-18 19:07:02 STATE: test-node-wasm.js passed: warmup: body default 2021-09-19 14:05:14 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg movenet
2021-09-18 19:07:02 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:14 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2021-09-18 19:07:02 DATA:  test-node-wasm.js result: performance: load: 1917 total: 2626 2021-09-19 14:05:14 DATA:  test-node-gpu.js result: performance: load: 282 total: 636
2021-09-18 19:07:02 INFO:  test-node-wasm.js test default 2021-09-19 14:05:15 STATE: test-node-gpu.js event: image
2021-09-18 19:07:03 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:15 STATE: test-node-gpu.js event: detect
2021-09-18 19:07:06 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:15 STATE: test-node-gpu.js passed: detect: random default
2021-09-18 19:07:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:15 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 1 gesture: 1 object: 0 person: 0 {} {} {"score":0.07,"keypoints":17}
2021-09-18 19:07:06 DATA:  test-node-wasm.js result: performance: load: 4 total: 2293 2021-09-19 14:05:15 DATA:  test-node-gpu.js result: performance: load: 282 total: 600
2021-09-18 19:07:06 INFO:  test-node-wasm.js test detectors 2021-09-19 14:05:15 INFO:  test-node-gpu.js test: first instance
2021-09-18 19:07:07 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:15 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:07:09 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:16 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:07:09 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:16 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:07:09 DATA:  test-node-wasm.js result: performance: load: 15 total: 2300 2021-09-19 14:05:16 DATA:  test-node-gpu.js result: performance: load: 4 total: 679
2021-09-18 19:07:09 INFO:  test-node-wasm.js test body variants 2021-09-19 14:05:16 INFO:  test-node-gpu.js test: second instance
2021-09-18 19:07:11 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:16 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:07:13 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg posenet 2021-09-19 14:05:17 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:07:13 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.96,"keypoints":16} 2021-09-19 14:05:17 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:07:13 DATA:  test-node-wasm.js result: performance: load: 316 total: 1938 2021-09-19 14:05:17 DATA:  test-node-gpu.js result: performance: load: 2 total: 616
2021-09-18 19:07:15 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:17 INFO:  test-node-gpu.js test: concurrent
2021-09-18 19:07:16 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg movenet 2021-09-19 14:05:17 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2021-09-18 19:07:16 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:17 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2021-09-18 19:07:16 DATA:  test-node-wasm.js result: performance: load: 316 total: 1751 2021-09-19 14:05:17 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2021-09-18 19:07:18 STATE: test-node-wasm.js passed: detect: random default 2021-09-19 14:05:18 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:07:18 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:19 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:07:18 DATA:  test-node-wasm.js result: performance: load: 316 total: 1734 2021-09-19 14:05:20 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2021-09-18 19:07:18 INFO:  test-node-wasm.js test: first instance 2021-09-19 14:05:20 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:07:19 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:20 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:07:21 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:21 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
2021-09-18 19:07:21 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:21 STATE: test-node-gpu.js event: image
2021-09-18 19:07:21 DATA:  test-node-wasm.js result: performance: load: 6 total: 2225 2021-09-19 14:05:21 STATE: test-node-gpu.js event: image
2021-09-18 19:07:21 INFO:  test-node-wasm.js test: second instance 2021-09-19 14:05:21 STATE: test-node-gpu.js event: image
2021-09-18 19:07:22 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:26 STATE: test-node-gpu.js event: detect
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
2021-09-18 19:07:24 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10}
2021-09-18 19:07:24 DATA:  test-node-wasm.js result: performance: load: 3 total: 2260 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 282 total: 5479
2021-09-18 19:07:24 INFO:  test-node-wasm.js test: concurrent 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 2 body: 1 hand: 0 gesture: 1 object: 1 person: 2 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10}
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5480
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
2021-09-18 19:07:26 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 3 body: 1 hand: 0 gesture: 1 object: 1 person: 3 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":10}
2021-09-18 19:07:27 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5480
2021-09-18 19:07:29 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] 2021-09-19 14:05:26 STATE: test-node-gpu.js event: detect
2021-09-18 19:07:30 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:07:30 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 4 body: 1 hand: 1 gesture: 1 object: 1 person: 4 {"score":0.91} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10}
2021-09-18 19:07:31 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 282 total: 5473
2021-09-18 19:07:47 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:07:47 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 1 object: 0 person: 1 {"score":0.93,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 5 body: 1 hand: 1 gesture: 1 object: 1 person: 5 {"score":0.91} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10}
2021-09-18 19:07:47 DATA:  test-node-wasm.js result: performance: load: 316 total: 15299 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5474
2021-09-18 19:07:50 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
2021-09-18 19:07:50 DATA:  test-node-wasm.js result: face: 2 body: 1 hand: 0 gesture: 1 object: 0 person: 2 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 6 body: 1 hand: 1 gesture: 1 object: 1 person: 6 {"score":0.91} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":10}
2021-09-18 19:07:50 DATA:  test-node-wasm.js result: performance: load: 6 total: 19352 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5474
2021-09-18 19:07:50 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default 2021-09-19 14:05:26 STATE: test-node-gpu.js event: detect
2021-09-18 19:07:50 DATA:  test-node-wasm.js result: face: 3 body: 1 hand: 0 gesture: 1 object: 0 person: 3 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:07:50 DATA:  test-node-wasm.js result: performance: load: 3 total: 19421 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 7 body: 1 hand: 0 gesture: 1 object: 1 person: 7 {"score":0.91} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:07:52 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 282 total: 5474
2021-09-18 19:07:52 DATA:  test-node-wasm.js result: face: 4 body: 1 hand: 0 gesture: 1 object: 0 person: 4 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:07:52 DATA:  test-node-wasm.js result: performance: load: 316 total: 21349 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 8 body: 1 hand: 0 gesture: 1 object: 1 person: 8 {"score":0.91} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:07:52 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5475
2021-09-18 19:07:52 DATA:  test-node-wasm.js result: face: 5 body: 1 hand: 0 gesture: 1 object: 0 person: 5 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
2021-09-18 19:07:52 DATA:  test-node-wasm.js result: performance: load: 6 total: 21394 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: face: 9 body: 1 hand: 0 gesture: 1 object: 1 person: 9 {"score":0.91} {"score":0.71,"class":"person"} {"score":0.69,"keypoints":10}
2021-09-18 19:07:53 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default 2021-09-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5475
2021-09-18 19:07:53 DATA:  test-node-wasm.js result: face: 6 body: 1 hand: 0 gesture: 1 object: 0 person: 6 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 STATE: test-node-gpu.js passeed: no memory leak
2021-09-18 19:07:53 DATA:  test-node-wasm.js result: performance: load: 3 total: 22600 2021-09-19 14:05:26 STATE: test-node-gpu.js passeed: equal usage
2021-09-18 19:07:53 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:26 INFO:  test-node-gpu.js events: {"image":12,"detect":12,"warmup":2}
2021-09-18 19:07:53 DATA:  test-node-wasm.js result: face: 7 body: 1 hand: 0 gesture: 1 object: 0 person: 7 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:26 INFO:  test-node-gpu.js test complete: 25122 ms
2021-09-18 19:07:53 DATA:  test-node-wasm.js result: performance: load: 316 total: 22621 2021-09-19 14:05:26 INFO: 
2021-09-18 19:07:54 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:26 INFO:  test-node-wasm.js start
2021-09-18 19:07:54 DATA:  test-node-wasm.js result: face: 8 body: 1 hand: 0 gesture: 1 object: 0 person: 8 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:27 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/
2021-09-18 19:07:54 DATA:  test-node-wasm.js result: performance: load: 6 total: 23178 2021-09-19 14:05:27 STATE: test-node-wasm.js passed: configuration default validation []
2021-09-18 19:07:54 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default 2021-09-19 14:05:27 STATE: test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2021-09-18 19:07:54 DATA:  test-node-wasm.js result: face: 9 body: 1 hand: 0 gesture: 1 object: 0 person: 9 {"score":0.93,"age":29.2,"gender":"male"} {} {"score":0.92,"keypoints":17} 2021-09-19 14:05:27 STATE: test-node-wasm.js passed: create human
2021-09-18 19:07:54 DATA:  test-node-wasm.js result: performance: load: 3 total: 23179 2021-09-19 14:05:27 INFO:  test-node-wasm.js human version: 2.2.2
2021-09-18 19:07:54 STATE: test-node-wasm.js passeed: no memory leak 2021-09-19 14:05:27 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-18 19:07:54 STATE: test-node-wasm.js passeed: equal usage 2021-09-19 14:05:27 INFO:  test-node-wasm.js tfjs version: 3.9.0
2021-09-18 19:07:54 INFO:  test-node-wasm.js events: {"image":2,"detect":2,"warmup":2} 2021-09-19 14:05:29 STATE: test-node-wasm.js passed: set backend: wasm
2021-09-18 19:07:54 INFO:  test-node-wasm.js test complete: 59343 ms 2021-09-19 14:05:29 STATE: test-node-wasm.js tensors 1189
2021-09-18 19:07:54 INFO:  2021-09-19 14:05:29 STATE: test-node-wasm.js passed: load models
2021-09-18 19:07:54 INFO:  status: {"passed":112,"failed":0} 2021-09-19 14:05:29 STATE: test-node-wasm.js result: defined models: 14 loaded models: 6
2021-09-19 14:05:29 STATE: test-node-wasm.js passed: warmup: none default
2021-09-19 14:05:29 STATE: test-node-wasm.js passed: warmup none result match
2021-09-19 14:05:29 STATE: test-node-wasm.js event: image
2021-09-19 14:05:30 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:30 STATE: test-node-wasm.js event: warmup
2021-09-19 14:05:30 STATE: test-node-wasm.js passed: warmup: face default
2021-09-19 14:05:30 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":23.6,"gender":"female"} {} {"score":0.47,"keypoints":4}
2021-09-19 14:05:30 DATA:  test-node-wasm.js result: performance: load: 1911 total: 1075
2021-09-19 14:05:30 STATE: test-node-wasm.js passed: warmup face result match
2021-09-19 14:05:33 STATE: test-node-wasm.js event: image
2021-09-19 14:05:34 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:34 STATE: test-node-wasm.js event: warmup
2021-09-19 14:05:34 STATE: test-node-wasm.js passed: warmup: body default
2021-09-19 14:05:34 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17}
2021-09-19 14:05:34 DATA:  test-node-wasm.js result: performance: load: 1911 total: 2678
2021-09-19 14:05:34 STATE: test-node-wasm.js passed: warmup body result match
2021-09-19 14:05:34 INFO:  test-node-wasm.js test default
2021-09-19 14:05:36 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:05:38 STATE: test-node-wasm.js event: image
2021-09-19 14:05:38 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:38 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:05:38 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17}
2021-09-19 14:05:38 DATA:  test-node-wasm.js result: performance: load: 1911 total: 2566
2021-09-19 14:05:38 STATE: test-node-wasm.js passed: default result face match
2021-09-19 14:05:38 INFO:  test-node-wasm.js test object
2021-09-19 14:05:40 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:05:42 STATE: test-node-wasm.js event: image
2021-09-19 14:05:43 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:43 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:05:43 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 3 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17}
2021-09-19 14:05:43 DATA:  test-node-wasm.js result: performance: load: 1911 total: 2619
2021-09-19 14:05:43 ERROR: test-node-wasm.js failed: object result mismatch 0
2021-09-19 14:05:43 INFO:  test-node-wasm.js test sensitive
2021-09-19 14:05:45 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:05:46 STATE: test-node-wasm.js event: image
2021-09-19 14:05:49 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:49 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:05:49 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 3 gesture: 9 object: 0 person: 1 {"score":1,"age":28.5,"gender":"female"} {} {"score":0.92,"keypoints":17}
2021-09-19 14:05:49 DATA:  test-node-wasm.js result: performance: load: 1911 total: 4006
2021-09-19 14:05:49 STATE: test-node-wasm.js passed: sensitive result match
2021-09-19 14:05:49 ERROR: test-node-wasm.js failed: sensitive face result mismatch 1 4 478 3 1024 9
2021-09-19 14:05:49 STATE: test-node-wasm.js passed: sensitive body result match
2021-09-19 14:05:49 STATE: test-node-wasm.js passed: sensitive hand result match
2021-09-19 14:05:49 INFO:  test-node-wasm.js test detectors
2021-09-19 14:05:50 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:05:52 STATE: test-node-wasm.js event: image
2021-09-19 14:05:52 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:52 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:05:52 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:05:52 DATA:  test-node-wasm.js result: performance: load: 1911 total: 1967
2021-09-19 14:05:52 STATE: test-node-wasm.js passed: detector result face match
2021-09-19 14:05:52 STATE: test-node-wasm.js passed: detector result hand match
2021-09-19 14:05:52 INFO:  test-node-wasm.js test body variants
2021-09-19 14:05:54 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:05:56 STATE: test-node-wasm.js event: image
2021-09-19 14:05:56 STATE: test-node-wasm.js event: detect
2021-09-19 14:05:56 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg posenet
2021-09-19 14:05:56 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.91,"keypoints":17}
2021-09-19 14:05:56 DATA:  test-node-wasm.js result: performance: load: 1911 total: 2238
2021-09-19 14:05:58 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:05:59 STATE: test-node-wasm.js event: image
2021-09-19 14:06:00 STATE: test-node-wasm.js event: detect
2021-09-19 14:06:00 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg movenet
2021-09-19 14:06:00 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:00 DATA:  test-node-wasm.js result: performance: load: 1911 total: 2018
2021-09-19 14:06:02 STATE: test-node-wasm.js event: image
2021-09-19 14:06:02 STATE: test-node-wasm.js event: detect
2021-09-19 14:06:02 STATE: test-node-wasm.js passed: detect: random default
2021-09-19 14:06:02 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:02 DATA:  test-node-wasm.js result: performance: load: 1911 total: 2009
2021-09-19 14:06:02 INFO:  test-node-wasm.js test: first instance
2021-09-19 14:06:03 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2021-09-19 14:06:05 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
2021-09-19 14:06:05 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:05 DATA:  test-node-wasm.js result: performance: load: 3 total: 1988
2021-09-19 14:06:05 INFO:  test-node-wasm.js test: second instance
2021-09-19 14:06:05 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2021-09-19 14:06:07 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
2021-09-19 14:06:07 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:07 DATA:  test-node-wasm.js result: performance: load: 3 total: 1912
2021-09-19 14:06:07 INFO:  test-node-wasm.js test: concurrent
2021-09-19 14:06:07 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2021-09-19 14:06:07 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2021-09-19 14:06:07 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2021-09-19 14:06:09 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:06:10 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:06:12 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2021-09-19 14:06:13 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2021-09-19 14:06:13 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2021-09-19 14:06:14 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2021-09-19 14:06:16 STATE: test-node-wasm.js event: image
2021-09-19 14:06:20 STATE: test-node-wasm.js event: image
2021-09-19 14:06:25 STATE: test-node-wasm.js event: image
2021-09-19 14:06:31 STATE: test-node-wasm.js event: detect
2021-09-19 14:06:31 STATE: test-node-wasm.js event: detect
2021-09-19 14:06:31 STATE: test-node-wasm.js event: detect
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 1 object: 0 person: 1 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 1911 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 2 body: 1 hand: 1 gesture: 1 object: 0 person: 2 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 3 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 3 body: 1 hand: 1 gesture: 1 object: 0 person: 3 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 3 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 4 body: 1 hand: 1 gesture: 1 object: 0 person: 4 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 1911 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 5 body: 1 hand: 1 gesture: 1 object: 0 person: 5 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 3 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 6 body: 1 hand: 1 gesture: 1 object: 0 person: 6 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 3 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 7 body: 1 hand: 1 gesture: 1 object: 0 person: 7 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 1911 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 8 body: 1 hand: 1 gesture: 1 object: 0 person: 8 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 3 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: face: 9 body: 1 hand: 1 gesture: 1 object: 0 person: 9 {"score":0.93} {} {"score":0.92,"keypoints":17}
2021-09-19 14:06:31 DATA:  test-node-wasm.js result: performance: load: 3 total: 17833
2021-09-19 14:06:31 STATE: test-node-wasm.js passeed: no memory leak
2021-09-19 14:06:31 STATE: test-node-wasm.js passeed: equal usage
2021-09-19 14:06:31 INFO:  test-node-wasm.js events: {"image":12,"detect":12,"warmup":2}
2021-09-19 14:06:31 INFO:  test-node-wasm.js test complete: 64517 ms
2021-09-19 14:06:31 INFO: 
2021-09-19 14:06:31 INFO:  status: {"test-node.js":{"passed":54,"failed":0},"test-node-gpu.js":{"passed":54,"failed":0},"test-node-wasm.js":{"passed":53,"failed":2}}

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
</ul> </ul>
</div><dl class="tsd-comment-tags"><dt>param userConfig:</dt><dd><p><a href="../interfaces/Config.html">Config</a></p> </div><dl class="tsd-comment-tags"><dt>param userConfig:</dt><dd><p><a href="../interfaces/Config.html">Config</a></p>
</dd><dt>returns</dt><dd><p>instance</p> </dd><dt>returns</dt><dd><p>instance</p>
</dd></dl></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Human</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>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="Human.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#config" class="tsd-kind-icon">config</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#draw" class="tsd-kind-icon">draw</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#env" class="tsd-kind-icon">env</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#events" class="tsd-kind-icon">events</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceTriangulation" class="tsd-kind-icon">face<wbr/>Triangulation</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceUVMap" class="tsd-kind-icon">faceUVMap</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#gl" class="tsd-kind-icon">gl</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#process" class="tsd-kind-icon">process</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#result" class="tsd-kind-icon">result</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#state" class="tsd-kind-icon">state</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#version" class="tsd-kind-icon">version</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#detect" class="tsd-kind-icon">detect</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#enhance" class="tsd-kind-icon">enhance</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#image" class="tsd-kind-icon">image</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#init" class="tsd-kind-icon">init</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#load" class="tsd-kind-icon">load</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#match" class="tsd-kind-icon">match</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#next" class="tsd-kind-icon">next</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#similarity" class="tsd-kind-icon">similarity</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#warmup" class="tsd-kind-icon">warmup</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a name="constructor" class="tsd-anchor"></a><h3>constructor</h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Human<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="Human.html" class="tsd-signature-type" data-tsd-kind="Class">Human</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L168">human.ts:168</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </dd></dl></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Human</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>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="Human.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#config" class="tsd-kind-icon">config</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#draw" class="tsd-kind-icon">draw</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#env" class="tsd-kind-icon">env</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#events" class="tsd-kind-icon">events</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceTriangulation" class="tsd-kind-icon">face<wbr/>Triangulation</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceUVMap" class="tsd-kind-icon">faceUVMap</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#gl" class="tsd-kind-icon">gl</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#process" class="tsd-kind-icon">process</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#result" class="tsd-kind-icon">result</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#state" class="tsd-kind-icon">state</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#version" class="tsd-kind-icon">version</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#detect" class="tsd-kind-icon">detect</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#enhance" class="tsd-kind-icon">enhance</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#image" class="tsd-kind-icon">image</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#init" class="tsd-kind-icon">init</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#load" class="tsd-kind-icon">load</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#match" class="tsd-kind-icon">match</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#next" class="tsd-kind-icon">next</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#reset" class="tsd-kind-icon">reset</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#similarity" class="tsd-kind-icon">similarity</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#validate" class="tsd-kind-icon">validate</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#warmup" class="tsd-kind-icon">warmup</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a name="constructor" class="tsd-anchor"></a><h3>constructor</h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Human<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="Human.html" class="tsd-signature-type" data-tsd-kind="Class">Human</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L168">human.ts:168</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Constructor for <strong>Human</strong> library that is futher used for all operations</p> <p>Constructor for <strong>Human</strong> library that is futher used for all operations</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="Human.html" class="tsd-signature-type" data-tsd-kind="Class">Human</a></h4><div><p>instance</p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="Human.html" class="tsd-signature-type" data-tsd-kind="Class">Human</a></h4><div><p>instance</p>
</div></li></ul></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-class"><a name="config" class="tsd-anchor"></a><h3>config</h3><div class="tsd-signature tsd-kind-icon">config<span class="tsd-signature-symbol">:</span> <a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L83">human.ts:83</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></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-class"><a name="config" class="tsd-anchor"></a><h3>config</h3><div class="tsd-signature tsd-kind-icon">config<span class="tsd-signature-symbol">:</span> <a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L83">human.ts:83</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
@ -62,7 +62,7 @@
</ul> </ul>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="version" class="tsd-anchor"></a><h3>version</h3><div class="tsd-signature tsd-kind-icon">version<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L78">human.ts:78</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="version" class="tsd-anchor"></a><h3>version</h3><div class="tsd-signature tsd-kind-icon">version<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L78">human.ts:78</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Current version of Human library in <em>semver</em> format</p> <p>Current version of Human library in <em>semver</em> format</p>
</div></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="detect" class="tsd-anchor"></a><h3>detect</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">detect<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a>, userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L387">human.ts:387</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="detect" class="tsd-anchor"></a><h3>detect</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">detect<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a>, userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L396">human.ts:396</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Main detection method</p> <p>Main detection method</p>
<ul> <ul>
<li>Analyze configuration: <a href="../interfaces/Config.html">Config</a></li> <li>Analyze configuration: <a href="../interfaces/Config.html">Config</a></li>
@ -71,12 +71,12 @@
<li>Process and return result: <a href="../interfaces/Result.html">Result</a></li> <li>Process and return result: <a href="../interfaces/Result.html">Result</a></li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="enhance" class="tsd-anchor"></a><h3>enhance</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">enhance<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L289">human.ts:289</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="enhance" class="tsd-anchor"></a><h3>enhance</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">enhance<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L298">human.ts:298</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Enhance method performs additional enhacements to face image previously detected for futher processing</p> <p>Enhance method performs additional enhacements to face image previously detected for futher processing</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Tensor</p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Tensor</p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="image" class="tsd-anchor"></a><h3>image</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">image<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">; </span>tensor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol"> }</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L256">human.ts:256</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="image" class="tsd-anchor"></a><h3>image</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">image<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">; </span>tensor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol"> }</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L265">human.ts:265</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Process input as return canvas and tensor</p> <p>Process input as return canvas and tensor</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">; </span>tensor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol"> }</span></h4><div></div><ul class="tsd-parameters"><li class="tsd-parameter"><h5>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span></h5></li><li class="tsd-parameter"><h5>tensor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="init" class="tsd-anchor"></a><h3>init</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">init<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L312">human.ts:312</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">; </span>tensor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol"> }</span></h4><div></div><ul class="tsd-parameters"><li class="tsd-parameter"><h5>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span></h5></li><li class="tsd-parameter"><h5>tensor<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="init" class="tsd-anchor"></a><h3>init</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">init<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L321">human.ts:321</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Explicit backend initialization</p> <p>Explicit backend initialization</p>
<ul> <ul>
<li>Normally done implicitly during initial load phase</li> <li>Normally done implicitly during initial load phase</li>
@ -84,38 +84,42 @@
<li>Used in webworker environments where there can be multiple instances of Human and not all initialized</li> <li>Used in webworker environments where there can be multiple instances of Human and not all initialized</li>
</ul> </ul>
</div></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div><p>Promise<void></p> </div></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><div><p>Promise<void></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="load" class="tsd-anchor"></a><h3>load</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">load<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L322">human.ts:322</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="load" class="tsd-anchor"></a><h3>load</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">load<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L331">human.ts:331</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Load method preloads all configured models on-demand</p> <p>Load method preloads all configured models on-demand</p>
<ul> <ul>
<li>Not explicitly required as any required model is load implicitly on it&#39;s first run</li> <li>Not explicitly required as any required model is load implicitly on it&#39;s first run</li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Promise<void></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Promise<void></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="match" class="tsd-anchor"></a><h3>match</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">match<span class="tsd-signature-symbol">(</span>faceEmbedding<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span>, db<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>source<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>, threshold<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><span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>source<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L301">human.ts:301</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="match" class="tsd-anchor"></a><h3>match</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">match<span class="tsd-signature-symbol">(</span>faceEmbedding<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span>, db<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>source<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>, threshold<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><span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>source<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L310">human.ts:310</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Math method find best match between provided face descriptor and predefined database of known descriptors</p> <p>Math method find best match between provided face descriptor and predefined database of known descriptors</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>faceEmbedding: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li><li><h5>db: <span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>source<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></h5></li><li><h5>threshold: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 0</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>source<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span></h4><div><p>best match</p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>faceEmbedding: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li><li><h5>db: <span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>source<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></h5></li><li><h5>threshold: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 0</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span>embedding<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>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>source<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span></h4><div><p>best match</p>
</div><ul class="tsd-parameters"><li class="tsd-parameter"><h5>embedding<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li><li class="tsd-parameter"><h5>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>source<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="next" class="tsd-anchor"></a><h3>next</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">next<span class="tsd-signature-symbol">(</span>result<span class="tsd-signature-symbol">?: </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L363">human.ts:363</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div><ul class="tsd-parameters"><li class="tsd-parameter"><h5>embedding<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li><li class="tsd-parameter"><h5>name<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>source<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="next" class="tsd-anchor"></a><h3>next</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">next<span class="tsd-signature-symbol">(</span>result<span class="tsd-signature-symbol">?: </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L372">human.ts:372</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Runs interpolation using last known result and returns smoothened result <p>Runs interpolation using last known result and returns smoothened result
Interpolation is based on time since last known result so can be called independently</p> Interpolation is based on time since last known result so can be called independently</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>result: <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> = ...</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>result: <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> = ...</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="segmentation" class="tsd-anchor"></a><h3>segmentation</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">segmentation<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a>, background<span class="tsd-signature-symbol">?: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L279">human.ts:279</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="reset" class="tsd-anchor"></a><h3>reset</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">reset<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L255">human.ts:255</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Reset configuration to default values</p>
</div></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">any</span></h4></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="segmentation" class="tsd-anchor"></a><h3>segmentation</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">segmentation<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a>, background<span class="tsd-signature-symbol">?: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L288">human.ts:288</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Segmentation method takes any input and returns this.processed canvas with body segmentation</p> <p>Segmentation method takes any input and returns this.processed canvas with body segmentation</p>
<ul> <ul>
<li>Optional parameter background is used to fill the background with specific input</li> <li>Optional parameter background is used to fill the background with specific input</li>
<li>Segmentation is not triggered as part of detect this.process</li> <li>Segmentation is not triggered as part of detect this.process</li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> background: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Canvas</p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> background: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Canvas</p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="similarity" class="tsd-anchor"></a><h3>similarity</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">similarity<span class="tsd-signature-symbol">(</span>embedding1<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span>, embedding2<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><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L267">human.ts:267</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="similarity" class="tsd-anchor"></a><h3>similarity</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">similarity<span class="tsd-signature-symbol">(</span>embedding1<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span>, embedding2<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><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L276">human.ts:276</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)</p> <p>Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)</p>
<ul> <ul>
<li>Calculation is based on normalized Minkowski distance between two descriptors</li> <li>Calculation is based on normalized Minkowski distance between two descriptors</li>
<li>Default is Euclidean distance which is Minkowski distance of 2nd order</li> <li>Default is Euclidean distance which is Minkowski distance of 2nd order</li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>embedding1: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li><li><h5>embedding2: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4><div><p>similarity: number</p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>embedding1: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li><li><h5>embedding2: <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4><div><p>similarity: number</p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="warmup" class="tsd-anchor"></a><h3>warmup</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">warmup<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">{ </span>error<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L373">human.ts:373</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="validate" class="tsd-anchor"></a><h3>validate</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">validate<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>expected<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>reason<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>where<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></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L258">human.ts:258</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Validate current configuration schema</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span>expected<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>reason<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>where<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></h4></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="warmup" class="tsd-anchor"></a><h3>warmup</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">warmup<span class="tsd-signature-symbol">(</span>userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">{ </span>error<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L382">human.ts:382</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Warmup method pre-initializes all configured models for faster inference</p> <p>Warmup method pre-initializes all configured models for faster inference</p>
<ul> <ul>
<li>can take significant time on startup</li> <li>can take significant time on startup</li>
<li>only used for <code>webgl</code> and <code>humangl</code> backends</li> <li>only used for <code>webgl</code> and <code>humangl</code> backends</li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">{ </span>error<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">{ </span>error<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p>
</div></li></ul></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><li class="current tsd-kind-class"><a href="Human.html" class="tsd-kind-icon">Human</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="Human.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#config" class="tsd-kind-icon">config</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#draw" class="tsd-kind-icon">draw</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#env" class="tsd-kind-icon">env</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#events" class="tsd-kind-icon">events</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceTriangulation" class="tsd-kind-icon">face<wbr/>Triangulation</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceUVMap" class="tsd-kind-icon">faceUVMap</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#gl" class="tsd-kind-icon">gl</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#process" class="tsd-kind-icon">process</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#result" class="tsd-kind-icon">result</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#state" class="tsd-kind-icon">state</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#version" class="tsd-kind-icon">version</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#detect" class="tsd-kind-icon">detect</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#enhance" class="tsd-kind-icon">enhance</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#image" class="tsd-kind-icon">image</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#init" class="tsd-kind-icon">init</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#load" class="tsd-kind-icon">load</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#match" class="tsd-kind-icon">match</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#next" class="tsd-kind-icon">next</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#similarity" class="tsd-kind-icon">similarity</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#warmup" class="tsd-kind-icon">warmup</a></li></ul></li></ul></nav></div></div></div><footer class=""><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><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="overlay"></div><script src="../assets/main.js"></script></body></html> </div></li></ul></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><li class="current tsd-kind-class"><a href="Human.html" class="tsd-kind-icon">Human</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="Human.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#config" class="tsd-kind-icon">config</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#draw" class="tsd-kind-icon">draw</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#env" class="tsd-kind-icon">env</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#events" class="tsd-kind-icon">events</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceTriangulation" class="tsd-kind-icon">face<wbr/>Triangulation</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#faceUVMap" class="tsd-kind-icon">faceUVMap</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#gl" class="tsd-kind-icon">gl</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#process" class="tsd-kind-icon">process</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#result" class="tsd-kind-icon">result</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#state" class="tsd-kind-icon">state</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#version" class="tsd-kind-icon">version</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#detect" class="tsd-kind-icon">detect</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#enhance" class="tsd-kind-icon">enhance</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#image" class="tsd-kind-icon">image</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#init" class="tsd-kind-icon">init</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#load" class="tsd-kind-icon">load</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#match" class="tsd-kind-icon">match</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#next" class="tsd-kind-icon">next</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#reset" class="tsd-kind-icon">reset</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#similarity" class="tsd-kind-icon">similarity</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#validate" class="tsd-kind-icon">validate</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="Human.html#warmup" class="tsd-kind-icon">warmup</a></li></ul></li></ul></nav></div></div></div><footer class=""><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><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="overlay"></div><script src="../assets/main.js"></script></body></html>

View File

@ -29,7 +29,7 @@
<li>values 0..1 where 0.01 means reset cache if input changed more than 1%</li> <li>values 0..1 where 0.01 means reset cache if input changed more than 1%</li>
<li>set to 0 to disable caching</li> <li>set to 0 to disable caching</li>
</ul> </ul>
</div></div></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">&quot;none&quot;</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">&quot;face&quot;</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">&quot;full&quot;</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">&quot;body&quot;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L205">config.ts:205</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></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">&quot;face&quot;</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">&quot;body&quot;</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">&quot;none&quot;</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">&quot;full&quot;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L205">config.ts:205</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>What to use for <code>human.warmup()</code></p> <p>What to use for <code>human.warmup()</code></p>
<ul> <ul>
<li>warmup pre-initializes all models for faster inference but can take significant time on startup</li> <li>warmup pre-initializes all models for faster inference but can take significant time on startup</li>

View File

@ -1 +1 @@
{"version":3,"file":"estimator.d.ts","sourceRoot":"","sources":["../../../src/fingerpose/estimator.ts"],"names":[],"mappings":"AAqKA,wBAAgB,QAAQ,CAAC,SAAS,KAAA;;;EA0CjC"} {"version":3,"file":"estimator.d.ts","sourceRoot":"","sources":["../../../src/fingerpose/estimator.ts"],"names":[],"mappings":"AAsKA,wBAAgB,QAAQ,CAAC,SAAS,KAAA;;;EA0CjC"}

View File

@ -1,4 +1,4 @@
export declare function analyze(keypoints: any): {}; export declare function analyze(keypoints: any): {} | null;
export declare function match(keypoints: any): { export declare function match(keypoints: any): {
name: string; name: string;
confidence: number; confidence: number;

View File

@ -1 +1 @@
{"version":3,"file":"fingerpose.d.ts","sourceRoot":"","sources":["../../../src/fingerpose/fingerpose.ts"],"names":[],"mappings":"AAQA,wBAAgB,OAAO,CAAC,SAAS,KAAA,MAWhC;AAED,wBAAgB,KAAK,CAAC,SAAS,KAAA;UAEF,MAAM;gBAAc,MAAM;IAOtD"} {"version":3,"file":"fingerpose.d.ts","sourceRoot":"","sources":["../../../src/fingerpose/fingerpose.ts"],"names":[],"mappings":"AAQA,wBAAgB,OAAO,CAAC,SAAS,KAAA,aAYhC;AAED,wBAAgB,KAAK,CAAC,SAAS,KAAA;UACF,MAAM;gBAAc,MAAM;IAStD"}

View File

@ -1 +1 @@
{"version":3,"file":"handdetector.d.ts","sourceRoot":"","sources":["../../../src/handpose/handdetector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAExD,qBAAa,YAAY;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;gBAElB,KAAK,KAAA;IASjB,cAAc,CAAC,KAAK,KAAA;IAYpB,kBAAkB,CAAC,gBAAgB,KAAA,EAAE,KAAK,KAAA;IAOpC,QAAQ,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA;aAUA,MAAM;uBAAiB,MAAM;oBAAc,MAAM;;IAWvE,kBAAkB,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAmB9I"} {"version":3,"file":"handdetector.d.ts","sourceRoot":"","sources":["../../../src/handpose/handdetector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAExD,qBAAa,YAAY;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;gBAElB,KAAK,KAAA;IASjB,cAAc,CAAC,KAAK,KAAA;IAYpB,kBAAkB,CAAC,gBAAgB,KAAA,EAAE,KAAK,KAAA;IAOpC,QAAQ,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA;aAWA,MAAM;uBAAiB,MAAM;oBAAc,MAAM;;IAWvE,kBAAkB,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAmB9I"}

View File

@ -1 +1 @@
{"version":3,"file":"handpipeline.d.ts","sourceRoot":"","sources":["../../../src/handpose/handpipeline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,eAAe,CAAC;AASxD,qBAAa,YAAY;IACvB,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC;IACpC,aAAa,EAAE,UAAU,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACrH,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;gBAEV,YAAY,KAAA,EAAE,aAAa,KAAA;IAUvC,6BAA6B,CAAC,SAAS,KAAA;;;;IAQvC,sBAAsB,CAAC,aAAa,KAAA,EAAE,cAAc,KAAA;;;;;IAMpD,sBAAsB,CAAC,SAAS,KAAA;;;;;IAUhC,kBAAkB,CAAC,SAAS,KAAA,EAAE,IAAI,KAAA,EAAE,KAAK,KAAA,EAAE,cAAc,KAAA;IA0BnD,aAAa,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA;mBAoBC,MAAM,EAAE;oBAAc,MAAM;aAAO;YAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAAC,WAAW,EAAE,MAAM,EAAE,CAAA;SAAE;;CAuDlH"} {"version":3,"file":"handpipeline.d.ts","sourceRoot":"","sources":["../../../src/handpose/handpipeline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,eAAe,CAAC;AASxD,qBAAa,YAAY;IACvB,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC;IACpC,aAAa,EAAE,UAAU,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACrH,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;gBAEV,YAAY,KAAA,EAAE,aAAa,KAAA;IAUvC,6BAA6B,CAAC,SAAS,KAAA;;;;IAQvC,sBAAsB,CAAC,aAAa,KAAA,EAAE,cAAc,KAAA;;;;;IAMpD,sBAAsB,CAAC,SAAS,KAAA;;;;;IAUhC,kBAAkB,CAAC,SAAS,KAAA,EAAE,IAAI,KAAA,EAAE,KAAK,KAAA,EAAE,cAAc,KAAA;IA0BnD,aAAa,CAAC,KAAK,KAAA,EAAE,MAAM,KAAA;mBAoBC,MAAM,EAAE;oBAAc,MAAM;aAAO;YAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAAC,WAAW,EAAE,MAAM,EAAE,CAAA;SAAE;;CAwDlH"}

View File

@ -4,6 +4,15 @@
export declare function join(folder: string, file: string): string; export declare function join(folder: string, file: string): string;
export declare function log(...msg: any[]): void; export declare function log(...msg: any[]): void;
export declare const now: () => number; export declare const now: () => number;
export declare function validate(defaults: any, config: any, parent?: string, msgs?: Array<{
reason: string;
where: string;
expected?: string;
}>): {
reason: string;
where: string;
expected?: string;
}[];
export declare function mergeDeep(...objects: any[]): any; export declare function mergeDeep(...objects: any[]): any;
export declare const minmax: (data: Array<number>) => number[]; export declare const minmax: (data: Array<number>) => number[];
//# sourceMappingURL=helpers.d.ts.map //# sourceMappingURL=helpers.d.ts.map

View File

@ -1 +1 @@
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzD;AAGD,wBAAgB,GAAG,CAAC,GAAG,GAAG,OAAA,GAAG,IAAI,CAKhC;AAGD,eAAO,MAAM,GAAG,cAGf,CAAC;AAGF,wBAAgB,SAAS,CAAC,GAAG,OAAO,OAAA,OAYnC;AAGD,eAAO,MAAM,MAAM,SAAU,MAAM,MAAM,CAAC,aAIpC,CAAC"} {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzD;AAGD,wBAAgB,GAAG,CAAC,GAAG,GAAG,OAAA,GAAG,IAAI,CAKhC;AAGD,eAAO,MAAM,GAAG,cAGf,CAAC;AAGF,wBAAgB,QAAQ,CAAC,QAAQ,KAAA,EAAE,MAAM,KAAA,EAAE,MAAM,SAAW,EAAE,IAAI,GAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAM;YAAhD,MAAM;WAAS,MAAM;eAAa,MAAM;IAc3H;AAGD,wBAAgB,SAAS,CAAC,GAAG,OAAO,OAAA,OAYnC;AAGD,eAAO,MAAM,MAAM,SAAU,MAAM,MAAM,CAAC,aAIpC,CAAC"}

View File

@ -141,6 +141,14 @@ export declare class Human {
constructor(userConfig?: Partial<Config>); constructor(userConfig?: Partial<Config>);
/** @hidden */ /** @hidden */
analyze: (...msg: string[]) => void; analyze: (...msg: string[]) => void;
/** Reset configuration to default values */
reset: () => any;
/** Validate current configuration schema */
validate: (userConfig?: Partial<Config> | undefined) => {
reason: string;
where: string;
expected?: string;
}[];
/** Process input as return canvas and tensor /** Process input as return canvas and tensor
* *
* @param input: {@link Input} * @param input: {@link Input}

View File

@ -1 +1 @@
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAiF,MAAM,UAAU,CAAC;AACtH,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG1C,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAejD,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAK7B,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG1C,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B;;GAEG;AACH,oBAAY,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAEpJ;;;;;;;GAOG;AACH,oBAAY,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjF;;GAEG;AACH,oBAAY,KAAK,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;GAEG;AACH,oBAAY,UAAU,GAAG,OAAO,EAAE,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,qBAAa,KAAK;;IAChB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd,iDAAiD;IACjD,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAAA;KAAE,CAAC;IAEvF;;;OAGG;IACH,EAAE,EAAE,UAAU,CAAC;IAEf,qEAAqE;IACrE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAEb;;;;;;;OAOG;IACH,IAAI,EAAE;QAAE,MAAM,MAAC;QAAC,IAAI,MAAC;QAAC,IAAI,MAAC;QAAC,IAAI,MAAC;QAAC,OAAO,MAAC;QAAC,MAAM,MAAC;QAAC,MAAM,MAAC;QAAC,GAAG,MAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IAEvF;;MAEE;IACF,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC7D,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;QACjC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACxD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;QAC1B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;KACjC,CAAC;IAEF;;;;;;;;;OASG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB,oGAAoG;IACpG,iBAAiB,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC;IACjD,0EAA0E;IAC1E,SAAS,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;IACjC,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIpC,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG5B;;;;;OAKG;gBACS,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;IA2DxC,cAAc;IACd,OAAO,WAAY,MAAM,EAAE,UAO1B;IAgBD;;;;OAIG;IACH,KAAK,UAAW,KAAK;;;MAAuC;IAE5D;;;;;;;MAOE;IAEF,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM;IAIxE;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,KAAK;IAInD;;;;OAIG;IAEH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIrC;;;;;;OAMG;IAEH,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE,SAAS,SAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;IAI/L;;;;;;OAMG;IACH,IAAI;IAIJ;;;;;MAKE;IACI,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;IAgCvC,cAAc;IACd,IAAI,UAAW,MAAM,aAAkD;IAEvE;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,MAAoB;IAIjC;;;;;MAKE;IACI,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG;QAAE,KAAK,MAAA;KAAE,CAAC;IAIvE;;;;;;;;;MASE;IACI,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;CAwKlF;AAED,oCAAoC;AACpC,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,CAAC"} {"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAiF,MAAM,UAAU,CAAC;AACtH,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG1C,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAejD,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAK7B,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG1C,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B;;GAEG;AACH,oBAAY,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAEpJ;;;;;;;GAOG;AACH,oBAAY,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjF;;GAEG;AACH,oBAAY,KAAK,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;GAEG;AACH,oBAAY,UAAU,GAAG,OAAO,EAAE,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,qBAAa,KAAK;;IAChB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd,iDAAiD;IACjD,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAAA;KAAE,CAAC;IAEvF;;;OAGG;IACH,EAAE,EAAE,UAAU,CAAC;IAEf,qEAAqE;IACrE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAEb;;;;;;;OAOG;IACH,IAAI,EAAE;QAAE,MAAM,MAAC;QAAC,IAAI,MAAC;QAAC,IAAI,MAAC;QAAC,IAAI,MAAC;QAAC,OAAO,MAAC;QAAC,MAAM,MAAC;QAAC,MAAM,MAAC;QAAC,GAAG,MAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IAEvF;;MAEE;IACF,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC7D,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;QACjC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACxD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;QAC1B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;KACjC,CAAC;IAEF;;;;;;;;;OASG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB,oGAAoG;IACpG,iBAAiB,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC;IACjD,0EAA0E;IAC1E,SAAS,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;IACjC,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIpC,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG5B;;;;;OAKG;gBACS,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;IA8DxC,cAAc;IACd,OAAO,WAAY,MAAM,EAAE,UAO1B;IAgBD,4CAA4C;IAC5C,KAAK,YAA4D;IAEjE,4CAA4C;IAC5C,QAAQ;;;;QAAmF;IAE3F;;;;OAIG;IACH,KAAK,UAAW,KAAK;;;MAAuC;IAE5D;;;;;;;MAOE;IAEF,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM;IAIxE;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,KAAK;IAInD;;;;OAIG;IAEH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIrC;;;;;;OAMG;IAEH,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE,SAAS,SAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;IAI/L;;;;;;OAMG;IACH,IAAI;IAIJ;;;;;MAKE;IACI,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;IAgCvC,cAAc;IACd,IAAI,UAAW,MAAM,aAAkD;IAEvE;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,MAAoB;IAIjC;;;;;MAKE;IACI,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG;QAAE,KAAK,MAAA;KAAE,CAAC;IAIvE;;;;;;;;;MASE;IACI,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;CAwKlF;AAED,oCAAoC;AACpC,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,CAAC"}

2
wiki

@ -1 +1 @@
Subproject commit 740fcd1b5b2cc92bde0111b630e872cbf7670c81 Subproject commit b24eafa265bda331788e0d36cf5c854a494e33d6