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
### **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
### **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>
### 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
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`
<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>

View File

@ -69,6 +69,23 @@ var now = () => {
return performance.now();
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) {
const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => {
@ -4550,7 +4567,7 @@ function process2(input, config3) {
let pixels;
if (outCanvas.data) {
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) {
pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8619,7 +8636,7 @@ var HandDetector = class {
const scores = await t.scores.data();
t.boxes = tfjs_esm_exports.slice(t.predictions, [0, 1], [-1, 4]);
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 hands = [];
for (const index of nms) {
@ -8732,7 +8749,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands");
this.handDetector = handDetector;
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.skipped = 0;
this.detectedHands = 0;
@ -8848,6 +8865,8 @@ var HandPipeline = class {
}
this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands;
}
};
@ -8909,6 +8928,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope;
}
function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2)
return slopeXY;
@ -9207,6 +9228,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts
var minConfidence = 0.7;
function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3);
const landmarks = {};
for (const fingerIdx of Finger.all) {
@ -9218,8 +9241,10 @@ function analyze(keypoints3) {
return landmarks;
}
function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence)
@ -10172,7 +10197,7 @@ async function load13(instance) {
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"];
for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) {
@ -10500,7 +10525,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) {
const fingers = [];
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] });
}
if (fingers && fingers.length > 0) {
@ -12212,6 +12237,8 @@ var Human = class {
}
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, "emit", (event) => {
var _a;
@ -12224,7 +12251,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = 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.state = "idle";
__privateSet(this, _numTensors, 0);
@ -12308,7 +12339,7 @@ var Human = class {
env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) {
await validate(this);
await validate2(this);
this.emit("load");
}
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 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) {
const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => {
@ -64607,7 +64624,7 @@ function process2(input2, config3) {
let pixels;
if (outCanvas.data) {
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) {
pixels = browser_exports ? browser_exports.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -68676,7 +68693,7 @@ var HandDetector = class {
const scores = await t.scores.data();
t.boxes = slice(t.predictions, [0, 1], [-1, 4]);
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 hands = [];
for (const index of nms) {
@ -68789,7 +68806,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands");
this.handDetector = handDetector;
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.skipped = 0;
this.detectedHands = 0;
@ -68905,6 +68922,8 @@ var HandPipeline = class {
}
this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands;
}
};
@ -68966,6 +68985,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope;
}
function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2)
return slopeXY;
@ -69264,6 +69285,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts
var minConfidence = 0.7;
function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3);
const landmarks = {};
for (const fingerIdx of Finger.all) {
@ -69275,8 +69298,10 @@ function analyze(keypoints3) {
return landmarks;
}
function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence)
@ -70229,7 +70254,7 @@ async function load13(instance) {
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"];
for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) {
@ -70557,7 +70582,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) {
const fingers = [];
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] });
}
if (fingers && fingers.length > 0) {
@ -72269,6 +72294,8 @@ var Human = class {
}
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, "emit", (event) => {
var _a;
@ -72281,7 +72308,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = 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.state = "idle";
__privateSet(this, _numTensors, 0);
@ -72365,7 +72396,7 @@ var Human = class {
env2.initial = false;
const loaded = Object.values(this.models).filter((model11) => model11).length;
if (loaded !== count3) {
await validate(this);
await validate2(this);
this.emit("load");
}
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 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) {
const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => {
@ -4584,7 +4601,7 @@ function process2(input, config3) {
let pixels;
if (outCanvas.data) {
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) {
pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8665,7 +8682,7 @@ var HandDetector = class {
const scores = await t.scores.data();
t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]);
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 hands = [];
for (const index of nms) {
@ -8781,7 +8798,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands");
this.handDetector = handDetector;
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.skipped = 0;
this.detectedHands = 0;
@ -8897,6 +8914,8 @@ var HandPipeline = class {
}
this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands;
}
};
@ -8958,6 +8977,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope;
}
function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2)
return slopeXY;
@ -9256,6 +9277,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts
var minConfidence = 0.7;
function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3);
const landmarks = {};
for (const fingerIdx of Finger.all) {
@ -9267,8 +9290,10 @@ function analyze(keypoints3) {
return landmarks;
}
function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence)
@ -10231,7 +10256,7 @@ async function load13(instance) {
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"];
for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) {
@ -10560,7 +10585,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) {
const fingers = [];
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] });
}
if (fingers && fingers.length > 0) {
@ -12275,6 +12300,8 @@ var Human = class {
}
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, "emit", (event) => {
var _a;
@ -12287,7 +12314,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = 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.state = "idle";
__privateSet(this, _numTensors, 0);
@ -12371,7 +12402,7 @@ var Human = class {
env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) {
await validate(this);
await validate2(this);
this.emit("load");
}
const current = Math.trunc(now() - timeStamp);

View File

@ -115,6 +115,23 @@ var now = () => {
return performance.now();
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) {
const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => {
@ -4585,7 +4602,7 @@ function process2(input, config3) {
let pixels;
if (outCanvas.data) {
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) {
pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8666,7 +8683,7 @@ var HandDetector = class {
const scores = await t.scores.data();
t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]);
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 hands = [];
for (const index of nms) {
@ -8782,7 +8799,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands");
this.handDetector = handDetector;
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.skipped = 0;
this.detectedHands = 0;
@ -8898,6 +8915,8 @@ var HandPipeline = class {
}
this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands;
}
};
@ -8959,6 +8978,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope;
}
function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2)
return slopeXY;
@ -9257,6 +9278,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts
var minConfidence = 0.7;
function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3);
const landmarks = {};
for (const fingerIdx of Finger.all) {
@ -9268,8 +9291,10 @@ function analyze(keypoints3) {
return landmarks;
}
function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence)
@ -10232,7 +10257,7 @@ async function load13(instance) {
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"];
for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) {
@ -10561,7 +10586,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) {
const fingers = [];
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] });
}
if (fingers && fingers.length > 0) {
@ -12276,6 +12301,8 @@ var Human = class {
}
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, "emit", (event) => {
var _a;
@ -12288,7 +12315,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = 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.state = "idle";
__privateSet(this, _numTensors, 0);
@ -12372,7 +12403,7 @@ var Human = class {
env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) {
await validate(this);
await validate2(this);
this.emit("load");
}
const current = Math.trunc(now() - timeStamp);

47
dist/human.node.js vendored
View File

@ -114,6 +114,23 @@ var now = () => {
return performance.now();
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) {
const isObject = (obj) => obj && typeof obj === "object";
return objects.reduce((prev, obj) => {
@ -4584,7 +4601,7 @@ function process2(input, config3) {
let pixels;
if (outCanvas.data) {
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) {
pixels = tf3.browser ? tf3.browser.fromPixels(outCanvas) : null;
} else if (config3.backend === "webgl" || config3.backend === "humangl") {
@ -8665,7 +8682,7 @@ var HandDetector = class {
const scores = await t.scores.data();
t.boxes = tf11.slice(t.predictions, [0, 1], [-1, 4]);
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 hands = [];
for (const index of nms) {
@ -8781,7 +8798,7 @@ var HandPipeline = class {
__publicField(this, "detectedHands");
this.handDetector = handDetector;
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.skipped = 0;
this.detectedHands = 0;
@ -8897,6 +8914,8 @@ var HandPipeline = class {
}
this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length;
if (hands.length > config3.hand.maxDetected)
hands.length = config3.hand.maxDetected;
return hands;
}
};
@ -8958,6 +8977,8 @@ function calculateSlope(point1x, point1y, point2x, point2y) {
return slope;
}
function getSlopes(point1, point2) {
if (!point1 || !point2)
return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2)
return slopeXY;
@ -9256,6 +9277,8 @@ var gestures_default = [ThumbsUp, Victory];
// src/fingerpose/fingerpose.ts
var minConfidence = 0.7;
function analyze(keypoints3) {
if (!keypoints3 || keypoints3.length === 0)
return null;
const estimatorRes = estimate(keypoints3);
const landmarks = {};
for (const fingerIdx of Finger.all) {
@ -9267,8 +9290,10 @@ function analyze(keypoints3) {
return landmarks;
}
function match2(keypoints3) {
const estimatorRes = estimate(keypoints3);
const poses2 = [];
if (!keypoints3 || keypoints3.length === 0)
return poses2;
const estimatorRes = estimate(keypoints3);
for (const gesture3 of gestures_default) {
const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions);
if (confidence >= minConfidence)
@ -10231,7 +10256,7 @@ async function load13(instance) {
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"];
for (const defined of Object.keys(instance.models)) {
if (instance.models[defined]) {
@ -10560,7 +10585,7 @@ var hand = (res) => {
for (let i = 0; i < res.length; i++) {
const fingers = [];
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] });
}
if (fingers && fingers.length > 0) {
@ -12275,6 +12300,8 @@ var Human = class {
}
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, "emit", (event) => {
var _a;
@ -12287,7 +12314,11 @@ var Human = class {
config.backend = this.env.browser ? "humangl" : "tensorflow";
this.version = 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.state = "idle";
__privateSet(this, _numTensors, 0);
@ -12371,7 +12402,7 @@ var Human = class {
env.initial = false;
const loaded = Object.values(this.models).filter((model10) => model10).length;
if (loaded !== count2) {
await validate(this);
await validate2(this);
this.emit("load");
}
const current = Math.trunc(now() - timeStamp);

View File

@ -66,11 +66,11 @@
"@tensorflow/tfjs-layers": "^3.9.0",
"@tensorflow/tfjs-node": "^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/parser": "^4.31.1",
"@vladmandic/build": "^0.5.1",
"@vladmandic/pilogger": "^0.3.2",
"@vladmandic/build": "^0.5.2",
"@vladmandic/pilogger": "^0.3.3",
"canvas": "^2.8.0",
"dayjs": "^1.10.7",
"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])
// returns either a single scalar (2d) or array of two slopes (3d)
function getSlopes(point1, point2) {
if (!point1 || !point2) return [0, 0];
const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);
if (point1.length === 2) return slopeXY;
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;
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 landmarks = {};
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
const estimatorRes = estimator.estimate(keypoints);
const poses: Array<{ name: string, confidence: number }> = [];
if (!keypoints || keypoints.length === 0) return poses;
const estimatorRes = estimator.estimate(keypoints);
for (const gesture of Gestures) {
const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);
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++) {
const fingers: Array<{ name: string, position: number }> = [];
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) {
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();
t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);
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 hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];
for (const index of nms) {

View File

@ -22,7 +22,7 @@ export class HandPipeline {
constructor(handDetector, handPoseModel) {
this.handDetector = handDetector;
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.skipped = 0;
this.detectedHands = 0;
@ -152,6 +152,7 @@ export class HandPipeline {
}
this.storedBoxes = this.storedBoxes.filter((a) => a !== null);
this.detectedHands = hands.length;
if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;
return hands;
}
}

View File

@ -25,6 +25,23 @@ export const now = () => {
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
export function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === 'object';

View File

@ -2,7 +2,7 @@
* Human main module
*/
import { log, now, mergeDeep } from './helpers';
import { log, now, mergeDeep, validate } from './helpers';
import { Config, defaults } from './config';
import type { Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult } from './result';
import * as tf from '../dist/tfjs.esm.js';
@ -173,7 +173,10 @@ export class Human {
defaults.backend = this.env.browser ? 'humangl' : 'tensorflow';
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
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.state = 'idle';
this.#numTensors = 0;
@ -248,6 +251,12 @@ export class Human {
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
*
* @param input: {@link Input}

View File

@ -166,7 +166,7 @@ export function process(input: Input, config: Config): { tensor: Tensor | null,
let pixels;
if (outCanvas.data) { // if we have data, just convert to tensor
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
pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null;
} 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-18 19:04:52 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-18 19:04:52 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-18 19:04:52 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-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-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-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-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-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-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-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-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-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-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-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-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-18 19:05:10 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-18 19:05:41 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-18 19:05:41 INFO:  Done...
2021-09-19 13:55:00 INFO:  @vladmandic/human version 2.2.2
2021-09-19 13:55:00 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0
2021-09-19 13:55:00 INFO:  Application: {"name":"@vladmandic/human","version":"2.2.2"}
2021-09-19 13:55:00 INFO:  Environment: {"profile":"production","config":"build.json","tsconfig":true,"eslintrc":true,"git":true}
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-19 13:55:00 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
2021-09-19 13:55:00 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]}
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-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-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-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-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-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-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-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-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-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-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-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-19 13:55:18 STATE: Typings: {"input":"src/human.ts","output":"types","files":94}
2021-09-19 13:55:23 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":29,"generated":true}
2021-09-19 13:55:51 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":83,"errors":0,"warnings":0}
2021-09-19 13:55:52 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
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);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
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 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
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);
human.tf.dispose(sum);
return res;
}
@ -98,10 +100,10 @@ async function testWarmup(human, title) {
// const count = human.tf.engine().state.numTensors;
// if (count - tensors > 0) log('warn', 'failed: memory', config.warmup, title, 'tensors:', count - tensors);
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) {
@ -124,10 +126,10 @@ async function testDetect(human, input, title) {
// const count = human.tf.engine().state.numTensors;
// if (count - tensors > 0) log('warn', 'failed: memory', config.warmup, title, 'tensors:', count - tensors);
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 };
async function events(event) {
@ -144,33 +146,94 @@ async function test(Human, inputConfig) {
return;
}
const t0 = process.hrtime.bigint();
let human;
let res;
// test event emitter
human = new Human(config);
const human = new Human(config);
human.events.addEventListener('warmup', () => events('warmup'));
human.events.addEventListener('image', () => events('image'));
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
await testInstance(human);
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';
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';
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
log('info', 'test default');
human = new Human(config);
await testDetect(human, 'samples/ai-body.jpg', 'default');
human.reset();
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
log('info', 'test detectors');
config.face = { mesh: { enabled: false }, iris: { enabled: false }, hand: { landmarks: false } };
human = new Human(config);
await testDetect(human, 'samples/ai-body.jpg', 'default');
human.reset();
config.face = { mesh: { enabled: false }, iris: { enabled: false }, description: { enabled: false }, emotion: { enabled: false } };
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
log('info', 'test body variants');

View File

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

View File

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

View File

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

View File

@ -23,15 +23,18 @@ const ignoreMessages = [
'ExperimentalWarning',
];
const status = {
passed: 0,
failed: 0,
};
const status = {};
function logMessage(test, data) {
log[data[0]](test, ...data[1]);
if (data[1][0].startsWith('passed')) status.passed++;
if (data[1][0].startsWith('failed')) status.failed++;
if (!status[test]) status[test] = { passed: 0, failed: 0 };
if (log[data[0]]) {
log[data[0]](test, ...data[1]);
} else {
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) {

View File

@ -1,297 +1,426 @@
2021-09-18 19:06:19 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-18 19:06:19 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"]
2021-09-18 19:06:19 INFO: 
2021-09-18 19:06:19 INFO:  test-node.js start
2021-09-18 19:06:20 STATE: test-node.js passed: create human
2021-09-18 19:06:20 INFO:  test-node.js human version: 2.2.2
2021-09-18 19:06:20 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-18 19:06:20 INFO:  test-node.js tfjs version: 3.9.0
2021-09-18 19:06:20 STATE: test-node.js passed: set backend: tensorflow
2021-09-18 19:06:20 STATE: test-node.js tensors 573
2021-09-18 19:06:20 STATE: test-node.js passed: load models
2021-09-18 19:06:20 STATE: test-node.js result: defined models: 14 loaded models: 3
2021-09-18 19:06:20 STATE: test-node.js passed: warmup: none default
2021-09-18 19:06:20 STATE: test-node.js event: image
2021-09-18 19:06:21 STATE: test-node.js event: detect
2021-09-18 19:06:21 STATE: test-node.js event: warmup
2021-09-18 19:06:21 STATE: test-node.js passed: warmup: face default
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-18 19:06:21 DATA:  test-node.js result: performance: load: 121 total: 577
2021-09-18 19:06:21 STATE: test-node.js event: image
2021-09-18 19:06:21 STATE: test-node.js event: detect
2021-09-18 19:06:21 STATE: test-node.js event: warmup
2021-09-18 19:06:21 STATE: test-node.js passed: warmup: body default
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-18 19:06:21 DATA:  test-node.js result: performance: load: 121 total: 320
2021-09-18 19:06:21 INFO:  test-node.js test default
2021-09-18 19:06:22 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:22 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-18 19:06:22 DATA:  test-node.js result: performance: load: 0 total: 264
2021-09-18 19:06:22 INFO:  test-node.js test detectors
2021-09-18 19:06:23 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:23 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-18 19:06:23 DATA:  test-node.js result: performance: load: 1 total: 85
2021-09-18 19:06:23 INFO:  test-node.js test body variants
2021-09-18 19:06:24 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:24 STATE: test-node.js passed: detect: samples/ai-body.jpg posenet
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-18 19:06:24 DATA:  test-node.js result: performance: load: 1 total: 102
2021-09-18 19:06:25 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:25 STATE: test-node.js passed: detect: samples/ai-body.jpg movenet
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-18 19:06:25 DATA:  test-node.js result: performance: load: 1 total: 90
2021-09-18 19:06:25 STATE: test-node.js passed: detect: random default
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-18 19:06:25 DATA:  test-node.js result: performance: load: 1 total: 77
2021-09-18 19:06:25 INFO:  test-node.js test: first instance
2021-09-18 19:06:25 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:26 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:26 DATA:  test-node.js result: performance: load: 44 total: 286
2021-09-18 19:06:26 INFO:  test-node.js test: second instance
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:26 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:26 DATA:  test-node.js result: performance: load: 0 total: 73
2021-09-18 19:06:26 INFO:  test-node.js test: concurrent
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:06:26 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:06:27 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:28 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:29 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:29 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:29 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:30 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:31 STATE: test-node.js passed: detect: samples/ai-face.jpg default
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-18 19:06:31 DATA:  test-node.js result: performance: load: 1 total: 1598
2021-09-18 19:06:32 STATE: test-node.js passed: detect: samples/ai-face.jpg default
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-18 19:06:32 DATA:  test-node.js result: performance: load: 44 total: 2782
2021-09-18 19:06:32 STATE: test-node.js passed: detect: samples/ai-face.jpg default
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-18 19:06:32 DATA:  test-node.js result: performance: load: 0 total: 2839
2021-09-18 19:06:33 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-18 19:06:33 DATA:  test-node.js result: performance: load: 1 total: 3302
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-18 19:06:34 DATA:  test-node.js result: performance: load: 44 total: 4027
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-18 19:06:34 DATA:  test-node.js result: performance: load: 0 total: 4066
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:34 DATA:  test-node.js result: performance: load: 1 total: 4331
2021-09-18 19:06:34 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:34 DATA:  test-node.js result: performance: load: 44 total: 4601
2021-09-18 19:06:34 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-18 19:06:34 DATA:  test-node.js result: performance: load: 0 total: 4601
2021-09-18 19:06:34 STATE: test-node.js passeed: no memory leak
2021-09-18 19:06:34 STATE: test-node.js passeed: equal usage
2021-09-18 19:06:34 INFO:  test-node.js events: {"image":2,"detect":2,"warmup":2}
2021-09-18 19:06:34 INFO:  test-node.js test complete: 14111 ms
2021-09-18 19:06:34 INFO: 
2021-09-18 19:06:34 INFO:  test-node-gpu.js start
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-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-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-18 19:06:35 STATE: test-node-gpu.js passed: create human
2021-09-18 19:06:35 INFO:  test-node-gpu.js human version: 2.2.2
2021-09-18 19:06:35 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-18 19:06:35 INFO:  test-node-gpu.js tfjs version: 3.9.0
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: set backend: tensorflow
2021-09-18 19:06:35 STATE: test-node-gpu.js tensors 1456
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: load models
2021-09-18 19:06:35 STATE: test-node-gpu.js result: defined models: 14 loaded models: 7
2021-09-18 19:06:35 STATE: test-node-gpu.js passed: warmup: none default
2021-09-18 19:06:35 STATE: test-node-gpu.js event: image
2021-09-18 19:06:37 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:37 STATE: test-node-gpu.js event: warmup
2021-09-18 19:06:37 STATE: test-node-gpu.js passed: warmup: face default
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-18 19:06:37 DATA:  test-node-gpu.js result: performance: load: 289 total: 1125
2021-09-18 19:06:37 STATE: test-node-gpu.js event: image
2021-09-18 19:06:38 STATE: test-node-gpu.js event: detect
2021-09-18 19:06:38 STATE: test-node-gpu.js event: warmup
2021-09-18 19:06:38 STATE: test-node-gpu.js passed: warmup: body 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-18 19:06:38 DATA:  test-node-gpu.js result: performance: load: 289 total: 1084
2021-09-18 19:06:38 INFO:  test-node-gpu.js test 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-18 19:06:39 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-18 19:06:39 DATA:  test-node-gpu.js result: performance: load: 6 total: 591
2021-09-18 19:06:39 INFO:  test-node-gpu.js test detectors
2021-09-18 19:06:40 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:41 STATE: test-node-gpu.js passed: detect: samples/ai-body.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-18 19:06:41 DATA:  test-node-gpu.js result: performance: load: 2 total: 592
2021-09-18 19:06:41 INFO:  test-node-gpu.js test body variants
2021-09-18 19:06:41 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:42 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg posenet
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-18 19:06:42 DATA:  test-node-gpu.js result: performance: load: 35 total: 185
2021-09-18 19:06:42 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg movenet
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-18 19:06:43 DATA:  test-node-gpu.js result: performance: load: 35 total: 75
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: detect: random default
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-18 19:06:43 DATA:  test-node-gpu.js result: performance: load: 35 total: 155
2021-09-18 19:06:43 INFO:  test-node-gpu.js test: first instance
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:43 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:43 DATA:  test-node-gpu.js result: performance: load: 4 total: 340
2021-09-18 19:06:43 INFO:  test-node-gpu.js test: second instance
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:44 DATA:  test-node-gpu.js result: performance: load: 3 total: 230
2021-09-18 19:06:44 INFO:  test-node-gpu.js test: concurrent
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:06:44 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:06:45 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:46 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:47 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:06:47 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:47 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:48 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:06:52 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
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-18 19:06:52 DATA:  test-node-gpu.js result: performance: load: 35 total: 3949
2021-09-18 19:06:52 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
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-18 19:06:52 DATA:  test-node-gpu.js result: performance: load: 7 total: 4514
2021-09-18 19:06:53 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg 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-18 19:06:53 DATA:  test-node-gpu.js result: performance: load: 7 total: 4975
2021-09-18 19:06:53 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-18 19:06:53 DATA:  test-node-gpu.js result: performance: load: 35 total: 5373
2021-09-18 19:06:53 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-18 19:06:53 DATA:  test-node-gpu.js result: performance: load: 7 total: 5730
2021-09-18 19:06:54 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: 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-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 7 total: 5956
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-upper.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-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 35 total: 6115
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 7 total: 6200
2021-09-18 19:06:54 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-18 19:06:54 DATA:  test-node-gpu.js result: performance: load: 7 total: 6201
2021-09-18 19:06:54 STATE: test-node-gpu.js passeed: no memory leak
2021-09-18 19:06:54 STATE: test-node-gpu.js passeed: equal usage
2021-09-18 19:06:54 INFO:  test-node-gpu.js events: {"image":2,"detect":2,"warmup":2}
2021-09-18 19:06:54 INFO:  test-node-gpu.js test complete: 18686 ms
2021-09-18 19:06:54 INFO: 
2021-09-18 19:06:54 INFO:  test-node-wasm.js start
2021-09-18 19:06:54 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/
2021-09-18 19:06:54 STATE: test-node-wasm.js passed: create human
2021-09-18 19:06:54 INFO:  test-node-wasm.js human version: 2.2.2
2021-09-18 19:06:54 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-18 19:06:54 INFO:  test-node-wasm.js tfjs version: 3.9.0
2021-09-18 19:06:56 STATE: test-node-wasm.js passed: set backend: wasm
2021-09-18 19:06:56 STATE: test-node-wasm.js tensors 1189
2021-09-18 19:06:56 STATE: test-node-wasm.js passed: load models
2021-09-18 19:06:56 STATE: test-node-wasm.js result: defined models: 14 loaded models: 6
2021-09-18 19:06:56 STATE: test-node-wasm.js passed: warmup: none default
2021-09-18 19:06:57 STATE: test-node-wasm.js event: image
2021-09-18 19:06:57 STATE: test-node-wasm.js event: detect
2021-09-18 19:06:57 STATE: test-node-wasm.js event: warmup
2021-09-18 19:06:57 STATE: test-node-wasm.js passed: warmup: face default
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-18 19:06:57 DATA:  test-node-wasm.js result: performance: load: 1917 total: 1032
2021-09-18 19:07:01 STATE: test-node-wasm.js event: image
2021-09-18 19:07:02 STATE: test-node-wasm.js event: detect
2021-09-18 19:07:02 STATE: test-node-wasm.js event: warmup
2021-09-18 19:07:02 STATE: test-node-wasm.js passed: warmup: body default
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-18 19:07:02 DATA:  test-node-wasm.js result: performance: load: 1917 total: 2626
2021-09-18 19:07:02 INFO:  test-node-wasm.js test default
2021-09-18 19:07:03 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:06 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg 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-18 19:07:06 DATA:  test-node-wasm.js result: performance: load: 4 total: 2293
2021-09-18 19:07:06 INFO:  test-node-wasm.js test detectors
2021-09-18 19:07:07 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:09 STATE: test-node-wasm.js passed: detect: samples/ai-body.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-18 19:07:09 DATA:  test-node-wasm.js result: performance: load: 15 total: 2300
2021-09-18 19:07:09 INFO:  test-node-wasm.js test body variants
2021-09-18 19:07:11 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:13 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg posenet
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-18 19:07:13 DATA:  test-node-wasm.js result: performance: load: 316 total: 1938
2021-09-18 19:07:15 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:16 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg movenet
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-18 19:07:16 DATA:  test-node-wasm.js result: performance: load: 316 total: 1751
2021-09-18 19:07:18 STATE: test-node-wasm.js passed: detect: random default
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-18 19:07:18 DATA:  test-node-wasm.js result: performance: load: 316 total: 1734
2021-09-18 19:07:18 INFO:  test-node-wasm.js test: first instance
2021-09-18 19:07:19 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:07:21 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
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-18 19:07:21 DATA:  test-node-wasm.js result: performance: load: 6 total: 2225
2021-09-18 19:07:21 INFO:  test-node-wasm.js test: second instance
2021-09-18 19:07:22 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: detect: samples/ai-upper.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-18 19:07:24 DATA:  test-node-wasm.js result: performance: load: 3 total: 2260
2021-09-18 19:07:24 INFO:  test-node-wasm.js test: concurrent
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:07:24 STATE: test-node-wasm.js passed: load image: samples/ai-face.jpg [1,256,256,3]
2021-09-18 19:07:26 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:27 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:29 STATE: test-node-wasm.js passed: load image: samples/ai-body.jpg [1,1200,1200,3]
2021-09-18 19:07:30 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:07:30 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:07:31 STATE: test-node-wasm.js passed: load image: samples/ai-upper.jpg [1,720,688,3]
2021-09-18 19:07:47 STATE: test-node-wasm.js passed: detect: samples/ai-face.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-18 19:07:47 DATA:  test-node-wasm.js result: performance: load: 316 total: 15299
2021-09-18 19:07:50 STATE: test-node-wasm.js passed: detect: samples/ai-face.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-18 19:07:50 DATA:  test-node-wasm.js result: performance: load: 6 total: 19352
2021-09-18 19:07:50 STATE: test-node-wasm.js passed: detect: samples/ai-face.jpg default
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-18 19:07:50 DATA:  test-node-wasm.js result: performance: load: 3 total: 19421
2021-09-18 19:07:52 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
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-18 19:07:52 DATA:  test-node-wasm.js result: performance: load: 316 total: 21349
2021-09-18 19:07:52 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
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-18 19:07:52 DATA:  test-node-wasm.js result: performance: load: 6 total: 21394
2021-09-18 19:07:53 STATE: test-node-wasm.js passed: detect: samples/ai-body.jpg default
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-18 19:07:53 DATA:  test-node-wasm.js result: performance: load: 3 total: 22600
2021-09-18 19:07:53 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
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-18 19:07:53 DATA:  test-node-wasm.js result: performance: load: 316 total: 22621
2021-09-18 19:07:54 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
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-18 19:07:54 DATA:  test-node-wasm.js result: performance: load: 6 total: 23178
2021-09-18 19:07:54 STATE: test-node-wasm.js passed: detect: samples/ai-upper.jpg default
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-18 19:07:54 DATA:  test-node-wasm.js result: performance: load: 3 total: 23179
2021-09-18 19:07:54 STATE: test-node-wasm.js passeed: no memory leak
2021-09-18 19:07:54 STATE: test-node-wasm.js passeed: equal usage
2021-09-18 19:07:54 INFO:  test-node-wasm.js events: {"image":2,"detect":2,"warmup":2}
2021-09-18 19:07:54 INFO:  test-node-wasm.js test complete: 59343 ms
2021-09-18 19:07:54 INFO: 
2021-09-18 19:07:54 INFO:  status: {"passed":112,"failed":0}
2021-09-19 14:04:35 INFO:  @vladmandic/human version 2.2.2
2021-09-19 14:04:35 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.5.0
2021-09-19 14:04:35 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"]
2021-09-19 14:04:35 INFO: 
2021-09-19 14:04:35 INFO:  test-node.js start
2021-09-19 14:04:36 STATE: test-node.js passed: configuration default validation []
2021-09-19 14:04:36 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2021-09-19 14:04:36 STATE: test-node.js passed: create human
2021-09-19 14:04:36 INFO:  test-node.js human version: 2.2.2
2021-09-19 14:04:36 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-19 14:04:36 INFO:  test-node.js tfjs version: 3.9.0
2021-09-19 14:04:36 STATE: test-node.js passed: set backend: tensorflow
2021-09-19 14:04:36 STATE: test-node.js tensors 1456
2021-09-19 14:04:36 STATE: test-node.js passed: load models
2021-09-19 14:04:36 STATE: test-node.js result: defined models: 14 loaded models: 7
2021-09-19 14:04:36 STATE: test-node.js passed: warmup: none default
2021-09-19 14:04:36 STATE: test-node.js passed: warmup none result match
2021-09-19 14:04:36 STATE: test-node.js event: image
2021-09-19 14:04:37 STATE: test-node.js event: detect
2021-09-19 14:04:37 STATE: test-node.js event: warmup
2021-09-19 14:04:37 STATE: test-node.js passed: warmup: face default
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-19 14:04:37 DATA:  test-node.js result: performance: load: 278 total: 994
2021-09-19 14:04:37 STATE: test-node.js passed: warmup face result match
2021-09-19 14:04:37 STATE: test-node.js event: image
2021-09-19 14:04:38 STATE: test-node.js event: detect
2021-09-19 14:04:38 STATE: test-node.js event: warmup
2021-09-19 14:04:38 STATE: test-node.js passed: warmup: body 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-19 14:04:38 DATA:  test-node.js result: performance: load: 278 total: 1097
2021-09-19 14:04:38 STATE: test-node.js passed: warmup body result match
2021-09-19 14:04:38 INFO:  test-node.js test default
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-19 14:04:39 STATE: test-node.js event: image
2021-09-19 14:04:40 STATE: test-node.js event: detect
2021-09-19 14:04:40 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:04:40 DATA:  test-node.js result: performance: load: 278 total: 1050
2021-09-19 14:04:40 STATE: test-node.js passed: default result face match
2021-09-19 14:04:40 INFO:  test-node.js test object
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-19 14:04:41 STATE: test-node.js event: image
2021-09-19 14:04:42 STATE: test-node.js event: detect
2021-09-19 14:04:42 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:04:42 DATA:  test-node.js result: performance: load: 278 total: 1064
2021-09-19 14:04:42 STATE: test-node.js passed: object result match
2021-09-19 14:04:42 INFO:  test-node.js test sensitive
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-19 14:04:43 STATE: test-node.js event: image
2021-09-19 14:04:45 STATE: test-node.js event: detect
2021-09-19 14:04:45 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:04:45 DATA:  test-node.js result: performance: load: 278 total: 1706
2021-09-19 14:04:45 STATE: test-node.js passed: sensitive result match
2021-09-19 14:04:45 STATE: test-node.js passed: sensitive face result match
2021-09-19 14:04:45 STATE: test-node.js passed: sensitive body result match
2021-09-19 14:04:45 STATE: test-node.js passed: sensitive hand result match
2021-09-19 14:04:45 INFO:  test-node.js test detectors
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-19 14:04:45 STATE: test-node.js event: image
2021-09-19 14:04:46 STATE: test-node.js event: detect
2021-09-19 14:04:46 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:04:46 DATA:  test-node.js result: performance: load: 278 total: 554
2021-09-19 14:04:46 STATE: test-node.js passed: detector result face match
2021-09-19 14:04:46 STATE: test-node.js passed: detector result hand match
2021-09-19 14:04:46 INFO:  test-node.js test body variants
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-19 14:04:47 STATE: test-node.js event: image
2021-09-19 14:04:48 STATE: test-node.js event: detect
2021-09-19 14:04:48 STATE: test-node.js passed: detect: samples/ai-body.jpg posenet
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-19 14:04:48 DATA:  test-node.js result: performance: load: 278 total: 728
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-19 14:04:48 STATE: test-node.js event: image
2021-09-19 14:04:49 STATE: test-node.js event: detect
2021-09-19 14:04:49 STATE: test-node.js passed: detect: samples/ai-body.jpg movenet
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-19 14:04:49 DATA:  test-node.js result: performance: load: 278 total: 648
2021-09-19 14:04:49 STATE: test-node.js event: image
2021-09-19 14:04:50 STATE: test-node.js event: detect
2021-09-19 14:04:50 STATE: test-node.js passed: detect: random 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-19 14:04:50 DATA:  test-node.js result: performance: load: 278 total: 564
2021-09-19 14:04:50 INFO:  test-node.js test: first instance
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-19 14:04:51 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-19 14:04:51 DATA:  test-node.js result: performance: load: 2 total: 684
2021-09-19 14:04:51 INFO:  test-node.js test: second instance
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-19 14:04:52 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-19 14:04:52 DATA:  test-node.js result: performance: load: 4 total: 685
2021-09-19 14:04:52 INFO:  test-node.js test: concurrent
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-19 14:04:52 STATE: test-node.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
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-19 14:04:53 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
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-19 14:04:54 STATE: test-node.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
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-19 14:04:55 STATE: test-node.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
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-19 14:04:55 STATE: test-node.js event: image
2021-09-19 14:04:55 STATE: test-node.js event: image
2021-09-19 14:04:55 STATE: test-node.js event: image
2021-09-19 14:05:00 STATE: test-node.js event: detect
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-face.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 278 total: 5047
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-face.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5049
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-face.jpg 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-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5050
2021-09-19 14:05:00 STATE: test-node.js event: detect
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 278 total: 5044
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5044
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-body.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5045
2021-09-19 14:05:00 STATE: test-node.js event: detect
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 278 total: 5045
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5046
2021-09-19 14:05:00 STATE: test-node.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:00 DATA:  test-node.js result: performance: load: 8 total: 5046
2021-09-19 14:05:00 STATE: test-node.js passeed: no memory leak
2021-09-19 14:05:00 STATE: test-node.js passeed: equal usage
2021-09-19 14:05:00 INFO:  test-node.js events: {"image":12,"detect":12,"warmup":2}
2021-09-19 14:05:00 INFO:  test-node.js test complete: 24579 ms
2021-09-19 14:05:00 INFO: 
2021-09-19 14:05:00 INFO:  test-node-gpu.js start
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-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-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-19 14:05:01 STATE: test-node-gpu.js passed: configuration default validation []
2021-09-19 14:05:01 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2021-09-19 14:05:01 STATE: test-node-gpu.js passed: create human
2021-09-19 14:05:01 INFO:  test-node-gpu.js human version: 2.2.2
2021-09-19 14:05:01 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-19 14:05:01 INFO:  test-node-gpu.js tfjs version: 3.9.0
2021-09-19 14:05:01 STATE: test-node-gpu.js passed: set backend: tensorflow
2021-09-19 14:05:01 STATE: test-node-gpu.js tensors 1456
2021-09-19 14:05:01 STATE: test-node-gpu.js passed: load models
2021-09-19 14:05:01 STATE: test-node-gpu.js result: defined models: 14 loaded models: 7
2021-09-19 14:05:01 STATE: test-node-gpu.js passed: warmup: none default
2021-09-19 14:05:01 STATE: test-node-gpu.js passed: warmup none result match
2021-09-19 14:05:01 STATE: test-node-gpu.js event: image
2021-09-19 14:05:02 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:02 STATE: test-node-gpu.js event: warmup
2021-09-19 14:05:02 STATE: test-node-gpu.js passed: warmup: face default
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-19 14:05:02 DATA:  test-node-gpu.js result: performance: load: 282 total: 992
2021-09-19 14:05:02 STATE: test-node-gpu.js passed: warmup face result match
2021-09-19 14:05:02 STATE: test-node-gpu.js event: image
2021-09-19 14:05:03 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:03 STATE: test-node-gpu.js event: warmup
2021-09-19 14:05:03 STATE: test-node-gpu.js passed: warmup: body 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-19 14:05:03 DATA:  test-node-gpu.js result: performance: load: 282 total: 1081
2021-09-19 14:05:03 STATE: test-node-gpu.js passed: warmup body result match
2021-09-19 14:05:03 INFO:  test-node-gpu.js test default
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-19 14:05:04 STATE: test-node-gpu.js event: image
2021-09-19 14:05:05 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:05 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:05 DATA:  test-node-gpu.js result: performance: load: 282 total: 1060
2021-09-19 14:05:05 STATE: test-node-gpu.js passed: default result face match
2021-09-19 14:05:05 INFO:  test-node-gpu.js test object
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-19 14:05:06 STATE: test-node-gpu.js event: image
2021-09-19 14:05:07 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:07 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:07 DATA:  test-node-gpu.js result: performance: load: 282 total: 1122
2021-09-19 14:05:07 STATE: test-node-gpu.js passed: object result match
2021-09-19 14:05:07 INFO:  test-node-gpu.js test sensitive
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-19 14:05:08 STATE: test-node-gpu.js event: image
2021-09-19 14:05:10 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:10 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:10 DATA:  test-node-gpu.js result: performance: load: 282 total: 1754
2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive result match
2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive face result match
2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive body result match
2021-09-19 14:05:10 STATE: test-node-gpu.js passed: sensitive hand result match
2021-09-19 14:05:10 INFO:  test-node-gpu.js test detectors
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-19 14:05:11 STATE: test-node-gpu.js event: image
2021-09-19 14:05:11 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:11 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:11 DATA:  test-node-gpu.js result: performance: load: 282 total: 560
2021-09-19 14:05:11 STATE: test-node-gpu.js passed: detector result face match
2021-09-19 14:05:11 STATE: test-node-gpu.js passed: detector result hand match
2021-09-19 14:05:11 INFO:  test-node-gpu.js test body variants
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-19 14:05:12 STATE: test-node-gpu.js event: image
2021-09-19 14:05:13 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:13 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg posenet
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-19 14:05:13 DATA:  test-node-gpu.js result: performance: load: 282 total: 725
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-19 14:05:14 STATE: test-node-gpu.js event: image
2021-09-19 14:05:14 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:14 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg movenet
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-19 14:05:14 DATA:  test-node-gpu.js result: performance: load: 282 total: 636
2021-09-19 14:05:15 STATE: test-node-gpu.js event: image
2021-09-19 14:05:15 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:15 STATE: test-node-gpu.js passed: detect: random default
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-19 14:05:15 DATA:  test-node-gpu.js result: performance: load: 282 total: 600
2021-09-19 14:05:15 INFO:  test-node-gpu.js test: first instance
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-19 14:05:16 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:16 DATA:  test-node-gpu.js result: performance: load: 4 total: 679
2021-09-19 14:05:16 INFO:  test-node-gpu.js test: second instance
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-19 14:05:17 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:17 DATA:  test-node-gpu.js result: performance: load: 2 total: 616
2021-09-19 14:05:17 INFO:  test-node-gpu.js test: concurrent
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-19 14:05:17 STATE: test-node-gpu.js passed: load image: samples/ai-face.jpg [1,256,256,3] {"checksum":34696120}
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-19 14:05:18 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
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-19 14:05:20 STATE: test-node-gpu.js passed: load image: samples/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
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-19 14:05:20 STATE: test-node-gpu.js passed: load image: samples/ai-upper.jpg [1,720,688,3] {"checksum":151289040}
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-19 14:05:21 STATE: test-node-gpu.js event: image
2021-09-19 14:05:21 STATE: test-node-gpu.js event: image
2021-09-19 14:05:21 STATE: test-node-gpu.js event: image
2021-09-19 14:05:26 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 282 total: 5479
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5480
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-face.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5480
2021-09-19 14:05:26 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 282 total: 5473
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5474
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-body.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5474
2021-09-19 14:05:26 STATE: test-node-gpu.js event: detect
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 282 total: 5474
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5475
2021-09-19 14:05:26 STATE: test-node-gpu.js passed: detect: samples/ai-upper.jpg default
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-19 14:05:26 DATA:  test-node-gpu.js result: performance: load: 7 total: 5475
2021-09-19 14:05:26 STATE: test-node-gpu.js passeed: no memory leak
2021-09-19 14:05:26 STATE: test-node-gpu.js passeed: equal usage
2021-09-19 14:05:26 INFO:  test-node-gpu.js events: {"image":12,"detect":12,"warmup":2}
2021-09-19 14:05:26 INFO:  test-node-gpu.js test complete: 25122 ms
2021-09-19 14:05:26 INFO: 
2021-09-19 14:05:26 INFO:  test-node-wasm.js start
2021-09-19 14:05:27 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/
2021-09-19 14:05:27 STATE: test-node-wasm.js passed: configuration default validation []
2021-09-19 14:05:27 STATE: test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2021-09-19 14:05:27 STATE: test-node-wasm.js passed: create human
2021-09-19 14:05:27 INFO:  test-node-wasm.js human version: 2.2.2
2021-09-19 14:05:27 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.5.0
2021-09-19 14:05:27 INFO:  test-node-wasm.js tfjs version: 3.9.0
2021-09-19 14:05:29 STATE: test-node-wasm.js passed: set backend: wasm
2021-09-19 14:05:29 STATE: test-node-wasm.js tensors 1189
2021-09-19 14:05:29 STATE: test-node-wasm.js passed: load models
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>
</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></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>
</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">
@ -62,7 +62,7 @@
</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">
<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>
<ul>
<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>
</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></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>
</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>
</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>
<ul>
<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>
</ul>
</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>
<ul>
<li>Not explicitly required as any required model is load implicitly on it&#39;s first run</li>
</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></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>
</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
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></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>
<ul>
<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>
</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></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>
<ul>
<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>
</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></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>
<ul>
<li>can take significant time on startup</li>
<li>only used for <code>webgl</code> and <code>humangl</code> backends</li>
</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></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>set to 0 to disable caching</li>
</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>
<ul>
<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): {
name: string;
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 log(...msg: any[]): void;
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 const minmax: (data: Array<number>) => number[];
//# 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>);
/** @hidden */
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
*
* @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