add blazepose v2 and add annotations to body results

pull/193/head
Vladimir Mandic 2021-10-04 16:29:15 -04:00
parent 3e1160237e
commit 3e53ba4726
47 changed files with 63190 additions and 5069 deletions

View File

@ -9,8 +9,9 @@
## Changelog ## Changelog
### **HEAD -> main** 2021/10/02 mandic00@live.com ### **HEAD -> main** 2021/10/03 mandic00@live.com
- added docker notes
- breaking change: new similarity and match methods - breaking change: new similarity and match methods
- release candidate - release candidate
- tweaked default values - tweaked default values

View File

@ -31,6 +31,13 @@ import jsonView from './helpers/jsonview.js';
let human; let human;
let userConfig = { let userConfig = {
face: { enabled: false },
object: { enabled: false },
gesture: { enabled: true },
hand: { enabled: false },
body: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/blazepose-lite.json' },
segmentation: { enabled: false },
/* /*
warmup: 'none', warmup: 'none',
backend: 'humangl', backend: 'humangl',
@ -108,7 +115,7 @@ const ui = {
lastFrame: 0, // time of last frame processing lastFrame: 0, // time of last frame processing
viewportSet: false, // internal, has custom viewport been set viewportSet: false, // internal, has custom viewport been set
background: null, // holds instance of segmentation background image background: null, // holds instance of segmentation background image
exceptionHandler: true, // should capture all unhandled exceptions exceptionHandler: false, // should capture all unhandled exceptions
// webrtc // webrtc
useWebRTC: false, // use webrtc as camera source instead of local webcam useWebRTC: false, // use webrtc as camera source instead of local webcam

View File

@ -173,7 +173,7 @@ var config = {
}, },
maxDetected: -1, maxDetected: -1,
minConfidence: 0.2, minConfidence: 0.2,
skipFrames: 1 skipFrames: 5
}, },
hand: { hand: {
enabled: true, enabled: true,
@ -1177,6 +1177,8 @@ function process2(input, config3) {
tempCanvas.height = targetHeight; tempCanvas.height = targetHeight;
const tempCtx = tempCanvas.getContext("2d"); const tempCtx = tempCanvas.getContext("2d");
tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0);
console.log("PIXELS", tempCanvas);
pixels = tfjs_esm_exports.browser && env2.browser ? tfjs_esm_exports.browser.fromPixels(tempCanvas) : null;
try { try {
pixels = tfjs_esm_exports.browser && env2.browser ? tfjs_esm_exports.browser.fromPixels(tempCanvas) : null; pixels = tfjs_esm_exports.browser && env2.browser ? tfjs_esm_exports.browser.fromPixels(tempCanvas) : null;
} catch (err) { } catch (err) {
@ -8732,11 +8734,11 @@ var HandPipeline = class {
const rawCoords = await keypointsReshaped.array(); const rawCoords = await keypointsReshaped.array();
tfjs_esm_exports.dispose(keypoints3); tfjs_esm_exports.dispose(keypoints3);
tfjs_esm_exports.dispose(keypointsReshaped); tfjs_esm_exports.dispose(keypointsReshaped);
const coords4 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); const coords7 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);
const nextBoundingBox = this.getBoxForHandLandmarks(coords4); const nextBoundingBox = this.getBoxForHandLandmarks(coords7);
this.storedBoxes[i] = { ...nextBoundingBox, confidence }; this.storedBoxes[i] = { ...nextBoundingBox, confidence };
const result = { const result = {
landmarks: coords4, landmarks: coords7,
confidence, confidence,
boxConfidence: currentBox.confidence, boxConfidence: currentBox.confidence,
fingerConfidence: confidence, fingerConfidence: confidence,
@ -9163,10 +9165,10 @@ async function predict5(input, config3) {
return []; return [];
const hands = []; const hands = [];
for (let i = 0; i < predictions.length; i++) { for (let i = 0; i < predictions.length; i++) {
const annotations3 = {}; const annotations2 = {};
if (predictions[i].landmarks) { if (predictions[i].landmarks) {
for (const key of Object.keys(meshAnnotations2)) { for (const key of Object.keys(meshAnnotations2)) {
annotations3[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]); annotations2[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]);
} }
} }
const keypoints3 = predictions[i].landmarks; const keypoints3 = predictions[i].landmarks;
@ -9210,7 +9212,7 @@ async function predict5(input, config3) {
box: box4, box: box4,
boxRaw: boxRaw2, boxRaw: boxRaw2,
keypoints: keypoints3, keypoints: keypoints3,
annotations: annotations3, annotations: annotations2,
landmarks landmarks
}); });
} }
@ -9249,9 +9251,9 @@ async function load7(config3) {
} }
// src/util/box.ts // src/util/box.ts
function scale(keypoints3, boxScaleFact2, outputSize3) { function scale(keypoints3, boxScaleFact2, outputSize2) {
const coords4 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])]; const coords7 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])];
const maxmin = [Math.max(...coords4[0]), Math.min(...coords4[0]), Math.max(...coords4[1]), Math.min(...coords4[1])]; const maxmin = [Math.max(...coords7[0]), Math.min(...coords7[0]), Math.max(...coords7[1]), Math.min(...coords7[1])];
const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2]; const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2];
const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2; const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2;
const box4 = [ const box4 = [
@ -9261,10 +9263,10 @@ function scale(keypoints3, boxScaleFact2, outputSize3) {
Math.trunc(2 * diff) Math.trunc(2 * diff)
]; ];
const boxRaw2 = [ const boxRaw2 = [
box4[0] / outputSize3[0], box4[0] / outputSize2[0],
box4[1] / outputSize3[1], box4[1] / outputSize2[1],
box4[2] / outputSize3[0], box4[2] / outputSize2[0],
box4[3] / outputSize3[1] box4[3] / outputSize2[1]
]; ];
const yxBox = [ const yxBox = [
boxRaw2[1], boxRaw2[1],
@ -9452,8 +9454,17 @@ async function predict6(input, config3) {
return hands; return hands;
} }
// src/body/annotations.ts // src/body/blazepose.ts
var full = [ import {
dispose as dispose12,
div as div8,
image as image13,
loadGraphModel as loadGraphModel9,
pad
} from "@tensorflow/tfjs";
// src/body/blazeposecoords.ts
var kpt = [
"nose", "nose",
"leftEyeInside", "leftEyeInside",
"leftEye", "leftEye",
@ -9487,58 +9498,38 @@ var full = [
"rightHeel", "rightHeel",
"leftFoot", "leftFoot",
"rightFoot", "rightFoot",
"midHip", "bodyCenter",
"forehead", "bodyTop",
"leftThumb", "leftThumb",
"leftHand", "leftHand",
"rightThumb", "rightThumb",
"rightHand" "rightHand"
]; ];
var upper = [ var connected = {
"nose", leftLeg: ["leftHip", "leftKnee", "leftAnkle", "leftHeel", "leftFoot"],
"leftEyeInside", rightLeg: ["rightHip", "rightKnee", "rightAnkle", "rightHeel", "rightFoot"],
"leftEye", torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
"leftEyeOutside", leftArm: ["leftShoulder", "leftElbow", "leftWrist", "leftPalm"],
"rightEyeInside", rightArm: ["rightShoulder", "rightElbow", "rightWrist", "rightPalm"],
"rightEye", leftHand: [],
"rightEyeOutside", rightHand: [],
"leftEar", head: []
"rightEar", };
"leftMouth",
"rightMouth",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"left:15",
"right:16",
"left:17",
"right:18",
"left:19",
"right:20",
"left:21",
"right:22",
"leftChest",
"rightChest",
"neck",
"forehead",
"left:27",
"right:28",
"left:29",
"right:30"
];
// src/body/blazepose.ts // src/body/blazepose.ts
var env3 = { initial: true };
var models2 = [null, null]; var models2 = [null, null];
var outputNodes = ["ld_3d", "activation_segmentation", "activation_heatmap", "world_3d", "output_poseflag"];
var inputSize5 = [[0, 0], [0, 0]]; var inputSize5 = [[0, 0], [0, 0]];
var outputSize2 = [0, 0]; var skipped5 = Number.MAX_SAFE_INTEGER;
var outputNodes;
var cache2 = null;
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
async function loadDetect2(config3) { async function loadDetect2(config3) {
var _a; var _a, _b;
if (env2.initial) if (env3.initial)
models2[0] = null; models2[0] = null;
if (!models2[0]) { if (!models2[0] && ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "") {
models2[0] = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "")); models2[0] = await loadGraphModel9(join(config3.modelBasePath, ((_b = config3.body.detector) == null ? void 0 : _b.modelPath) || ""));
const inputs = Object.values(models2[0].modelSignature["inputs"]); const inputs = Object.values(models2[0].modelSignature["inputs"]);
inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
@ -9546,18 +9537,23 @@ async function loadDetect2(config3) {
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
log("load model:", models2[0]["modelUrl"]); log("load model:", models2[0]["modelUrl"]);
} else if (config3.debug) } else if (config3.debug && models2[0])
log("cached model:", models2[0]["modelUrl"]); log("cached model:", models2[0]["modelUrl"]);
return models2[0]; return models2[0];
} }
async function loadPose(config3) { async function loadPose(config3) {
if (env2.initial) var _a;
if (env3.initial)
models2[1] = null; models2[1] = null;
if (!models2[1]) { if (!models2[1]) {
models2[1] = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || "")); models2[1] = await loadGraphModel9(join(config3.modelBasePath, config3.body.modelPath || ""));
const inputs = Object.values(models2[1].modelSignature["inputs"]); const inputs = Object.values(models2[1].modelSignature["inputs"]);
inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
if ((_a = config3.body.modelPath) == null ? void 0 : _a.includes("lite"))
outputNodes = ["ld_3d", "output_segmentation", "output_heatmap", "world_3d", "output_poseflag"];
else
outputNodes = ["Identity", "Identity_2", "Identity_3", "Identity_4", "Identity_1"];
if (!models2[1] || !models2[1]["modelUrl"]) if (!models2[1] || !models2[1]["modelUrl"])
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
@ -9566,63 +9562,125 @@ async function loadPose(config3) {
log("cached model:", models2[1]["modelUrl"]); log("cached model:", models2[1]["modelUrl"]);
return models2[1]; return models2[1];
} }
async function detectParts(input, config3) { function calculateBoxes(keypoints3, outputSize2) {
var _a;
const t = {};
t.resize = tfjs_esm_exports.image.resizeBilinear(input, [inputSize5[1][0], inputSize5[1][1]]);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.resize, outputNodes));
const points = await t.ld.data();
const keypoints3 = [];
const labels2 = (points == null ? void 0 : points.length) === 195 ? full : upper;
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score3 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
if (score3 > (config3.body.minConfidence || 0)) {
keypoints3.push({
part: labels2[i],
position: [
Math.trunc(outputSize2[0] * points[depth * i + 0] / 255),
Math.trunc(outputSize2[1] * points[depth * i + 1] / 255),
Math.trunc(points[depth * i + 2]) + 0
],
positionRaw: [
points[depth * i + 0] / 255,
points[depth * i + 1] / 255,
points[depth * i + 2] + 0
],
score: score3
});
}
}
const x = keypoints3.map((a) => a.position[0]); const x = keypoints3.map((a) => a.position[0]);
const y = keypoints3.map((a) => a.position[1]); const y = keypoints3.map((a) => a.position[1]);
const box4 = [ const keypointsBox = [Math.min(...x), Math.min(...y), Math.max(...x) - Math.min(...x), Math.max(...y) - Math.min(...y)];
Math.min(...x), const keypointsBoxRaw = [keypointsBox[0] / outputSize2[0], keypointsBox[1] / outputSize2[1], keypointsBox[2] / outputSize2[0], keypointsBox[3] / outputSize2[1]];
Math.min(...y), return { keypointsBox, keypointsBoxRaw };
Math.max(...x) - Math.min(...x), }
Math.max(...y) - Math.min(...x) async function prepareImage(input) {
const t = {};
if (!input.shape || !input.shape[1] || !input.shape[2])
return input;
padding = [
[0, 0],
[input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0],
[input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0],
[0, 0]
]; ];
const boxRaw2 = [0, 0, 0, 0]; t.pad = pad(input, padding);
const score2 = keypoints3.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); t.resize = image13.resizeBilinear(t.pad, [inputSize5[1][0], inputSize5[1][1]]);
Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); const final = div8(t.resize, 255);
return { id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints3 }; Object.keys(t).forEach((tensor3) => dispose12(t[tensor3]));
return final;
}
function rescaleKeypoints(keypoints3, outputSize2) {
for (const kpt4 of keypoints3) {
kpt4.position = [
kpt4.position[0] * (outputSize2[0] + padding[2][0] + padding[2][1]) / outputSize2[0] - padding[2][0],
kpt4.position[1] * (outputSize2[1] + padding[1][0] + padding[1][1]) / outputSize2[1] - padding[1][0],
kpt4.position[2]
];
kpt4.positionRaw = [
kpt4.position[0] / outputSize2[0],
kpt4.position[1] / outputSize2[1],
kpt4.position[2]
];
}
return keypoints3;
}
async function detectParts(input, config3, outputSize2) {
var _a;
const t = {};
t.input = await prepareImage(input);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.input, outputNodes));
const points = await t.ld.data();
const keypointsRelative = [];
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score2 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
const positionRaw = [points[depth * i + 0] / inputSize5[1][0], points[depth * i + 1] / inputSize5[1][1], points[depth * i + 2] + 0];
const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]];
keypointsRelative.push({ part: kpt[i], positionRaw, position, score: score2 });
}
const avgScore = Math.round(100 * keypointsRelative.reduce((prev, curr) => prev += curr.score, 0) / keypointsRelative.length) / 100;
if (avgScore < (config3.body.minConfidence || 0))
return null;
const keypoints3 = rescaleKeypoints(keypointsRelative, outputSize2);
const boxes = calculateBoxes(keypoints3, [outputSize2[0], outputSize2[1]]);
Object.keys(t).forEach((tensor3) => dispose12(t[tensor3]));
const annotations2 = {};
for (const [name, indexes] of Object.entries(connected)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints3.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints3.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
return { id: 0, score: avgScore, box: boxes.keypointsBox, boxRaw: boxes.keypointsBoxRaw, keypoints: keypoints3, annotations: annotations2 };
} }
async function predict7(input, config3) { async function predict7(input, config3) {
outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
const bodies = []; if (skipped5 < (config3.body.skipFrames || 0) && config3.skipFrame) {
const body4 = await detectParts(input, config3); skipped5++;
bodies.push(body4); } else {
return bodies; cache2 = await detectParts(input, config3, outputSize2);
skipped5 = 0;
}
if (cache2)
return [cache2];
return [];
} }
// src/body/efficientposecoords.ts
var kpt2 = [
"head",
"neck",
"rightShoulder",
"rightElbow",
"rightWrist",
"chest",
"leftShoulder",
"leftElbow",
"leftWrist",
"bodyCenter",
"rightHip",
"rightKnee",
"rightAnkle",
"leftHip",
"leftKnee",
"leftAnkle"
];
var connected2 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/efficientpose.ts // src/body/efficientpose.ts
var model7; var model7;
var keypoints = []; var keypoints = [];
var box3 = [0, 0, 0, 0]; var box3 = [0, 0, 0, 0];
var boxRaw = [0, 0, 0, 0]; var boxRaw = [0, 0, 0, 0];
var score = 0; var score = 0;
var skipped5 = Number.MAX_SAFE_INTEGER; var skipped6 = Number.MAX_SAFE_INTEGER;
var bodyParts = ["head", "neck", "rightShoulder", "rightElbow", "rightWrist", "chest", "leftShoulder", "leftElbow", "leftWrist", "pelvis", "rightHip", "rightKnee", "rightAnkle", "leftHip", "leftKnee", "leftAnkle"];
async function load8(config3) { async function load8(config3) {
if (env2.initial) if (env2.initial)
model7 = null; model7 = null;
@ -9643,9 +9701,9 @@ function max2d(inputs, minScore) {
const reshaped = tfjs_esm_exports.reshape(inputs, [height * width]); const reshaped = tfjs_esm_exports.reshape(inputs, [height * width]);
const newScore = tfjs_esm_exports.max(reshaped, 0).dataSync()[0]; const newScore = tfjs_esm_exports.max(reshaped, 0).dataSync()[0];
if (newScore > minScore) { if (newScore > minScore) {
const coords4 = tfjs_esm_exports.argMax(reshaped, 0); const coordinates = tfjs_esm_exports.argMax(reshaped, 0);
const x = mod(coords4, width).dataSync()[0]; const x = mod(coordinates, width).dataSync()[0];
const y = tfjs_esm_exports.div(coords4, tfjs_esm_exports.scalar(width, "int32")).dataSync()[0]; const y = tfjs_esm_exports.div(coordinates, tfjs_esm_exports.scalar(width, "int32")).dataSync()[0];
return [x, y, newScore]; return [x, y, newScore];
} }
return [0, 0, newScore]; return [0, 0, newScore];
@ -9653,11 +9711,11 @@ function max2d(inputs, minScore) {
} }
async function predict8(image24, config3) { async function predict8(image24, config3) {
var _a; var _a;
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) { if (skipped6 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) {
skipped5++; skipped6++;
return [{ id: 0, score, box: box3, boxRaw, keypoints }]; return [{ id: 0, score, box: box3, boxRaw, keypoints, annotations: {} }];
} }
skipped5 = 0; skipped6 = 0;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
var _a2; var _a2;
const tensor3 = tfjs_esm_exports.tidy(() => { const tensor3 = tfjs_esm_exports.tidy(() => {
@ -9683,7 +9741,7 @@ async function predict8(image24, config3) {
if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) { if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
keypoints.push({ keypoints.push({
score: Math.round(100 * partScore) / 100, score: Math.round(100 * partScore) / 100,
part: bodyParts[id], part: kpt2[id],
positionRaw: [ positionRaw: [
x2 / model7.inputs[0].shape[2], x2 / model7.inputs[0].shape[2],
y2 / model7.inputs[0].shape[1] y2 / model7.inputs[0].shape[1]
@ -9714,17 +9772,56 @@ async function predict8(image24, config3) {
Math.max(...xRaw) - Math.min(...xRaw), Math.max(...xRaw) - Math.min(...xRaw),
Math.max(...yRaw) - Math.min(...yRaw) Math.max(...yRaw) - Math.min(...yRaw)
]; ];
resolve([{ id: 0, score, box: box3, boxRaw, keypoints }]); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected2)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
resolve([{ id: 0, score, box: box3, boxRaw, keypoints, annotations: annotations2 }]);
}); });
} }
// src/body/movenetcoords.ts
var kpt3 = [
"nose",
"leftEye",
"rightEye",
"leftEar",
"rightEar",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"leftWrist",
"rightWrist",
"leftHip",
"rightHip",
"leftKnee",
"rightKnee",
"leftAnkle",
"rightAnkle"
];
var connected3 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/movenet.ts // src/body/movenet.ts
var model8; var model8;
var inputSize6 = 0; var inputSize6 = 0;
var cachedBoxes = []; var cachedBoxes = [];
var skipped6 = Number.MAX_SAFE_INTEGER; var skipped7 = Number.MAX_SAFE_INTEGER;
var keypoints2 = []; var keypoints2 = [];
var bodyParts2 = ["nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle"];
async function load9(config3) { async function load9(config3) {
if (env2.initial) if (env2.initial)
model8 = null; model8 = null;
@ -9762,19 +9859,19 @@ function createBox2(points) {
return [box4, boxRaw2]; return [box4, boxRaw2];
} }
async function parseSinglePose(res, config3, image24, inputBox) { async function parseSinglePose(res, config3, image24, inputBox) {
const kpt = res[0][0]; const kpt4 = res[0][0];
keypoints2.length = 0; keypoints2.length = 0;
let score2 = 0; let score2 = 0;
for (let id = 0; id < kpt.length; id++) { for (let id = 0; id < kpt4.length; id++) {
score2 = kpt[id][2]; score2 = kpt4[id][2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[id][1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[id][1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[id][0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[id][0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
part: bodyParts2[id], part: kpt3[id],
positionRaw, positionRaw,
position: [ position: [
Math.round((image24.shape[2] || 0) * positionRaw[0]), Math.round((image24.shape[2] || 0) * positionRaw[0]),
@ -9786,25 +9883,36 @@ async function parseSinglePose(res, config3, image24, inputBox) {
score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0);
const bodies = []; const bodies = [];
const [box4, boxRaw2] = createBox2(keypoints2); const [box4, boxRaw2] = createBox2(keypoints2);
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2 }); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2, annotations: annotations2 });
return bodies; return bodies;
} }
async function parseMultiPose(res, config3, image24, inputBox) { async function parseMultiPose(res, config3, image24, inputBox) {
const bodies = []; const bodies = [];
for (let id = 0; id < res[0].length; id++) { for (let id = 0; id < res[0].length; id++) {
const kpt = res[0][id]; const kpt4 = res[0][id];
const totalScore = Math.round(100 * kpt[51 + 4]) / 100; const totalScore = Math.round(100 * kpt4[51 + 4]) / 100;
if (totalScore > config3.body.minConfidence) { if (totalScore > config3.body.minConfidence) {
keypoints2.length = 0; keypoints2.length = 0;
for (let i = 0; i < 17; i++) { for (let i = 0; i < 17; i++) {
const score2 = kpt[3 * i + 2]; const score2 = kpt4[3 * i + 2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[3 * i + 1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[3 * i + 1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[3 * i + 0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[3 * i + 0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
part: bodyParts2[i], part: kpt3[i],
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
positionRaw, positionRaw,
position: [ position: [
@ -9814,9 +9922,19 @@ async function parseMultiPose(res, config3, image24, inputBox) {
}); });
} }
} }
const boxRaw2 = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]]; const [box4, boxRaw2] = createBox2(keypoints2);
const box4 = [Math.trunc(boxRaw2[0] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[1] * (image24.shape[1] || 0)), Math.trunc(boxRaw2[2] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[3] * (image24.shape[1] || 0))]; const annotations2 = {};
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2] }); for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2], annotations: annotations2 });
} }
} }
bodies.sort((a, b) => b.score - a.score); bodies.sort((a, b) => b.score - a.score);
@ -9832,7 +9950,7 @@ async function predict9(input, config3) {
let bodies = []; let bodies = [];
if (!config3.skipFrame) if (!config3.skipFrame)
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6++; skipped7++;
for (let i = 0; i < cachedBoxes.length; i++) { for (let i = 0; i < cachedBoxes.length; i++) {
t.crop = tfjs_esm_exports.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear"); t.crop = tfjs_esm_exports.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear");
t.cast = tfjs_esm_exports.cast(t.crop, "int32"); t.cast = tfjs_esm_exports.cast(t.crop, "int32");
@ -9842,7 +9960,7 @@ async function predict9(input, config3) {
bodies = bodies.concat(newBodies); bodies = bodies.concat(newBodies);
Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3]));
} }
if (bodies.length !== config3.body.maxDetected && skipped6 > (config3.body.skipFrames || 0)) { if (bodies.length !== config3.body.maxDetected && skipped7 > (config3.body.skipFrames || 0)) {
t.resized = tfjs_esm_exports.image.resizeBilinear(input, [inputSize6, inputSize6], false); t.resized = tfjs_esm_exports.image.resizeBilinear(input, [inputSize6, inputSize6], false);
t.cast = tfjs_esm_exports.cast(t.resized, "int32"); t.cast = tfjs_esm_exports.cast(t.resized, "int32");
t.res = await (model8 == null ? void 0 : model8.predict(t.cast)); t.res = await (model8 == null ? void 0 : model8.predict(t.cast));
@ -9850,13 +9968,13 @@ async function predict9(input, config3) {
bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]); bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]);
Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3]));
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6 = 0; skipped7 = 0;
} }
if (config3.skipFrame) { if (config3.skipFrame) {
cachedBoxes.length = 0; cachedBoxes.length = 0;
for (let i = 0; i < bodies.length; i++) { for (let i = 0; i < bodies.length; i++) {
if (bodies[i].keypoints.length > 10) { if (bodies[i].keypoints.length > 10) {
const kpts = bodies[i].keypoints.map((kpt) => kpt.position); const kpts = bodies[i].keypoints.map((kpt4) => kpt4.position);
const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]); const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]);
cachedBoxes.push([...newBox.yxBox]); cachedBoxes.push([...newBox.yxBox]);
} }
@ -9953,7 +10071,7 @@ var labels = [
// src/object/nanodet.ts // src/object/nanodet.ts
var model9; var model9;
var last3 = []; var last3 = [];
var skipped7 = Number.MAX_SAFE_INTEGER; var skipped8 = Number.MAX_SAFE_INTEGER;
var scaleBox = 2.5; var scaleBox = 2.5;
async function load10(config3) { async function load10(config3) {
if (!model9 || env2.initial) { if (!model9 || env2.initial) {
@ -10032,15 +10150,15 @@ async function process3(res, inputSize8, outputShape, config3) {
return results; return results;
} }
async function predict10(image24, config3) { async function predict10(image24, config3) {
if (skipped7 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) { if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) {
skipped7++; skipped8++;
return last3; return last3;
} }
skipped7 = 0; skipped8 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last3; return last3;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [image24.shape[2], image24.shape[1]]; const outputSize2 = [image24.shape[2], image24.shape[1]];
const resize = tfjs_esm_exports.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false); const resize = tfjs_esm_exports.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false);
const norm = tfjs_esm_exports.div(resize, 255); const norm = tfjs_esm_exports.div(resize, 255);
const transpose = norm.transpose([0, 3, 1, 2]); const transpose = norm.transpose([0, 3, 1, 2]);
@ -10050,7 +10168,7 @@ async function predict10(image24, config3) {
if (config3.object.enabled) if (config3.object.enabled)
objectT = await model9.predict(transpose); objectT = await model9.predict(transpose);
tfjs_esm_exports.dispose(transpose); tfjs_esm_exports.dispose(transpose);
const obj = await process3(objectT, model9.inputSize, outputSize3, config3); const obj = await process3(objectT, model9.inputSize, outputSize2, config3);
last3 = obj; last3 = obj;
resolve(obj); resolve(obj);
}); });
@ -10060,7 +10178,7 @@ async function predict10(image24, config3) {
var model10; var model10;
var inputSize7 = 0; var inputSize7 = 0;
var last4 = []; var last4 = [];
var skipped8 = Number.MAX_SAFE_INTEGER; var skipped9 = Number.MAX_SAFE_INTEGER;
async function load11(config3) { async function load11(config3) {
if (env2.initial) if (env2.initial)
model10 = null; model10 = null;
@ -10124,19 +10242,19 @@ async function process4(res, outputShape, config3) {
return results; return results;
} }
async function predict11(input, config3) { async function predict11(input, config3) {
if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) { if (skipped9 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) {
skipped8++; skipped9++;
return last4; return last4;
} }
skipped8 = 0; skipped9 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last4; return last4;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [input.shape[2], input.shape[1]]; const outputSize2 = [input.shape[2], input.shape[1]];
const resize = tfjs_esm_exports.image.resizeBilinear(input, [inputSize7, inputSize7]); const resize = tfjs_esm_exports.image.resizeBilinear(input, [inputSize7, inputSize7]);
const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null; const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null;
tfjs_esm_exports.dispose(resize); tfjs_esm_exports.dispose(resize);
const obj = await process4(objectT, outputSize3, config3); const obj = await process4(objectT, outputSize2, config3);
last4 = obj; last4 = obj;
resolve(obj); resolve(obj);
}); });
@ -10227,7 +10345,7 @@ async function process5(input, background, config3) {
// src/gear/gear-agegenderrace.ts // src/gear/gear-agegenderrace.ts
var model12; var model12;
var skipped9 = Number.MAX_SAFE_INTEGER; var skipped10 = Number.MAX_SAFE_INTEGER;
async function load13(config3) { async function load13(config3) {
if (env2.initial) if (env2.initial)
model12 = null; model12 = null;
@ -10407,7 +10525,6 @@ async function register(instance) {
log("error: humangl:", e.type); log("error: humangl:", e.type);
log("possible browser memory leak using webgl"); log("possible browser memory leak using webgl");
instance.emit("error"); instance.emit("error");
throw new Error("browser webgl error");
}); });
config2.canvas.addEventListener("webglcontextrestored", (e) => { config2.canvas.addEventListener("webglcontextrestored", (e) => {
log("error: humangl context restored:", e); log("error: humangl context restored:", e);
@ -10542,10 +10659,8 @@ async function check(instance, force = false) {
log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);
} }
} }
if (tfjs_esm_exports.getBackend() === "humangl") { if (tfjs_esm_exports.getBackend() === "webgpu") {
tfjs_esm_exports.ENV.set("WEBGPU_USE_GLSL", true); tfjs_esm_exports.ENV.set("WEBGPU_USE_GLSL", true);
tfjs_esm_exports.ENV.set("WEBGL_PACK_DEPTHWISECONV", false);
tfjs_esm_exports.ENV.set("WEBGL_USE_SHAPES_UNIFORMS", true);
} }
tfjs_esm_exports.enableProdMode(); tfjs_esm_exports.enableProdMode();
await tfjs_esm_exports.ready(); await tfjs_esm_exports.ready();
@ -10817,109 +10932,24 @@ async function body(inCanvas2, result, drawOptions) {
ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);
} }
} }
if (localOptions.drawPoints) { if (localOptions.drawPoints && result[i].keypoints) {
for (let pt = 0; pt < result[i].keypoints.length; pt++) { for (let pt = 0; pt < result[i].keypoints.length; pt++) {
ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color; ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color;
point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);
} }
} }
if (localOptions.drawLabels) { if (localOptions.drawLabels && result[i].keypoints) {
ctx.font = localOptions.font; ctx.font = localOptions.font;
if (result[i].keypoints) { for (const pt of result[i].keypoints) {
for (const pt of result[i].keypoints) { ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color;
ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color; ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
}
} }
} }
if (localOptions.drawPolygons && result[i].keypoints) { if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {
let part; for (const part of Object.values(result[i].annotations)) {
const points = []; for (const connected4 of part)
points.length = 0; curves(ctx, connected4, localOptions);
part = result[i].keypoints.find((a) => a.part === "leftShoulder"); }
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
if (points.length === 4)
lines(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
} }
} }
} }
@ -11409,15 +11439,15 @@ function calc(newResult) {
if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length)
bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints;
const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : [];
const annotations3 = {}; const annotations2 = {};
if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length)
bufferedResult.hand[i].annotations = newResult.hand[i].annotations; bufferedResult.hand[i].annotations = newResult.hand[i].annotations;
if (newResult.hand[i].annotations) { if (newResult.hand[i].annotations) {
for (const key of Object.keys(newResult.hand[i].annotations)) { for (const key of Object.keys(newResult.hand[i].annotations)) {
annotations3[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; annotations2[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null;
} }
} }
bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations3 }; bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations2 };
} }
} }
if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) {

File diff suppressed because one or more lines are too long

58009
dist/human.esm.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

6636
dist/human.js vendored

File diff suppressed because one or more lines are too long

523
dist/human.node-gpu.js vendored
View File

@ -216,7 +216,7 @@ var config = {
}, },
maxDetected: -1, maxDetected: -1,
minConfidence: 0.2, minConfidence: 0.2,
skipFrames: 1 skipFrames: 5
}, },
hand: { hand: {
enabled: true, enabled: true,
@ -1200,6 +1200,8 @@ function process2(input, config3) {
tempCanvas.height = targetHeight; tempCanvas.height = targetHeight;
const tempCtx = tempCanvas.getContext("2d"); const tempCtx = tempCanvas.getContext("2d");
tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0);
console.log("PIXELS", tempCanvas);
pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null;
try { try {
pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null; pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null;
} catch (err) { } catch (err) {
@ -8780,11 +8782,11 @@ var HandPipeline = class {
const rawCoords = await keypointsReshaped.array(); const rawCoords = await keypointsReshaped.array();
tf12.dispose(keypoints3); tf12.dispose(keypoints3);
tf12.dispose(keypointsReshaped); tf12.dispose(keypointsReshaped);
const coords4 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); const coords7 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);
const nextBoundingBox = this.getBoxForHandLandmarks(coords4); const nextBoundingBox = this.getBoxForHandLandmarks(coords7);
this.storedBoxes[i] = { ...nextBoundingBox, confidence }; this.storedBoxes[i] = { ...nextBoundingBox, confidence };
const result = { const result = {
landmarks: coords4, landmarks: coords7,
confidence, confidence,
boxConfidence: currentBox.confidence, boxConfidence: currentBox.confidence,
fingerConfidence: confidence, fingerConfidence: confidence,
@ -9211,10 +9213,10 @@ async function predict5(input, config3) {
return []; return [];
const hands = []; const hands = [];
for (let i = 0; i < predictions.length; i++) { for (let i = 0; i < predictions.length; i++) {
const annotations3 = {}; const annotations2 = {};
if (predictions[i].landmarks) { if (predictions[i].landmarks) {
for (const key of Object.keys(meshAnnotations2)) { for (const key of Object.keys(meshAnnotations2)) {
annotations3[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]); annotations2[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]);
} }
} }
const keypoints3 = predictions[i].landmarks; const keypoints3 = predictions[i].landmarks;
@ -9258,7 +9260,7 @@ async function predict5(input, config3) {
box: box4, box: box4,
boxRaw: boxRaw2, boxRaw: boxRaw2,
keypoints: keypoints3, keypoints: keypoints3,
annotations: annotations3, annotations: annotations2,
landmarks landmarks
}); });
} }
@ -9297,9 +9299,9 @@ async function load7(config3) {
} }
// src/util/box.ts // src/util/box.ts
function scale(keypoints3, boxScaleFact2, outputSize3) { function scale(keypoints3, boxScaleFact2, outputSize2) {
const coords4 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])]; const coords7 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])];
const maxmin = [Math.max(...coords4[0]), Math.min(...coords4[0]), Math.max(...coords4[1]), Math.min(...coords4[1])]; const maxmin = [Math.max(...coords7[0]), Math.min(...coords7[0]), Math.max(...coords7[1]), Math.min(...coords7[1])];
const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2]; const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2];
const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2; const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2;
const box4 = [ const box4 = [
@ -9309,10 +9311,10 @@ function scale(keypoints3, boxScaleFact2, outputSize3) {
Math.trunc(2 * diff) Math.trunc(2 * diff)
]; ];
const boxRaw2 = [ const boxRaw2 = [
box4[0] / outputSize3[0], box4[0] / outputSize2[0],
box4[1] / outputSize3[1], box4[1] / outputSize2[1],
box4[2] / outputSize3[0], box4[2] / outputSize2[0],
box4[3] / outputSize3[1] box4[3] / outputSize2[1]
]; ];
const yxBox = [ const yxBox = [
boxRaw2[1], boxRaw2[1],
@ -9502,10 +9504,10 @@ async function predict6(input, config3) {
} }
// src/body/blazepose.ts // src/body/blazepose.ts
var tf15 = __toModule(require_tfjs_esm()); var tf15 = __toModule(require("@tensorflow/tfjs"));
// src/body/annotations.ts // src/body/blazeposecoords.ts
var full = [ var kpt = [
"nose", "nose",
"leftEyeInside", "leftEyeInside",
"leftEye", "leftEye",
@ -9539,58 +9541,38 @@ var full = [
"rightHeel", "rightHeel",
"leftFoot", "leftFoot",
"rightFoot", "rightFoot",
"midHip", "bodyCenter",
"forehead", "bodyTop",
"leftThumb", "leftThumb",
"leftHand", "leftHand",
"rightThumb", "rightThumb",
"rightHand" "rightHand"
]; ];
var upper = [ var connected = {
"nose", leftLeg: ["leftHip", "leftKnee", "leftAnkle", "leftHeel", "leftFoot"],
"leftEyeInside", rightLeg: ["rightHip", "rightKnee", "rightAnkle", "rightHeel", "rightFoot"],
"leftEye", torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
"leftEyeOutside", leftArm: ["leftShoulder", "leftElbow", "leftWrist", "leftPalm"],
"rightEyeInside", rightArm: ["rightShoulder", "rightElbow", "rightWrist", "rightPalm"],
"rightEye", leftHand: [],
"rightEyeOutside", rightHand: [],
"leftEar", head: []
"rightEar", };
"leftMouth",
"rightMouth",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"left:15",
"right:16",
"left:17",
"right:18",
"left:19",
"right:20",
"left:21",
"right:22",
"leftChest",
"rightChest",
"neck",
"forehead",
"left:27",
"right:28",
"left:29",
"right:30"
];
// src/body/blazepose.ts // src/body/blazepose.ts
var env3 = { initial: true };
var models2 = [null, null]; var models2 = [null, null];
var outputNodes = ["ld_3d", "activation_segmentation", "activation_heatmap", "world_3d", "output_poseflag"];
var inputSize5 = [[0, 0], [0, 0]]; var inputSize5 = [[0, 0], [0, 0]];
var outputSize2 = [0, 0]; var skipped5 = Number.MAX_SAFE_INTEGER;
var outputNodes;
var cache2 = null;
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
async function loadDetect2(config3) { async function loadDetect2(config3) {
var _a; var _a, _b;
if (env2.initial) if (env3.initial)
models2[0] = null; models2[0] = null;
if (!models2[0]) { if (!models2[0] && ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "") {
models2[0] = await tf15.loadGraphModel(join(config3.modelBasePath, ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "")); models2[0] = await tf15.loadGraphModel(join(config3.modelBasePath, ((_b = config3.body.detector) == null ? void 0 : _b.modelPath) || ""));
const inputs = Object.values(models2[0].modelSignature["inputs"]); const inputs = Object.values(models2[0].modelSignature["inputs"]);
inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
@ -9598,18 +9580,23 @@ async function loadDetect2(config3) {
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
log("load model:", models2[0]["modelUrl"]); log("load model:", models2[0]["modelUrl"]);
} else if (config3.debug) } else if (config3.debug && models2[0])
log("cached model:", models2[0]["modelUrl"]); log("cached model:", models2[0]["modelUrl"]);
return models2[0]; return models2[0];
} }
async function loadPose(config3) { async function loadPose(config3) {
if (env2.initial) var _a;
if (env3.initial)
models2[1] = null; models2[1] = null;
if (!models2[1]) { if (!models2[1]) {
models2[1] = await tf15.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || "")); models2[1] = await tf15.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || ""));
const inputs = Object.values(models2[1].modelSignature["inputs"]); const inputs = Object.values(models2[1].modelSignature["inputs"]);
inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
if ((_a = config3.body.modelPath) == null ? void 0 : _a.includes("lite"))
outputNodes = ["ld_3d", "output_segmentation", "output_heatmap", "world_3d", "output_poseflag"];
else
outputNodes = ["Identity", "Identity_2", "Identity_3", "Identity_4", "Identity_1"];
if (!models2[1] || !models2[1]["modelUrl"]) if (!models2[1] || !models2[1]["modelUrl"])
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
@ -9618,64 +9605,128 @@ async function loadPose(config3) {
log("cached model:", models2[1]["modelUrl"]); log("cached model:", models2[1]["modelUrl"]);
return models2[1]; return models2[1];
} }
async function detectParts(input, config3) { function calculateBoxes(keypoints3, outputSize2) {
var _a;
const t = {};
t.resize = tf15.image.resizeBilinear(input, [inputSize5[1][0], inputSize5[1][1]]);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.resize, outputNodes));
const points = await t.ld.data();
const keypoints3 = [];
const labels2 = (points == null ? void 0 : points.length) === 195 ? full : upper;
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score3 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
if (score3 > (config3.body.minConfidence || 0)) {
keypoints3.push({
part: labels2[i],
position: [
Math.trunc(outputSize2[0] * points[depth * i + 0] / 255),
Math.trunc(outputSize2[1] * points[depth * i + 1] / 255),
Math.trunc(points[depth * i + 2]) + 0
],
positionRaw: [
points[depth * i + 0] / 255,
points[depth * i + 1] / 255,
points[depth * i + 2] + 0
],
score: score3
});
}
}
const x = keypoints3.map((a) => a.position[0]); const x = keypoints3.map((a) => a.position[0]);
const y = keypoints3.map((a) => a.position[1]); const y = keypoints3.map((a) => a.position[1]);
const box4 = [ const keypointsBox = [Math.min(...x), Math.min(...y), Math.max(...x) - Math.min(...x), Math.max(...y) - Math.min(...y)];
Math.min(...x), const keypointsBoxRaw = [keypointsBox[0] / outputSize2[0], keypointsBox[1] / outputSize2[1], keypointsBox[2] / outputSize2[0], keypointsBox[3] / outputSize2[1]];
Math.min(...y), return { keypointsBox, keypointsBoxRaw };
Math.max(...x) - Math.min(...x), }
Math.max(...y) - Math.min(...x) async function prepareImage(input) {
const t = {};
if (!input.shape || !input.shape[1] || !input.shape[2])
return input;
padding = [
[0, 0],
[input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0],
[input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0],
[0, 0]
]; ];
const boxRaw2 = [0, 0, 0, 0]; t.pad = tf15.pad(input, padding);
const score2 = keypoints3.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); t.resize = tf15.image.resizeBilinear(t.pad, [inputSize5[1][0], inputSize5[1][1]]);
const final = tf15.div(t.resize, 255);
Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3]));
return { id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints3 }; return final;
}
function rescaleKeypoints(keypoints3, outputSize2) {
for (const kpt4 of keypoints3) {
kpt4.position = [
kpt4.position[0] * (outputSize2[0] + padding[2][0] + padding[2][1]) / outputSize2[0] - padding[2][0],
kpt4.position[1] * (outputSize2[1] + padding[1][0] + padding[1][1]) / outputSize2[1] - padding[1][0],
kpt4.position[2]
];
kpt4.positionRaw = [
kpt4.position[0] / outputSize2[0],
kpt4.position[1] / outputSize2[1],
kpt4.position[2]
];
}
return keypoints3;
}
async function detectParts(input, config3, outputSize2) {
var _a;
const t = {};
t.input = await prepareImage(input);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.input, outputNodes));
const points = await t.ld.data();
const keypointsRelative = [];
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score2 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
const positionRaw = [points[depth * i + 0] / inputSize5[1][0], points[depth * i + 1] / inputSize5[1][1], points[depth * i + 2] + 0];
const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]];
keypointsRelative.push({ part: kpt[i], positionRaw, position, score: score2 });
}
const avgScore = Math.round(100 * keypointsRelative.reduce((prev, curr) => prev += curr.score, 0) / keypointsRelative.length) / 100;
if (avgScore < (config3.body.minConfidence || 0))
return null;
const keypoints3 = rescaleKeypoints(keypointsRelative, outputSize2);
const boxes = calculateBoxes(keypoints3, [outputSize2[0], outputSize2[1]]);
Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3]));
const annotations2 = {};
for (const [name, indexes] of Object.entries(connected)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints3.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints3.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
return { id: 0, score: avgScore, box: boxes.keypointsBox, boxRaw: boxes.keypointsBoxRaw, keypoints: keypoints3, annotations: annotations2 };
} }
async function predict7(input, config3) { async function predict7(input, config3) {
outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
const bodies = []; if (skipped5 < (config3.body.skipFrames || 0) && config3.skipFrame) {
const body4 = await detectParts(input, config3); skipped5++;
bodies.push(body4); } else {
return bodies; cache2 = await detectParts(input, config3, outputSize2);
skipped5 = 0;
}
if (cache2)
return [cache2];
return [];
} }
// src/body/efficientpose.ts // src/body/efficientpose.ts
var tf16 = __toModule(require_tfjs_esm()); var tf16 = __toModule(require_tfjs_esm());
// src/body/efficientposecoords.ts
var kpt2 = [
"head",
"neck",
"rightShoulder",
"rightElbow",
"rightWrist",
"chest",
"leftShoulder",
"leftElbow",
"leftWrist",
"bodyCenter",
"rightHip",
"rightKnee",
"rightAnkle",
"leftHip",
"leftKnee",
"leftAnkle"
];
var connected2 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/efficientpose.ts
var model7; var model7;
var keypoints = []; var keypoints = [];
var box3 = [0, 0, 0, 0]; var box3 = [0, 0, 0, 0];
var boxRaw = [0, 0, 0, 0]; var boxRaw = [0, 0, 0, 0];
var score = 0; var score = 0;
var skipped5 = Number.MAX_SAFE_INTEGER; var skipped6 = Number.MAX_SAFE_INTEGER;
var bodyParts = ["head", "neck", "rightShoulder", "rightElbow", "rightWrist", "chest", "leftShoulder", "leftElbow", "leftWrist", "pelvis", "rightHip", "rightKnee", "rightAnkle", "leftHip", "leftKnee", "leftAnkle"];
async function load8(config3) { async function load8(config3) {
if (env2.initial) if (env2.initial)
model7 = null; model7 = null;
@ -9696,9 +9747,9 @@ function max2d(inputs, minScore) {
const reshaped = tf16.reshape(inputs, [height * width]); const reshaped = tf16.reshape(inputs, [height * width]);
const newScore = tf16.max(reshaped, 0).dataSync()[0]; const newScore = tf16.max(reshaped, 0).dataSync()[0];
if (newScore > minScore) { if (newScore > minScore) {
const coords4 = tf16.argMax(reshaped, 0); const coordinates = tf16.argMax(reshaped, 0);
const x = mod(coords4, width).dataSync()[0]; const x = mod(coordinates, width).dataSync()[0];
const y = tf16.div(coords4, tf16.scalar(width, "int32")).dataSync()[0]; const y = tf16.div(coordinates, tf16.scalar(width, "int32")).dataSync()[0];
return [x, y, newScore]; return [x, y, newScore];
} }
return [0, 0, newScore]; return [0, 0, newScore];
@ -9706,11 +9757,11 @@ function max2d(inputs, minScore) {
} }
async function predict8(image24, config3) { async function predict8(image24, config3) {
var _a; var _a;
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) { if (skipped6 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) {
skipped5++; skipped6++;
return [{ id: 0, score, box: box3, boxRaw, keypoints }]; return [{ id: 0, score, box: box3, boxRaw, keypoints, annotations: {} }];
} }
skipped5 = 0; skipped6 = 0;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
var _a2; var _a2;
const tensor3 = tf16.tidy(() => { const tensor3 = tf16.tidy(() => {
@ -9736,7 +9787,7 @@ async function predict8(image24, config3) {
if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) { if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
keypoints.push({ keypoints.push({
score: Math.round(100 * partScore) / 100, score: Math.round(100 * partScore) / 100,
part: bodyParts[id], part: kpt2[id],
positionRaw: [ positionRaw: [
x2 / model7.inputs[0].shape[2], x2 / model7.inputs[0].shape[2],
y2 / model7.inputs[0].shape[1] y2 / model7.inputs[0].shape[1]
@ -9767,18 +9818,59 @@ async function predict8(image24, config3) {
Math.max(...xRaw) - Math.min(...xRaw), Math.max(...xRaw) - Math.min(...xRaw),
Math.max(...yRaw) - Math.min(...yRaw) Math.max(...yRaw) - Math.min(...yRaw)
]; ];
resolve([{ id: 0, score, box: box3, boxRaw, keypoints }]); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected2)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
resolve([{ id: 0, score, box: box3, boxRaw, keypoints, annotations: annotations2 }]);
}); });
} }
// src/body/movenet.ts // src/body/movenet.ts
var tf17 = __toModule(require_tfjs_esm()); var tf17 = __toModule(require_tfjs_esm());
// src/body/movenetcoords.ts
var kpt3 = [
"nose",
"leftEye",
"rightEye",
"leftEar",
"rightEar",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"leftWrist",
"rightWrist",
"leftHip",
"rightHip",
"leftKnee",
"rightKnee",
"leftAnkle",
"rightAnkle"
];
var connected3 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/movenet.ts
var model8; var model8;
var inputSize6 = 0; var inputSize6 = 0;
var cachedBoxes = []; var cachedBoxes = [];
var skipped6 = Number.MAX_SAFE_INTEGER; var skipped7 = Number.MAX_SAFE_INTEGER;
var keypoints2 = []; var keypoints2 = [];
var bodyParts2 = ["nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle"];
async function load9(config3) { async function load9(config3) {
if (env2.initial) if (env2.initial)
model8 = null; model8 = null;
@ -9816,19 +9908,19 @@ function createBox2(points) {
return [box4, boxRaw2]; return [box4, boxRaw2];
} }
async function parseSinglePose(res, config3, image24, inputBox) { async function parseSinglePose(res, config3, image24, inputBox) {
const kpt = res[0][0]; const kpt4 = res[0][0];
keypoints2.length = 0; keypoints2.length = 0;
let score2 = 0; let score2 = 0;
for (let id = 0; id < kpt.length; id++) { for (let id = 0; id < kpt4.length; id++) {
score2 = kpt[id][2]; score2 = kpt4[id][2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[id][1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[id][1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[id][0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[id][0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
part: bodyParts2[id], part: kpt3[id],
positionRaw, positionRaw,
position: [ position: [
Math.round((image24.shape[2] || 0) * positionRaw[0]), Math.round((image24.shape[2] || 0) * positionRaw[0]),
@ -9840,25 +9932,36 @@ async function parseSinglePose(res, config3, image24, inputBox) {
score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0);
const bodies = []; const bodies = [];
const [box4, boxRaw2] = createBox2(keypoints2); const [box4, boxRaw2] = createBox2(keypoints2);
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2 }); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2, annotations: annotations2 });
return bodies; return bodies;
} }
async function parseMultiPose(res, config3, image24, inputBox) { async function parseMultiPose(res, config3, image24, inputBox) {
const bodies = []; const bodies = [];
for (let id = 0; id < res[0].length; id++) { for (let id = 0; id < res[0].length; id++) {
const kpt = res[0][id]; const kpt4 = res[0][id];
const totalScore = Math.round(100 * kpt[51 + 4]) / 100; const totalScore = Math.round(100 * kpt4[51 + 4]) / 100;
if (totalScore > config3.body.minConfidence) { if (totalScore > config3.body.minConfidence) {
keypoints2.length = 0; keypoints2.length = 0;
for (let i = 0; i < 17; i++) { for (let i = 0; i < 17; i++) {
const score2 = kpt[3 * i + 2]; const score2 = kpt4[3 * i + 2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[3 * i + 1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[3 * i + 1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[3 * i + 0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[3 * i + 0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
part: bodyParts2[i], part: kpt3[i],
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
positionRaw, positionRaw,
position: [ position: [
@ -9868,9 +9971,19 @@ async function parseMultiPose(res, config3, image24, inputBox) {
}); });
} }
} }
const boxRaw2 = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]]; const [box4, boxRaw2] = createBox2(keypoints2);
const box4 = [Math.trunc(boxRaw2[0] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[1] * (image24.shape[1] || 0)), Math.trunc(boxRaw2[2] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[3] * (image24.shape[1] || 0))]; const annotations2 = {};
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2] }); for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2], annotations: annotations2 });
} }
} }
bodies.sort((a, b) => b.score - a.score); bodies.sort((a, b) => b.score - a.score);
@ -9886,7 +9999,7 @@ async function predict9(input, config3) {
let bodies = []; let bodies = [];
if (!config3.skipFrame) if (!config3.skipFrame)
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6++; skipped7++;
for (let i = 0; i < cachedBoxes.length; i++) { for (let i = 0; i < cachedBoxes.length; i++) {
t.crop = tf17.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear"); t.crop = tf17.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear");
t.cast = tf17.cast(t.crop, "int32"); t.cast = tf17.cast(t.crop, "int32");
@ -9896,7 +10009,7 @@ async function predict9(input, config3) {
bodies = bodies.concat(newBodies); bodies = bodies.concat(newBodies);
Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3]));
} }
if (bodies.length !== config3.body.maxDetected && skipped6 > (config3.body.skipFrames || 0)) { if (bodies.length !== config3.body.maxDetected && skipped7 > (config3.body.skipFrames || 0)) {
t.resized = tf17.image.resizeBilinear(input, [inputSize6, inputSize6], false); t.resized = tf17.image.resizeBilinear(input, [inputSize6, inputSize6], false);
t.cast = tf17.cast(t.resized, "int32"); t.cast = tf17.cast(t.resized, "int32");
t.res = await (model8 == null ? void 0 : model8.predict(t.cast)); t.res = await (model8 == null ? void 0 : model8.predict(t.cast));
@ -9904,13 +10017,13 @@ async function predict9(input, config3) {
bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]); bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]);
Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3]));
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6 = 0; skipped7 = 0;
} }
if (config3.skipFrame) { if (config3.skipFrame) {
cachedBoxes.length = 0; cachedBoxes.length = 0;
for (let i = 0; i < bodies.length; i++) { for (let i = 0; i < bodies.length; i++) {
if (bodies[i].keypoints.length > 10) { if (bodies[i].keypoints.length > 10) {
const kpts = bodies[i].keypoints.map((kpt) => kpt.position); const kpts = bodies[i].keypoints.map((kpt4) => kpt4.position);
const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]); const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]);
cachedBoxes.push([...newBox.yxBox]); cachedBoxes.push([...newBox.yxBox]);
} }
@ -10010,7 +10123,7 @@ var labels = [
// src/object/nanodet.ts // src/object/nanodet.ts
var model9; var model9;
var last3 = []; var last3 = [];
var skipped7 = Number.MAX_SAFE_INTEGER; var skipped8 = Number.MAX_SAFE_INTEGER;
var scaleBox = 2.5; var scaleBox = 2.5;
async function load10(config3) { async function load10(config3) {
if (!model9 || env2.initial) { if (!model9 || env2.initial) {
@ -10089,15 +10202,15 @@ async function process3(res, inputSize8, outputShape, config3) {
return results; return results;
} }
async function predict10(image24, config3) { async function predict10(image24, config3) {
if (skipped7 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) { if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) {
skipped7++; skipped8++;
return last3; return last3;
} }
skipped7 = 0; skipped8 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last3; return last3;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [image24.shape[2], image24.shape[1]]; const outputSize2 = [image24.shape[2], image24.shape[1]];
const resize = tf18.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false); const resize = tf18.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false);
const norm = tf18.div(resize, 255); const norm = tf18.div(resize, 255);
const transpose = norm.transpose([0, 3, 1, 2]); const transpose = norm.transpose([0, 3, 1, 2]);
@ -10107,7 +10220,7 @@ async function predict10(image24, config3) {
if (config3.object.enabled) if (config3.object.enabled)
objectT = await model9.predict(transpose); objectT = await model9.predict(transpose);
tf18.dispose(transpose); tf18.dispose(transpose);
const obj = await process3(objectT, model9.inputSize, outputSize3, config3); const obj = await process3(objectT, model9.inputSize, outputSize2, config3);
last3 = obj; last3 = obj;
resolve(obj); resolve(obj);
}); });
@ -10118,7 +10231,7 @@ var tf19 = __toModule(require_tfjs_esm());
var model10; var model10;
var inputSize7 = 0; var inputSize7 = 0;
var last4 = []; var last4 = [];
var skipped8 = Number.MAX_SAFE_INTEGER; var skipped9 = Number.MAX_SAFE_INTEGER;
async function load11(config3) { async function load11(config3) {
if (env2.initial) if (env2.initial)
model10 = null; model10 = null;
@ -10182,19 +10295,19 @@ async function process4(res, outputShape, config3) {
return results; return results;
} }
async function predict11(input, config3) { async function predict11(input, config3) {
if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) { if (skipped9 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) {
skipped8++; skipped9++;
return last4; return last4;
} }
skipped8 = 0; skipped9 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last4; return last4;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [input.shape[2], input.shape[1]]; const outputSize2 = [input.shape[2], input.shape[1]];
const resize = tf19.image.resizeBilinear(input, [inputSize7, inputSize7]); const resize = tf19.image.resizeBilinear(input, [inputSize7, inputSize7]);
const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null; const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null;
tf19.dispose(resize); tf19.dispose(resize);
const obj = await process4(objectT, outputSize3, config3); const obj = await process4(objectT, outputSize2, config3);
last4 = obj; last4 = obj;
resolve(obj); resolve(obj);
}); });
@ -10287,7 +10400,7 @@ async function process5(input, background, config3) {
// src/gear/gear-agegenderrace.ts // src/gear/gear-agegenderrace.ts
var tf21 = __toModule(require_tfjs_esm()); var tf21 = __toModule(require_tfjs_esm());
var model12; var model12;
var skipped9 = Number.MAX_SAFE_INTEGER; var skipped10 = Number.MAX_SAFE_INTEGER;
async function load13(config3) { async function load13(config3) {
if (env2.initial) if (env2.initial)
model12 = null; model12 = null;
@ -10467,7 +10580,6 @@ async function register(instance) {
log("error: humangl:", e.type); log("error: humangl:", e.type);
log("possible browser memory leak using webgl"); log("possible browser memory leak using webgl");
instance.emit("error"); instance.emit("error");
throw new Error("browser webgl error");
}); });
config2.canvas.addEventListener("webglcontextrestored", (e) => { config2.canvas.addEventListener("webglcontextrestored", (e) => {
log("error: humangl context restored:", e); log("error: humangl context restored:", e);
@ -10603,10 +10715,8 @@ async function check(instance, force = false) {
log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);
} }
} }
if (tf23.getBackend() === "humangl") { if (tf23.getBackend() === "webgpu") {
tf23.ENV.set("WEBGPU_USE_GLSL", true); tf23.ENV.set("WEBGPU_USE_GLSL", true);
tf23.ENV.set("WEBGL_PACK_DEPTHWISECONV", false);
tf23.ENV.set("WEBGL_USE_SHAPES_UNIFORMS", true);
} }
tf23.enableProdMode(); tf23.enableProdMode();
await tf23.ready(); await tf23.ready();
@ -10878,109 +10988,24 @@ async function body(inCanvas2, result, drawOptions) {
ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);
} }
} }
if (localOptions.drawPoints) { if (localOptions.drawPoints && result[i].keypoints) {
for (let pt = 0; pt < result[i].keypoints.length; pt++) { for (let pt = 0; pt < result[i].keypoints.length; pt++) {
ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color; ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color;
point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);
} }
} }
if (localOptions.drawLabels) { if (localOptions.drawLabels && result[i].keypoints) {
ctx.font = localOptions.font; ctx.font = localOptions.font;
if (result[i].keypoints) { for (const pt of result[i].keypoints) {
for (const pt of result[i].keypoints) { ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color;
ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color; ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
}
} }
} }
if (localOptions.drawPolygons && result[i].keypoints) { if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {
let part; for (const part of Object.values(result[i].annotations)) {
const points = []; for (const connected4 of part)
points.length = 0; curves(ctx, connected4, localOptions);
part = result[i].keypoints.find((a) => a.part === "leftShoulder"); }
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
if (points.length === 4)
lines(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
} }
} }
} }
@ -11473,15 +11498,15 @@ function calc(newResult) {
if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length)
bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints;
const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : [];
const annotations3 = {}; const annotations2 = {};
if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length)
bufferedResult.hand[i].annotations = newResult.hand[i].annotations; bufferedResult.hand[i].annotations = newResult.hand[i].annotations;
if (newResult.hand[i].annotations) { if (newResult.hand[i].annotations) {
for (const key of Object.keys(newResult.hand[i].annotations)) { for (const key of Object.keys(newResult.hand[i].annotations)) {
annotations3[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; annotations2[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null;
} }
} }
bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations3 }; bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations2 };
} }
} }
if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) {

View File

@ -217,7 +217,7 @@ var config = {
}, },
maxDetected: -1, maxDetected: -1,
minConfidence: 0.2, minConfidence: 0.2,
skipFrames: 1 skipFrames: 5
}, },
hand: { hand: {
enabled: true, enabled: true,
@ -1201,6 +1201,8 @@ function process2(input, config3) {
tempCanvas.height = targetHeight; tempCanvas.height = targetHeight;
const tempCtx = tempCanvas.getContext("2d"); const tempCtx = tempCanvas.getContext("2d");
tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0);
console.log("PIXELS", tempCanvas);
pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null;
try { try {
pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null; pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null;
} catch (err) { } catch (err) {
@ -8781,11 +8783,11 @@ var HandPipeline = class {
const rawCoords = await keypointsReshaped.array(); const rawCoords = await keypointsReshaped.array();
tf12.dispose(keypoints3); tf12.dispose(keypoints3);
tf12.dispose(keypointsReshaped); tf12.dispose(keypointsReshaped);
const coords4 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); const coords7 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);
const nextBoundingBox = this.getBoxForHandLandmarks(coords4); const nextBoundingBox = this.getBoxForHandLandmarks(coords7);
this.storedBoxes[i] = { ...nextBoundingBox, confidence }; this.storedBoxes[i] = { ...nextBoundingBox, confidence };
const result = { const result = {
landmarks: coords4, landmarks: coords7,
confidence, confidence,
boxConfidence: currentBox.confidence, boxConfidence: currentBox.confidence,
fingerConfidence: confidence, fingerConfidence: confidence,
@ -9212,10 +9214,10 @@ async function predict5(input, config3) {
return []; return [];
const hands = []; const hands = [];
for (let i = 0; i < predictions.length; i++) { for (let i = 0; i < predictions.length; i++) {
const annotations3 = {}; const annotations2 = {};
if (predictions[i].landmarks) { if (predictions[i].landmarks) {
for (const key of Object.keys(meshAnnotations2)) { for (const key of Object.keys(meshAnnotations2)) {
annotations3[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]); annotations2[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]);
} }
} }
const keypoints3 = predictions[i].landmarks; const keypoints3 = predictions[i].landmarks;
@ -9259,7 +9261,7 @@ async function predict5(input, config3) {
box: box4, box: box4,
boxRaw: boxRaw2, boxRaw: boxRaw2,
keypoints: keypoints3, keypoints: keypoints3,
annotations: annotations3, annotations: annotations2,
landmarks landmarks
}); });
} }
@ -9298,9 +9300,9 @@ async function load7(config3) {
} }
// src/util/box.ts // src/util/box.ts
function scale(keypoints3, boxScaleFact2, outputSize3) { function scale(keypoints3, boxScaleFact2, outputSize2) {
const coords4 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])]; const coords7 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])];
const maxmin = [Math.max(...coords4[0]), Math.min(...coords4[0]), Math.max(...coords4[1]), Math.min(...coords4[1])]; const maxmin = [Math.max(...coords7[0]), Math.min(...coords7[0]), Math.max(...coords7[1]), Math.min(...coords7[1])];
const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2]; const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2];
const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2; const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2;
const box4 = [ const box4 = [
@ -9310,10 +9312,10 @@ function scale(keypoints3, boxScaleFact2, outputSize3) {
Math.trunc(2 * diff) Math.trunc(2 * diff)
]; ];
const boxRaw2 = [ const boxRaw2 = [
box4[0] / outputSize3[0], box4[0] / outputSize2[0],
box4[1] / outputSize3[1], box4[1] / outputSize2[1],
box4[2] / outputSize3[0], box4[2] / outputSize2[0],
box4[3] / outputSize3[1] box4[3] / outputSize2[1]
]; ];
const yxBox = [ const yxBox = [
boxRaw2[1], boxRaw2[1],
@ -9503,10 +9505,10 @@ async function predict6(input, config3) {
} }
// src/body/blazepose.ts // src/body/blazepose.ts
var tf15 = __toModule(require_tfjs_esm()); var tf15 = __toModule(require("@tensorflow/tfjs"));
// src/body/annotations.ts // src/body/blazeposecoords.ts
var full = [ var kpt = [
"nose", "nose",
"leftEyeInside", "leftEyeInside",
"leftEye", "leftEye",
@ -9540,58 +9542,38 @@ var full = [
"rightHeel", "rightHeel",
"leftFoot", "leftFoot",
"rightFoot", "rightFoot",
"midHip", "bodyCenter",
"forehead", "bodyTop",
"leftThumb", "leftThumb",
"leftHand", "leftHand",
"rightThumb", "rightThumb",
"rightHand" "rightHand"
]; ];
var upper = [ var connected = {
"nose", leftLeg: ["leftHip", "leftKnee", "leftAnkle", "leftHeel", "leftFoot"],
"leftEyeInside", rightLeg: ["rightHip", "rightKnee", "rightAnkle", "rightHeel", "rightFoot"],
"leftEye", torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
"leftEyeOutside", leftArm: ["leftShoulder", "leftElbow", "leftWrist", "leftPalm"],
"rightEyeInside", rightArm: ["rightShoulder", "rightElbow", "rightWrist", "rightPalm"],
"rightEye", leftHand: [],
"rightEyeOutside", rightHand: [],
"leftEar", head: []
"rightEar", };
"leftMouth",
"rightMouth",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"left:15",
"right:16",
"left:17",
"right:18",
"left:19",
"right:20",
"left:21",
"right:22",
"leftChest",
"rightChest",
"neck",
"forehead",
"left:27",
"right:28",
"left:29",
"right:30"
];
// src/body/blazepose.ts // src/body/blazepose.ts
var env3 = { initial: true };
var models2 = [null, null]; var models2 = [null, null];
var outputNodes = ["ld_3d", "activation_segmentation", "activation_heatmap", "world_3d", "output_poseflag"];
var inputSize5 = [[0, 0], [0, 0]]; var inputSize5 = [[0, 0], [0, 0]];
var outputSize2 = [0, 0]; var skipped5 = Number.MAX_SAFE_INTEGER;
var outputNodes;
var cache2 = null;
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
async function loadDetect2(config3) { async function loadDetect2(config3) {
var _a; var _a, _b;
if (env2.initial) if (env3.initial)
models2[0] = null; models2[0] = null;
if (!models2[0]) { if (!models2[0] && ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "") {
models2[0] = await tf15.loadGraphModel(join(config3.modelBasePath, ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "")); models2[0] = await tf15.loadGraphModel(join(config3.modelBasePath, ((_b = config3.body.detector) == null ? void 0 : _b.modelPath) || ""));
const inputs = Object.values(models2[0].modelSignature["inputs"]); const inputs = Object.values(models2[0].modelSignature["inputs"]);
inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
@ -9599,18 +9581,23 @@ async function loadDetect2(config3) {
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
log("load model:", models2[0]["modelUrl"]); log("load model:", models2[0]["modelUrl"]);
} else if (config3.debug) } else if (config3.debug && models2[0])
log("cached model:", models2[0]["modelUrl"]); log("cached model:", models2[0]["modelUrl"]);
return models2[0]; return models2[0];
} }
async function loadPose(config3) { async function loadPose(config3) {
if (env2.initial) var _a;
if (env3.initial)
models2[1] = null; models2[1] = null;
if (!models2[1]) { if (!models2[1]) {
models2[1] = await tf15.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || "")); models2[1] = await tf15.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || ""));
const inputs = Object.values(models2[1].modelSignature["inputs"]); const inputs = Object.values(models2[1].modelSignature["inputs"]);
inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
if ((_a = config3.body.modelPath) == null ? void 0 : _a.includes("lite"))
outputNodes = ["ld_3d", "output_segmentation", "output_heatmap", "world_3d", "output_poseflag"];
else
outputNodes = ["Identity", "Identity_2", "Identity_3", "Identity_4", "Identity_1"];
if (!models2[1] || !models2[1]["modelUrl"]) if (!models2[1] || !models2[1]["modelUrl"])
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
@ -9619,64 +9606,128 @@ async function loadPose(config3) {
log("cached model:", models2[1]["modelUrl"]); log("cached model:", models2[1]["modelUrl"]);
return models2[1]; return models2[1];
} }
async function detectParts(input, config3) { function calculateBoxes(keypoints3, outputSize2) {
var _a;
const t = {};
t.resize = tf15.image.resizeBilinear(input, [inputSize5[1][0], inputSize5[1][1]]);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.resize, outputNodes));
const points = await t.ld.data();
const keypoints3 = [];
const labels2 = (points == null ? void 0 : points.length) === 195 ? full : upper;
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score3 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
if (score3 > (config3.body.minConfidence || 0)) {
keypoints3.push({
part: labels2[i],
position: [
Math.trunc(outputSize2[0] * points[depth * i + 0] / 255),
Math.trunc(outputSize2[1] * points[depth * i + 1] / 255),
Math.trunc(points[depth * i + 2]) + 0
],
positionRaw: [
points[depth * i + 0] / 255,
points[depth * i + 1] / 255,
points[depth * i + 2] + 0
],
score: score3
});
}
}
const x = keypoints3.map((a) => a.position[0]); const x = keypoints3.map((a) => a.position[0]);
const y = keypoints3.map((a) => a.position[1]); const y = keypoints3.map((a) => a.position[1]);
const box4 = [ const keypointsBox = [Math.min(...x), Math.min(...y), Math.max(...x) - Math.min(...x), Math.max(...y) - Math.min(...y)];
Math.min(...x), const keypointsBoxRaw = [keypointsBox[0] / outputSize2[0], keypointsBox[1] / outputSize2[1], keypointsBox[2] / outputSize2[0], keypointsBox[3] / outputSize2[1]];
Math.min(...y), return { keypointsBox, keypointsBoxRaw };
Math.max(...x) - Math.min(...x), }
Math.max(...y) - Math.min(...x) async function prepareImage(input) {
const t = {};
if (!input.shape || !input.shape[1] || !input.shape[2])
return input;
padding = [
[0, 0],
[input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0],
[input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0],
[0, 0]
]; ];
const boxRaw2 = [0, 0, 0, 0]; t.pad = tf15.pad(input, padding);
const score2 = keypoints3.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); t.resize = tf15.image.resizeBilinear(t.pad, [inputSize5[1][0], inputSize5[1][1]]);
const final = tf15.div(t.resize, 255);
Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3]));
return { id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints3 }; return final;
}
function rescaleKeypoints(keypoints3, outputSize2) {
for (const kpt4 of keypoints3) {
kpt4.position = [
kpt4.position[0] * (outputSize2[0] + padding[2][0] + padding[2][1]) / outputSize2[0] - padding[2][0],
kpt4.position[1] * (outputSize2[1] + padding[1][0] + padding[1][1]) / outputSize2[1] - padding[1][0],
kpt4.position[2]
];
kpt4.positionRaw = [
kpt4.position[0] / outputSize2[0],
kpt4.position[1] / outputSize2[1],
kpt4.position[2]
];
}
return keypoints3;
}
async function detectParts(input, config3, outputSize2) {
var _a;
const t = {};
t.input = await prepareImage(input);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.input, outputNodes));
const points = await t.ld.data();
const keypointsRelative = [];
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score2 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
const positionRaw = [points[depth * i + 0] / inputSize5[1][0], points[depth * i + 1] / inputSize5[1][1], points[depth * i + 2] + 0];
const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]];
keypointsRelative.push({ part: kpt[i], positionRaw, position, score: score2 });
}
const avgScore = Math.round(100 * keypointsRelative.reduce((prev, curr) => prev += curr.score, 0) / keypointsRelative.length) / 100;
if (avgScore < (config3.body.minConfidence || 0))
return null;
const keypoints3 = rescaleKeypoints(keypointsRelative, outputSize2);
const boxes = calculateBoxes(keypoints3, [outputSize2[0], outputSize2[1]]);
Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3]));
const annotations2 = {};
for (const [name, indexes] of Object.entries(connected)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints3.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints3.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
return { id: 0, score: avgScore, box: boxes.keypointsBox, boxRaw: boxes.keypointsBoxRaw, keypoints: keypoints3, annotations: annotations2 };
} }
async function predict7(input, config3) { async function predict7(input, config3) {
outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
const bodies = []; if (skipped5 < (config3.body.skipFrames || 0) && config3.skipFrame) {
const body4 = await detectParts(input, config3); skipped5++;
bodies.push(body4); } else {
return bodies; cache2 = await detectParts(input, config3, outputSize2);
skipped5 = 0;
}
if (cache2)
return [cache2];
return [];
} }
// src/body/efficientpose.ts // src/body/efficientpose.ts
var tf16 = __toModule(require_tfjs_esm()); var tf16 = __toModule(require_tfjs_esm());
// src/body/efficientposecoords.ts
var kpt2 = [
"head",
"neck",
"rightShoulder",
"rightElbow",
"rightWrist",
"chest",
"leftShoulder",
"leftElbow",
"leftWrist",
"bodyCenter",
"rightHip",
"rightKnee",
"rightAnkle",
"leftHip",
"leftKnee",
"leftAnkle"
];
var connected2 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/efficientpose.ts
var model7; var model7;
var keypoints = []; var keypoints = [];
var box3 = [0, 0, 0, 0]; var box3 = [0, 0, 0, 0];
var boxRaw = [0, 0, 0, 0]; var boxRaw = [0, 0, 0, 0];
var score = 0; var score = 0;
var skipped5 = Number.MAX_SAFE_INTEGER; var skipped6 = Number.MAX_SAFE_INTEGER;
var bodyParts = ["head", "neck", "rightShoulder", "rightElbow", "rightWrist", "chest", "leftShoulder", "leftElbow", "leftWrist", "pelvis", "rightHip", "rightKnee", "rightAnkle", "leftHip", "leftKnee", "leftAnkle"];
async function load8(config3) { async function load8(config3) {
if (env2.initial) if (env2.initial)
model7 = null; model7 = null;
@ -9697,9 +9748,9 @@ function max2d(inputs, minScore) {
const reshaped = tf16.reshape(inputs, [height * width]); const reshaped = tf16.reshape(inputs, [height * width]);
const newScore = tf16.max(reshaped, 0).dataSync()[0]; const newScore = tf16.max(reshaped, 0).dataSync()[0];
if (newScore > minScore) { if (newScore > minScore) {
const coords4 = tf16.argMax(reshaped, 0); const coordinates = tf16.argMax(reshaped, 0);
const x = mod(coords4, width).dataSync()[0]; const x = mod(coordinates, width).dataSync()[0];
const y = tf16.div(coords4, tf16.scalar(width, "int32")).dataSync()[0]; const y = tf16.div(coordinates, tf16.scalar(width, "int32")).dataSync()[0];
return [x, y, newScore]; return [x, y, newScore];
} }
return [0, 0, newScore]; return [0, 0, newScore];
@ -9707,11 +9758,11 @@ function max2d(inputs, minScore) {
} }
async function predict8(image24, config3) { async function predict8(image24, config3) {
var _a; var _a;
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) { if (skipped6 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) {
skipped5++; skipped6++;
return [{ id: 0, score, box: box3, boxRaw, keypoints }]; return [{ id: 0, score, box: box3, boxRaw, keypoints, annotations: {} }];
} }
skipped5 = 0; skipped6 = 0;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
var _a2; var _a2;
const tensor3 = tf16.tidy(() => { const tensor3 = tf16.tidy(() => {
@ -9737,7 +9788,7 @@ async function predict8(image24, config3) {
if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) { if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
keypoints.push({ keypoints.push({
score: Math.round(100 * partScore) / 100, score: Math.round(100 * partScore) / 100,
part: bodyParts[id], part: kpt2[id],
positionRaw: [ positionRaw: [
x2 / model7.inputs[0].shape[2], x2 / model7.inputs[0].shape[2],
y2 / model7.inputs[0].shape[1] y2 / model7.inputs[0].shape[1]
@ -9768,18 +9819,59 @@ async function predict8(image24, config3) {
Math.max(...xRaw) - Math.min(...xRaw), Math.max(...xRaw) - Math.min(...xRaw),
Math.max(...yRaw) - Math.min(...yRaw) Math.max(...yRaw) - Math.min(...yRaw)
]; ];
resolve([{ id: 0, score, box: box3, boxRaw, keypoints }]); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected2)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
resolve([{ id: 0, score, box: box3, boxRaw, keypoints, annotations: annotations2 }]);
}); });
} }
// src/body/movenet.ts // src/body/movenet.ts
var tf17 = __toModule(require_tfjs_esm()); var tf17 = __toModule(require_tfjs_esm());
// src/body/movenetcoords.ts
var kpt3 = [
"nose",
"leftEye",
"rightEye",
"leftEar",
"rightEar",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"leftWrist",
"rightWrist",
"leftHip",
"rightHip",
"leftKnee",
"rightKnee",
"leftAnkle",
"rightAnkle"
];
var connected3 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/movenet.ts
var model8; var model8;
var inputSize6 = 0; var inputSize6 = 0;
var cachedBoxes = []; var cachedBoxes = [];
var skipped6 = Number.MAX_SAFE_INTEGER; var skipped7 = Number.MAX_SAFE_INTEGER;
var keypoints2 = []; var keypoints2 = [];
var bodyParts2 = ["nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle"];
async function load9(config3) { async function load9(config3) {
if (env2.initial) if (env2.initial)
model8 = null; model8 = null;
@ -9817,19 +9909,19 @@ function createBox2(points) {
return [box4, boxRaw2]; return [box4, boxRaw2];
} }
async function parseSinglePose(res, config3, image24, inputBox) { async function parseSinglePose(res, config3, image24, inputBox) {
const kpt = res[0][0]; const kpt4 = res[0][0];
keypoints2.length = 0; keypoints2.length = 0;
let score2 = 0; let score2 = 0;
for (let id = 0; id < kpt.length; id++) { for (let id = 0; id < kpt4.length; id++) {
score2 = kpt[id][2]; score2 = kpt4[id][2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[id][1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[id][1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[id][0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[id][0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
part: bodyParts2[id], part: kpt3[id],
positionRaw, positionRaw,
position: [ position: [
Math.round((image24.shape[2] || 0) * positionRaw[0]), Math.round((image24.shape[2] || 0) * positionRaw[0]),
@ -9841,25 +9933,36 @@ async function parseSinglePose(res, config3, image24, inputBox) {
score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0);
const bodies = []; const bodies = [];
const [box4, boxRaw2] = createBox2(keypoints2); const [box4, boxRaw2] = createBox2(keypoints2);
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2 }); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2, annotations: annotations2 });
return bodies; return bodies;
} }
async function parseMultiPose(res, config3, image24, inputBox) { async function parseMultiPose(res, config3, image24, inputBox) {
const bodies = []; const bodies = [];
for (let id = 0; id < res[0].length; id++) { for (let id = 0; id < res[0].length; id++) {
const kpt = res[0][id]; const kpt4 = res[0][id];
const totalScore = Math.round(100 * kpt[51 + 4]) / 100; const totalScore = Math.round(100 * kpt4[51 + 4]) / 100;
if (totalScore > config3.body.minConfidence) { if (totalScore > config3.body.minConfidence) {
keypoints2.length = 0; keypoints2.length = 0;
for (let i = 0; i < 17; i++) { for (let i = 0; i < 17; i++) {
const score2 = kpt[3 * i + 2]; const score2 = kpt4[3 * i + 2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[3 * i + 1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[3 * i + 1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[3 * i + 0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[3 * i + 0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
part: bodyParts2[i], part: kpt3[i],
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
positionRaw, positionRaw,
position: [ position: [
@ -9869,9 +9972,19 @@ async function parseMultiPose(res, config3, image24, inputBox) {
}); });
} }
} }
const boxRaw2 = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]]; const [box4, boxRaw2] = createBox2(keypoints2);
const box4 = [Math.trunc(boxRaw2[0] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[1] * (image24.shape[1] || 0)), Math.trunc(boxRaw2[2] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[3] * (image24.shape[1] || 0))]; const annotations2 = {};
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2] }); for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2], annotations: annotations2 });
} }
} }
bodies.sort((a, b) => b.score - a.score); bodies.sort((a, b) => b.score - a.score);
@ -9887,7 +10000,7 @@ async function predict9(input, config3) {
let bodies = []; let bodies = [];
if (!config3.skipFrame) if (!config3.skipFrame)
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6++; skipped7++;
for (let i = 0; i < cachedBoxes.length; i++) { for (let i = 0; i < cachedBoxes.length; i++) {
t.crop = tf17.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear"); t.crop = tf17.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear");
t.cast = tf17.cast(t.crop, "int32"); t.cast = tf17.cast(t.crop, "int32");
@ -9897,7 +10010,7 @@ async function predict9(input, config3) {
bodies = bodies.concat(newBodies); bodies = bodies.concat(newBodies);
Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3]));
} }
if (bodies.length !== config3.body.maxDetected && skipped6 > (config3.body.skipFrames || 0)) { if (bodies.length !== config3.body.maxDetected && skipped7 > (config3.body.skipFrames || 0)) {
t.resized = tf17.image.resizeBilinear(input, [inputSize6, inputSize6], false); t.resized = tf17.image.resizeBilinear(input, [inputSize6, inputSize6], false);
t.cast = tf17.cast(t.resized, "int32"); t.cast = tf17.cast(t.resized, "int32");
t.res = await (model8 == null ? void 0 : model8.predict(t.cast)); t.res = await (model8 == null ? void 0 : model8.predict(t.cast));
@ -9905,13 +10018,13 @@ async function predict9(input, config3) {
bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]); bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]);
Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3]));
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6 = 0; skipped7 = 0;
} }
if (config3.skipFrame) { if (config3.skipFrame) {
cachedBoxes.length = 0; cachedBoxes.length = 0;
for (let i = 0; i < bodies.length; i++) { for (let i = 0; i < bodies.length; i++) {
if (bodies[i].keypoints.length > 10) { if (bodies[i].keypoints.length > 10) {
const kpts = bodies[i].keypoints.map((kpt) => kpt.position); const kpts = bodies[i].keypoints.map((kpt4) => kpt4.position);
const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]); const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]);
cachedBoxes.push([...newBox.yxBox]); cachedBoxes.push([...newBox.yxBox]);
} }
@ -10011,7 +10124,7 @@ var labels = [
// src/object/nanodet.ts // src/object/nanodet.ts
var model9; var model9;
var last3 = []; var last3 = [];
var skipped7 = Number.MAX_SAFE_INTEGER; var skipped8 = Number.MAX_SAFE_INTEGER;
var scaleBox = 2.5; var scaleBox = 2.5;
async function load10(config3) { async function load10(config3) {
if (!model9 || env2.initial) { if (!model9 || env2.initial) {
@ -10090,15 +10203,15 @@ async function process3(res, inputSize8, outputShape, config3) {
return results; return results;
} }
async function predict10(image24, config3) { async function predict10(image24, config3) {
if (skipped7 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) { if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) {
skipped7++; skipped8++;
return last3; return last3;
} }
skipped7 = 0; skipped8 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last3; return last3;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [image24.shape[2], image24.shape[1]]; const outputSize2 = [image24.shape[2], image24.shape[1]];
const resize = tf18.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false); const resize = tf18.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false);
const norm = tf18.div(resize, 255); const norm = tf18.div(resize, 255);
const transpose = norm.transpose([0, 3, 1, 2]); const transpose = norm.transpose([0, 3, 1, 2]);
@ -10108,7 +10221,7 @@ async function predict10(image24, config3) {
if (config3.object.enabled) if (config3.object.enabled)
objectT = await model9.predict(transpose); objectT = await model9.predict(transpose);
tf18.dispose(transpose); tf18.dispose(transpose);
const obj = await process3(objectT, model9.inputSize, outputSize3, config3); const obj = await process3(objectT, model9.inputSize, outputSize2, config3);
last3 = obj; last3 = obj;
resolve(obj); resolve(obj);
}); });
@ -10119,7 +10232,7 @@ var tf19 = __toModule(require_tfjs_esm());
var model10; var model10;
var inputSize7 = 0; var inputSize7 = 0;
var last4 = []; var last4 = [];
var skipped8 = Number.MAX_SAFE_INTEGER; var skipped9 = Number.MAX_SAFE_INTEGER;
async function load11(config3) { async function load11(config3) {
if (env2.initial) if (env2.initial)
model10 = null; model10 = null;
@ -10183,19 +10296,19 @@ async function process4(res, outputShape, config3) {
return results; return results;
} }
async function predict11(input, config3) { async function predict11(input, config3) {
if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) { if (skipped9 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) {
skipped8++; skipped9++;
return last4; return last4;
} }
skipped8 = 0; skipped9 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last4; return last4;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [input.shape[2], input.shape[1]]; const outputSize2 = [input.shape[2], input.shape[1]];
const resize = tf19.image.resizeBilinear(input, [inputSize7, inputSize7]); const resize = tf19.image.resizeBilinear(input, [inputSize7, inputSize7]);
const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null; const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null;
tf19.dispose(resize); tf19.dispose(resize);
const obj = await process4(objectT, outputSize3, config3); const obj = await process4(objectT, outputSize2, config3);
last4 = obj; last4 = obj;
resolve(obj); resolve(obj);
}); });
@ -10288,7 +10401,7 @@ async function process5(input, background, config3) {
// src/gear/gear-agegenderrace.ts // src/gear/gear-agegenderrace.ts
var tf21 = __toModule(require_tfjs_esm()); var tf21 = __toModule(require_tfjs_esm());
var model12; var model12;
var skipped9 = Number.MAX_SAFE_INTEGER; var skipped10 = Number.MAX_SAFE_INTEGER;
async function load13(config3) { async function load13(config3) {
if (env2.initial) if (env2.initial)
model12 = null; model12 = null;
@ -10468,7 +10581,6 @@ async function register(instance) {
log("error: humangl:", e.type); log("error: humangl:", e.type);
log("possible browser memory leak using webgl"); log("possible browser memory leak using webgl");
instance.emit("error"); instance.emit("error");
throw new Error("browser webgl error");
}); });
config2.canvas.addEventListener("webglcontextrestored", (e) => { config2.canvas.addEventListener("webglcontextrestored", (e) => {
log("error: humangl context restored:", e); log("error: humangl context restored:", e);
@ -10604,10 +10716,8 @@ async function check(instance, force = false) {
log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);
} }
} }
if (tf23.getBackend() === "humangl") { if (tf23.getBackend() === "webgpu") {
tf23.ENV.set("WEBGPU_USE_GLSL", true); tf23.ENV.set("WEBGPU_USE_GLSL", true);
tf23.ENV.set("WEBGL_PACK_DEPTHWISECONV", false);
tf23.ENV.set("WEBGL_USE_SHAPES_UNIFORMS", true);
} }
tf23.enableProdMode(); tf23.enableProdMode();
await tf23.ready(); await tf23.ready();
@ -10879,109 +10989,24 @@ async function body(inCanvas2, result, drawOptions) {
ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);
} }
} }
if (localOptions.drawPoints) { if (localOptions.drawPoints && result[i].keypoints) {
for (let pt = 0; pt < result[i].keypoints.length; pt++) { for (let pt = 0; pt < result[i].keypoints.length; pt++) {
ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color; ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color;
point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);
} }
} }
if (localOptions.drawLabels) { if (localOptions.drawLabels && result[i].keypoints) {
ctx.font = localOptions.font; ctx.font = localOptions.font;
if (result[i].keypoints) { for (const pt of result[i].keypoints) {
for (const pt of result[i].keypoints) { ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color;
ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color; ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
}
} }
} }
if (localOptions.drawPolygons && result[i].keypoints) { if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {
let part; for (const part of Object.values(result[i].annotations)) {
const points = []; for (const connected4 of part)
points.length = 0; curves(ctx, connected4, localOptions);
part = result[i].keypoints.find((a) => a.part === "leftShoulder"); }
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
if (points.length === 4)
lines(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
} }
} }
} }
@ -11474,15 +11499,15 @@ function calc(newResult) {
if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length)
bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints;
const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : [];
const annotations3 = {}; const annotations2 = {};
if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length)
bufferedResult.hand[i].annotations = newResult.hand[i].annotations; bufferedResult.hand[i].annotations = newResult.hand[i].annotations;
if (newResult.hand[i].annotations) { if (newResult.hand[i].annotations) {
for (const key of Object.keys(newResult.hand[i].annotations)) { for (const key of Object.keys(newResult.hand[i].annotations)) {
annotations3[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; annotations2[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null;
} }
} }
bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations3 }; bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations2 };
} }
} }
if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) {

523
dist/human.node.js vendored
View File

@ -216,7 +216,7 @@ var config = {
}, },
maxDetected: -1, maxDetected: -1,
minConfidence: 0.2, minConfidence: 0.2,
skipFrames: 1 skipFrames: 5
}, },
hand: { hand: {
enabled: true, enabled: true,
@ -1200,6 +1200,8 @@ function process2(input, config3) {
tempCanvas.height = targetHeight; tempCanvas.height = targetHeight;
const tempCtx = tempCanvas.getContext("2d"); const tempCtx = tempCanvas.getContext("2d");
tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0);
console.log("PIXELS", tempCanvas);
pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null;
try { try {
pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null; pixels = tf2.browser && env2.browser ? tf2.browser.fromPixels(tempCanvas) : null;
} catch (err) { } catch (err) {
@ -8780,11 +8782,11 @@ var HandPipeline = class {
const rawCoords = await keypointsReshaped.array(); const rawCoords = await keypointsReshaped.array();
tf12.dispose(keypoints3); tf12.dispose(keypoints3);
tf12.dispose(keypointsReshaped); tf12.dispose(keypointsReshaped);
const coords4 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); const coords7 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);
const nextBoundingBox = this.getBoxForHandLandmarks(coords4); const nextBoundingBox = this.getBoxForHandLandmarks(coords7);
this.storedBoxes[i] = { ...nextBoundingBox, confidence }; this.storedBoxes[i] = { ...nextBoundingBox, confidence };
const result = { const result = {
landmarks: coords4, landmarks: coords7,
confidence, confidence,
boxConfidence: currentBox.confidence, boxConfidence: currentBox.confidence,
fingerConfidence: confidence, fingerConfidence: confidence,
@ -9211,10 +9213,10 @@ async function predict5(input, config3) {
return []; return [];
const hands = []; const hands = [];
for (let i = 0; i < predictions.length; i++) { for (let i = 0; i < predictions.length; i++) {
const annotations3 = {}; const annotations2 = {};
if (predictions[i].landmarks) { if (predictions[i].landmarks) {
for (const key of Object.keys(meshAnnotations2)) { for (const key of Object.keys(meshAnnotations2)) {
annotations3[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]); annotations2[key] = meshAnnotations2[key].map((index) => predictions[i].landmarks[index]);
} }
} }
const keypoints3 = predictions[i].landmarks; const keypoints3 = predictions[i].landmarks;
@ -9258,7 +9260,7 @@ async function predict5(input, config3) {
box: box4, box: box4,
boxRaw: boxRaw2, boxRaw: boxRaw2,
keypoints: keypoints3, keypoints: keypoints3,
annotations: annotations3, annotations: annotations2,
landmarks landmarks
}); });
} }
@ -9297,9 +9299,9 @@ async function load7(config3) {
} }
// src/util/box.ts // src/util/box.ts
function scale(keypoints3, boxScaleFact2, outputSize3) { function scale(keypoints3, boxScaleFact2, outputSize2) {
const coords4 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])]; const coords7 = [keypoints3.map((pt) => pt[0]), keypoints3.map((pt) => pt[1])];
const maxmin = [Math.max(...coords4[0]), Math.min(...coords4[0]), Math.max(...coords4[1]), Math.min(...coords4[1])]; const maxmin = [Math.max(...coords7[0]), Math.min(...coords7[0]), Math.max(...coords7[1]), Math.min(...coords7[1])];
const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2]; const center = [(maxmin[0] + maxmin[1]) / 2, (maxmin[2] + maxmin[3]) / 2];
const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2; const diff = Math.max(center[0] - maxmin[1], center[1] - maxmin[3], -center[0] + maxmin[0], -center[1] + maxmin[2]) * boxScaleFact2;
const box4 = [ const box4 = [
@ -9309,10 +9311,10 @@ function scale(keypoints3, boxScaleFact2, outputSize3) {
Math.trunc(2 * diff) Math.trunc(2 * diff)
]; ];
const boxRaw2 = [ const boxRaw2 = [
box4[0] / outputSize3[0], box4[0] / outputSize2[0],
box4[1] / outputSize3[1], box4[1] / outputSize2[1],
box4[2] / outputSize3[0], box4[2] / outputSize2[0],
box4[3] / outputSize3[1] box4[3] / outputSize2[1]
]; ];
const yxBox = [ const yxBox = [
boxRaw2[1], boxRaw2[1],
@ -9502,10 +9504,10 @@ async function predict6(input, config3) {
} }
// src/body/blazepose.ts // src/body/blazepose.ts
var tf15 = __toModule(require_tfjs_esm()); var tf15 = __toModule(require("@tensorflow/tfjs"));
// src/body/annotations.ts // src/body/blazeposecoords.ts
var full = [ var kpt = [
"nose", "nose",
"leftEyeInside", "leftEyeInside",
"leftEye", "leftEye",
@ -9539,58 +9541,38 @@ var full = [
"rightHeel", "rightHeel",
"leftFoot", "leftFoot",
"rightFoot", "rightFoot",
"midHip", "bodyCenter",
"forehead", "bodyTop",
"leftThumb", "leftThumb",
"leftHand", "leftHand",
"rightThumb", "rightThumb",
"rightHand" "rightHand"
]; ];
var upper = [ var connected = {
"nose", leftLeg: ["leftHip", "leftKnee", "leftAnkle", "leftHeel", "leftFoot"],
"leftEyeInside", rightLeg: ["rightHip", "rightKnee", "rightAnkle", "rightHeel", "rightFoot"],
"leftEye", torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
"leftEyeOutside", leftArm: ["leftShoulder", "leftElbow", "leftWrist", "leftPalm"],
"rightEyeInside", rightArm: ["rightShoulder", "rightElbow", "rightWrist", "rightPalm"],
"rightEye", leftHand: [],
"rightEyeOutside", rightHand: [],
"leftEar", head: []
"rightEar", };
"leftMouth",
"rightMouth",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"left:15",
"right:16",
"left:17",
"right:18",
"left:19",
"right:20",
"left:21",
"right:22",
"leftChest",
"rightChest",
"neck",
"forehead",
"left:27",
"right:28",
"left:29",
"right:30"
];
// src/body/blazepose.ts // src/body/blazepose.ts
var env3 = { initial: true };
var models2 = [null, null]; var models2 = [null, null];
var outputNodes = ["ld_3d", "activation_segmentation", "activation_heatmap", "world_3d", "output_poseflag"];
var inputSize5 = [[0, 0], [0, 0]]; var inputSize5 = [[0, 0], [0, 0]];
var outputSize2 = [0, 0]; var skipped5 = Number.MAX_SAFE_INTEGER;
var outputNodes;
var cache2 = null;
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
async function loadDetect2(config3) { async function loadDetect2(config3) {
var _a; var _a, _b;
if (env2.initial) if (env3.initial)
models2[0] = null; models2[0] = null;
if (!models2[0]) { if (!models2[0] && ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "") {
models2[0] = await tf15.loadGraphModel(join(config3.modelBasePath, ((_a = config3.body.detector) == null ? void 0 : _a.modelPath) || "")); models2[0] = await tf15.loadGraphModel(join(config3.modelBasePath, ((_b = config3.body.detector) == null ? void 0 : _b.modelPath) || ""));
const inputs = Object.values(models2[0].modelSignature["inputs"]); const inputs = Object.values(models2[0].modelSignature["inputs"]);
inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
@ -9598,18 +9580,23 @@ async function loadDetect2(config3) {
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
log("load model:", models2[0]["modelUrl"]); log("load model:", models2[0]["modelUrl"]);
} else if (config3.debug) } else if (config3.debug && models2[0])
log("cached model:", models2[0]["modelUrl"]); log("cached model:", models2[0]["modelUrl"]);
return models2[0]; return models2[0];
} }
async function loadPose(config3) { async function loadPose(config3) {
if (env2.initial) var _a;
if (env3.initial)
models2[1] = null; models2[1] = null;
if (!models2[1]) { if (!models2[1]) {
models2[1] = await tf15.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || "")); models2[1] = await tf15.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath || ""));
const inputs = Object.values(models2[1].modelSignature["inputs"]); const inputs = Object.values(models2[1].modelSignature["inputs"]);
inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize5[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize5[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
if ((_a = config3.body.modelPath) == null ? void 0 : _a.includes("lite"))
outputNodes = ["ld_3d", "output_segmentation", "output_heatmap", "world_3d", "output_poseflag"];
else
outputNodes = ["Identity", "Identity_2", "Identity_3", "Identity_4", "Identity_1"];
if (!models2[1] || !models2[1]["modelUrl"]) if (!models2[1] || !models2[1]["modelUrl"])
log("load model failed:", config3.object.modelPath); log("load model failed:", config3.object.modelPath);
else if (config3.debug) else if (config3.debug)
@ -9618,64 +9605,128 @@ async function loadPose(config3) {
log("cached model:", models2[1]["modelUrl"]); log("cached model:", models2[1]["modelUrl"]);
return models2[1]; return models2[1];
} }
async function detectParts(input, config3) { function calculateBoxes(keypoints3, outputSize2) {
var _a;
const t = {};
t.resize = tf15.image.resizeBilinear(input, [inputSize5[1][0], inputSize5[1][1]]);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.resize, outputNodes));
const points = await t.ld.data();
const keypoints3 = [];
const labels2 = (points == null ? void 0 : points.length) === 195 ? full : upper;
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score3 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
if (score3 > (config3.body.minConfidence || 0)) {
keypoints3.push({
part: labels2[i],
position: [
Math.trunc(outputSize2[0] * points[depth * i + 0] / 255),
Math.trunc(outputSize2[1] * points[depth * i + 1] / 255),
Math.trunc(points[depth * i + 2]) + 0
],
positionRaw: [
points[depth * i + 0] / 255,
points[depth * i + 1] / 255,
points[depth * i + 2] + 0
],
score: score3
});
}
}
const x = keypoints3.map((a) => a.position[0]); const x = keypoints3.map((a) => a.position[0]);
const y = keypoints3.map((a) => a.position[1]); const y = keypoints3.map((a) => a.position[1]);
const box4 = [ const keypointsBox = [Math.min(...x), Math.min(...y), Math.max(...x) - Math.min(...x), Math.max(...y) - Math.min(...y)];
Math.min(...x), const keypointsBoxRaw = [keypointsBox[0] / outputSize2[0], keypointsBox[1] / outputSize2[1], keypointsBox[2] / outputSize2[0], keypointsBox[3] / outputSize2[1]];
Math.min(...y), return { keypointsBox, keypointsBoxRaw };
Math.max(...x) - Math.min(...x), }
Math.max(...y) - Math.min(...x) async function prepareImage(input) {
const t = {};
if (!input.shape || !input.shape[1] || !input.shape[2])
return input;
padding = [
[0, 0],
[input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0],
[input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0],
[0, 0]
]; ];
const boxRaw2 = [0, 0, 0, 0]; t.pad = tf15.pad(input, padding);
const score2 = keypoints3.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); t.resize = tf15.image.resizeBilinear(t.pad, [inputSize5[1][0], inputSize5[1][1]]);
const final = tf15.div(t.resize, 255);
Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3]));
return { id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints3 }; return final;
}
function rescaleKeypoints(keypoints3, outputSize2) {
for (const kpt4 of keypoints3) {
kpt4.position = [
kpt4.position[0] * (outputSize2[0] + padding[2][0] + padding[2][1]) / outputSize2[0] - padding[2][0],
kpt4.position[1] * (outputSize2[1] + padding[1][0] + padding[1][1]) / outputSize2[1] - padding[1][0],
kpt4.position[2]
];
kpt4.positionRaw = [
kpt4.position[0] / outputSize2[0],
kpt4.position[1] / outputSize2[1],
kpt4.position[2]
];
}
return keypoints3;
}
async function detectParts(input, config3, outputSize2) {
var _a;
const t = {};
t.input = await prepareImage(input);
[t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = await ((_a = models2[1]) == null ? void 0 : _a.execute(t.input, outputNodes));
const points = await t.ld.data();
const keypointsRelative = [];
const depth = 5;
for (let i = 0; i < points.length / depth; i++) {
const score2 = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100;
const positionRaw = [points[depth * i + 0] / inputSize5[1][0], points[depth * i + 1] / inputSize5[1][1], points[depth * i + 2] + 0];
const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]];
keypointsRelative.push({ part: kpt[i], positionRaw, position, score: score2 });
}
const avgScore = Math.round(100 * keypointsRelative.reduce((prev, curr) => prev += curr.score, 0) / keypointsRelative.length) / 100;
if (avgScore < (config3.body.minConfidence || 0))
return null;
const keypoints3 = rescaleKeypoints(keypointsRelative, outputSize2);
const boxes = calculateBoxes(keypoints3, [outputSize2[0], outputSize2[1]]);
Object.keys(t).forEach((tensor3) => tf15.dispose(t[tensor3]));
const annotations2 = {};
for (const [name, indexes] of Object.entries(connected)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints3.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints3.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
return { id: 0, score: avgScore, box: boxes.keypointsBox, boxRaw: boxes.keypointsBoxRaw, keypoints: keypoints3, annotations: annotations2 };
} }
async function predict7(input, config3) { async function predict7(input, config3) {
outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
const bodies = []; if (skipped5 < (config3.body.skipFrames || 0) && config3.skipFrame) {
const body4 = await detectParts(input, config3); skipped5++;
bodies.push(body4); } else {
return bodies; cache2 = await detectParts(input, config3, outputSize2);
skipped5 = 0;
}
if (cache2)
return [cache2];
return [];
} }
// src/body/efficientpose.ts // src/body/efficientpose.ts
var tf16 = __toModule(require_tfjs_esm()); var tf16 = __toModule(require_tfjs_esm());
// src/body/efficientposecoords.ts
var kpt2 = [
"head",
"neck",
"rightShoulder",
"rightElbow",
"rightWrist",
"chest",
"leftShoulder",
"leftElbow",
"leftWrist",
"bodyCenter",
"rightHip",
"rightKnee",
"rightAnkle",
"leftHip",
"leftKnee",
"leftAnkle"
];
var connected2 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/efficientpose.ts
var model7; var model7;
var keypoints = []; var keypoints = [];
var box3 = [0, 0, 0, 0]; var box3 = [0, 0, 0, 0];
var boxRaw = [0, 0, 0, 0]; var boxRaw = [0, 0, 0, 0];
var score = 0; var score = 0;
var skipped5 = Number.MAX_SAFE_INTEGER; var skipped6 = Number.MAX_SAFE_INTEGER;
var bodyParts = ["head", "neck", "rightShoulder", "rightElbow", "rightWrist", "chest", "leftShoulder", "leftElbow", "leftWrist", "pelvis", "rightHip", "rightKnee", "rightAnkle", "leftHip", "leftKnee", "leftAnkle"];
async function load8(config3) { async function load8(config3) {
if (env2.initial) if (env2.initial)
model7 = null; model7 = null;
@ -9696,9 +9747,9 @@ function max2d(inputs, minScore) {
const reshaped = tf16.reshape(inputs, [height * width]); const reshaped = tf16.reshape(inputs, [height * width]);
const newScore = tf16.max(reshaped, 0).dataSync()[0]; const newScore = tf16.max(reshaped, 0).dataSync()[0];
if (newScore > minScore) { if (newScore > minScore) {
const coords4 = tf16.argMax(reshaped, 0); const coordinates = tf16.argMax(reshaped, 0);
const x = mod(coords4, width).dataSync()[0]; const x = mod(coordinates, width).dataSync()[0];
const y = tf16.div(coords4, tf16.scalar(width, "int32")).dataSync()[0]; const y = tf16.div(coordinates, tf16.scalar(width, "int32")).dataSync()[0];
return [x, y, newScore]; return [x, y, newScore];
} }
return [0, 0, newScore]; return [0, 0, newScore];
@ -9706,11 +9757,11 @@ function max2d(inputs, minScore) {
} }
async function predict8(image24, config3) { async function predict8(image24, config3) {
var _a; var _a;
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) { if (skipped6 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(keypoints).length > 0) {
skipped5++; skipped6++;
return [{ id: 0, score, box: box3, boxRaw, keypoints }]; return [{ id: 0, score, box: box3, boxRaw, keypoints, annotations: {} }];
} }
skipped5 = 0; skipped6 = 0;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
var _a2; var _a2;
const tensor3 = tf16.tidy(() => { const tensor3 = tf16.tidy(() => {
@ -9736,7 +9787,7 @@ async function predict8(image24, config3) {
if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) { if (score > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
keypoints.push({ keypoints.push({
score: Math.round(100 * partScore) / 100, score: Math.round(100 * partScore) / 100,
part: bodyParts[id], part: kpt2[id],
positionRaw: [ positionRaw: [
x2 / model7.inputs[0].shape[2], x2 / model7.inputs[0].shape[2],
y2 / model7.inputs[0].shape[1] y2 / model7.inputs[0].shape[1]
@ -9767,18 +9818,59 @@ async function predict8(image24, config3) {
Math.max(...xRaw) - Math.min(...xRaw), Math.max(...xRaw) - Math.min(...xRaw),
Math.max(...yRaw) - Math.min(...yRaw) Math.max(...yRaw) - Math.min(...yRaw)
]; ];
resolve([{ id: 0, score, box: box3, boxRaw, keypoints }]); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected2)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]);
const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
resolve([{ id: 0, score, box: box3, boxRaw, keypoints, annotations: annotations2 }]);
}); });
} }
// src/body/movenet.ts // src/body/movenet.ts
var tf17 = __toModule(require_tfjs_esm()); var tf17 = __toModule(require_tfjs_esm());
// src/body/movenetcoords.ts
var kpt3 = [
"nose",
"leftEye",
"rightEye",
"leftEar",
"rightEar",
"leftShoulder",
"rightShoulder",
"leftElbow",
"rightElbow",
"leftWrist",
"rightWrist",
"leftHip",
"rightHip",
"leftKnee",
"rightKnee",
"leftAnkle",
"rightAnkle"
];
var connected3 = {
leftLeg: ["leftHip", "leftKnee", "leftAnkle"],
rightLeg: ["rightHip", "rightKnee", "rightAnkle"],
torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"],
leftArm: ["leftShoulder", "leftElbow", "leftWrist"],
rightArm: ["rightShoulder", "rightElbow", "rightWrist"],
head: []
};
// src/body/movenet.ts
var model8; var model8;
var inputSize6 = 0; var inputSize6 = 0;
var cachedBoxes = []; var cachedBoxes = [];
var skipped6 = Number.MAX_SAFE_INTEGER; var skipped7 = Number.MAX_SAFE_INTEGER;
var keypoints2 = []; var keypoints2 = [];
var bodyParts2 = ["nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle"];
async function load9(config3) { async function load9(config3) {
if (env2.initial) if (env2.initial)
model8 = null; model8 = null;
@ -9816,19 +9908,19 @@ function createBox2(points) {
return [box4, boxRaw2]; return [box4, boxRaw2];
} }
async function parseSinglePose(res, config3, image24, inputBox) { async function parseSinglePose(res, config3, image24, inputBox) {
const kpt = res[0][0]; const kpt4 = res[0][0];
keypoints2.length = 0; keypoints2.length = 0;
let score2 = 0; let score2 = 0;
for (let id = 0; id < kpt.length; id++) { for (let id = 0; id < kpt4.length; id++) {
score2 = kpt[id][2]; score2 = kpt4[id][2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[id][1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[id][1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[id][0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[id][0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
part: bodyParts2[id], part: kpt3[id],
positionRaw, positionRaw,
position: [ position: [
Math.round((image24.shape[2] || 0) * positionRaw[0]), Math.round((image24.shape[2] || 0) * positionRaw[0]),
@ -9840,25 +9932,36 @@ async function parseSinglePose(res, config3, image24, inputBox) {
score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0);
const bodies = []; const bodies = [];
const [box4, boxRaw2] = createBox2(keypoints2); const [box4, boxRaw2] = createBox2(keypoints2);
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2 }); const annotations2 = {};
for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id: 0, score: score2, box: box4, boxRaw: boxRaw2, keypoints: keypoints2, annotations: annotations2 });
return bodies; return bodies;
} }
async function parseMultiPose(res, config3, image24, inputBox) { async function parseMultiPose(res, config3, image24, inputBox) {
const bodies = []; const bodies = [];
for (let id = 0; id < res[0].length; id++) { for (let id = 0; id < res[0].length; id++) {
const kpt = res[0][id]; const kpt4 = res[0][id];
const totalScore = Math.round(100 * kpt[51 + 4]) / 100; const totalScore = Math.round(100 * kpt4[51 + 4]) / 100;
if (totalScore > config3.body.minConfidence) { if (totalScore > config3.body.minConfidence) {
keypoints2.length = 0; keypoints2.length = 0;
for (let i = 0; i < 17; i++) { for (let i = 0; i < 17; i++) {
const score2 = kpt[3 * i + 2]; const score2 = kpt4[3 * i + 2];
if (score2 > config3.body.minConfidence) { if (score2 > config3.body.minConfidence) {
const positionRaw = [ const positionRaw = [
(inputBox[3] - inputBox[1]) * kpt[3 * i + 1] + inputBox[1], (inputBox[3] - inputBox[1]) * kpt4[3 * i + 1] + inputBox[1],
(inputBox[2] - inputBox[0]) * kpt[3 * i + 0] + inputBox[0] (inputBox[2] - inputBox[0]) * kpt4[3 * i + 0] + inputBox[0]
]; ];
keypoints2.push({ keypoints2.push({
part: bodyParts2[i], part: kpt3[i],
score: Math.round(100 * score2) / 100, score: Math.round(100 * score2) / 100,
positionRaw, positionRaw,
position: [ position: [
@ -9868,9 +9971,19 @@ async function parseMultiPose(res, config3, image24, inputBox) {
}); });
} }
} }
const boxRaw2 = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]]; const [box4, boxRaw2] = createBox2(keypoints2);
const box4 = [Math.trunc(boxRaw2[0] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[1] * (image24.shape[1] || 0)), Math.trunc(boxRaw2[2] * (image24.shape[2] || 0)), Math.trunc(boxRaw2[3] * (image24.shape[1] || 0))]; const annotations2 = {};
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2] }); for (const [name, indexes] of Object.entries(connected3)) {
const pt = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints2.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints2.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0))
pt.push([pt0.position, pt1.position]);
}
annotations2[name] = pt;
}
bodies.push({ id, score: totalScore, boxRaw: boxRaw2, box: box4, keypoints: [...keypoints2], annotations: annotations2 });
} }
} }
bodies.sort((a, b) => b.score - a.score); bodies.sort((a, b) => b.score - a.score);
@ -9886,7 +9999,7 @@ async function predict9(input, config3) {
let bodies = []; let bodies = [];
if (!config3.skipFrame) if (!config3.skipFrame)
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6++; skipped7++;
for (let i = 0; i < cachedBoxes.length; i++) { for (let i = 0; i < cachedBoxes.length; i++) {
t.crop = tf17.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear"); t.crop = tf17.image.cropAndResize(input, [cachedBoxes[i]], [0], [inputSize6, inputSize6], "bilinear");
t.cast = tf17.cast(t.crop, "int32"); t.cast = tf17.cast(t.crop, "int32");
@ -9896,7 +10009,7 @@ async function predict9(input, config3) {
bodies = bodies.concat(newBodies); bodies = bodies.concat(newBodies);
Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3]));
} }
if (bodies.length !== config3.body.maxDetected && skipped6 > (config3.body.skipFrames || 0)) { if (bodies.length !== config3.body.maxDetected && skipped7 > (config3.body.skipFrames || 0)) {
t.resized = tf17.image.resizeBilinear(input, [inputSize6, inputSize6], false); t.resized = tf17.image.resizeBilinear(input, [inputSize6, inputSize6], false);
t.cast = tf17.cast(t.resized, "int32"); t.cast = tf17.cast(t.resized, "int32");
t.res = await (model8 == null ? void 0 : model8.predict(t.cast)); t.res = await (model8 == null ? void 0 : model8.predict(t.cast));
@ -9904,13 +10017,13 @@ async function predict9(input, config3) {
bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]); bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input, [0, 0, 1, 1]) : await parseMultiPose(res, config3, input, [0, 0, 1, 1]);
Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3])); Object.keys(t).forEach((tensor3) => tf17.dispose(t[tensor3]));
cachedBoxes.length = 0; cachedBoxes.length = 0;
skipped6 = 0; skipped7 = 0;
} }
if (config3.skipFrame) { if (config3.skipFrame) {
cachedBoxes.length = 0; cachedBoxes.length = 0;
for (let i = 0; i < bodies.length; i++) { for (let i = 0; i < bodies.length; i++) {
if (bodies[i].keypoints.length > 10) { if (bodies[i].keypoints.length > 10) {
const kpts = bodies[i].keypoints.map((kpt) => kpt.position); const kpts = bodies[i].keypoints.map((kpt4) => kpt4.position);
const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]); const newBox = scale(kpts, 1.5, [input.shape[2], input.shape[1]]);
cachedBoxes.push([...newBox.yxBox]); cachedBoxes.push([...newBox.yxBox]);
} }
@ -10010,7 +10123,7 @@ var labels = [
// src/object/nanodet.ts // src/object/nanodet.ts
var model9; var model9;
var last3 = []; var last3 = [];
var skipped7 = Number.MAX_SAFE_INTEGER; var skipped8 = Number.MAX_SAFE_INTEGER;
var scaleBox = 2.5; var scaleBox = 2.5;
async function load10(config3) { async function load10(config3) {
if (!model9 || env2.initial) { if (!model9 || env2.initial) {
@ -10089,15 +10202,15 @@ async function process3(res, inputSize8, outputShape, config3) {
return results; return results;
} }
async function predict10(image24, config3) { async function predict10(image24, config3) {
if (skipped7 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) { if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last3.length > 0) {
skipped7++; skipped8++;
return last3; return last3;
} }
skipped7 = 0; skipped8 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last3; return last3;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [image24.shape[2], image24.shape[1]]; const outputSize2 = [image24.shape[2], image24.shape[1]];
const resize = tf18.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false); const resize = tf18.image.resizeBilinear(image24, [model9.inputSize, model9.inputSize], false);
const norm = tf18.div(resize, 255); const norm = tf18.div(resize, 255);
const transpose = norm.transpose([0, 3, 1, 2]); const transpose = norm.transpose([0, 3, 1, 2]);
@ -10107,7 +10220,7 @@ async function predict10(image24, config3) {
if (config3.object.enabled) if (config3.object.enabled)
objectT = await model9.predict(transpose); objectT = await model9.predict(transpose);
tf18.dispose(transpose); tf18.dispose(transpose);
const obj = await process3(objectT, model9.inputSize, outputSize3, config3); const obj = await process3(objectT, model9.inputSize, outputSize2, config3);
last3 = obj; last3 = obj;
resolve(obj); resolve(obj);
}); });
@ -10118,7 +10231,7 @@ var tf19 = __toModule(require_tfjs_esm());
var model10; var model10;
var inputSize7 = 0; var inputSize7 = 0;
var last4 = []; var last4 = [];
var skipped8 = Number.MAX_SAFE_INTEGER; var skipped9 = Number.MAX_SAFE_INTEGER;
async function load11(config3) { async function load11(config3) {
if (env2.initial) if (env2.initial)
model10 = null; model10 = null;
@ -10182,19 +10295,19 @@ async function process4(res, outputShape, config3) {
return results; return results;
} }
async function predict11(input, config3) { async function predict11(input, config3) {
if (skipped8 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) { if (skipped9 < (config3.object.skipFrames || 0) && config3.skipFrame && last4.length > 0) {
skipped8++; skipped9++;
return last4; return last4;
} }
skipped8 = 0; skipped9 = 0;
if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense")) if (!env2.kernels.includes("mod") || !env2.kernels.includes("sparsetodense"))
return last4; return last4;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize3 = [input.shape[2], input.shape[1]]; const outputSize2 = [input.shape[2], input.shape[1]];
const resize = tf19.image.resizeBilinear(input, [inputSize7, inputSize7]); const resize = tf19.image.resizeBilinear(input, [inputSize7, inputSize7]);
const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null; const objectT = config3.object.enabled ? model10 == null ? void 0 : model10.execute(resize, ["tower_0/detections"]) : null;
tf19.dispose(resize); tf19.dispose(resize);
const obj = await process4(objectT, outputSize3, config3); const obj = await process4(objectT, outputSize2, config3);
last4 = obj; last4 = obj;
resolve(obj); resolve(obj);
}); });
@ -10287,7 +10400,7 @@ async function process5(input, background, config3) {
// src/gear/gear-agegenderrace.ts // src/gear/gear-agegenderrace.ts
var tf21 = __toModule(require_tfjs_esm()); var tf21 = __toModule(require_tfjs_esm());
var model12; var model12;
var skipped9 = Number.MAX_SAFE_INTEGER; var skipped10 = Number.MAX_SAFE_INTEGER;
async function load13(config3) { async function load13(config3) {
if (env2.initial) if (env2.initial)
model12 = null; model12 = null;
@ -10467,7 +10580,6 @@ async function register(instance) {
log("error: humangl:", e.type); log("error: humangl:", e.type);
log("possible browser memory leak using webgl"); log("possible browser memory leak using webgl");
instance.emit("error"); instance.emit("error");
throw new Error("browser webgl error");
}); });
config2.canvas.addEventListener("webglcontextrestored", (e) => { config2.canvas.addEventListener("webglcontextrestored", (e) => {
log("error: humangl context restored:", e); log("error: humangl context restored:", e);
@ -10603,10 +10715,8 @@ async function check(instance, force = false) {
log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);
} }
} }
if (tf23.getBackend() === "humangl") { if (tf23.getBackend() === "webgpu") {
tf23.ENV.set("WEBGPU_USE_GLSL", true); tf23.ENV.set("WEBGPU_USE_GLSL", true);
tf23.ENV.set("WEBGL_PACK_DEPTHWISECONV", false);
tf23.ENV.set("WEBGL_USE_SHAPES_UNIFORMS", true);
} }
tf23.enableProdMode(); tf23.enableProdMode();
await tf23.ready(); await tf23.ready();
@ -10878,109 +10988,24 @@ async function body(inCanvas2, result, drawOptions) {
ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);
} }
} }
if (localOptions.drawPoints) { if (localOptions.drawPoints && result[i].keypoints) {
for (let pt = 0; pt < result[i].keypoints.length; pt++) { for (let pt = 0; pt < result[i].keypoints.length; pt++) {
ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color; ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color;
point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);
} }
} }
if (localOptions.drawLabels) { if (localOptions.drawLabels && result[i].keypoints) {
ctx.font = localOptions.font; ctx.font = localOptions.font;
if (result[i].keypoints) { for (const pt of result[i].keypoints) {
for (const pt of result[i].keypoints) { ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color;
ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color; ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
}
} }
} }
if (localOptions.drawPolygons && result[i].keypoints) { if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {
let part; for (const part of Object.values(result[i].annotations)) {
const points = []; for (const connected4 of part)
points.length = 0; curves(ctx, connected4, localOptions);
part = result[i].keypoints.find((a) => a.part === "leftShoulder"); }
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
if (points.length === 4)
lines(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightHip");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightKnee");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightAnkle");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightHeel");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightFoot");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "leftShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "leftPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
points.length = 0;
part = result[i].keypoints.find((a) => a.part === "rightShoulder");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightElbow");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightWrist");
if (part)
points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === "rightPalm");
if (part)
points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
} }
} }
} }
@ -11473,15 +11498,15 @@ function calc(newResult) {
if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length)
bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints;
const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; const keypoints3 = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : [];
const annotations3 = {}; const annotations2 = {};
if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length)
bufferedResult.hand[i].annotations = newResult.hand[i].annotations; bufferedResult.hand[i].annotations = newResult.hand[i].annotations;
if (newResult.hand[i].annotations) { if (newResult.hand[i].annotations) {
for (const key of Object.keys(newResult.hand[i].annotations)) { for (const key of Object.keys(newResult.hand[i].annotations)) {
annotations3[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; annotations2[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null;
} }
} }
bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations3 }; bufferedResult.hand[i] = { ...newResult.hand[i], box: box4, boxRaw: boxRaw2, keypoints: keypoints3, annotations: annotations2 };
} }
} }
if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) {

View File

@ -37,7 +37,7 @@ export const full = [
'rightHeel', 'rightHeel',
'leftFoot', 'leftFoot',
'rightFoot', 'rightFoot',
'midHip', 'bodyCenter',
'forehead', 'forehead',
'leftThumb', 'leftThumb',
'leftHand', 'leftHand',

View File

@ -1,73 +0,0 @@
/**
* BlazePose model implementation
*
* Based on : [**BlazePose**](https://drive.google.com/file/d/10IU-DRP2ioSNjKFdiGbmmQX81xAYj88s/view)
*/
import { log, join } from '../util/util';
import * as tf from '../../dist/tfjs.esm.js';
import * as annotations from './annotations';
import type { Tensor, GraphModel } from '../tfjs/types';
import type { BodyResult, Box, Point } from '../result';
import type { Config } from '../config';
import { env } from '../util/env';
let model: GraphModel | null;
export async function load(config: Config): Promise<GraphModel> {
if (env.initial) model = null;
if (!model) {
model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath || '')) as unknown as GraphModel;
model['width'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[2].size);
model['height'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[1].size);
if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);
else if (config.debug) log('load model:', model['modelUrl']);
} else if (config.debug) log('cached model:', model['modelUrl']);
return model;
}
export async function predict(image: Tensor, config: Config): Promise<BodyResult[]> {
if (!model) return [];
if (!config.body.enabled) return [];
const imgSize = { width: (image.shape[2] || 0), height: (image.shape[1] || 0) };
const resize = tf.image.resizeBilinear(image, [model['width'], model['height']], false);
const normalize = tf.div(resize, [255.0]);
tf.dispose(resize);
const resT = await model.predict(normalize) as Array<Tensor>;
const findT = resT.find((t) => (t.size === 195 || t.size === 155));
const points = await findT?.data() || []; // order of output tensors may change between models, full has 195 and upper has 155 items
resT.forEach((t) => tf.dispose(t));
tf.dispose(normalize);
const keypoints: Array<{ id, part, position: Point, positionRaw: Point, score, presence }> = [];
const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints
const depth = 5; // each points has x,y,z,visibility,presence
for (let i = 0; i < points.length / depth; i++) {
keypoints.push({
id: i,
part: labels[i],
position: [
Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255
Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255
Math.trunc(points[depth * i + 2]) + 0, // fix negative zero
],
positionRaw: [
points[depth * i + 0] / 255, // return x value normalized to 0..1
points[depth * i + 1] / 255, // return y value normalized to 0..1
points[depth * i + 2] + 0, // fix negative zero
],
score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value
presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value
});
}
const x = keypoints.map((a) => a.position[0]);
const y = keypoints.map((a) => a.position[1]);
const box: Box = [
Math.min(...x),
Math.min(...y),
Math.max(...x) - Math.min(...x),
Math.max(...y) - Math.min(...x),
];
const boxRaw: Box = [0, 0, 0, 0]; // not yet implemented
const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);
return [{ id: 0, score, box, boxRaw, keypoints }];
}

View File

@ -1,60 +1,33 @@
/** /**
* BlazePose model implementation * BlazePose model implementation
*
* Based on : [**BlazePose**](https://github.com/google/mediapipe/blob/master/mediapipe/modules/pose_detection)
*/ */
import * as tf from '@tensorflow/tfjs';
import { log, join } from '../util/util'; import { log, join } from '../util/util';
import * as tf from '../../dist/tfjs.esm.js'; import type { BodyKeypoint, BodyResult, Box, Point } from '../result';
import type { BodyResult, Box, Point } from '../result';
import type { GraphModel, Tensor } from '../tfjs/types'; import type { GraphModel, Tensor } from '../tfjs/types';
import type { Config } from '../config'; import type { Config } from '../config';
import { env } from '../util/env'; import * as coords from './blazeposecoords';
import * as annotations from './annotations';
// const boxScaleFact = 1.5; // hand finger model prefers slighly larger box const env = { initial: true };
const models: [GraphModel | null, GraphModel | null] = [null, null]; const models: [GraphModel | null, GraphModel | null] = [null, null];
const outputNodes = ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'];
const inputSize = [[0, 0], [0, 0]]; const inputSize = [[0, 0], [0, 0]];
let skipped = Number.MAX_SAFE_INTEGER;
// let skipped = 0; let outputNodes: string[]; // different for lite/full/heavy
let outputSize: [number, number] = [0, 0]; let cache: BodyResult | null = null;
let padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];
type Keypoints = { score: number, part: string, position: Point, positionRaw: Point };
/*
type BodyDetectResult = {
id: number,
score: number,
box: Box,
boxRaw: Box,
label: string,
yxBox: Box,
}
const cache: {
bodyBoxes: Array<BodyDetectResult>,
partBoxes: Array<BodyDetectResult>
tmpBoxes: Array<BodyDetectResult>
} = {
bodyBoxes: [],
partBoxes: [],
tmpBoxes: [],
};
*/
export async function loadDetect(config: Config): Promise<GraphModel> { export async function loadDetect(config: Config): Promise<GraphModel> {
if (env.initial) models[0] = null; if (env.initial) models[0] = null;
if (!models[0]) { if (!models[0] && config.body.detector?.modelPath || '') {
models[0] = await tf.loadGraphModel(join(config.modelBasePath, config.body.detector?.modelPath || '')) as unknown as GraphModel; models[0] = await tf.loadGraphModel(join(config.modelBasePath, config.body.detector?.modelPath || '')) as unknown as GraphModel;
const inputs = Object.values(models[0].modelSignature['inputs']); const inputs = Object.values(models[0].modelSignature['inputs']);
inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
if (!models[0] || !models[0]['modelUrl']) log('load model failed:', config.object.modelPath); if (!models[0] || !models[0]['modelUrl']) log('load model failed:', config.object.modelPath);
else if (config.debug) log('load model:', models[0]['modelUrl']); else if (config.debug) log('load model:', models[0]['modelUrl']);
} else if (config.debug) log('cached model:', models[0]['modelUrl']); } else if (config.debug && models[0]) log('cached model:', models[0]['modelUrl']);
return models[0]; return models[0] as GraphModel;
} }
export async function loadPose(config: Config): Promise<GraphModel> { export async function loadPose(config: Config): Promise<GraphModel> {
@ -64,6 +37,8 @@ export async function loadPose(config: Config): Promise<GraphModel> {
const inputs = Object.values(models[1].modelSignature['inputs']); const inputs = Object.values(models[1].modelSignature['inputs']);
inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
if (config.body.modelPath?.includes('lite')) outputNodes = ['ld_3d', 'output_segmentation', 'output_heatmap', 'world_3d', 'output_poseflag'];
else outputNodes = ['Identity', 'Identity_2', 'Identity_3', 'Identity_4', 'Identity_1']; // v2 from pinto full and heavy
if (!models[1] || !models[1]['modelUrl']) log('load model failed:', config.object.modelPath); if (!models[1] || !models[1]['modelUrl']) log('load model failed:', config.object.modelPath);
else if (config.debug) log('load model:', models[1]['modelUrl']); else if (config.debug) log('load model:', models[1]['modelUrl']);
} else if (config.debug) log('cached model:', models[1]['modelUrl']); } else if (config.debug) log('cached model:', models[1]['modelUrl']);
@ -76,86 +51,104 @@ export async function load(config: Config): Promise<[GraphModel | null, GraphMod
return models; return models;
} }
/* function calculateBoxes(keypoints: Array<BodyKeypoint>, outputSize: [number, number]): { keypointsBox: Box, keypointsBoxRaw: Box } {
async function detectBody(input: Tensor, config: Config): Promise<BodyDetectResult[]> {
if ((config.body.detector?.modelPath.length || 0) > 0 && models[0]) {
const t: Record<string, Tensor> = {};
t.resize = tf.image.resizeBilinear(input, [inputSize[0][0], inputSize[0][1]]);
t.res = await models[0]?.predict(t.resize) as Tensor; // [1,2254,13]
t.logits = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);
t.sigmoid = tf.sigmoid(t.logits);
t.rawBoxes = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);
t.packedBoxes = tf.squeeze(t.rawBoxes); // [2254,12]
t.scores = tf.squeeze(t.sigmoid); // [2254,1]
// boxes need to be decoded based on anchors
Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
}
return [];
}
*/
async function detectParts(input: Tensor, config: Config): Promise<BodyResult> {
const t: Record<string, Tensor> = {};
t.resize = tf.image.resizeBilinear(input, [inputSize[1][0], inputSize[1][1]]);
[t.ld/* 1,195 */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117 */, t.poseflag/* 1,1 */] = await models[1]?.execute(t.resize, outputNodes) as Tensor[]; // [1,2254,13]
const points = await t.ld.data();
const keypoints: Array<Keypoints> = [];
const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints
const depth = 5; // each points has x,y,z,visibility,presence
for (let i = 0; i < points.length / depth; i++) {
const score = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100; // reverse sigmoid value
// const presence = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100; // reverse sigmoid value
if (score > (config.body.minConfidence || 0)) {
keypoints.push({
part: labels[i],
position: [
Math.trunc(outputSize[0] * points[depth * i + 0] / 255), // return normalized x value istead of 0..255
Math.trunc(outputSize[1] * points[depth * i + 1] / 255), // return normalized y value istead of 0..255
Math.trunc(points[depth * i + 2]) + 0, // fix negative zero
],
positionRaw: [
points[depth * i + 0] / 255, // return x value normalized to 0..1
points[depth * i + 1] / 255, // return y value normalized to 0..1
points[depth * i + 2] + 0, // fix negative zero
],
score,
});
}
}
const x = keypoints.map((a) => a.position[0]); const x = keypoints.map((a) => a.position[0]);
const y = keypoints.map((a) => a.position[1]); const y = keypoints.map((a) => a.position[1]);
const box: Box = [ const keypointsBox: Box = [Math.min(...x), Math.min(...y), Math.max(...x) - Math.min(...x), Math.max(...y) - Math.min(...y)];
Math.min(...x), const keypointsBoxRaw: Box = [keypointsBox[0] / outputSize[0], keypointsBox[1] / outputSize[1], keypointsBox[2] / outputSize[0], keypointsBox[3] / outputSize[1]];
Math.min(...y), /*
Math.max(...x) - Math.min(...x), const leftShoulder = keypoints.find((kpt) => kpt.part === 'leftShoulder');
Math.max(...y) - Math.min(...x), const rightShoulder = keypoints.find((kpt) => kpt.part === 'rightShoulder');
if (!leftShoulder || !rightShoulder || !config.skipFrame) { // reset cache box coords
cache.box = [0, 0, 1, 1];
cache.boxRaw = cache.box;
} else { // recalculate cache box coords
const size = [leftShoulder.position[0] - rightShoulder.position[0], leftShoulder.position[1] - rightShoulder.position[1]];
const shoulderWidth = Math.sqrt((size[0] * size[0]) + (size[1] * size[1])); // distance between left and right shoulder
const shoulderCenter: Point = [(leftShoulder.position[0] + rightShoulder.position[0]) / 2, (leftShoulder.position[1] + rightShoulder.position[1]) / 2]; // center point between left and right shoulder
const bodyCenter: Point = [shoulderCenter[0], shoulderCenter[0] + (shoulderWidth), 0]; // approximate center of the body
const bodyCenterRaw: Point = [bodyCenter[0] / outputSize[0], bodyCenter[1] / outputSize[1], 0];
const bodyCenterKpt: Keypoint = { part: 'bodyCenter', positionRaw: bodyCenterRaw, position: bodyCenter, score: 1 }; // add virtual keypoint
keypoints.push(bodyCenterKpt);
const scaleFact = 2.5;
cache.box = [Math.trunc(bodyCenter[0] - (scaleFact * shoulderWidth)), Math.trunc(bodyCenter[1] - (scaleFact * shoulderWidth)), Math.trunc(2 * scaleFact * shoulderWidth), Math.trunc(2 * scaleFact * shoulderWidth)];
cache.boxRaw = [cache.box[0] / outputSize[0], cache.box[1] / outputSize[1], cache.box[2] / outputSize[0], cache.box[3] / outputSize[1]];
}
*/
return { keypointsBox, keypointsBoxRaw };
}
async function prepareImage(input: Tensor): Promise<Tensor> {
const t: Record<string, Tensor> = {};
if (!input.shape || !input.shape[1] || !input.shape[2]) return input;
padding = [
[0, 0], // dont touch batch
[input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], // height before&after
[input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], // width before&after
[0, 0], // dont touch rbg
]; ];
const boxRaw: Box = [0, 0, 0, 0]; // not yet implemented t.pad = tf.pad(input as tf.Tensor4D, padding);
const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0); t.resize = tf.image.resizeBilinear(t.pad as tf.Tensor4D, [inputSize[1][0], inputSize[1][1]]);
const final = tf.div(t.resize, 255);
Object.keys(t).forEach((tensor) => tf.dispose(t[tensor])); Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
return { id: 0, score, box, boxRaw, keypoints }; return final;
}
function rescaleKeypoints(keypoints: Array<BodyKeypoint>, outputSize: [number, number]): Array<BodyKeypoint> {
for (const kpt of keypoints) {
kpt.position = [
kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0],
kpt.position[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1] - padding[1][0],
kpt.position[2] as number,
];
kpt.positionRaw = [
kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], kpt.position[2] as number,
];
}
return keypoints;
}
async function detectParts(input: Tensor, config: Config, outputSize: [number, number]): Promise<BodyResult | null> {
const t: Record<string, Tensor> = {};
t.input = await prepareImage(input);
[t.ld/* 1,195 */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117 */, t.poseflag/* 1,1 */] = await models[1]?.execute(t.input, outputNodes) as Tensor[]; // run model
const points = await t.ld.data();
const keypointsRelative: Array<BodyKeypoint> = [];
const depth = 5; // each points has x,y,z,visibility,presence
for (let i = 0; i < points.length / depth; i++) {
const score = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100; // normally this is from tf.sigmoid but no point of running sigmoid on full array which has coords as well
// const presence = (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100; // reverse sigmoid value
const positionRaw: Point = [points[depth * i + 0] / inputSize[1][0], points[depth * i + 1] / inputSize[1][1], points[depth * i + 2] + 0];
const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];
// if (positionRaw[0] < 0 || positionRaw[1] < 0 || positionRaw[0] > 1 || positionRaw[1] > 1) score = 0;
keypointsRelative.push({ part: coords.kpt[i], positionRaw, position, score });
}
const avgScore = Math.round(100 * keypointsRelative.reduce((prev, curr) => prev += curr.score, 0) / keypointsRelative.length) / 100; // average score of keypoints
if (avgScore < (config.body.minConfidence || 0)) return null;
const keypoints: Array<BodyKeypoint> = rescaleKeypoints(keypointsRelative, outputSize); // keypoints were relative to input image which is cropped
const boxes = calculateBoxes(keypoints, [outputSize[0], outputSize[1]]); // now find boxes based on rescaled keypoints
Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
const annotations: Record<string, Point[][]> = {};
for (const [name, indexes] of Object.entries(coords.connected)) {
const pt: Array<Point[]> = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);
const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);
}
annotations[name] = pt;
}
return { id: 0, score: avgScore, box: boxes.keypointsBox, boxRaw: boxes.keypointsBoxRaw, keypoints, annotations };
} }
export async function predict(input: Tensor, config: Config): Promise<BodyResult[]> { export async function predict(input: Tensor, config: Config): Promise<BodyResult[]> {
outputSize = [input.shape[2] || 0, input.shape[1] || 0]; const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];
const bodies: Array<BodyResult> = []; if ((skipped < (config.body.skipFrames || 0)) && config.skipFrame) {
const body = await detectParts(input, config);
bodies.push(body);
/*
cache.tmpBoxes = []; // clear temp cache
if ((skipped < (config.body.skipFrames || 0)) && config.skipFrame) { // just run part detection while reusing cached boxes
skipped++; skipped++;
bodies = await Promise.all(cache.partBoxes.map((body) => detectParts(input, body, config))); // run from parts box cache } else {
} else { // calculate new boxes and run part detection cache = await detectParts(input, config, outputSize);
skipped = 0; skipped = 0;
bodies = await Promise.all(cache.partBoxes.map((body) => detectParts(input, body, config))); // run from part box cache
if (bodies.length !== config.body.maxDetected) { // run body detection only if we dont have enough bodies in cache
cache.bodyBoxes = await detectBody(input, config);
const newBodies = await Promise.all(cache.bodyBoxes.map((body) => detectParts(input, body, config)));
bodies = bodies.concat(newBodies);
}
} }
cache.partBoxes = [...cache.tmpBoxes]; // repopulate cache with validated bodies if (cache) return [cache];
*/ return [];
return bodies as BodyResult[];
} }

View File

@ -0,0 +1,54 @@
/* eslint-disable no-multi-spaces */
export const kpt = [
'nose', // 0
'leftEyeInside', // 1
'leftEye', // 2
'leftEyeOutside', // 3
'rightEyeInside', // 4
'rightEye', // 5
'rightEyeOutside', // 6
'leftEar', // 7
'rightEar', // 8
'leftMouth', // 9
'rightMouth', // 10
'leftShoulder', // 11
'rightShoulder', // 12
'leftElbow', // 13
'rightElbow', // 14
'leftWrist', // 15
'rightWrist', // 16
'leftPalm', // 17
'rightPalm', // 18
'leftIndex', // 19
'rightIndex', // 20
'leftPinky', // 21
'rightPinky', // 22
'leftHip', // 23
'rightHip', // 24
'leftKnee', // 25
'rightKnee', // 26
'leftAnkle', // 27
'rightAnkle', // 28
'leftHeel', // 29
'rightHeel', // 30
'leftFoot', // 31
'rightFoot', // 32
'bodyCenter', // 33
'bodyTop', // 34
'leftThumb', // 35
'leftHand', // 36
'rightThumb', // 37
'rightHand', // 38
];
export const connected = {
leftLeg: ['leftHip', 'leftKnee', 'leftAnkle', 'leftHeel', 'leftFoot'],
rightLeg: ['rightHip', 'rightKnee', 'rightAnkle', 'rightHeel', 'rightFoot'],
torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],
leftArm: ['leftShoulder', 'leftElbow', 'leftWrist', 'leftPalm'],
rightArm: ['rightShoulder', 'rightElbow', 'rightWrist', 'rightPalm'],
leftHand: [],
rightHand: [],
head: [],
};

View File

@ -6,23 +6,20 @@
import { log, join } from '../util/util'; import { log, join } from '../util/util';
import * as tf from '../../dist/tfjs.esm.js'; import * as tf from '../../dist/tfjs.esm.js';
import type { BodyResult, Box, Point } from '../result'; import * as coords from './efficientposecoords';
import type { BodyKeypoint, BodyResult, Box, Point } from '../result';
import type { GraphModel, Tensor } from '../tfjs/types'; import type { GraphModel, Tensor } from '../tfjs/types';
import type { Config } from '../config'; import type { Config } from '../config';
import { env } from '../util/env'; import { env } from '../util/env';
let model: GraphModel | null; let model: GraphModel | null;
type Keypoints = { score: number, part: string, position: Point, positionRaw: Point }; const keypoints: Array<BodyKeypoint> = [];
const keypoints: Array<Keypoints> = [];
let box: Box = [0, 0, 0, 0]; let box: Box = [0, 0, 0, 0];
let boxRaw: Box = [0, 0, 0, 0]; let boxRaw: Box = [0, 0, 0, 0];
let score = 0; let score = 0;
let skipped = Number.MAX_SAFE_INTEGER; let skipped = Number.MAX_SAFE_INTEGER;
const bodyParts = ['head', 'neck', 'rightShoulder', 'rightElbow', 'rightWrist', 'chest', 'leftShoulder', 'leftElbow', 'leftWrist', 'pelvis', 'rightHip', 'rightKnee', 'rightAnkle', 'leftHip', 'leftKnee', 'leftAnkle'];
export async function load(config: Config): Promise<GraphModel> { export async function load(config: Config): Promise<GraphModel> {
if (env.initial) model = null; if (env.initial) model = null;
if (!model) { if (!model) {
@ -41,9 +38,9 @@ function max2d(inputs, minScore) {
const reshaped = tf.reshape(inputs, [height * width]); // combine all data const reshaped = tf.reshape(inputs, [height * width]); // combine all data
const newScore = tf.max(reshaped, 0).dataSync()[0]; // get highest score // inside tf.tidy const newScore = tf.max(reshaped, 0).dataSync()[0]; // get highest score // inside tf.tidy
if (newScore > minScore) { // skip coordinate calculation is score is too low if (newScore > minScore) { // skip coordinate calculation is score is too low
const coords = tf.argMax(reshaped, 0); const coordinates = tf.argMax(reshaped, 0);
const x = mod(coords, width).dataSync()[0]; // inside tf.tidy const x = mod(coordinates, width).dataSync()[0]; // inside tf.tidy
const y = tf.div(coords, tf.scalar(width, 'int32')).dataSync()[0]; // inside tf.tidy const y = tf.div(coordinates, tf.scalar(width, 'int32')).dataSync()[0]; // inside tf.tidy
return [x, y, newScore]; return [x, y, newScore];
} }
return [0, 0, newScore]; return [0, 0, newScore];
@ -53,7 +50,7 @@ function max2d(inputs, minScore) {
export async function predict(image: Tensor, config: Config): Promise<BodyResult[]> { export async function predict(image: Tensor, config: Config): Promise<BodyResult[]> {
if ((skipped < (config.body?.skipFrames || 0)) && config.skipFrame && Object.keys(keypoints).length > 0) { if ((skipped < (config.body?.skipFrames || 0)) && config.skipFrame && Object.keys(keypoints).length > 0) {
skipped++; skipped++;
return [{ id: 0, score, box, boxRaw, keypoints }]; return [{ id: 0, score, box, boxRaw, keypoints, annotations: {} }];
} }
skipped = 0; skipped = 0;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
@ -83,7 +80,7 @@ export async function predict(image: Tensor, config: Config): Promise<BodyResult
if (score > (config.body?.minConfidence || 0)) { if (score > (config.body?.minConfidence || 0)) {
keypoints.push({ keypoints.push({
score: Math.round(100 * partScore) / 100, score: Math.round(100 * partScore) / 100,
part: bodyParts[id], part: coords.kpt[id],
positionRaw: [ // normalized to 0..1 positionRaw: [ // normalized to 0..1
// @ts-ignore model is not undefined here // @ts-ignore model is not undefined here
x / model.inputs[0].shape[2], y / model.inputs[0].shape[1], x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],
@ -114,6 +111,16 @@ export async function predict(image: Tensor, config: Config): Promise<BodyResult
Math.max(...xRaw) - Math.min(...xRaw), Math.max(...xRaw) - Math.min(...xRaw),
Math.max(...yRaw) - Math.min(...yRaw), Math.max(...yRaw) - Math.min(...yRaw),
]; ];
resolve([{ id: 0, score, box, boxRaw, keypoints }]); const annotations: Record<string, Point[][]> = {};
for (const [name, indexes] of Object.entries(coords.connected)) {
const pt: Array<Point[]> = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);
const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);
}
annotations[name] = pt;
}
resolve([{ id: 0, score, box, boxRaw, keypoints, annotations }]);
}); });
} }

View File

@ -0,0 +1,27 @@
export const kpt = [
'head',
'neck',
'rightShoulder',
'rightElbow',
'rightWrist',
'chest',
'leftShoulder',
'leftElbow',
'leftWrist',
'bodyCenter',
'rightHip',
'rightKnee',
'rightAnkle',
'leftHip',
'leftKnee',
'leftAnkle',
];
export const connected = {
leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],
rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],
torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],
leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],
rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],
head: [],
};

View File

@ -7,7 +7,8 @@
import { log, join } from '../util/util'; import { log, join } from '../util/util';
import { scale } from '../util/box'; import { scale } from '../util/box';
import * as tf from '../../dist/tfjs.esm.js'; import * as tf from '../../dist/tfjs.esm.js';
import type { BodyResult, Box, Point } from '../result'; import * as coords from './movenetcoords';
import type { BodyKeypoint, BodyResult, Box, Point } from '../result';
import type { GraphModel, Tensor } from '../tfjs/types'; import type { GraphModel, Tensor } from '../tfjs/types';
import type { Config } from '../config'; import type { Config } from '../config';
import { fakeOps } from '../tfjs/backend'; import { fakeOps } from '../tfjs/backend';
@ -17,13 +18,8 @@ let model: GraphModel | null;
let inputSize = 0; let inputSize = 0;
const cachedBoxes: Array<Box> = []; const cachedBoxes: Array<Box> = [];
type Keypoints = { score: number, part: string, position: Point, positionRaw: Point };
type Body = { id: number, score: number, box: Box, boxRaw: Box, keypoints: Array<Keypoints> }
let skipped = Number.MAX_SAFE_INTEGER; let skipped = Number.MAX_SAFE_INTEGER;
const keypoints: Array<Keypoints> = []; const keypoints: Array<BodyKeypoint> = [];
const bodyParts = ['nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle'];
export async function load(config: Config): Promise<GraphModel> { export async function load(config: Config): Promise<GraphModel> {
if (env.initial) model = null; if (env.initial) model = null;
@ -71,7 +67,7 @@ async function parseSinglePose(res, config, image, inputBox) {
]; ];
keypoints.push({ keypoints.push({
score: Math.round(100 * score) / 100, score: Math.round(100 * score) / 100,
part: bodyParts[id], part: coords.kpt[id],
positionRaw, positionRaw,
position: [ // normalized to input image size position: [ // normalized to input image size
Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[2] || 0) * positionRaw[0]),
@ -81,14 +77,24 @@ async function parseSinglePose(res, config, image, inputBox) {
} }
} }
score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0); score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);
const bodies: Array<Body> = []; const bodies: Array<BodyResult> = [];
const [box, boxRaw] = createBox(keypoints); const [box, boxRaw] = createBox(keypoints);
bodies.push({ id: 0, score, box, boxRaw, keypoints }); const annotations: Record<string, Point[][]> = {};
for (const [name, indexes] of Object.entries(coords.connected)) {
const pt: Array<Point[]> = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);
}
annotations[name] = pt;
}
bodies.push({ id: 0, score, box, boxRaw, keypoints, annotations });
return bodies; return bodies;
} }
async function parseMultiPose(res, config, image, inputBox) { async function parseMultiPose(res, config, image, inputBox) {
const bodies: Array<Body> = []; const bodies: Array<BodyResult> = [];
for (let id = 0; id < res[0].length; id++) { for (let id = 0; id < res[0].length; id++) {
const kpt = res[0][id]; const kpt = res[0][id];
const totalScore = Math.round(100 * kpt[51 + 4]) / 100; const totalScore = Math.round(100 * kpt[51 + 4]) / 100;
@ -102,7 +108,7 @@ async function parseMultiPose(res, config, image, inputBox) {
(inputBox[2] - inputBox[0]) * kpt[3 * i + 0] + inputBox[0], (inputBox[2] - inputBox[0]) * kpt[3 * i + 0] + inputBox[0],
]; ];
keypoints.push({ keypoints.push({
part: bodyParts[i], part: coords.kpt[i],
score: Math.round(100 * score) / 100, score: Math.round(100 * score) / 100,
positionRaw, positionRaw,
position: [ position: [
@ -112,11 +118,21 @@ async function parseMultiPose(res, config, image, inputBox) {
}); });
} }
} }
// const [box, boxRaw] = createBox(keypoints); const [box, boxRaw] = createBox(keypoints);
// movenet-multipose has built-in box details // movenet-multipose has built-in box details
const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]]; // const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];
const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))]; // const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))];
bodies.push({ id, score: totalScore, boxRaw, box, keypoints: [...keypoints] }); const annotations: Record<string, Point[][]> = {};
for (const [name, indexes] of Object.entries(coords.connected)) {
const pt: Array<Point[]> = [];
for (let i = 0; i < indexes.length - 1; i++) {
const pt0 = keypoints.find((kp) => kp.part === indexes[i]);
const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);
if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);
}
annotations[name] = pt;
}
bodies.push({ id, score: totalScore, boxRaw, box, keypoints: [...keypoints], annotations });
} }
} }
bodies.sort((a, b) => b.score - a.score); bodies.sort((a, b) => b.score - a.score);
@ -129,7 +145,7 @@ export async function predict(input: Tensor, config: Config): Promise<BodyResult
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const t: Record<string, Tensor> = {}; const t: Record<string, Tensor> = {};
let bodies: Array<Body> = []; let bodies: Array<BodyResult> = [];
if (!config.skipFrame) cachedBoxes.length = 0; // allowed to use cache or not if (!config.skipFrame) cachedBoxes.length = 0; // allowed to use cache or not
skipped++; skipped++;

28
src/body/movenetcoords.ts Normal file
View File

@ -0,0 +1,28 @@
export const kpt = [
'nose',
'leftEye',
'rightEye',
'leftEar',
'rightEar',
'leftShoulder',
'rightShoulder',
'leftElbow',
'rightElbow',
'leftWrist',
'rightWrist',
'leftHip',
'rightHip',
'leftKnee',
'rightKnee',
'leftAnkle',
'rightAnkle',
];
export const connected = {
leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],
rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],
torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],
leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],
rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],
head: [],
};

View File

@ -411,7 +411,7 @@ const config: Config = {
// only valid for posenet and movenet-multipose as other models detects single pose // only valid for posenet and movenet-multipose as other models detects single pose
// set to -1 to autodetect based on number of detected faces // set to -1 to autodetect based on number of detected faces
minConfidence: 0.2, // threshold for discarding a prediction minConfidence: 0.2, // threshold for discarding a prediction
skipFrames: 1, // how many max frames to go without re-running the detector skipFrames: 5, // how many max frames to go without re-running the detector
// only used when cacheSensitivity is not zero // only used when cacheSensitivity is not zero
}, },

View File

@ -8,7 +8,6 @@ import { defaults } from './config';
import * as tf from '../dist/tfjs.esm.js'; import * as tf from '../dist/tfjs.esm.js';
import * as app from '../package.json'; import * as app from '../package.json';
import * as backend from './tfjs/backend'; import * as backend from './tfjs/backend';
// import * as blazepose from './body/blazepose-v1';
import * as blazepose from './body/blazepose'; import * as blazepose from './body/blazepose';
import * as centernet from './object/centernet'; import * as centernet from './object/centernet';
import * as draw from './util/draw'; import * as draw from './util/draw';

View File

@ -183,6 +183,8 @@ export function process(input: Input, config: Config): { tensor: Tensor | null,
tempCanvas.height = targetHeight; tempCanvas.height = targetHeight;
const tempCtx = tempCanvas.getContext('2d'); const tempCtx = tempCanvas.getContext('2d');
tempCtx?.drawImage(outCanvas, 0, 0); tempCtx?.drawImage(outCanvas, 0, 0);
console.log('PIXELS', tempCanvas);
pixels = (tf.browser && env.browser) ? tf.browser.fromPixels(tempCanvas) : null;
try { try {
pixels = (tf.browser && env.browser) ? tf.browser.fromPixels(tempCanvas) : null; pixels = (tf.browser && env.browser) ? tf.browser.fromPixels(tempCanvas) : null;
} catch (err) { } catch (err) {

View File

@ -59,6 +59,13 @@ export interface FaceResult {
tensor?: Tensor, tensor?: Tensor,
} }
export type BodyKeypoint = {
part: string,
position: Point,
positionRaw: Point,
score: number,
}
/** Body results /** Body results
* *
* Each results has: * Each results has:
@ -77,13 +84,8 @@ export interface BodyResult {
score: number, score: number,
box: Box, box: Box,
boxRaw: Box, boxRaw: Box,
keypoints: Array<{ annotations: Record<string, Point[][]>,
part: string, keypoints: Array<BodyKeypoint>
position: Point,
positionRaw: Point,
score: number,
presence?: number,
}>
} }
/** Hand results /** Hand results

View File

@ -90,10 +90,8 @@ export async function check(instance, force = false) {
} }
// handle webgpu // handle webgpu
if (tf.getBackend() === 'humangl') { if (tf.getBackend() === 'webgpu') {
tf.ENV.set('WEBGPU_USE_GLSL', true); tf.ENV.set('WEBGPU_USE_GLSL', true);
tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', false);
tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);
} }
// wait for ready // wait for ready

View File

@ -67,7 +67,7 @@ export async function register(instance): Promise<void> {
// log('gpu memory usage:', instance.tf.engine().backendInstance.numBytesInGPU); // log('gpu memory usage:', instance.tf.engine().backendInstance.numBytesInGPU);
log('possible browser memory leak using webgl'); log('possible browser memory leak using webgl');
instance.emit('error'); instance.emit('error');
throw new Error('browser webgl error'); // throw new Error('browser webgl error');
/* /*
log('resetting humangl backend'); log('resetting humangl backend');
env.initial = true; env.initial = true;

View File

@ -4,7 +4,7 @@
import { TRI468 as triangulation } from '../face/facemeshcoords'; import { TRI468 as triangulation } from '../face/facemeshcoords';
import { mergeDeep, now } from './util'; import { mergeDeep, now } from './util';
import type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult } from '../result'; import type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Point } from '../result';
/** /**
* Draw Options * Draw Options
@ -102,7 +102,7 @@ function rect(ctx, x, y, width, height, localOptions) {
ctx.stroke(); ctx.stroke();
} }
function lines(ctx, points: [number, number, number?][] = [], localOptions) { function lines(ctx, points: Point[] = [], localOptions) {
if (points === undefined || points.length === 0) return; if (points === undefined || points.length === 0) return;
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(points[0][0], points[0][1]); ctx.moveTo(points[0][0], points[0][1]);
@ -119,7 +119,7 @@ function lines(ctx, points: [number, number, number?][] = [], localOptions) {
} }
} }
function curves(ctx, points: [number, number, number?][] = [], localOptions) { function curves(ctx, points: Point[] = [], localOptions) {
if (points === undefined || points.length === 0) return; if (points === undefined || points.length === 0) return;
if (!localOptions.useCurves || points.length <= 2) { if (!localOptions.useCurves || points.length <= 2) {
lines(ctx, points, localOptions); lines(ctx, points, localOptions);
@ -288,91 +288,23 @@ export async function body(inCanvas: HTMLCanvasElement | OffscreenCanvas, result
ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);
} }
} }
if (localOptions.drawPoints) { if (localOptions.drawPoints && result[i].keypoints) {
for (let pt = 0; pt < result[i].keypoints.length; pt++) { for (let pt = 0; pt < result[i].keypoints.length; pt++) {
ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color; ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;
point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);
} }
} }
if (localOptions.drawLabels) { if (localOptions.drawLabels && result[i].keypoints) {
ctx.font = localOptions.font; ctx.font = localOptions.font;
if (result[i].keypoints) { for (const pt of result[i].keypoints) {
for (const pt of result[i].keypoints) { ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;
ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color; ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);
}
} }
} }
if (localOptions.drawPolygons && result[i].keypoints) { if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {
let part; for (const part of Object.values(result[i].annotations)) {
const points: [number, number, number?][] = []; for (const connected of part) curves(ctx, connected, localOptions);
// shoulder line }
points.length = 0;
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
if (part) points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
// torso main
points.length = 0;
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightHip');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftHip');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
if (part) points.push([part.position[0], part.position[1]]);
if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso
// leg left
points.length = 0;
part = result[i].keypoints.find((a) => a.part === 'leftHip');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftKnee');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftAnkle');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftHeel');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftFoot');
if (part) points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
// leg right
points.length = 0;
part = result[i].keypoints.find((a) => a.part === 'rightHip');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightKnee');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightAnkle');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightHeel');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightFoot');
if (part) points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
// arm left
points.length = 0;
part = result[i].keypoints.find((a) => a.part === 'leftShoulder');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftElbow');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftWrist');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'leftPalm');
if (part) points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
// arm right
points.length = 0;
part = result[i].keypoints.find((a) => a.part === 'rightShoulder');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightElbow');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightWrist');
if (part) points.push([part.position[0], part.position[1]]);
part = result[i].keypoints.find((a) => a.part === 'rightPalm');
if (part) points.push([part.position[0], part.position[1]]);
curves(ctx, points, localOptions);
// draw all
} }
} }
} }

View File

@ -1,24 +1,719 @@
2021-10-03 08:08:21 INFO:  @vladmandic/human version 2.3.0 2021-10-04 15:47:15 INFO:  @vladmandic/human version 2.3.0
2021-10-03 08:08:21 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.10.0 2021-10-04 15:47:16 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.10.0
2021-10-03 08:08:21 INFO:  Application: {"name":"@vladmandic/human","version":"2.3.0"} 2021-10-04 15:47:16 INFO:  Application: {"name":"@vladmandic/human","version":"2.3.0"}
2021-10-03 08:08:21 INFO:  Environment: {"profile":"production","config":"build.json","tsconfig":true,"eslintrc":true,"git":true} 2021-10-04 15:47:16 INFO:  Environment: {"profile":"production","config":"build.json","tsconfig":true,"eslintrc":true,"git":true}
2021-10-03 08:08:21 INFO:  Toolchain: {"build":"0.5.3","esbuild":"0.13.3","typescript":"4.4.3","typedoc":"0.22.4","eslint":"7.32.0"} 2021-10-04 15:47:16 INFO:  Toolchain: {"build":"0.5.3","esbuild":"0.13.3","typescript":"4.4.3","typedoc":"0.22.4","eslint":"7.32.0"}
2021-10-03 08:08:21 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} 2021-10-04 15:47:16 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
2021-10-03 08:08:21 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} 2021-10-04 15:47:16 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]}
2021-10-03 08:08:21 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":1275} 2021-10-04 15:47:16 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":1275}
2021-10-03 08:08:21 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":50,"inputBytes":507203,"outputBytes":422220} 2021-10-04 15:47:16 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":511674,"outputBytes":426693}
2021-10-03 08:08:21 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":1283} 2021-10-04 15:47:16 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":1283}
2021-10-03 08:08:21 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":50,"inputBytes":507211,"outputBytes":422224} 2021-10-04 15:47:16 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":511682,"outputBytes":426697}
2021-10-03 08:08:21 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":1350} 2021-10-04 15:47:16 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":1350}
2021-10-03 08:08:21 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":50,"inputBytes":507278,"outputBytes":422296} 2021-10-04 15:47:16 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":511749,"outputBytes":426769}
2021-10-03 08:08:21 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-10-04 15:47:16 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-10-03 08:08:21 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-10-04 15:47:16 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-10-03 08:08:21 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":50,"inputBytes":506721,"outputBytes":423742} 2021-10-04 15:47:16 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":511192,"outputBytes":428266}
2021-10-03 08:08:21 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":2377041} 2021-10-04 15:47:17 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":2377041}
2021-10-03 08:08:22 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":50,"inputBytes":2882969,"outputBytes":1417710} 2021-10-04 15:47:17 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2887440,"outputBytes":2397338}
2021-10-03 08:08:22 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":50,"inputBytes":2882969,"outputBytes":2628660} 2021-10-04 15:47:18 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2887440,"outputBytes":4638818}
2021-10-03 08:08:38 STATE: Typings: {"input":"src/human.ts","output":"types","files":6} 2021-10-04 15:47:36 STATE: Typings: {"input":"src/human.ts","output":"types","files":6}
2021-10-03 08:08:44 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":34,"generated":true} 2021-10-04 15:47:42 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":35,"generated":true}
2021-10-03 08:09:11 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":84,"errors":0,"warnings":0} 2021-10-04 15:48:16 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":86,"errors":0,"warnings":0}
2021-10-03 08:09:12 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} 2021-10-04 15:48:16 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
2021-10-03 08:09:12 INFO:  Done... 2021-10-04 15:48:16 INFO:  Done...
2021-10-04 15:52:25 INFO:  @vladmandic/human version 2.3.0
2021-10-04 15:52:25 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.10.0
2021-10-04 15:52:25 INFO:  Application: {"name":"@vladmandic/human","version":"2.3.0"}
2021-10-04 15:52:25 INFO:  Environment: {"profile":"development","config":"build.json","tsconfig":true,"eslintrc":true,"git":true}
2021-10-04 15:52:25 INFO:  Toolchain: {"build":"0.5.3","esbuild":"0.13.3","typescript":"4.4.3","typedoc":"0.22.4","eslint":"7.32.0"}
2021-10-04 15:52:25 INFO:  Build: {"profile":"development","steps":["serve","watch","compile"]}
2021-10-04 15:52:25 STATE: WebServer: {"ssl":false,"port":10030,"root":"."}
2021-10-04 15:52:25 STATE: WebServer: {"ssl":true,"port":10031,"root":".","sslKey":"node_modules/@vladmandic/build/cert/https.key","sslCrt":"node_modules/@vladmandic/build/cert/https.crt"}
2021-10-04 15:52:26 STATE: Watch: {"locations":["src/**","README.md","src/**/*","tfjs/**/*"]}
2021-10-04 15:52:26 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":1275}
2021-10-04 15:52:26 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507846,"outputBytes":422913}
2021-10-04 15:52:26 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":1283}
2021-10-04 15:52:26 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507854,"outputBytes":422917}
2021-10-04 15:52:26 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":1350}
2021-10-04 15:52:26 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507921,"outputBytes":422989}
2021-10-04 15:52:26 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-10-04 15:52:26 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-10-04 15:52:26 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507364,"outputBytes":424486}
2021-10-04 15:52:27 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":2377041}
2021-10-04 15:52:27 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883612,"outputBytes":2395163}
2021-10-04 15:52:28 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883612,"outputBytes":4635038}
2021-10-04 15:52:28 INFO:  Listening...
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47584,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635038,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154450,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 15:54:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:27 INFO:  Watch: {"event":"modify","input":"src/tfjs/backend.ts"}
2021-10-04 15:55:27 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":1275}
2021-10-04 15:55:27 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507739,"outputBytes":422802}
2021-10-04 15:55:27 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":1283}
2021-10-04 15:55:27 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507747,"outputBytes":422806}
2021-10-04 15:55:27 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":1350}
2021-10-04 15:55:27 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507814,"outputBytes":422878}
2021-10-04 15:55:27 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-10-04 15:55:27 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-10-04 15:55:27 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507257,"outputBytes":424351}
2021-10-04 15:55:28 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":2377041}
2021-10-04 15:55:28 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883505,"outputBytes":2395083}
2021-10-04 15:55:29 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883505,"outputBytes":4634937}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47584,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47584,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 15:55:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:23 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:23 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395083,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:23 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:23 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47584,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:39 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:39 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395083,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 15:56:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:03 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:22 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:23 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395083,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 15:58:29 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:01 INFO:  @vladmandic/human version 2.3.0
2021-10-04 15:59:01 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.10.0
2021-10-04 15:59:01 INFO:  Application: {"name":"@vladmandic/human","version":"2.3.0"}
2021-10-04 15:59:01 INFO:  Environment: {"profile":"development","config":"build.json","tsconfig":true,"eslintrc":true,"git":true}
2021-10-04 15:59:01 INFO:  Toolchain: {"build":"0.5.3","esbuild":"0.13.3","typescript":"4.4.3","typedoc":"0.22.4","eslint":"7.32.0"}
2021-10-04 15:59:01 INFO:  Build: {"profile":"development","steps":["serve","watch","compile"]}
2021-10-04 15:59:01 STATE: WebServer: {"ssl":false,"port":10030,"root":"."}
2021-10-04 15:59:01 STATE: WebServer: {"ssl":true,"port":10031,"root":".","sslKey":"node_modules/@vladmandic/build/cert/https.key","sslCrt":"node_modules/@vladmandic/build/cert/https.crt"}
2021-10-04 15:59:01 STATE: Watch: {"locations":["src/**","README.md","src/**/*","tfjs/**/*"]}
2021-10-04 15:59:01 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":1275}
2021-10-04 15:59:01 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507739,"outputBytes":422802}
2021-10-04 15:59: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":1283}
2021-10-04 15:59:01 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507747,"outputBytes":422806}
2021-10-04 15:59: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":1350}
2021-10-04 15:59:01 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507814,"outputBytes":422878}
2021-10-04 15:59: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-10-04 15:59: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-10-04 15:59:01 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507257,"outputBytes":424351}
2021-10-04 15:59:02 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":2377041}
2021-10-04 15:59:02 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883505,"outputBytes":2395083}
2021-10-04 15:59:03 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883505,"outputBytes":4634937}
2021-10-04 15:59:03 INFO:  Listening...
2021-10-04 15:59:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:17 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:17 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395083,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:17 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 15:59:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:51 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:51 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395083,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":79038,"url":"/models/blazeface.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":89289,"url":"/models/facemesh.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":122025,"url":"/models/iris.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":17980,"url":"/models/emotion.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":71432,"url":"/models/faceres.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":538928,"url":"/models/blazeface.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":820516,"url":"/models/emotion.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":2955780,"url":"/models/facemesh.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":6978814,"url":"/models/faceres.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:00:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":2599092,"url":"/models/iris.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:44 INFO:  Watch: {"event":"modify","input":"src/body/movenet.ts"}
2021-10-04 16:02:44 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":1275}
2021-10-04 16:02:44 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507813,"outputBytes":422876}
2021-10-04 16:02:44 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":1283}
2021-10-04 16:02:44 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507821,"outputBytes":422880}
2021-10-04 16:02:44 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":1350}
2021-10-04 16:02:44 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507888,"outputBytes":422952}
2021-10-04 16:02:44 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-10-04 16:02:44 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-10-04 16:02:44 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507331,"outputBytes":424425}
2021-10-04 16:02:45 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":2377041}
2021-10-04 16:02:45 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883579,"outputBytes":2395142}
2021-10-04 16:02:46 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883579,"outputBytes":4635011}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635011,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154407,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395142,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:02:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:29 INFO:  Watch: {"event":"modify","input":"src/body/movenet.ts"}
2021-10-04 16:03:29 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":1275}
2021-10-04 16:03:29 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507859,"outputBytes":422922}
2021-10-04 16:03:29 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":1283}
2021-10-04 16:03:29 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507867,"outputBytes":422926}
2021-10-04 16:03:29 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":1350}
2021-10-04 16:03:29 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507934,"outputBytes":422998}
2021-10-04 16:03:29 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-10-04 16:03:29 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-10-04 16:03:29 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507377,"outputBytes":424471}
2021-10-04 16:03:30 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":2377041}
2021-10-04 16:03:30 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883625,"outputBytes":2395182}
2021-10-04 16:03:31 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883625,"outputBytes":4635057}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635057,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154485,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:35 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:35 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395182,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:35 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:03:35 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:03 INFO:  Watch: {"event":"modify","input":"src/body/movenet.ts"}
2021-10-04 16:04:03 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":1275}
2021-10-04 16:04:03 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507739,"outputBytes":422802}
2021-10-04 16:04:03 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":1283}
2021-10-04 16:04:03 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507747,"outputBytes":422806}
2021-10-04 16:04:03 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":1350}
2021-10-04 16:04:03 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507814,"outputBytes":422878}
2021-10-04 16:04:03 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-10-04 16:04:03 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-10-04 16:04:03 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507257,"outputBytes":424351}
2021-10-04 16:04:04 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":2377041}
2021-10-04 16:04:04 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883505,"outputBytes":2395083}
2021-10-04 16:04:05 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883505,"outputBytes":4634937}
2021-10-04 16:04:29 INFO:  Watch: {"event":"modify","input":"src/human.ts"}
2021-10-04 16:04:29 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":1275}
2021-10-04 16:04:29 INFO:  Watch: {"event":"modify","input":"src/human.ts","skip":true}
2021-10-04 16:04:29 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507765,"outputBytes":422828}
2021-10-04 16:04:29 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":1283}
2021-10-04 16:04:29 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507773,"outputBytes":422832}
2021-10-04 16:04:29 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":1350}
2021-10-04 16:04:29 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507840,"outputBytes":422904}
2021-10-04 16:04:29 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-10-04 16:04:29 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-10-04 16:04:29 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507283,"outputBytes":424377}
2021-10-04 16:04:30 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":2377041}
2021-10-04 16:04:30 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883531,"outputBytes":2395102}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883531,"outputBytes":4634963}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634963,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:31 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154327,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:32 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:34 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:34 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395102,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:35 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:35 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:04:44 INFO:  Watch: {"event":"modify","input":"src/human.ts"}
2021-10-04 16:04:44 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":1275}
2021-10-04 16:04:44 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":51,"inputBytes":507739,"outputBytes":422802}
2021-10-04 16:04:44 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":1283}
2021-10-04 16:04:44 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":51,"inputBytes":507747,"outputBytes":422806}
2021-10-04 16:04:44 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":1350}
2021-10-04 16:04:44 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":51,"inputBytes":507814,"outputBytes":422878}
2021-10-04 16:04:44 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-10-04 16:04:44 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-10-04 16:04:44 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":51,"inputBytes":507257,"outputBytes":424351}
2021-10-04 16:04:45 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":2377041}
2021-10-04 16:04:46 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":2883505,"outputBytes":2395083}
2021-10-04 16:04:47 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":2883505,"outputBytes":4634937}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4634937,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12154285,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:10 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:12 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:05:12 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:33 INFO:  Watch: {"event":"modify","input":"src/body/movenet.ts"}
2021-10-04 16:08:33 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":1275}
2021-10-04 16:08:34 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508349,"outputBytes":423453}
2021-10-04 16:08:34 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":1283}
2021-10-04 16:08:34 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508357,"outputBytes":423457}
2021-10-04 16:08:34 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":1350}
2021-10-04 16:08:34 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508424,"outputBytes":423529}
2021-10-04 16:08:34 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-10-04 16:08:34 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-10-04 16:08:34 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507867,"outputBytes":424978}
2021-10-04 16:08:35 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":2377041}
2021-10-04 16:08:35 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884115,"outputBytes":2395575}
2021-10-04 16:08:36 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884115,"outputBytes":4635564}
2021-10-04 16:08:37 INFO:  Watch: {"event":"modify","input":"src/body/movenetcoords.ts"}
2021-10-04 16:08:37 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":1275}
2021-10-04 16:08:37 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508349,"outputBytes":423453}
2021-10-04 16:08:37 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":1283}
2021-10-04 16:08:37 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508357,"outputBytes":423457}
2021-10-04 16:08:37 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":1350}
2021-10-04 16:08:37 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508424,"outputBytes":423529}
2021-10-04 16:08:37 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-10-04 16:08:37 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-10-04 16:08:37 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507867,"outputBytes":424978}
2021-10-04 16:08:38 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":2377041}
2021-10-04 16:08:38 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884115,"outputBytes":2395575}
2021-10-04 16:08:40 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884115,"outputBytes":4635564}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47585,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635564,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155361,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:52 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/json","size":161813,"url":"/models/movenet-lightning.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:08:52 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":4650216,"url":"/models/movenet-lightning.bin","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47646,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635564,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155361,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:18 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:19 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:10:22 WARN:  HTTP: {"method":"GET","ver":"1.1","status":404,"url":"/human-models/models/movenet-thunder.json","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47669,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635564,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:33 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:34 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155361,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:34 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:12:34 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47671,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635564,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155361,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:28 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47671,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635564,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155361,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:13:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:21 INFO:  Watch: {"event":"modify","input":"src/body/movenet.ts"}
2021-10-04 16:15:22 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":1275}
2021-10-04 16:15:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508352,"outputBytes":423176}
2021-10-04 16:15:22 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":1283}
2021-10-04 16:15:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508360,"outputBytes":423180}
2021-10-04 16:15:22 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":1350}
2021-10-04 16:15:22 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508427,"outputBytes":423252}
2021-10-04 16:15:22 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-10-04 16:15:22 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-10-04 16:15:22 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507870,"outputBytes":424701}
2021-10-04 16:15:22 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":2377041}
2021-10-04 16:15:23 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884118,"outputBytes":2395400}
2021-10-04 16:15:24 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884118,"outputBytes":4635291}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47671,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635291,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:15:26 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47661,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635291,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:07 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:07 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:16:07 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635291,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:18:14 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:25 INFO:  Watch: {"event":"modify","input":"src/body/blazeposecoords.ts"}
2021-10-04 16:19:25 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":1275}
2021-10-04 16:19:25 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508352,"outputBytes":423175}
2021-10-04 16:19:25 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":1283}
2021-10-04 16:19:25 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508360,"outputBytes":423179}
2021-10-04 16:19:25 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":1350}
2021-10-04 16:19:26 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508427,"outputBytes":423251}
2021-10-04 16:19:26 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-10-04 16:19:26 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-10-04 16:19:26 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507870,"outputBytes":424700}
2021-10-04 16:19:27 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":2377041}
2021-10-04 16:19:27 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884118,"outputBytes":2395399}
2021-10-04 16:19:28 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884118,"outputBytes":4635290}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635290,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:38 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:39 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:19:39 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635290,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:08 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47669,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635290,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:20:54 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:56 INFO:  Watch: {"event":"modify","input":"src/config.ts"}
2021-10-04 16:21:56 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":1275}
2021-10-04 16:21:56 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508352,"outputBytes":423175}
2021-10-04 16:21:56 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":1283}
2021-10-04 16:21:56 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508360,"outputBytes":423179}
2021-10-04 16:21:56 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":1350}
2021-10-04 16:21:56 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508427,"outputBytes":423251}
2021-10-04 16:21:56 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-10-04 16:21:56 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-10-04 16:21:56 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507870,"outputBytes":424700}
2021-10-04 16:21:57 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":2377041}
2021-10-04 16:21:57 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884118,"outputBytes":2395399}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635290,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:57 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:58 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:21:58 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884118,"outputBytes":4635290}
2021-10-04 16:22:23 INFO:  Watch: {"event":"modify","input":"src/config.ts"}
2021-10-04 16:22:23 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":1275}
2021-10-04 16:22:24 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508352,"outputBytes":423175}
2021-10-04 16:22:24 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":1283}
2021-10-04 16:22:24 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508360,"outputBytes":423179}
2021-10-04 16:22:24 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":1350}
2021-10-04 16:22:24 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508427,"outputBytes":423251}
2021-10-04 16:22:24 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-10-04 16:22:24 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-10-04 16:22:24 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507870,"outputBytes":424700}
2021-10-04 16:22:24 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":2377041}
2021-10-04 16:22:25 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884118,"outputBytes":2395399}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635290,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:26 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884118,"outputBytes":4635290}
2021-10-04 16:22:26 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:26 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:22:26 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635290,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155113,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:10 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:10 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395399,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:43 INFO:  Watch: {"event":"modify","input":"src/tfjs/humangl.ts"}
2021-10-04 16:23:43 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":1275}
2021-10-04 16:23:43 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508355,"outputBytes":423125}
2021-10-04 16:23:43 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":1283}
2021-10-04 16:23:44 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508363,"outputBytes":423129}
2021-10-04 16:23:44 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":1350}
2021-10-04 16:23:44 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508430,"outputBytes":423201}
2021-10-04 16:23:44 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-10-04 16:23:44 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-10-04 16:23:44 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":507873,"outputBytes":424650}
2021-10-04 16:23:44 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":2377041}
2021-10-04 16:23:45 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884121,"outputBytes":2395360}
2021-10-04 16:23:46 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884121,"outputBytes":4635240}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635240,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:49 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155095,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:23:55 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395360,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:24:46 INFO:  Watch: {"event":"modify","input":"src/image/image.ts"}
2021-10-04 16:24:46 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":1275}
2021-10-04 16:24:46 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":52,"inputBytes":508487,"outputBytes":423258}
2021-10-04 16:24:46 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":1283}
2021-10-04 16:24:46 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":52,"inputBytes":508495,"outputBytes":423262}
2021-10-04 16:24:46 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":1350}
2021-10-04 16:24:46 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":52,"inputBytes":508562,"outputBytes":423334}
2021-10-04 16:24:47 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-10-04 16:24:47 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-10-04 16:24:47 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":52,"inputBytes":508005,"outputBytes":424809}
2021-10-04 16:24:47 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":2377041}
2021-10-04 16:24:48 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":55,"inputBytes":2884253,"outputBytes":2395423}
2021-10-04 16:24:49 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":55,"inputBytes":2884253,"outputBytes":4635381}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:04 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:07 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:07 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395423,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:47 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:48 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?backend=webgl&warmup=body&worker=false","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:25:53 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?backend=webgl","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:05 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:06 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:09 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395423,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?backend=webgl","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:40 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:41 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":303,"url":"/manifest.webmanifest","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?backend=webgl","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:50 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:51 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:51 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:51 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:56 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:26:56 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395423,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?backend=webgl","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:25 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:26 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:26 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:27 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:30 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":1816,"url":"/index-worker.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:27:30 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":2395423,"url":"/dist/human.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:42 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/html","size":7842,"url":"/?backend=webgl","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":47668,"url":"/index.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4635381,"url":"/dist/human.esm.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":14222,"url":"/helpers/menu.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":10894,"url":"/helpers/gl-bench.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"application/octet-stream","size":12155305,"url":"/dist/human.esm.js.map","remote":"::ffff:192.168.0.200"}
2021-10-04 16:28:43 DATA:  HTTP: {"method":"GET","ver":"1.1","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::ffff:192.168.0.200"}

File diff suppressed because one or more lines are too long

View File

@ -8,16 +8,16 @@
</ul> </ul>
</div><dl class="tsd-comment-tags"><dt>param userConfig:</dt><dd><p><a href="../interfaces/Config.html">Config</a></p> </div><dl class="tsd-comment-tags"><dt>param userConfig:</dt><dd><p><a href="../interfaces/Config.html">Config</a></p>
</dd><dt>returns</dt><dd><p>instance</p> </dd><dt>returns</dt><dd><p>instance</p>
</dd></dl></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Human</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="Human.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#config" class="tsd-kind-icon">config</a></li><li class="tsd-kind-property tsd-parent-kind-class"><a href="Human.html#distance" class="tsd-kind-icon">distance</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#match" class="tsd-kind-icon">match</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#similarity" class="tsd-kind-icon">similarity</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#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#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#L177">human.ts:177</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#distance" class="tsd-kind-icon">distance</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#match" class="tsd-kind-icon">match</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#similarity" class="tsd-kind-icon">similarity</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#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#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#L176">human.ts:176</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Constructor for <strong>Human</strong> library that is futher used for all operations</p> <p>Constructor for <strong>Human</strong> library that is futher used for all operations</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="Human.html" class="tsd-signature-type" data-tsd-kind="Class">Human</a></h4><div><p>instance: <a href="Human.html">Human</a></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="Human.html" class="tsd-signature-type" data-tsd-kind="Class">Human</a></h4><div><p>instance: <a href="Human.html">Human</a></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#L103">human.ts:103</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="config" class="tsd-anchor"></a><h3>config</h3><div class="tsd-signature tsd-kind-icon">config<span class="tsd-signature-symbol">:</span> <a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L102">human.ts:102</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Current configuration</p> <p>Current configuration</p>
<ul> <ul>
<li>Definition: <a href="../interfaces/Config.html">Config</a></li> <li>Definition: <a href="../interfaces/Config.html">Config</a></li>
<li>Defaults: <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L292">config</a></li> <li>Defaults: <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L292">config</a></li>
</ul> </ul>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="distance" class="tsd-anchor"></a><h3>distance</h3><div class="tsd-signature tsd-kind-icon">distance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"> =&gt; </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L261">human.ts:261</a></li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="distance" class="tsd-anchor"></a><h3>distance</h3><div class="tsd-signature tsd-kind-icon">distance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"> =&gt; </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L260">human.ts:260</a></li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"><div class="tsd-comment tsd-typography"><div class="lead">
<p>Calculates distance between two descriptors</p> <p>Calculates distance between two descriptors</p>
<ul> <ul>
<li>Minkowski distance algorithm of nth order if <code>order</code> is different than 2</li> <li>Minkowski distance algorithm of nth order if <code>order</code> is different than 2</li>
@ -28,7 +28,7 @@
<li><code>order</code></li> <li><code>order</code></li>
</ul> </ul>
<p>Note: No checks are performed for performance reasons so make sure to pass valid number arrays of equal length</p> <p>Note: No checks are performed for performance reasons so make sure to pass valid number arrays of equal length</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>descriptor1: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>descriptor2: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>options: <span class="tsd-signature-symbol">{ </span>order<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></h5><ul class="tsd-parameters"><li class="tsd-parameter"><h5>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li></ul></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4></li></ul></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="draw" class="tsd-anchor"></a><h3>draw</h3><div class="tsd-signature tsd-kind-icon">draw<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>all<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>body<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>face<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>gesture<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>hand<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>object<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>options<span class="tsd-signature-symbol">: </span><a href="../interfaces/DrawOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">DrawOptions</a><span class="tsd-signature-symbol">; </span>person<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L139">human.ts:139</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>descriptor1: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>descriptor2: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>options: <span class="tsd-signature-symbol">{ </span>order<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></h5><ul class="tsd-parameters"><li class="tsd-parameter"><h5>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li></ul></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4></li></ul></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="draw" class="tsd-anchor"></a><h3>draw</h3><div class="tsd-signature tsd-kind-icon">draw<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>all<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>body<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>face<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>gesture<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>hand<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>object<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">; </span>options<span class="tsd-signature-symbol">: </span><a href="../interfaces/DrawOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">DrawOptions</a><span class="tsd-signature-symbol">; </span>person<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L138">human.ts:138</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Draw helper classes that can draw detected objects on canvas using specified draw</p> <p>Draw helper classes that can draw detected objects on canvas using specified draw</p>
<ul> <ul>
<li>options: <a href="../interfaces/DrawOptions.html">DrawOptions</a> global settings for all draw operations, can be overriden for each draw method</li> <li>options: <a href="../interfaces/DrawOptions.html">DrawOptions</a> global settings for all draw operations, can be overriden for each draw method</li>
@ -38,9 +38,9 @@
<li>canvas: draw processed canvas which is a processed copy of the input</li> <li>canvas: draw processed canvas which is a processed copy of the input</li>
<li>all: meta-function that performs: canvas, face, body, hand</li> <li>all: meta-function that performs: canvas, face, body, hand</li>
</ul> </ul>
</div></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>all<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>body<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>face<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>gesture<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>hand<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>object<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>options<span class="tsd-signature-symbol">: </span><a href="../interfaces/DrawOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">DrawOptions</a></h5></li><li class="tsd-parameter"><h5>person<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="env" class="tsd-anchor"></a><h3>env</h3><div class="tsd-signature tsd-kind-icon">env<span class="tsd-signature-symbol">:</span> <a href="../index.html#Env" class="tsd-signature-type" data-tsd-kind="Type alias">Env</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L129">human.ts:129</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>all<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>body<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>face<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>gesture<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>hand<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>object<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li><li class="tsd-parameter"><h5>options<span class="tsd-signature-symbol">: </span><a href="../interfaces/DrawOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">DrawOptions</a></h5></li><li class="tsd-parameter"><h5>person<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="env" class="tsd-anchor"></a><h3>env</h3><div class="tsd-signature tsd-kind-icon">env<span class="tsd-signature-symbol">:</span> <a href="../index.html#Env" class="tsd-signature-type" data-tsd-kind="Type alias">Env</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L128">human.ts:128</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Object containing environment information used for diagnostics</p> <p>Object containing environment information used for diagnostics</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="events" class="tsd-anchor"></a><h3>events</h3><div class="tsd-signature tsd-kind-icon">events<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">EventTarget</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L157">human.ts:157</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="events" class="tsd-anchor"></a><h3>events</h3><div class="tsd-signature tsd-kind-icon">events<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">EventTarget</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L156">human.ts:156</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Container for events dispatched by Human</p> <p>Container for events dispatched by Human</p>
</div><div><p>Possible events:</p> </div><div><p>Possible events:</p>
<ul> <ul>
@ -51,13 +51,13 @@
<li><code>warmup</code>: triggered when warmup is complete</li> <li><code>warmup</code>: triggered when warmup is complete</li>
<li><code>error</code>: triggered on some errors</li> <li><code>error</code>: triggered on some errors</li>
</ul> </ul>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="faceTriangulation" class="tsd-anchor"></a><h3>face<wbr/>Triangulation</h3><div class="tsd-signature tsd-kind-icon">face<wbr/>Triangulation<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L159">human.ts:159</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="faceTriangulation" class="tsd-anchor"></a><h3>face<wbr/>Triangulation</h3><div class="tsd-signature tsd-kind-icon">face<wbr/>Triangulation<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L158">human.ts:158</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Reference face triangualtion array of 468 points, used for triangle references between points</p> <p>Reference face triangualtion array of 468 points, used for triangle references between points</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="faceUVMap" class="tsd-anchor"></a><h3>faceUVMap</h3><div class="tsd-signature tsd-kind-icon">faceUVMap<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></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L161">human.ts:161</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="faceUVMap" class="tsd-anchor"></a><h3>faceUVMap</h3><div class="tsd-signature tsd-kind-icon">faceUVMap<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></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L160">human.ts:160</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Refernce UV map of 468 values, used for 3D mapping of the face mesh</p> <p>Refernce UV map of 468 values, used for 3D mapping of the face mesh</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="gl" class="tsd-anchor"></a><h3>gl</h3><div class="tsd-signature tsd-kind-icon">gl<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">&gt;</span></div><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"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="gl" class="tsd-anchor"></a><h3>gl</h3><div class="tsd-signature tsd-kind-icon">gl<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">&gt;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L167">human.ts:167</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>WebGL debug info</p> <p>WebGL debug info</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="match" class="tsd-anchor"></a><h3>match</h3><div class="tsd-signature tsd-kind-icon">match<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>descriptor<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptors<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a><span class="tsd-signature-symbol">[]</span>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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"> =&gt; </span><span class="tsd-signature-symbol">{ </span>distance<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>index<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L262">human.ts:262</a></li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>descriptor<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptors<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a><span class="tsd-signature-symbol">[]</span>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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><span class="tsd-signature-symbol">{ </span>distance<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>index<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="match" class="tsd-anchor"></a><h3>match</h3><div class="tsd-signature tsd-kind-icon">match<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>descriptor<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptors<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a><span class="tsd-signature-symbol">[]</span>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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"> =&gt; </span><span class="tsd-signature-symbol">{ </span>distance<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>index<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L261">human.ts:261</a></li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>descriptor<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptors<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a><span class="tsd-signature-symbol">[]</span>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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><span class="tsd-signature-symbol">{ </span>distance<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>index<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</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></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><div class="tsd-comment tsd-typography"><div class="lead">
<p>Matches given descriptor to a closest entry in array of descriptors</p> <p>Matches given descriptor to a closest entry in array of descriptors</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>descriptor: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>descriptor: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5><div class="tsd-comment tsd-typography"><div class="lead">
<p>face descriptor</p> <p>face descriptor</p>
@ -74,27 +74,27 @@
<li><a href="Human.html#distance">distance</a> calculated <code>distance</code> of given descriptor to the best match</li> <li><a href="Human.html#distance">distance</a> calculated <code>distance</code> of given descriptor to the best match</li>
<li><a href="Human.html#similarity">similarity</a> calculated normalized <code>similarity</code> of given descriptor to the best match</li> <li><a href="Human.html#similarity">similarity</a> calculated normalized <code>similarity</code> of given descriptor to the best match</li>
</ul> </ul>
</div><ul class="tsd-parameters"><li class="tsd-parameter"><h5>distance<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>index<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li></ul></li></ul></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="performance" class="tsd-anchor"></a><h3>performance</h3><div class="tsd-signature tsd-kind-icon">performance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">&gt;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L163">human.ts:163</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div><ul class="tsd-parameters"><li class="tsd-parameter"><h5>distance<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>index<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>similarity<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li></ul></li></ul></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="performance" class="tsd-anchor"></a><h3>performance</h3><div class="tsd-signature tsd-kind-icon">performance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">&gt;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L162">human.ts:162</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Performance object that contains values for all recently performed operations</p> <p>Performance object that contains values for all recently performed operations</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="process" class="tsd-anchor"></a><h3>process</h3><div class="tsd-signature tsd-kind-icon">process<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L118">human.ts:118</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="process" class="tsd-anchor"></a><h3>process</h3><div class="tsd-signature tsd-kind-icon">process<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L117">human.ts:117</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>currenty processed image tensor and canvas</p> <p>currenty processed image tensor and canvas</p>
</div></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="result" class="tsd-anchor"></a><h3>result</h3><div class="tsd-signature tsd-kind-icon">result<span class="tsd-signature-symbol">:</span> <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L109">human.ts:109</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="result" class="tsd-anchor"></a><h3>result</h3><div class="tsd-signature tsd-kind-icon">result<span class="tsd-signature-symbol">:</span> <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L108">human.ts:108</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Last known result of detect run</p> <p>Last known result of detect run</p>
<ul> <ul>
<li>Can be accessed anytime after initial detection</li> <li>Can be accessed anytime after initial detection</li>
<li>Definition: <a href="../interfaces/Result.html">Result</a></li> <li>Definition: <a href="../interfaces/Result.html">Result</a></li>
</ul> </ul>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="similarity" class="tsd-anchor"></a><h3>similarity</h3><div class="tsd-signature tsd-kind-icon">similarity<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"> =&gt; </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L260">human.ts:260</a></li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="similarity" class="tsd-anchor"></a><h3>similarity</h3><div class="tsd-signature tsd-kind-icon">similarity<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"> =&gt; </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L259">human.ts:259</a></li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>descriptor1<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, descriptor2<span class="tsd-signature-symbol">: </span><a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a>, options<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-symbol">{ </span>order<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"><div class="tsd-comment tsd-typography"><div class="lead">
<p>Calculates normalized similarity between two descriptors based on their <code>distance</code></p> <p>Calculates normalized similarity between two descriptors based on their <code>distance</code></p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>descriptor1: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>descriptor2: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>options: <span class="tsd-signature-symbol">{ </span>order<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></h5><ul class="tsd-parameters"><li class="tsd-parameter"><h5>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li></ul></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4></li></ul></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="state" class="tsd-anchor"></a><h3>state</h3><div class="tsd-signature tsd-kind-icon">state<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#L115">human.ts:115</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>descriptor1: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>descriptor2: <a href="../index.html#Descriptor" class="tsd-signature-type" data-tsd-kind="Type alias">Descriptor</a></h5></li><li><h5>options: <span class="tsd-signature-symbol">{ </span>order<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></h5><ul class="tsd-parameters"><li class="tsd-parameter"><h5>order<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">number</span></h5></li></ul></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4></li></ul></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="state" class="tsd-anchor"></a><h3>state</h3><div class="tsd-signature tsd-kind-icon">state<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#L114">human.ts:114</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Current state of Human library</p> <p>Current state of Human library</p>
<ul> <ul>
<li>Can be polled to determine operations that are currently executed</li> <li>Can be polled to determine operations that are currently executed</li>
<li>Progresses through: &#39;config&#39;, &#39;check&#39;, &#39;backend&#39;, &#39;load&#39;, &#39;run:<model>&#39;, &#39;idle&#39;</li> <li>Progresses through: &#39;config&#39;, &#39;check&#39;, &#39;backend&#39;, &#39;load&#39;, &#39;run:<model>&#39;, &#39;idle&#39;</li>
</ul> </ul>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="version" class="tsd-anchor"></a><h3>version</h3><div class="tsd-signature tsd-kind-icon">version<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L97">human.ts:97</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-class"><a name="version" class="tsd-anchor"></a><h3>version</h3><div class="tsd-signature tsd-kind-icon">version<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L96">human.ts:96</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Current version of Human library in <em>semver</em> format</p> <p>Current version of Human library in <em>semver</em> format</p>
</div></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="detect" class="tsd-anchor"></a><h3>detect</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">detect<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a>, userConfig<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L386">human.ts:386</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#L385">human.ts:385</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Main detection method</p> <p>Main detection method</p>
<ul> <ul>
<li>Analyze configuration: <a href="../interfaces/Config.html">Config</a></li> <li>Analyze configuration: <a href="../interfaces/Config.html">Config</a></li>
@ -103,12 +103,12 @@
<li>Process and return result: <a href="../interfaces/Result.html">Result</a></li> <li>Process and return result: <a href="../interfaces/Result.html">Result</a></li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../index.html#Error" class="tsd-signature-type" data-tsd-kind="Type alias">Error</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol">&gt;</span></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="enhance" class="tsd-anchor"></a><h3>enhance</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">enhance<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/human.ts#L296">human.ts:296</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#L295">human.ts:295</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Enhance method performs additional enhacements to face image previously detected for futher processing</p> <p>Enhance method performs additional enhacements to face image previously detected for futher processing</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Tensor</p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">Tensor</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">Rank</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Tensor</p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="image" class="tsd-anchor"></a><h3>image</h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">image<span class="tsd-signature-symbol">(</span>input<span class="tsd-signature-symbol">: </span><a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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#L269">human.ts:269</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">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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#L268">human.ts:268</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Process input as return canvas and tensor</p> <p>Process input as return canvas and tensor</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">{ </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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">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#L307">human.ts:307</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">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</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">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#L306">human.ts:306</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Explicit backend initialization</p> <p>Explicit backend initialization</p>
<ul> <ul>
<li>Normally done implicitly during initial load phase</li> <li>Normally done implicitly during initial load phase</li>
@ -116,19 +116,19 @@
<li>Use when changing backend during runtime</li> <li>Use when changing backend during runtime</li>
</ul> </ul>
</div></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Promise<void></p> </div></div><h4 class="tsd-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="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#L319">human.ts:319</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#L318">human.ts:318</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Load method preloads all configured models on-demand</p> <p>Load method preloads all configured models on-demand</p>
<ul> <ul>
<li>Not explicitly required as any required model is load implicitly on it&#39;s first run</li> <li>Not explicitly required as any required model is load implicitly on it&#39;s first run</li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Promise<void></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> userConfig: <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/Config.html" class="tsd-signature-type" data-tsd-kind="Interface">Config</a><span class="tsd-signature-symbol">&gt;</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><div><p>Promise<void></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="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#L362">human.ts:362</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="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#L361">human.ts:361</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Runs interpolation using last known result and returns smoothened result <p>Runs interpolation using last known result and returns smoothened result
Interpolation is based on time since last known result so can be called independently</p> Interpolation is based on time since last known result so can be called independently</p>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>result: <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> = ...</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p> </div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>result: <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a><span class="tsd-signature-symbol"> = ...</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="../interfaces/Result.html" class="tsd-signature-type" data-tsd-kind="Interface">Result</a></h4><div><p>result: <a href="../interfaces/Result.html">Result</a></p>
</div></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a name="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">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#L248">human.ts:248</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">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#L247">human.ts:247</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Reset configuration to default values</p> <p>Reset configuration to default values</p>
</div></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</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-symbol">{ </span>alpha<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>data<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">&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#L286">human.ts:286</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</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-symbol">{ </span>alpha<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>data<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">&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#L285">human.ts:285</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Segmentation method takes any input and returns processed canvas with body segmentation</p> <p>Segmentation method takes any input and returns processed canvas with body segmentation</p>
<ul> <ul>
<li>Optional parameter background is used to fill the background with specific input</li> <li>Optional parameter background is used to fill the background with specific input</li>
@ -140,9 +140,9 @@ Interpolation is based on time since last known result so can be called independ
<li><code>canvas</code> as canvas which is input image filtered with segementation data and optionally merged with background image. canvas alpha values are set to segmentation values for easy merging</li> <li><code>canvas</code> as canvas which is input image filtered with segementation data and optionally merged with background image. canvas alpha values are set to segmentation values for easy merging</li>
<li><code>alpha</code> as grayscale canvas that represents segmentation alpha values</li> <li><code>alpha</code> as grayscale canvas that represents segmentation alpha values</li>
</ul> </ul>
</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>input: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li><li><h5><span class="tsd-flag ts-flagOptional">Optional</span> background: <a href="../index.html#Input" class="tsd-signature-type" data-tsd-kind="Type alias">Input</a></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-symbol">{ </span>alpha<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>data<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">&gt;</span></h4><div></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#L255">human.ts:255</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><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-symbol">{ </span>alpha<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>canvas<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span><span class="tsd-signature-symbol">; </span>data<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">&gt;</span></h4><div></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#L254">human.ts:254</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Validate current configuration schema</p> <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#L372">human.ts:372</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><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#L371">human.ts:371</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Warmup method pre-initializes all configured models for faster inference</p> <p>Warmup method pre-initializes all configured models for faster inference</p>
<ul> <ul>
<li>can take significant time on startup</li> <li>can take significant time on startup</li>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,22 +1,22 @@
<!DOCTYPE html><html class="default no-js"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Result | @vladmandic/human - v2.3.0</title><meta name="description" content="Documentation for @vladmandic/human - v2.3.0"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@vladmandic/human - v2.3.0</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../index.html">@vladmandic/human - v2.3.0</a></li><li><a href="Result.html">Result</a></li></ul><h1>Interface Result</h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><div class="lead"> <!DOCTYPE html><html class="default no-js"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Result | @vladmandic/human - v2.3.0</title><meta name="description" content="Documentation for @vladmandic/human - v2.3.0"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@vladmandic/human - v2.3.0</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../index.html">@vladmandic/human - v2.3.0</a></li><li><a href="Result.html">Result</a></li></ul><h1>Interface Result</h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><div class="lead">
<p>Result interface definition for <strong>Human</strong> library</p> <p>Result interface definition for <strong>Human</strong> library</p>
</div><div><p>Contains all possible detection results</p> </div><div><p>Contains all possible detection results</p>
</div></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Result</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#canvas" class="tsd-kind-icon">canvas</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#persons" class="tsd-kind-icon">persons</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#timestamp" class="tsd-kind-icon">timestamp</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="body" class="tsd-anchor"></a><h3>body</h3><div class="tsd-signature tsd-kind-icon">body<span class="tsd-signature-symbol">:</span> <a href="BodyResult.html" class="tsd-signature-type" data-tsd-kind="Interface">BodyResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L185">result.ts:185</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> </div></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Result</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#canvas" class="tsd-kind-icon">canvas</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#persons" class="tsd-kind-icon">persons</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#timestamp" class="tsd-kind-icon">timestamp</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="body" class="tsd-anchor"></a><h3>body</h3><div class="tsd-signature tsd-kind-icon">body<span class="tsd-signature-symbol">:</span> <a href="BodyResult.html" class="tsd-signature-type" data-tsd-kind="Interface">BodyResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L187">result.ts:187</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p><a href="BodyResult.html">BodyResult</a>: detection &amp; analysis results</p> <p><a href="BodyResult.html">BodyResult</a>: detection &amp; analysis results</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="canvas" class="tsd-anchor"></a><h3><span class="tsd-flag ts-flagOptional">Optional</span> canvas</h3><div class="tsd-signature tsd-kind-icon">canvas<span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L195">result.ts:195</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="canvas" class="tsd-anchor"></a><h3><span class="tsd-flag ts-flagOptional">Optional</span> canvas</h3><div class="tsd-signature tsd-kind-icon">canvas<span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OffscreenCanvas</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCanvasElement</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L197">result.ts:197</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>optional processed canvas that can be used to draw input on screen</p> <p>optional processed canvas that can be used to draw input on screen</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="face" class="tsd-anchor"></a><h3>face</h3><div class="tsd-signature tsd-kind-icon">face<span class="tsd-signature-symbol">:</span> <a href="FaceResult.html" class="tsd-signature-type" data-tsd-kind="Interface">FaceResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L183">result.ts:183</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="face" class="tsd-anchor"></a><h3>face</h3><div class="tsd-signature tsd-kind-icon">face<span class="tsd-signature-symbol">:</span> <a href="FaceResult.html" class="tsd-signature-type" data-tsd-kind="Interface">FaceResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L185">result.ts:185</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p><a href="FaceResult.html">FaceResult</a>: detection &amp; analysis results</p> <p><a href="FaceResult.html">FaceResult</a>: detection &amp; analysis results</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="gesture" class="tsd-anchor"></a><h3>gesture</h3><div class="tsd-signature tsd-kind-icon">gesture<span class="tsd-signature-symbol">:</span> <a href="../index.html#GestureResult" class="tsd-signature-type" data-tsd-kind="Type alias">GestureResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L189">result.ts:189</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="gesture" class="tsd-anchor"></a><h3>gesture</h3><div class="tsd-signature tsd-kind-icon">gesture<span class="tsd-signature-symbol">:</span> <a href="../index.html#GestureResult" class="tsd-signature-type" data-tsd-kind="Type alias">GestureResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L191">result.ts:191</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p><a href="../index.html#GestureResult">GestureResult</a>: detection &amp; analysis results</p> <p><a href="../index.html#GestureResult">GestureResult</a>: detection &amp; analysis results</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="hand" class="tsd-anchor"></a><h3>hand</h3><div class="tsd-signature tsd-kind-icon">hand<span class="tsd-signature-symbol">:</span> <a href="HandResult.html" class="tsd-signature-type" data-tsd-kind="Interface">HandResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L187">result.ts:187</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="hand" class="tsd-anchor"></a><h3>hand</h3><div class="tsd-signature tsd-kind-icon">hand<span class="tsd-signature-symbol">:</span> <a href="HandResult.html" class="tsd-signature-type" data-tsd-kind="Interface">HandResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L189">result.ts:189</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p><a href="HandResult.html">HandResult</a>: detection &amp; analysis results</p> <p><a href="HandResult.html">HandResult</a>: detection &amp; analysis results</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="object" class="tsd-anchor"></a><h3>object</h3><div class="tsd-signature tsd-kind-icon">object<span class="tsd-signature-symbol">:</span> <a href="ObjectResult.html" class="tsd-signature-type" data-tsd-kind="Interface">ObjectResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L191">result.ts:191</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="object" class="tsd-anchor"></a><h3>object</h3><div class="tsd-signature tsd-kind-icon">object<span class="tsd-signature-symbol">:</span> <a href="ObjectResult.html" class="tsd-signature-type" data-tsd-kind="Interface">ObjectResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L193">result.ts:193</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p><a href="ObjectResult.html">ObjectResult</a>: detection &amp; analysis results</p> <p><a href="ObjectResult.html">ObjectResult</a>: detection &amp; analysis results</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="performance" class="tsd-anchor"></a><h3>performance</h3><div class="tsd-signature tsd-kind-icon">performance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">&gt;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L193">result.ts:193</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="performance" class="tsd-anchor"></a><h3>performance</h3><div class="tsd-signature tsd-kind-icon">performance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">&gt;</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L195">result.ts:195</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>global performance object with timing values for each operation</p> <p>global performance object with timing values for each operation</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="persons" class="tsd-anchor"></a><h3>persons</h3><div class="tsd-signature tsd-kind-icon">persons<span class="tsd-signature-symbol">:</span> <a href="PersonResult.html" class="tsd-signature-type" data-tsd-kind="Interface">PersonResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L199">result.ts:199</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="persons" class="tsd-anchor"></a><h3>persons</h3><div class="tsd-signature tsd-kind-icon">persons<span class="tsd-signature-symbol">:</span> <a href="PersonResult.html" class="tsd-signature-type" data-tsd-kind="Interface">PersonResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L201">result.ts:201</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>getter property that returns unified persons object</p> <p>getter property that returns unified persons object</p>
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a name="timestamp" class="tsd-anchor"></a><h3><span class="tsd-flag ts-flagReadonly">Readonly</span> timestamp</h3><div class="tsd-signature tsd-kind-icon">timestamp<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L197">result.ts:197</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="timestamp" class="tsd-anchor"></a><h3><span class="tsd-flag ts-flagReadonly">Readonly</span> timestamp</h3><div class="tsd-signature tsd-kind-icon">timestamp<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L199">result.ts:199</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>timestamp of detection representing the milliseconds elapsed since the UNIX epoch</p> <p>timestamp of detection representing the milliseconds elapsed since the UNIX epoch</p>
</div></div></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-interface"><a href="Result.html" class="tsd-kind-icon">Result</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#canvas" class="tsd-kind-icon">canvas</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#persons" class="tsd-kind-icon">persons</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#timestamp" class="tsd-kind-icon">timestamp</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></div></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-interface"><a href="Result.html" class="tsd-kind-icon">Result</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#canvas" class="tsd-kind-icon">canvas</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#performance" class="tsd-kind-icon">performance</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#persons" class="tsd-kind-icon">persons</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Result.html#timestamp" class="tsd-kind-icon">timestamp</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

@ -1,7 +0,0 @@
/**
* BlazePose model implemenation constants
* See `blazepose.ts` for entry point
*/
export declare const full: string[];
export declare const upper: string[];
//# sourceMappingURL=annotations.d.ts.map

View File

@ -1 +0,0 @@
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../../src/body/annotations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,IAAI,UAwChB,CAAC;AAEF,eAAO,MAAM,KAAK,UAgCjB,CAAC"}

View File

@ -1,7 +1,5 @@
/** /**
* BlazePose model implementation * BlazePose model implementation
*
* Based on : [**BlazePose**](https://github.com/google/mediapipe/blob/master/mediapipe/modules/pose_detection)
*/ */
import type { BodyResult } from '../result'; import type { BodyResult } from '../result';
import type { GraphModel, Tensor } from '../tfjs/types'; import type { GraphModel, Tensor } from '../tfjs/types';

View File

@ -1 +1 @@
{"version":3,"file":"blazepose.d.ts","sourceRoot":"","sources":["../../../src/body/blazepose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAoCxC,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWpE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWlE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAI1F;AA8DD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBlF"} {"version":3,"file":"blazepose.d.ts","sourceRoot":"","sources":["../../../src/body/blazepose.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWxC,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWpE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAalE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAI1F;AA4FD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAUlF"}

12
types/src/body/blazeposecoords.d.ts vendored Normal file
View File

@ -0,0 +1,12 @@
export declare const kpt: string[];
export declare const connected: {
leftLeg: string[];
rightLeg: string[];
torso: string[];
leftArm: string[];
rightArm: string[];
leftHand: never[];
rightHand: never[];
head: never[];
};
//# sourceMappingURL=blazeposecoords.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"blazeposecoords.d.ts","sourceRoot":"","sources":["../../../src/body/blazeposecoords.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,UAwCf,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;CASrB,CAAC"}

View File

@ -1 +1 @@
{"version":3,"file":"efficientpose.d.ts","sourceRoot":"","sources":["../../../src/body/efficientpose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAexC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAmBD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAkElF"} {"version":3,"file":"efficientpose.d.ts","sourceRoot":"","sources":["../../../src/body/efficientpose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAmBD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA4ElF"}

10
types/src/body/efficientposecoords.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
export declare const kpt: string[];
export declare const connected: {
leftLeg: string[];
rightLeg: string[];
torso: string[];
leftArm: string[];
rightArm: string[];
head: never[];
};
//# sourceMappingURL=efficientposecoords.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"efficientposecoords.d.ts","sourceRoot":"","sources":["../../../src/body/efficientposecoords.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,UAiBf,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;CAOrB,CAAC"}

View File

@ -1 +1 @@
{"version":3,"file":"movenet.d.ts","sourceRoot":"","sources":["../../../src/body/movenet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAgBxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9D;AAwFD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2ClF"} {"version":3,"file":"movenet.d.ts","sourceRoot":"","sources":["../../../src/body/movenet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9D;AA4GD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2ClF"}

View File

@ -1 +1 @@
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQ1C,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAElC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAQ5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AASnC,OAAO,KAAK,EAAE,MAAM,EAAiF,MAAM,UAAU,CAAC;AACtH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,kEAAkE;AAClE,cAAc,UAAU,CAAC;AAEzB,6DAA6D;AAC7D,cAAc,UAAU,CAAC;AAEzB,yDAAyD;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,2CAA2C;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,+BAA+B;AAC/B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,+DAA+D;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;;;;;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;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;MAGE;IACF,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;;;;;OAKG;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;;;MAGE;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAEtB;;;;;;;;;OASG;IACH,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,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;IA8CxC,cAAc;IACd,OAAO,WAAY,MAAM,EAAE,UAO1B;IAgBD,4CAA4C;IAC5C,KAAK,IAAI,IAAI;IAMb,4CAA4C;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;;;;;IAI5C,oCAAoC;IAC7B,UAAU,0BAAoB;IAC9B,QAAQ,wBAAkB;IAC1B,KAAK,qBAAe;IAE3B;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK;;;;IAIlB;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAAA;KAAE,CAAC;IAIxL;;;;OAIG;IAEH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIrC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;;MAKE;IACI,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCvD,cAAc;IACd,IAAI,UAAW,MAAM,UAEpB;IAED;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,MAAoB,GAAG,MAAM;IAI1C;;;;;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;CAkKlF;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;AAKH,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAO1C,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAElC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAQ5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AASnC,OAAO,KAAK,EAAE,MAAM,EAAiF,MAAM,UAAU,CAAC;AACtH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,kEAAkE;AAClE,cAAc,UAAU,CAAC;AAEzB,6DAA6D;AAC7D,cAAc,UAAU,CAAC;AAEzB,yDAAyD;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,2CAA2C;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,+BAA+B;AAC/B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,+DAA+D;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;;;;;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;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;MAGE;IACF,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;;;;;OAKG;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;;;MAGE;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAEtB;;;;;;;;;OASG;IACH,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,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;IA8CxC,cAAc;IACd,OAAO,WAAY,MAAM,EAAE,UAO1B;IAgBD,4CAA4C;IAC5C,KAAK,IAAI,IAAI;IAMb,4CAA4C;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;;;;;IAI5C,oCAAoC;IAC7B,UAAU,0BAAoB;IAC9B,QAAQ,wBAAkB;IAC1B,KAAK,qBAAe;IAE3B;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK;;;;IAIlB;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAAA;KAAE,CAAC;IAIxL;;;;OAIG;IAEH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIrC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;;MAKE;IACI,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCvD,cAAc;IACd,IAAI,UAAW,MAAM,UAEpB;IAED;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,MAAoB,GAAG,MAAM;IAI1C;;;;;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;CAkKlF;AAED,oCAAoC;AACpC,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,CAAC"}

15
types/src/result.d.ts vendored
View File

@ -65,6 +65,12 @@ export interface FaceResult {
}; };
tensor?: Tensor; tensor?: Tensor;
} }
export declare type BodyKeypoint = {
part: string;
position: Point;
positionRaw: Point;
score: number;
};
/** Body results /** Body results
* *
* Each results has: * Each results has:
@ -83,13 +89,8 @@ export interface BodyResult {
score: number; score: number;
box: Box; box: Box;
boxRaw: Box; boxRaw: Box;
keypoints: Array<{ annotations: Record<string, Point[][]>;
part: string; keypoints: Array<BodyKeypoint>;
position: Point;
positionRaw: Point;
score: number;
presence?: number;
}>;
} }
/** Hand results /** Hand results
* *

View File

@ -1 +1 @@
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5F,oBAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,oBAAY,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IAClB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjF,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7C,CAAA;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,KAAK,CAAC;QAChB,WAAW,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAA;CACH;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CACjB,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EACxD,KAAK,CAAC,KAAK,CAAC,CACb,CAAC;IACF,SAAS,EAAE,MAAM,CACf,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAC/C;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,YAAY,GAAG,cAAc,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,CAAA;KAAE,CACtM,CAAC;CACH;AAED;;;;;;;;;;;EAWE;AACF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;CACb;AAED;;;;;;;GAOG;AACH,oBAAY,aAAa,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAA;AAE5C;;;;;;;;;;;EAWE;AACF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7D,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/B,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,uDAAuD;IACvD,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxB,uDAAuD;IACvD,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxB,uDAAuD;IACvD,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxB,0DAA0D;IAC1D,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC9B,yDAAyD;IACzD,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;IAC3B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,yEAAyE;IACzE,MAAM,CAAC,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;CAC9B"} {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5F,oBAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,oBAAY,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IAClB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjF,IAAI,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7C,CAAA;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oBAAY,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;CAC/B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CACjB,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EACxD,KAAK,CAAC,KAAK,CAAC,CACb,CAAC;IACF,SAAS,EAAE,MAAM,CACf,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAC/C;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,YAAY,GAAG,cAAc,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,CAAA;KAAE,CACtM,CAAC;CACH;AAED;;;;;;;;;;;EAWE;AACF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,GAAG,CAAC;CACb;AAED;;;;;;;GAOG;AACH,oBAAY,aAAa,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAA;AAE5C;;;;;;;;;;;EAWE;AACF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7D,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/B,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,uDAAuD;IACvD,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxB,uDAAuD;IACvD,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxB,uDAAuD;IACvD,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxB,0DAA0D;IAC1D,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC9B,yDAAyD;IACzD,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;IAC3B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,yEAAyE;IACzE,MAAM,CAAC,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;CAC9B"}