mirror of https://github.com/vladmandic/human
update & fix posenet
parent
17e851bc2a
commit
733ffc8b2b
|
@ -1,6 +1,6 @@
|
||||||
# @vladmandic/human
|
# @vladmandic/human
|
||||||
|
|
||||||
Version: **1.8.2**
|
Version: **1.8.3**
|
||||||
Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition**
|
Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition**
|
||||||
|
|
||||||
Author: **Vladimir Mandic <mandic00@live.com>**
|
Author: **Vladimir Mandic <mandic00@live.com>**
|
||||||
|
@ -9,7 +9,10 @@ Repository: **<git+https://github.com/vladmandic/human.git>**
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
### **HEAD -> main** 2021/05/04 mandic00@live.com
|
### **1.8.3** 2021/05/05 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
|
### **origin/main** 2021/05/04 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
### **1.8.2** 2021/05/04 mandic00@live.com
|
### **1.8.2** 2021/05/04 mandic00@live.com
|
||||||
|
|
|
@ -9,11 +9,10 @@ import webRTC from './helpers/webrtc.js';
|
||||||
let human;
|
let human;
|
||||||
|
|
||||||
const userConfig = {
|
const userConfig = {
|
||||||
warmup: 'full',
|
warmup: 'none',
|
||||||
/*
|
/*
|
||||||
backend: 'webgl',
|
backend: 'webgl',
|
||||||
async: true,
|
async: true,
|
||||||
|
|
||||||
videoOptimized: false,
|
videoOptimized: false,
|
||||||
filter: {
|
filter: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
|
@ -36,10 +35,12 @@ const userConfig = {
|
||||||
|
|
||||||
// ui options
|
// ui options
|
||||||
const ui = {
|
const ui = {
|
||||||
baseBackground: 'rgba(50, 50, 50, 1)', // 'grey'
|
// configurable items
|
||||||
|
console: true, // log messages to browser console
|
||||||
crop: true, // video mode crop to size or leave full frame
|
crop: true, // video mode crop to size or leave full frame
|
||||||
columns: 2, // when processing sample images create this many columns
|
|
||||||
facing: true, // camera facing front or back
|
facing: true, // camera facing front or back
|
||||||
|
baseBackground: 'rgba(50, 50, 50, 1)', // 'grey'
|
||||||
|
columns: 2, // when processing sample images create this many columns
|
||||||
useWorker: false, // use web workers for processing
|
useWorker: false, // use web workers for processing
|
||||||
worker: 'index-worker.js',
|
worker: 'index-worker.js',
|
||||||
samples: ['../assets/sample6.jpg', '../assets/sample1.jpg', '../assets/sample4.jpg', '../assets/sample5.jpg', '../assets/sample3.jpg', '../assets/sample2.jpg'],
|
samples: ['../assets/sample6.jpg', '../assets/sample1.jpg', '../assets/sample4.jpg', '../assets/sample5.jpg', '../assets/sample3.jpg', '../assets/sample2.jpg'],
|
||||||
|
@ -47,10 +48,10 @@ const ui = {
|
||||||
useWebRTC: false, // use webrtc as camera source instead of local webcam
|
useWebRTC: false, // use webrtc as camera source instead of local webcam
|
||||||
webRTCServer: 'http://localhost:8002',
|
webRTCServer: 'http://localhost:8002',
|
||||||
webRTCStream: 'reowhite',
|
webRTCStream: 'reowhite',
|
||||||
console: true, // log messages to browser console
|
|
||||||
maxFPSframes: 10, // keep fps history for how many frames
|
maxFPSframes: 10, // keep fps history for how many frames
|
||||||
modelsPreload: true, // preload human models on startup
|
modelsPreload: true, // preload human models on startup
|
||||||
modelsWarmup: true, // warmup human models on startup
|
modelsWarmup: true, // warmup human models on startup
|
||||||
|
// internal variables
|
||||||
busy: false, // internal camera busy flag
|
busy: false, // internal camera busy flag
|
||||||
menuWidth: 0, // internal
|
menuWidth: 0, // internal
|
||||||
menuHeight: 0, // internal
|
menuHeight: 0, // internal
|
||||||
|
@ -58,7 +59,7 @@ const ui = {
|
||||||
detectFPS: [], // internal, holds fps values for detection performance
|
detectFPS: [], // internal, holds fps values for detection performance
|
||||||
drawFPS: [], // internal, holds fps values for draw performance
|
drawFPS: [], // internal, holds fps values for draw performance
|
||||||
buffered: true, // should output be buffered between frames
|
buffered: true, // should output be buffered between frames
|
||||||
drawWarmup: true, // debug only, should warmup image processing be displayed on startup
|
drawWarmup: false, // debug only, should warmup image processing be displayed on startup
|
||||||
drawThread: null, // internl, perform draw operations in a separate thread
|
drawThread: null, // internl, perform draw operations in a separate thread
|
||||||
detectThread: null, // internl, perform detect operations in a separate thread
|
detectThread: null, // internl, perform detect operations in a separate thread
|
||||||
framesDraw: 0, // internal, statistics on frames drawn
|
framesDraw: 0, // internal, statistics on frames drawn
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -106,6 +106,103 @@ function mergeDeep(...objects) {
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// src/config.ts
|
||||||
|
var config = {
|
||||||
|
backend: "webgl",
|
||||||
|
modelBasePath: "../models/",
|
||||||
|
wasmPath: "../assets/",
|
||||||
|
debug: true,
|
||||||
|
async: true,
|
||||||
|
videoOptimized: true,
|
||||||
|
warmup: "full",
|
||||||
|
filter: {
|
||||||
|
enabled: true,
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
flip: false,
|
||||||
|
return: true,
|
||||||
|
brightness: 0,
|
||||||
|
contrast: 0,
|
||||||
|
sharpness: 0,
|
||||||
|
blur: 0,
|
||||||
|
saturation: 0,
|
||||||
|
hue: 0,
|
||||||
|
negative: false,
|
||||||
|
sepia: false,
|
||||||
|
vintage: false,
|
||||||
|
kodachrome: false,
|
||||||
|
technicolor: false,
|
||||||
|
polaroid: false,
|
||||||
|
pixelate: 0
|
||||||
|
},
|
||||||
|
gesture: {
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
face: {
|
||||||
|
enabled: true,
|
||||||
|
detector: {
|
||||||
|
modelPath: "blazeface.json",
|
||||||
|
rotation: false,
|
||||||
|
maxDetected: 10,
|
||||||
|
skipFrames: 21,
|
||||||
|
skipInitial: false,
|
||||||
|
minConfidence: 0.2,
|
||||||
|
iouThreshold: 0.1,
|
||||||
|
return: false
|
||||||
|
},
|
||||||
|
mesh: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "facemesh.json"
|
||||||
|
},
|
||||||
|
iris: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "iris.json"
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "faceres.json",
|
||||||
|
skipFrames: 31,
|
||||||
|
minConfidence: 0.1
|
||||||
|
},
|
||||||
|
emotion: {
|
||||||
|
enabled: true,
|
||||||
|
minConfidence: 0.1,
|
||||||
|
skipFrames: 32,
|
||||||
|
modelPath: "emotion.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "posenet.json",
|
||||||
|
maxDetected: 1,
|
||||||
|
minConfidence: 0.1
|
||||||
|
},
|
||||||
|
hand: {
|
||||||
|
enabled: true,
|
||||||
|
rotation: false,
|
||||||
|
skipFrames: 12,
|
||||||
|
skipInitial: false,
|
||||||
|
minConfidence: 0.1,
|
||||||
|
iouThreshold: 0.1,
|
||||||
|
maxDetected: 2,
|
||||||
|
landmarks: true,
|
||||||
|
detector: {
|
||||||
|
modelPath: "handdetect.json"
|
||||||
|
},
|
||||||
|
skeleton: {
|
||||||
|
modelPath: "handskeleton.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
object: {
|
||||||
|
enabled: false,
|
||||||
|
modelPath: "nanodet.json",
|
||||||
|
minConfidence: 0.2,
|
||||||
|
iouThreshold: 0.4,
|
||||||
|
maxDetected: 10,
|
||||||
|
skipFrames: 41
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// src/sysinfo.ts
|
// src/sysinfo.ts
|
||||||
function info() {
|
function info() {
|
||||||
let platform;
|
let platform;
|
||||||
|
@ -132,7 +229,7 @@ var tf16 = __toModule(require_tfjs_esm());
|
||||||
|
|
||||||
// src/tfjs/backend.ts
|
// src/tfjs/backend.ts
|
||||||
var tf = __toModule(require_tfjs_esm());
|
var tf = __toModule(require_tfjs_esm());
|
||||||
var config = {
|
var config2 = {
|
||||||
name: "humangl",
|
name: "humangl",
|
||||||
priority: 99,
|
priority: 99,
|
||||||
canvas: null,
|
canvas: null,
|
||||||
|
@ -151,29 +248,29 @@ var config = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
function register() {
|
function register() {
|
||||||
if (!tf.findBackend(config.name)) {
|
if (!tf.findBackend(config2.name)) {
|
||||||
log("backend registration:", config.name);
|
log("backend registration:", config2.name);
|
||||||
try {
|
try {
|
||||||
config.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config.width, config.height) : document.createElement("canvas");
|
config2.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config2.width, config2.height) : document.createElement("canvas");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot create canvas:", err);
|
log("error: cannot create canvas:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
config.gl = config.canvas.getContext("webgl2", config.webGLattr);
|
config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot get WebGL2 context:", err);
|
log("error: cannot get WebGL2 context:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
tf.setWebGLContext(2, config.gl);
|
tf.setWebGLContext(2, config2.gl);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot set WebGL2 context:", err);
|
log("error: cannot set WebGL2 context:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const ctx = new tf.GPGPUContext(config.gl);
|
const ctx = new tf.GPGPUContext(config2.gl);
|
||||||
tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);
|
tf.registerBackend(config2.name, () => new tf.MathBackendWebGL(ctx), config2.priority);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot register WebGL backend:", err);
|
log("error: cannot register WebGL backend:", err);
|
||||||
return;
|
return;
|
||||||
|
@ -181,7 +278,7 @@ function register() {
|
||||||
try {
|
try {
|
||||||
const kernels = tf.getKernelsForBackend("webgl");
|
const kernels = tf.getKernelsForBackend("webgl");
|
||||||
kernels.forEach((kernelConfig) => {
|
kernels.forEach((kernelConfig) => {
|
||||||
const newKernelConfig = {...kernelConfig, backendName: config.name};
|
const newKernelConfig = {...kernelConfig, backendName: config2.name};
|
||||||
tf.registerKernel(newKernelConfig);
|
tf.registerKernel(newKernelConfig);
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -194,7 +291,7 @@ function register() {
|
||||||
log("error: cannot set WebGL backend flags:", err);
|
log("error: cannot set WebGL backend flags:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log("backend registered:", config.name);
|
log("backend registered:", config2.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4561,7 +4658,7 @@ function addVectors(a, b) {
|
||||||
var localMaximumRadius = 1;
|
var localMaximumRadius = 1;
|
||||||
var outputStride = 16;
|
var outputStride = 16;
|
||||||
var squaredNmsRadius = 50 ** 2;
|
var squaredNmsRadius = 50 ** 2;
|
||||||
function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scoresBuffer, offsets, displacements, offsetRefineStep = 2) {
|
function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {
|
||||||
const getDisplacement = (point2) => ({
|
const getDisplacement = (point2) => ({
|
||||||
y: displacements.get(point2.y, point2.x, edgeId),
|
y: displacements.get(point2.y, point2.x, edgeId),
|
||||||
x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId)
|
x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId)
|
||||||
|
@ -4570,51 +4667,48 @@ function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scor
|
||||||
y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1),
|
y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1),
|
||||||
x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1)
|
x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1)
|
||||||
});
|
});
|
||||||
const [height, width] = scoresBuffer.shape;
|
const [height, width] = scores.shape;
|
||||||
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
||||||
const displacement = getDisplacement(sourceKeypointIndices);
|
const displacement = getDisplacement(sourceKeypointIndices);
|
||||||
const displacedPoint = addVectors(sourceKeypoint.position, displacement);
|
const displacedPoint = addVectors(sourceKeypoint.position, displacement);
|
||||||
let targetKeypoint = displacedPoint;
|
let targetKeypoint = displacedPoint;
|
||||||
for (let i = 0; i < offsetRefineStep; i++) {
|
for (let i = 0; i < offsetRefineStep; i++) {
|
||||||
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetKeypointId, offsets);
|
const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);
|
||||||
targetKeypoint = addVectors({
|
targetKeypoint = addVectors({x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride}, {x: offsetPoint.x, y: offsetPoint.y});
|
||||||
x: targetKeypointIndices.x * outputStride,
|
|
||||||
y: targetKeypointIndices.y * outputStride
|
|
||||||
}, {x: offsetPoint.x, y: offsetPoint.y});
|
|
||||||
}
|
}
|
||||||
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const score = scoresBuffer.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetKeypointId);
|
const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);
|
||||||
return {position: targetKeypoint, part: partNames[targetKeypointId], score};
|
return {position: targetKeypoint, part: partNames[targetId], score};
|
||||||
}
|
}
|
||||||
function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
||||||
const parentChildrenTuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]);
|
const tuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]);
|
||||||
const parentToChildEdges = parentChildrenTuples.map(([, childJointId]) => childJointId);
|
const edgesFwd = tuples.map(([, childJointId]) => childJointId);
|
||||||
const childToParentEdges = parentChildrenTuples.map(([parentJointId]) => parentJointId);
|
const edgesBwd = tuples.map(([parentJointId]) => parentJointId);
|
||||||
const numParts = scores.shape[2];
|
const numParts = scores.shape[2];
|
||||||
const numEdges = parentToChildEdges.length;
|
const numEdges = edgesFwd.length;
|
||||||
const instanceKeypoints = new Array(numParts);
|
const keypoints = new Array(numParts);
|
||||||
const rootPoint = getImageCoords(root.part, outputStride, offsets);
|
const rootPoint = getImageCoords(root.part, outputStride, offsets);
|
||||||
instanceKeypoints[root.part.id] = {
|
keypoints[root.part.id] = {
|
||||||
score: root.score,
|
score: root.score,
|
||||||
part: partNames[root.part.id],
|
part: partNames[root.part.id],
|
||||||
position: rootPoint
|
position: rootPoint
|
||||||
};
|
};
|
||||||
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
||||||
const sourceKeypointId = parentToChildEdges[edge];
|
const sourceId = edgesFwd[edge];
|
||||||
const targetKeypointId = childToParentEdges[edge];
|
const targetId = edgesBwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsBwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let edge = 0; edge < numEdges; ++edge) {
|
for (let edge = 0; edge < numEdges; ++edge) {
|
||||||
const sourceKeypointId = childToParentEdges[edge];
|
const sourceId = edgesBwd[edge];
|
||||||
const targetKeypointId = parentToChildEdges[edge];
|
const targetId = edgesFwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsFwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return instanceKeypoints;
|
return keypoints;
|
||||||
}
|
}
|
||||||
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
||||||
const [height, width] = scores.shape;
|
const [height, width] = scores.shape;
|
||||||
|
@ -4653,27 +4747,30 @@ function buildPartWithScoreQueue(minConfidence, scores) {
|
||||||
}
|
}
|
||||||
function withinRadius(poses2, {x, y}, keypointId) {
|
function withinRadius(poses2, {x, y}, keypointId) {
|
||||||
return poses2.some(({keypoints}) => {
|
return poses2.some(({keypoints}) => {
|
||||||
const correspondingKeypoint = keypoints[keypointId].position;
|
var _a;
|
||||||
|
const correspondingKeypoint = (_a = keypoints[keypointId]) == null ? void 0 : _a.position;
|
||||||
|
if (!correspondingKeypoint)
|
||||||
|
return false;
|
||||||
return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function getInstanceScore(existingPoses, instanceKeypoints) {
|
function getInstanceScore(existingPoses, keypoints) {
|
||||||
const notOverlappedKeypointScores = instanceKeypoints.reduce((result, {position, score}, keypointId) => {
|
const notOverlappedKeypointScores = keypoints.reduce((result, {position, score}, keypointId) => {
|
||||||
if (!withinRadius(existingPoses, position, keypointId))
|
if (!withinRadius(existingPoses, position, keypointId))
|
||||||
result += score;
|
result += score;
|
||||||
return result;
|
return result;
|
||||||
}, 0);
|
}, 0);
|
||||||
return notOverlappedKeypointScores / instanceKeypoints.length;
|
return notOverlappedKeypointScores / keypoints.length;
|
||||||
}
|
}
|
||||||
function decode(offsetsBuffer, scoresBuffer, displacementsFwdBuffer, displacementsBwdBuffer, maxDetected, minConfidence) {
|
function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {
|
||||||
const poses2 = [];
|
const poses2 = [];
|
||||||
const queue = buildPartWithScoreQueue(minConfidence, scoresBuffer);
|
const queue = buildPartWithScoreQueue(minConfidence, scores);
|
||||||
while (poses2.length < maxDetected && !queue.empty()) {
|
while (poses2.length < maxDetected && !queue.empty()) {
|
||||||
const root = queue.dequeue();
|
const root = queue.dequeue();
|
||||||
const rootImageCoords = getImageCoords(root.part, outputStride, offsetsBuffer);
|
const rootImageCoords = getImageCoords(root.part, outputStride, offsets);
|
||||||
if (withinRadius(poses2, rootImageCoords, root.part.id))
|
if (withinRadius(poses2, rootImageCoords, root.part.id))
|
||||||
continue;
|
continue;
|
||||||
let keypoints = decodePose(root, scoresBuffer, offsetsBuffer, displacementsFwdBuffer, displacementsBwdBuffer);
|
let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);
|
||||||
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
||||||
const score = getInstanceScore(poses2, keypoints);
|
const score = getInstanceScore(poses2, keypoints);
|
||||||
const box4 = getBoundingBox(keypoints);
|
const box4 = getBoundingBox(keypoints);
|
||||||
|
@ -16701,11 +16798,11 @@ function rotatePoint2(homogeneousCoordinate, rotationMatrix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/handpose/handpipeline.ts
|
// src/handpose/handpipeline.ts
|
||||||
var PALM_BOX_ENLARGE_FACTOR = 5;
|
var palmBoxEnlargeFactor = 5;
|
||||||
var HAND_BOX_ENLARGE_FACTOR = 1.65;
|
var handBoxEnlargeFactor = 1.65;
|
||||||
var PALM_LANDMARK_IDS = [0, 5, 9, 13, 17, 1, 2];
|
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||||
var PALM_LANDMARKS_INDEX_OF_PALM_BASE = 0;
|
var palmLandmarksPalmBase = 0;
|
||||||
var PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE = 2;
|
var palmLandmarksMiddleFingerBase = 2;
|
||||||
var HandPipeline = class {
|
var HandPipeline = class {
|
||||||
constructor(handDetector, landmarkDetector) {
|
constructor(handDetector, landmarkDetector) {
|
||||||
var _a;
|
var _a;
|
||||||
|
@ -16716,17 +16813,24 @@ var HandPipeline = class {
|
||||||
this.skipped = 0;
|
this.skipped = 0;
|
||||||
this.detectedHands = 0;
|
this.detectedHands = 0;
|
||||||
}
|
}
|
||||||
|
calculateLandmarksBoundingBox(landmarks) {
|
||||||
|
const xs = landmarks.map((d) => d[0]);
|
||||||
|
const ys = landmarks.map((d) => d[1]);
|
||||||
|
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
||||||
|
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
||||||
|
return {startPoint, endPoint};
|
||||||
|
}
|
||||||
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
||||||
const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix));
|
const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix));
|
||||||
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
||||||
return enlargeBox2(squarifyBox2(boxAroundPalm), PALM_BOX_ENLARGE_FACTOR);
|
return enlargeBox2(squarifyBox2(boxAroundPalm), palmBoxEnlargeFactor);
|
||||||
}
|
}
|
||||||
getBoxForHandLandmarks(landmarks) {
|
getBoxForHandLandmarks(landmarks) {
|
||||||
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
||||||
const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), HAND_BOX_ENLARGE_FACTOR);
|
const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), handBoxEnlargeFactor);
|
||||||
boxAroundHand.palmLandmarks = [];
|
boxAroundHand.palmLandmarks = [];
|
||||||
for (let i = 0; i < PALM_LANDMARK_IDS.length; i++) {
|
for (let i = 0; i < palmLandmarkIds.length; i++) {
|
||||||
boxAroundHand.palmLandmarks.push(landmarks[PALM_LANDMARK_IDS[i]].slice(0, 2));
|
boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));
|
||||||
}
|
}
|
||||||
return boxAroundHand;
|
return boxAroundHand;
|
||||||
}
|
}
|
||||||
|
@ -16778,7 +16882,7 @@ var HandPipeline = class {
|
||||||
if (!currentBox)
|
if (!currentBox)
|
||||||
continue;
|
continue;
|
||||||
if (config3.hand.landmarks) {
|
if (config3.hand.landmarks) {
|
||||||
const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_PALM_BASE], currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE]) : 0;
|
const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;
|
||||||
const palmCenter = getBoxCenter2(currentBox);
|
const palmCenter = getBoxCenter2(currentBox);
|
||||||
const palmCenterNormalized = [palmCenter[0] / image11.shape[2], palmCenter[1] / image11.shape[1]];
|
const palmCenterNormalized = [palmCenter[0] / image11.shape[2], palmCenter[1] / image11.shape[1]];
|
||||||
const rotatedImage = config3.hand.rotation ? tf11.image.rotateWithOffset(image11, angle, 0, palmCenterNormalized) : image11.clone();
|
const rotatedImage = config3.hand.rotation ? tf11.image.rotateWithOffset(image11, angle, 0, palmCenterNormalized) : image11.clone();
|
||||||
|
@ -16811,7 +16915,7 @@ var HandPipeline = class {
|
||||||
}
|
}
|
||||||
keypoints.dispose();
|
keypoints.dispose();
|
||||||
} else {
|
} else {
|
||||||
const enlarged = enlargeBox2(squarifyBox2(currentBox), HAND_BOX_ENLARGE_FACTOR);
|
const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor);
|
||||||
const result = {
|
const result = {
|
||||||
confidence: currentBox.confidence,
|
confidence: currentBox.confidence,
|
||||||
box: {topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint}
|
box: {topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint}
|
||||||
|
@ -16823,13 +16927,6 @@ var HandPipeline = class {
|
||||||
this.detectedHands = hands.length;
|
this.detectedHands = hands.length;
|
||||||
return hands;
|
return hands;
|
||||||
}
|
}
|
||||||
calculateLandmarksBoundingBox(landmarks) {
|
|
||||||
const xs = landmarks.map((d) => d[0]);
|
|
||||||
const ys = landmarks.map((d) => d[1]);
|
|
||||||
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
|
||||||
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
|
||||||
return {startPoint, endPoint};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/handpose/handpose.ts
|
// src/handpose/handpose.ts
|
||||||
|
@ -18691,103 +18788,6 @@ async function all(inCanvas2, result, drawOptions) {
|
||||||
object(inCanvas2, result.object, localOptions);
|
object(inCanvas2, result.object, localOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/config.ts
|
|
||||||
var config2 = {
|
|
||||||
backend: "webgl",
|
|
||||||
modelBasePath: "../models/",
|
|
||||||
wasmPath: "../assets/",
|
|
||||||
debug: true,
|
|
||||||
async: true,
|
|
||||||
videoOptimized: true,
|
|
||||||
warmup: "full",
|
|
||||||
filter: {
|
|
||||||
enabled: true,
|
|
||||||
width: 0,
|
|
||||||
height: 0,
|
|
||||||
flip: false,
|
|
||||||
return: true,
|
|
||||||
brightness: 0,
|
|
||||||
contrast: 0,
|
|
||||||
sharpness: 0,
|
|
||||||
blur: 0,
|
|
||||||
saturation: 0,
|
|
||||||
hue: 0,
|
|
||||||
negative: false,
|
|
||||||
sepia: false,
|
|
||||||
vintage: false,
|
|
||||||
kodachrome: false,
|
|
||||||
technicolor: false,
|
|
||||||
polaroid: false,
|
|
||||||
pixelate: 0
|
|
||||||
},
|
|
||||||
gesture: {
|
|
||||||
enabled: true
|
|
||||||
},
|
|
||||||
face: {
|
|
||||||
enabled: true,
|
|
||||||
detector: {
|
|
||||||
modelPath: "blazeface.json",
|
|
||||||
rotation: false,
|
|
||||||
maxDetected: 10,
|
|
||||||
skipFrames: 21,
|
|
||||||
skipInitial: false,
|
|
||||||
minConfidence: 0.2,
|
|
||||||
iouThreshold: 0.1,
|
|
||||||
return: false
|
|
||||||
},
|
|
||||||
mesh: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "facemesh.json"
|
|
||||||
},
|
|
||||||
iris: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "iris.json"
|
|
||||||
},
|
|
||||||
description: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "faceres.json",
|
|
||||||
skipFrames: 31,
|
|
||||||
minConfidence: 0.1
|
|
||||||
},
|
|
||||||
emotion: {
|
|
||||||
enabled: true,
|
|
||||||
minConfidence: 0.1,
|
|
||||||
skipFrames: 32,
|
|
||||||
modelPath: "emotion.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "posenet.json",
|
|
||||||
maxDetected: 1,
|
|
||||||
minConfidence: 0.1
|
|
||||||
},
|
|
||||||
hand: {
|
|
||||||
enabled: true,
|
|
||||||
rotation: false,
|
|
||||||
skipFrames: 12,
|
|
||||||
skipInitial: false,
|
|
||||||
minConfidence: 0.1,
|
|
||||||
iouThreshold: 0.1,
|
|
||||||
maxDetected: 1,
|
|
||||||
landmarks: true,
|
|
||||||
detector: {
|
|
||||||
modelPath: "handdetect.json"
|
|
||||||
},
|
|
||||||
skeleton: {
|
|
||||||
modelPath: "handskeleton.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
object: {
|
|
||||||
enabled: false,
|
|
||||||
modelPath: "nanodet.json",
|
|
||||||
minConfidence: 0.2,
|
|
||||||
iouThreshold: 0.4,
|
|
||||||
maxDetected: 10,
|
|
||||||
skipFrames: 41
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// src/sample.ts
|
// src/sample.ts
|
||||||
var face3 = `
|
var face3 = `
|
||||||
/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
|
/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
|
||||||
|
@ -19512,7 +19512,7 @@ lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/
|
||||||
2Q==`;
|
2Q==`;
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.8.2";
|
var version = "1.8.3";
|
||||||
|
|
||||||
// src/human.ts
|
// src/human.ts
|
||||||
var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _sanity, _checkBackend, _warmupBitmap, _warmupCanvas, _warmupNode;
|
var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _sanity, _checkBackend, _warmupBitmap, _warmupCanvas, _warmupNode;
|
||||||
|
@ -19675,7 +19675,7 @@ var Human = class {
|
||||||
this.tf = tf16;
|
this.tf = tf16;
|
||||||
this.draw = draw_exports;
|
this.draw = draw_exports;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.config = mergeDeep(config2, userConfig);
|
this.config = mergeDeep(config, userConfig);
|
||||||
this.state = "idle";
|
this.state = "idle";
|
||||||
__privateSet(this, _numTensors, 0);
|
__privateSet(this, _numTensors, 0);
|
||||||
__privateSet(this, _analyzeMemoryLeaks, false);
|
__privateSet(this, _analyzeMemoryLeaks, false);
|
||||||
|
|
|
@ -107,6 +107,103 @@ function mergeDeep(...objects) {
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// src/config.ts
|
||||||
|
var config = {
|
||||||
|
backend: "webgl",
|
||||||
|
modelBasePath: "../models/",
|
||||||
|
wasmPath: "../assets/",
|
||||||
|
debug: true,
|
||||||
|
async: true,
|
||||||
|
videoOptimized: true,
|
||||||
|
warmup: "full",
|
||||||
|
filter: {
|
||||||
|
enabled: true,
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
flip: false,
|
||||||
|
return: true,
|
||||||
|
brightness: 0,
|
||||||
|
contrast: 0,
|
||||||
|
sharpness: 0,
|
||||||
|
blur: 0,
|
||||||
|
saturation: 0,
|
||||||
|
hue: 0,
|
||||||
|
negative: false,
|
||||||
|
sepia: false,
|
||||||
|
vintage: false,
|
||||||
|
kodachrome: false,
|
||||||
|
technicolor: false,
|
||||||
|
polaroid: false,
|
||||||
|
pixelate: 0
|
||||||
|
},
|
||||||
|
gesture: {
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
face: {
|
||||||
|
enabled: true,
|
||||||
|
detector: {
|
||||||
|
modelPath: "blazeface.json",
|
||||||
|
rotation: false,
|
||||||
|
maxDetected: 10,
|
||||||
|
skipFrames: 21,
|
||||||
|
skipInitial: false,
|
||||||
|
minConfidence: 0.2,
|
||||||
|
iouThreshold: 0.1,
|
||||||
|
return: false
|
||||||
|
},
|
||||||
|
mesh: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "facemesh.json"
|
||||||
|
},
|
||||||
|
iris: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "iris.json"
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "faceres.json",
|
||||||
|
skipFrames: 31,
|
||||||
|
minConfidence: 0.1
|
||||||
|
},
|
||||||
|
emotion: {
|
||||||
|
enabled: true,
|
||||||
|
minConfidence: 0.1,
|
||||||
|
skipFrames: 32,
|
||||||
|
modelPath: "emotion.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "posenet.json",
|
||||||
|
maxDetected: 1,
|
||||||
|
minConfidence: 0.1
|
||||||
|
},
|
||||||
|
hand: {
|
||||||
|
enabled: true,
|
||||||
|
rotation: false,
|
||||||
|
skipFrames: 12,
|
||||||
|
skipInitial: false,
|
||||||
|
minConfidence: 0.1,
|
||||||
|
iouThreshold: 0.1,
|
||||||
|
maxDetected: 2,
|
||||||
|
landmarks: true,
|
||||||
|
detector: {
|
||||||
|
modelPath: "handdetect.json"
|
||||||
|
},
|
||||||
|
skeleton: {
|
||||||
|
modelPath: "handskeleton.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
object: {
|
||||||
|
enabled: false,
|
||||||
|
modelPath: "nanodet.json",
|
||||||
|
minConfidence: 0.2,
|
||||||
|
iouThreshold: 0.4,
|
||||||
|
maxDetected: 10,
|
||||||
|
skipFrames: 41
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// src/sysinfo.ts
|
// src/sysinfo.ts
|
||||||
function info() {
|
function info() {
|
||||||
let platform;
|
let platform;
|
||||||
|
@ -133,7 +230,7 @@ var tf16 = __toModule(require_tfjs_esm());
|
||||||
|
|
||||||
// src/tfjs/backend.ts
|
// src/tfjs/backend.ts
|
||||||
var tf = __toModule(require_tfjs_esm());
|
var tf = __toModule(require_tfjs_esm());
|
||||||
var config = {
|
var config2 = {
|
||||||
name: "humangl",
|
name: "humangl",
|
||||||
priority: 99,
|
priority: 99,
|
||||||
canvas: null,
|
canvas: null,
|
||||||
|
@ -152,29 +249,29 @@ var config = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
function register() {
|
function register() {
|
||||||
if (!tf.findBackend(config.name)) {
|
if (!tf.findBackend(config2.name)) {
|
||||||
log("backend registration:", config.name);
|
log("backend registration:", config2.name);
|
||||||
try {
|
try {
|
||||||
config.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config.width, config.height) : document.createElement("canvas");
|
config2.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config2.width, config2.height) : document.createElement("canvas");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot create canvas:", err);
|
log("error: cannot create canvas:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
config.gl = config.canvas.getContext("webgl2", config.webGLattr);
|
config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot get WebGL2 context:", err);
|
log("error: cannot get WebGL2 context:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
tf.setWebGLContext(2, config.gl);
|
tf.setWebGLContext(2, config2.gl);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot set WebGL2 context:", err);
|
log("error: cannot set WebGL2 context:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const ctx = new tf.GPGPUContext(config.gl);
|
const ctx = new tf.GPGPUContext(config2.gl);
|
||||||
tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);
|
tf.registerBackend(config2.name, () => new tf.MathBackendWebGL(ctx), config2.priority);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot register WebGL backend:", err);
|
log("error: cannot register WebGL backend:", err);
|
||||||
return;
|
return;
|
||||||
|
@ -182,7 +279,7 @@ function register() {
|
||||||
try {
|
try {
|
||||||
const kernels = tf.getKernelsForBackend("webgl");
|
const kernels = tf.getKernelsForBackend("webgl");
|
||||||
kernels.forEach((kernelConfig) => {
|
kernels.forEach((kernelConfig) => {
|
||||||
const newKernelConfig = {...kernelConfig, backendName: config.name};
|
const newKernelConfig = {...kernelConfig, backendName: config2.name};
|
||||||
tf.registerKernel(newKernelConfig);
|
tf.registerKernel(newKernelConfig);
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -195,7 +292,7 @@ function register() {
|
||||||
log("error: cannot set WebGL backend flags:", err);
|
log("error: cannot set WebGL backend flags:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log("backend registered:", config.name);
|
log("backend registered:", config2.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4562,7 +4659,7 @@ function addVectors(a, b) {
|
||||||
var localMaximumRadius = 1;
|
var localMaximumRadius = 1;
|
||||||
var outputStride = 16;
|
var outputStride = 16;
|
||||||
var squaredNmsRadius = 50 ** 2;
|
var squaredNmsRadius = 50 ** 2;
|
||||||
function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scoresBuffer, offsets, displacements, offsetRefineStep = 2) {
|
function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {
|
||||||
const getDisplacement = (point2) => ({
|
const getDisplacement = (point2) => ({
|
||||||
y: displacements.get(point2.y, point2.x, edgeId),
|
y: displacements.get(point2.y, point2.x, edgeId),
|
||||||
x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId)
|
x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId)
|
||||||
|
@ -4571,51 +4668,48 @@ function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scor
|
||||||
y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1),
|
y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1),
|
||||||
x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1)
|
x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1)
|
||||||
});
|
});
|
||||||
const [height, width] = scoresBuffer.shape;
|
const [height, width] = scores.shape;
|
||||||
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
||||||
const displacement = getDisplacement(sourceKeypointIndices);
|
const displacement = getDisplacement(sourceKeypointIndices);
|
||||||
const displacedPoint = addVectors(sourceKeypoint.position, displacement);
|
const displacedPoint = addVectors(sourceKeypoint.position, displacement);
|
||||||
let targetKeypoint = displacedPoint;
|
let targetKeypoint = displacedPoint;
|
||||||
for (let i = 0; i < offsetRefineStep; i++) {
|
for (let i = 0; i < offsetRefineStep; i++) {
|
||||||
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetKeypointId, offsets);
|
const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);
|
||||||
targetKeypoint = addVectors({
|
targetKeypoint = addVectors({x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride}, {x: offsetPoint.x, y: offsetPoint.y});
|
||||||
x: targetKeypointIndices.x * outputStride,
|
|
||||||
y: targetKeypointIndices.y * outputStride
|
|
||||||
}, {x: offsetPoint.x, y: offsetPoint.y});
|
|
||||||
}
|
}
|
||||||
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const score = scoresBuffer.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetKeypointId);
|
const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);
|
||||||
return {position: targetKeypoint, part: partNames[targetKeypointId], score};
|
return {position: targetKeypoint, part: partNames[targetId], score};
|
||||||
}
|
}
|
||||||
function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
||||||
const parentChildrenTuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]);
|
const tuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]);
|
||||||
const parentToChildEdges = parentChildrenTuples.map(([, childJointId]) => childJointId);
|
const edgesFwd = tuples.map(([, childJointId]) => childJointId);
|
||||||
const childToParentEdges = parentChildrenTuples.map(([parentJointId]) => parentJointId);
|
const edgesBwd = tuples.map(([parentJointId]) => parentJointId);
|
||||||
const numParts = scores.shape[2];
|
const numParts = scores.shape[2];
|
||||||
const numEdges = parentToChildEdges.length;
|
const numEdges = edgesFwd.length;
|
||||||
const instanceKeypoints = new Array(numParts);
|
const keypoints = new Array(numParts);
|
||||||
const rootPoint = getImageCoords(root.part, outputStride, offsets);
|
const rootPoint = getImageCoords(root.part, outputStride, offsets);
|
||||||
instanceKeypoints[root.part.id] = {
|
keypoints[root.part.id] = {
|
||||||
score: root.score,
|
score: root.score,
|
||||||
part: partNames[root.part.id],
|
part: partNames[root.part.id],
|
||||||
position: rootPoint
|
position: rootPoint
|
||||||
};
|
};
|
||||||
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
||||||
const sourceKeypointId = parentToChildEdges[edge];
|
const sourceId = edgesFwd[edge];
|
||||||
const targetKeypointId = childToParentEdges[edge];
|
const targetId = edgesBwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsBwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let edge = 0; edge < numEdges; ++edge) {
|
for (let edge = 0; edge < numEdges; ++edge) {
|
||||||
const sourceKeypointId = childToParentEdges[edge];
|
const sourceId = edgesBwd[edge];
|
||||||
const targetKeypointId = parentToChildEdges[edge];
|
const targetId = edgesFwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsFwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return instanceKeypoints;
|
return keypoints;
|
||||||
}
|
}
|
||||||
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
||||||
const [height, width] = scores.shape;
|
const [height, width] = scores.shape;
|
||||||
|
@ -4654,27 +4748,30 @@ function buildPartWithScoreQueue(minConfidence, scores) {
|
||||||
}
|
}
|
||||||
function withinRadius(poses2, {x, y}, keypointId) {
|
function withinRadius(poses2, {x, y}, keypointId) {
|
||||||
return poses2.some(({keypoints}) => {
|
return poses2.some(({keypoints}) => {
|
||||||
const correspondingKeypoint = keypoints[keypointId].position;
|
var _a;
|
||||||
|
const correspondingKeypoint = (_a = keypoints[keypointId]) == null ? void 0 : _a.position;
|
||||||
|
if (!correspondingKeypoint)
|
||||||
|
return false;
|
||||||
return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function getInstanceScore(existingPoses, instanceKeypoints) {
|
function getInstanceScore(existingPoses, keypoints) {
|
||||||
const notOverlappedKeypointScores = instanceKeypoints.reduce((result, {position, score}, keypointId) => {
|
const notOverlappedKeypointScores = keypoints.reduce((result, {position, score}, keypointId) => {
|
||||||
if (!withinRadius(existingPoses, position, keypointId))
|
if (!withinRadius(existingPoses, position, keypointId))
|
||||||
result += score;
|
result += score;
|
||||||
return result;
|
return result;
|
||||||
}, 0);
|
}, 0);
|
||||||
return notOverlappedKeypointScores / instanceKeypoints.length;
|
return notOverlappedKeypointScores / keypoints.length;
|
||||||
}
|
}
|
||||||
function decode(offsetsBuffer, scoresBuffer, displacementsFwdBuffer, displacementsBwdBuffer, maxDetected, minConfidence) {
|
function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {
|
||||||
const poses2 = [];
|
const poses2 = [];
|
||||||
const queue = buildPartWithScoreQueue(minConfidence, scoresBuffer);
|
const queue = buildPartWithScoreQueue(minConfidence, scores);
|
||||||
while (poses2.length < maxDetected && !queue.empty()) {
|
while (poses2.length < maxDetected && !queue.empty()) {
|
||||||
const root = queue.dequeue();
|
const root = queue.dequeue();
|
||||||
const rootImageCoords = getImageCoords(root.part, outputStride, offsetsBuffer);
|
const rootImageCoords = getImageCoords(root.part, outputStride, offsets);
|
||||||
if (withinRadius(poses2, rootImageCoords, root.part.id))
|
if (withinRadius(poses2, rootImageCoords, root.part.id))
|
||||||
continue;
|
continue;
|
||||||
let keypoints = decodePose(root, scoresBuffer, offsetsBuffer, displacementsFwdBuffer, displacementsBwdBuffer);
|
let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);
|
||||||
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
||||||
const score = getInstanceScore(poses2, keypoints);
|
const score = getInstanceScore(poses2, keypoints);
|
||||||
const box4 = getBoundingBox(keypoints);
|
const box4 = getBoundingBox(keypoints);
|
||||||
|
@ -16702,11 +16799,11 @@ function rotatePoint2(homogeneousCoordinate, rotationMatrix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/handpose/handpipeline.ts
|
// src/handpose/handpipeline.ts
|
||||||
var PALM_BOX_ENLARGE_FACTOR = 5;
|
var palmBoxEnlargeFactor = 5;
|
||||||
var HAND_BOX_ENLARGE_FACTOR = 1.65;
|
var handBoxEnlargeFactor = 1.65;
|
||||||
var PALM_LANDMARK_IDS = [0, 5, 9, 13, 17, 1, 2];
|
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||||
var PALM_LANDMARKS_INDEX_OF_PALM_BASE = 0;
|
var palmLandmarksPalmBase = 0;
|
||||||
var PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE = 2;
|
var palmLandmarksMiddleFingerBase = 2;
|
||||||
var HandPipeline = class {
|
var HandPipeline = class {
|
||||||
constructor(handDetector, landmarkDetector) {
|
constructor(handDetector, landmarkDetector) {
|
||||||
var _a;
|
var _a;
|
||||||
|
@ -16717,17 +16814,24 @@ var HandPipeline = class {
|
||||||
this.skipped = 0;
|
this.skipped = 0;
|
||||||
this.detectedHands = 0;
|
this.detectedHands = 0;
|
||||||
}
|
}
|
||||||
|
calculateLandmarksBoundingBox(landmarks) {
|
||||||
|
const xs = landmarks.map((d) => d[0]);
|
||||||
|
const ys = landmarks.map((d) => d[1]);
|
||||||
|
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
||||||
|
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
||||||
|
return {startPoint, endPoint};
|
||||||
|
}
|
||||||
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
||||||
const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix));
|
const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix));
|
||||||
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
||||||
return enlargeBox2(squarifyBox2(boxAroundPalm), PALM_BOX_ENLARGE_FACTOR);
|
return enlargeBox2(squarifyBox2(boxAroundPalm), palmBoxEnlargeFactor);
|
||||||
}
|
}
|
||||||
getBoxForHandLandmarks(landmarks) {
|
getBoxForHandLandmarks(landmarks) {
|
||||||
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
||||||
const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), HAND_BOX_ENLARGE_FACTOR);
|
const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), handBoxEnlargeFactor);
|
||||||
boxAroundHand.palmLandmarks = [];
|
boxAroundHand.palmLandmarks = [];
|
||||||
for (let i = 0; i < PALM_LANDMARK_IDS.length; i++) {
|
for (let i = 0; i < palmLandmarkIds.length; i++) {
|
||||||
boxAroundHand.palmLandmarks.push(landmarks[PALM_LANDMARK_IDS[i]].slice(0, 2));
|
boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));
|
||||||
}
|
}
|
||||||
return boxAroundHand;
|
return boxAroundHand;
|
||||||
}
|
}
|
||||||
|
@ -16779,7 +16883,7 @@ var HandPipeline = class {
|
||||||
if (!currentBox)
|
if (!currentBox)
|
||||||
continue;
|
continue;
|
||||||
if (config3.hand.landmarks) {
|
if (config3.hand.landmarks) {
|
||||||
const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_PALM_BASE], currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE]) : 0;
|
const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;
|
||||||
const palmCenter = getBoxCenter2(currentBox);
|
const palmCenter = getBoxCenter2(currentBox);
|
||||||
const palmCenterNormalized = [palmCenter[0] / image11.shape[2], palmCenter[1] / image11.shape[1]];
|
const palmCenterNormalized = [palmCenter[0] / image11.shape[2], palmCenter[1] / image11.shape[1]];
|
||||||
const rotatedImage = config3.hand.rotation ? tf11.image.rotateWithOffset(image11, angle, 0, palmCenterNormalized) : image11.clone();
|
const rotatedImage = config3.hand.rotation ? tf11.image.rotateWithOffset(image11, angle, 0, palmCenterNormalized) : image11.clone();
|
||||||
|
@ -16812,7 +16916,7 @@ var HandPipeline = class {
|
||||||
}
|
}
|
||||||
keypoints.dispose();
|
keypoints.dispose();
|
||||||
} else {
|
} else {
|
||||||
const enlarged = enlargeBox2(squarifyBox2(currentBox), HAND_BOX_ENLARGE_FACTOR);
|
const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor);
|
||||||
const result = {
|
const result = {
|
||||||
confidence: currentBox.confidence,
|
confidence: currentBox.confidence,
|
||||||
box: {topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint}
|
box: {topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint}
|
||||||
|
@ -16824,13 +16928,6 @@ var HandPipeline = class {
|
||||||
this.detectedHands = hands.length;
|
this.detectedHands = hands.length;
|
||||||
return hands;
|
return hands;
|
||||||
}
|
}
|
||||||
calculateLandmarksBoundingBox(landmarks) {
|
|
||||||
const xs = landmarks.map((d) => d[0]);
|
|
||||||
const ys = landmarks.map((d) => d[1]);
|
|
||||||
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
|
||||||
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
|
||||||
return {startPoint, endPoint};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/handpose/handpose.ts
|
// src/handpose/handpose.ts
|
||||||
|
@ -18692,103 +18789,6 @@ async function all(inCanvas2, result, drawOptions) {
|
||||||
object(inCanvas2, result.object, localOptions);
|
object(inCanvas2, result.object, localOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/config.ts
|
|
||||||
var config2 = {
|
|
||||||
backend: "webgl",
|
|
||||||
modelBasePath: "../models/",
|
|
||||||
wasmPath: "../assets/",
|
|
||||||
debug: true,
|
|
||||||
async: true,
|
|
||||||
videoOptimized: true,
|
|
||||||
warmup: "full",
|
|
||||||
filter: {
|
|
||||||
enabled: true,
|
|
||||||
width: 0,
|
|
||||||
height: 0,
|
|
||||||
flip: false,
|
|
||||||
return: true,
|
|
||||||
brightness: 0,
|
|
||||||
contrast: 0,
|
|
||||||
sharpness: 0,
|
|
||||||
blur: 0,
|
|
||||||
saturation: 0,
|
|
||||||
hue: 0,
|
|
||||||
negative: false,
|
|
||||||
sepia: false,
|
|
||||||
vintage: false,
|
|
||||||
kodachrome: false,
|
|
||||||
technicolor: false,
|
|
||||||
polaroid: false,
|
|
||||||
pixelate: 0
|
|
||||||
},
|
|
||||||
gesture: {
|
|
||||||
enabled: true
|
|
||||||
},
|
|
||||||
face: {
|
|
||||||
enabled: true,
|
|
||||||
detector: {
|
|
||||||
modelPath: "blazeface.json",
|
|
||||||
rotation: false,
|
|
||||||
maxDetected: 10,
|
|
||||||
skipFrames: 21,
|
|
||||||
skipInitial: false,
|
|
||||||
minConfidence: 0.2,
|
|
||||||
iouThreshold: 0.1,
|
|
||||||
return: false
|
|
||||||
},
|
|
||||||
mesh: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "facemesh.json"
|
|
||||||
},
|
|
||||||
iris: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "iris.json"
|
|
||||||
},
|
|
||||||
description: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "faceres.json",
|
|
||||||
skipFrames: 31,
|
|
||||||
minConfidence: 0.1
|
|
||||||
},
|
|
||||||
emotion: {
|
|
||||||
enabled: true,
|
|
||||||
minConfidence: 0.1,
|
|
||||||
skipFrames: 32,
|
|
||||||
modelPath: "emotion.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "posenet.json",
|
|
||||||
maxDetected: 1,
|
|
||||||
minConfidence: 0.1
|
|
||||||
},
|
|
||||||
hand: {
|
|
||||||
enabled: true,
|
|
||||||
rotation: false,
|
|
||||||
skipFrames: 12,
|
|
||||||
skipInitial: false,
|
|
||||||
minConfidence: 0.1,
|
|
||||||
iouThreshold: 0.1,
|
|
||||||
maxDetected: 1,
|
|
||||||
landmarks: true,
|
|
||||||
detector: {
|
|
||||||
modelPath: "handdetect.json"
|
|
||||||
},
|
|
||||||
skeleton: {
|
|
||||||
modelPath: "handskeleton.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
object: {
|
|
||||||
enabled: false,
|
|
||||||
modelPath: "nanodet.json",
|
|
||||||
minConfidence: 0.2,
|
|
||||||
iouThreshold: 0.4,
|
|
||||||
maxDetected: 10,
|
|
||||||
skipFrames: 41
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// src/sample.ts
|
// src/sample.ts
|
||||||
var face3 = `
|
var face3 = `
|
||||||
/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
|
/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
|
||||||
|
@ -19513,7 +19513,7 @@ lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/
|
||||||
2Q==`;
|
2Q==`;
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.8.2";
|
var version = "1.8.3";
|
||||||
|
|
||||||
// src/human.ts
|
// src/human.ts
|
||||||
var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _sanity, _checkBackend, _warmupBitmap, _warmupCanvas, _warmupNode;
|
var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _sanity, _checkBackend, _warmupBitmap, _warmupCanvas, _warmupNode;
|
||||||
|
@ -19676,7 +19676,7 @@ var Human = class {
|
||||||
this.tf = tf16;
|
this.tf = tf16;
|
||||||
this.draw = draw_exports;
|
this.draw = draw_exports;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.config = mergeDeep(config2, userConfig);
|
this.config = mergeDeep(config, userConfig);
|
||||||
this.state = "idle";
|
this.state = "idle";
|
||||||
__privateSet(this, _numTensors, 0);
|
__privateSet(this, _numTensors, 0);
|
||||||
__privateSet(this, _analyzeMemoryLeaks, false);
|
__privateSet(this, _analyzeMemoryLeaks, false);
|
||||||
|
|
|
@ -106,6 +106,103 @@ function mergeDeep(...objects) {
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// src/config.ts
|
||||||
|
var config = {
|
||||||
|
backend: "webgl",
|
||||||
|
modelBasePath: "../models/",
|
||||||
|
wasmPath: "../assets/",
|
||||||
|
debug: true,
|
||||||
|
async: true,
|
||||||
|
videoOptimized: true,
|
||||||
|
warmup: "full",
|
||||||
|
filter: {
|
||||||
|
enabled: true,
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
flip: false,
|
||||||
|
return: true,
|
||||||
|
brightness: 0,
|
||||||
|
contrast: 0,
|
||||||
|
sharpness: 0,
|
||||||
|
blur: 0,
|
||||||
|
saturation: 0,
|
||||||
|
hue: 0,
|
||||||
|
negative: false,
|
||||||
|
sepia: false,
|
||||||
|
vintage: false,
|
||||||
|
kodachrome: false,
|
||||||
|
technicolor: false,
|
||||||
|
polaroid: false,
|
||||||
|
pixelate: 0
|
||||||
|
},
|
||||||
|
gesture: {
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
face: {
|
||||||
|
enabled: true,
|
||||||
|
detector: {
|
||||||
|
modelPath: "blazeface.json",
|
||||||
|
rotation: false,
|
||||||
|
maxDetected: 10,
|
||||||
|
skipFrames: 21,
|
||||||
|
skipInitial: false,
|
||||||
|
minConfidence: 0.2,
|
||||||
|
iouThreshold: 0.1,
|
||||||
|
return: false
|
||||||
|
},
|
||||||
|
mesh: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "facemesh.json"
|
||||||
|
},
|
||||||
|
iris: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "iris.json"
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "faceres.json",
|
||||||
|
skipFrames: 31,
|
||||||
|
minConfidence: 0.1
|
||||||
|
},
|
||||||
|
emotion: {
|
||||||
|
enabled: true,
|
||||||
|
minConfidence: 0.1,
|
||||||
|
skipFrames: 32,
|
||||||
|
modelPath: "emotion.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
enabled: true,
|
||||||
|
modelPath: "posenet.json",
|
||||||
|
maxDetected: 1,
|
||||||
|
minConfidence: 0.1
|
||||||
|
},
|
||||||
|
hand: {
|
||||||
|
enabled: true,
|
||||||
|
rotation: false,
|
||||||
|
skipFrames: 12,
|
||||||
|
skipInitial: false,
|
||||||
|
minConfidence: 0.1,
|
||||||
|
iouThreshold: 0.1,
|
||||||
|
maxDetected: 2,
|
||||||
|
landmarks: true,
|
||||||
|
detector: {
|
||||||
|
modelPath: "handdetect.json"
|
||||||
|
},
|
||||||
|
skeleton: {
|
||||||
|
modelPath: "handskeleton.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
object: {
|
||||||
|
enabled: false,
|
||||||
|
modelPath: "nanodet.json",
|
||||||
|
minConfidence: 0.2,
|
||||||
|
iouThreshold: 0.4,
|
||||||
|
maxDetected: 10,
|
||||||
|
skipFrames: 41
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// src/sysinfo.ts
|
// src/sysinfo.ts
|
||||||
function info() {
|
function info() {
|
||||||
let platform;
|
let platform;
|
||||||
|
@ -132,7 +229,7 @@ var tf16 = __toModule(require_tfjs_esm());
|
||||||
|
|
||||||
// src/tfjs/backend.ts
|
// src/tfjs/backend.ts
|
||||||
var tf = __toModule(require_tfjs_esm());
|
var tf = __toModule(require_tfjs_esm());
|
||||||
var config = {
|
var config2 = {
|
||||||
name: "humangl",
|
name: "humangl",
|
||||||
priority: 99,
|
priority: 99,
|
||||||
canvas: null,
|
canvas: null,
|
||||||
|
@ -151,29 +248,29 @@ var config = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
function register() {
|
function register() {
|
||||||
if (!tf.findBackend(config.name)) {
|
if (!tf.findBackend(config2.name)) {
|
||||||
log("backend registration:", config.name);
|
log("backend registration:", config2.name);
|
||||||
try {
|
try {
|
||||||
config.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config.width, config.height) : document.createElement("canvas");
|
config2.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config2.width, config2.height) : document.createElement("canvas");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot create canvas:", err);
|
log("error: cannot create canvas:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
config.gl = config.canvas.getContext("webgl2", config.webGLattr);
|
config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot get WebGL2 context:", err);
|
log("error: cannot get WebGL2 context:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
tf.setWebGLContext(2, config.gl);
|
tf.setWebGLContext(2, config2.gl);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot set WebGL2 context:", err);
|
log("error: cannot set WebGL2 context:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const ctx = new tf.GPGPUContext(config.gl);
|
const ctx = new tf.GPGPUContext(config2.gl);
|
||||||
tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);
|
tf.registerBackend(config2.name, () => new tf.MathBackendWebGL(ctx), config2.priority);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error: cannot register WebGL backend:", err);
|
log("error: cannot register WebGL backend:", err);
|
||||||
return;
|
return;
|
||||||
|
@ -181,7 +278,7 @@ function register() {
|
||||||
try {
|
try {
|
||||||
const kernels = tf.getKernelsForBackend("webgl");
|
const kernels = tf.getKernelsForBackend("webgl");
|
||||||
kernels.forEach((kernelConfig) => {
|
kernels.forEach((kernelConfig) => {
|
||||||
const newKernelConfig = {...kernelConfig, backendName: config.name};
|
const newKernelConfig = {...kernelConfig, backendName: config2.name};
|
||||||
tf.registerKernel(newKernelConfig);
|
tf.registerKernel(newKernelConfig);
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -194,7 +291,7 @@ function register() {
|
||||||
log("error: cannot set WebGL backend flags:", err);
|
log("error: cannot set WebGL backend flags:", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log("backend registered:", config.name);
|
log("backend registered:", config2.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4561,7 +4658,7 @@ function addVectors(a, b) {
|
||||||
var localMaximumRadius = 1;
|
var localMaximumRadius = 1;
|
||||||
var outputStride = 16;
|
var outputStride = 16;
|
||||||
var squaredNmsRadius = 50 ** 2;
|
var squaredNmsRadius = 50 ** 2;
|
||||||
function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scoresBuffer, offsets, displacements, offsetRefineStep = 2) {
|
function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {
|
||||||
const getDisplacement = (point2) => ({
|
const getDisplacement = (point2) => ({
|
||||||
y: displacements.get(point2.y, point2.x, edgeId),
|
y: displacements.get(point2.y, point2.x, edgeId),
|
||||||
x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId)
|
x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId)
|
||||||
|
@ -4570,51 +4667,48 @@ function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scor
|
||||||
y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1),
|
y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1),
|
||||||
x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1)
|
x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1)
|
||||||
});
|
});
|
||||||
const [height, width] = scoresBuffer.shape;
|
const [height, width] = scores.shape;
|
||||||
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
||||||
const displacement = getDisplacement(sourceKeypointIndices);
|
const displacement = getDisplacement(sourceKeypointIndices);
|
||||||
const displacedPoint = addVectors(sourceKeypoint.position, displacement);
|
const displacedPoint = addVectors(sourceKeypoint.position, displacement);
|
||||||
let targetKeypoint = displacedPoint;
|
let targetKeypoint = displacedPoint;
|
||||||
for (let i = 0; i < offsetRefineStep; i++) {
|
for (let i = 0; i < offsetRefineStep; i++) {
|
||||||
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetKeypointId, offsets);
|
const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);
|
||||||
targetKeypoint = addVectors({
|
targetKeypoint = addVectors({x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride}, {x: offsetPoint.x, y: offsetPoint.y});
|
||||||
x: targetKeypointIndices.x * outputStride,
|
|
||||||
y: targetKeypointIndices.y * outputStride
|
|
||||||
}, {x: offsetPoint.x, y: offsetPoint.y});
|
|
||||||
}
|
}
|
||||||
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const score = scoresBuffer.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetKeypointId);
|
const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);
|
||||||
return {position: targetKeypoint, part: partNames[targetKeypointId], score};
|
return {position: targetKeypoint, part: partNames[targetId], score};
|
||||||
}
|
}
|
||||||
function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
||||||
const parentChildrenTuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]);
|
const tuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]);
|
||||||
const parentToChildEdges = parentChildrenTuples.map(([, childJointId]) => childJointId);
|
const edgesFwd = tuples.map(([, childJointId]) => childJointId);
|
||||||
const childToParentEdges = parentChildrenTuples.map(([parentJointId]) => parentJointId);
|
const edgesBwd = tuples.map(([parentJointId]) => parentJointId);
|
||||||
const numParts = scores.shape[2];
|
const numParts = scores.shape[2];
|
||||||
const numEdges = parentToChildEdges.length;
|
const numEdges = edgesFwd.length;
|
||||||
const instanceKeypoints = new Array(numParts);
|
const keypoints = new Array(numParts);
|
||||||
const rootPoint = getImageCoords(root.part, outputStride, offsets);
|
const rootPoint = getImageCoords(root.part, outputStride, offsets);
|
||||||
instanceKeypoints[root.part.id] = {
|
keypoints[root.part.id] = {
|
||||||
score: root.score,
|
score: root.score,
|
||||||
part: partNames[root.part.id],
|
part: partNames[root.part.id],
|
||||||
position: rootPoint
|
position: rootPoint
|
||||||
};
|
};
|
||||||
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
||||||
const sourceKeypointId = parentToChildEdges[edge];
|
const sourceId = edgesFwd[edge];
|
||||||
const targetKeypointId = childToParentEdges[edge];
|
const targetId = edgesBwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsBwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let edge = 0; edge < numEdges; ++edge) {
|
for (let edge = 0; edge < numEdges; ++edge) {
|
||||||
const sourceKeypointId = childToParentEdges[edge];
|
const sourceId = edgesBwd[edge];
|
||||||
const targetKeypointId = parentToChildEdges[edge];
|
const targetId = edgesFwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsFwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return instanceKeypoints;
|
return keypoints;
|
||||||
}
|
}
|
||||||
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
||||||
const [height, width] = scores.shape;
|
const [height, width] = scores.shape;
|
||||||
|
@ -4653,27 +4747,30 @@ function buildPartWithScoreQueue(minConfidence, scores) {
|
||||||
}
|
}
|
||||||
function withinRadius(poses2, {x, y}, keypointId) {
|
function withinRadius(poses2, {x, y}, keypointId) {
|
||||||
return poses2.some(({keypoints}) => {
|
return poses2.some(({keypoints}) => {
|
||||||
const correspondingKeypoint = keypoints[keypointId].position;
|
var _a;
|
||||||
|
const correspondingKeypoint = (_a = keypoints[keypointId]) == null ? void 0 : _a.position;
|
||||||
|
if (!correspondingKeypoint)
|
||||||
|
return false;
|
||||||
return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function getInstanceScore(existingPoses, instanceKeypoints) {
|
function getInstanceScore(existingPoses, keypoints) {
|
||||||
const notOverlappedKeypointScores = instanceKeypoints.reduce((result, {position, score}, keypointId) => {
|
const notOverlappedKeypointScores = keypoints.reduce((result, {position, score}, keypointId) => {
|
||||||
if (!withinRadius(existingPoses, position, keypointId))
|
if (!withinRadius(existingPoses, position, keypointId))
|
||||||
result += score;
|
result += score;
|
||||||
return result;
|
return result;
|
||||||
}, 0);
|
}, 0);
|
||||||
return notOverlappedKeypointScores / instanceKeypoints.length;
|
return notOverlappedKeypointScores / keypoints.length;
|
||||||
}
|
}
|
||||||
function decode(offsetsBuffer, scoresBuffer, displacementsFwdBuffer, displacementsBwdBuffer, maxDetected, minConfidence) {
|
function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {
|
||||||
const poses2 = [];
|
const poses2 = [];
|
||||||
const queue = buildPartWithScoreQueue(minConfidence, scoresBuffer);
|
const queue = buildPartWithScoreQueue(minConfidence, scores);
|
||||||
while (poses2.length < maxDetected && !queue.empty()) {
|
while (poses2.length < maxDetected && !queue.empty()) {
|
||||||
const root = queue.dequeue();
|
const root = queue.dequeue();
|
||||||
const rootImageCoords = getImageCoords(root.part, outputStride, offsetsBuffer);
|
const rootImageCoords = getImageCoords(root.part, outputStride, offsets);
|
||||||
if (withinRadius(poses2, rootImageCoords, root.part.id))
|
if (withinRadius(poses2, rootImageCoords, root.part.id))
|
||||||
continue;
|
continue;
|
||||||
let keypoints = decodePose(root, scoresBuffer, offsetsBuffer, displacementsFwdBuffer, displacementsBwdBuffer);
|
let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);
|
||||||
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
||||||
const score = getInstanceScore(poses2, keypoints);
|
const score = getInstanceScore(poses2, keypoints);
|
||||||
const box4 = getBoundingBox(keypoints);
|
const box4 = getBoundingBox(keypoints);
|
||||||
|
@ -16701,11 +16798,11 @@ function rotatePoint2(homogeneousCoordinate, rotationMatrix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/handpose/handpipeline.ts
|
// src/handpose/handpipeline.ts
|
||||||
var PALM_BOX_ENLARGE_FACTOR = 5;
|
var palmBoxEnlargeFactor = 5;
|
||||||
var HAND_BOX_ENLARGE_FACTOR = 1.65;
|
var handBoxEnlargeFactor = 1.65;
|
||||||
var PALM_LANDMARK_IDS = [0, 5, 9, 13, 17, 1, 2];
|
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||||
var PALM_LANDMARKS_INDEX_OF_PALM_BASE = 0;
|
var palmLandmarksPalmBase = 0;
|
||||||
var PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE = 2;
|
var palmLandmarksMiddleFingerBase = 2;
|
||||||
var HandPipeline = class {
|
var HandPipeline = class {
|
||||||
constructor(handDetector, landmarkDetector) {
|
constructor(handDetector, landmarkDetector) {
|
||||||
var _a;
|
var _a;
|
||||||
|
@ -16716,17 +16813,24 @@ var HandPipeline = class {
|
||||||
this.skipped = 0;
|
this.skipped = 0;
|
||||||
this.detectedHands = 0;
|
this.detectedHands = 0;
|
||||||
}
|
}
|
||||||
|
calculateLandmarksBoundingBox(landmarks) {
|
||||||
|
const xs = landmarks.map((d) => d[0]);
|
||||||
|
const ys = landmarks.map((d) => d[1]);
|
||||||
|
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
||||||
|
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
||||||
|
return {startPoint, endPoint};
|
||||||
|
}
|
||||||
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
||||||
const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix));
|
const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix));
|
||||||
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
||||||
return enlargeBox2(squarifyBox2(boxAroundPalm), PALM_BOX_ENLARGE_FACTOR);
|
return enlargeBox2(squarifyBox2(boxAroundPalm), palmBoxEnlargeFactor);
|
||||||
}
|
}
|
||||||
getBoxForHandLandmarks(landmarks) {
|
getBoxForHandLandmarks(landmarks) {
|
||||||
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
||||||
const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), HAND_BOX_ENLARGE_FACTOR);
|
const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), handBoxEnlargeFactor);
|
||||||
boxAroundHand.palmLandmarks = [];
|
boxAroundHand.palmLandmarks = [];
|
||||||
for (let i = 0; i < PALM_LANDMARK_IDS.length; i++) {
|
for (let i = 0; i < palmLandmarkIds.length; i++) {
|
||||||
boxAroundHand.palmLandmarks.push(landmarks[PALM_LANDMARK_IDS[i]].slice(0, 2));
|
boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));
|
||||||
}
|
}
|
||||||
return boxAroundHand;
|
return boxAroundHand;
|
||||||
}
|
}
|
||||||
|
@ -16778,7 +16882,7 @@ var HandPipeline = class {
|
||||||
if (!currentBox)
|
if (!currentBox)
|
||||||
continue;
|
continue;
|
||||||
if (config3.hand.landmarks) {
|
if (config3.hand.landmarks) {
|
||||||
const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_PALM_BASE], currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE]) : 0;
|
const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;
|
||||||
const palmCenter = getBoxCenter2(currentBox);
|
const palmCenter = getBoxCenter2(currentBox);
|
||||||
const palmCenterNormalized = [palmCenter[0] / image11.shape[2], palmCenter[1] / image11.shape[1]];
|
const palmCenterNormalized = [palmCenter[0] / image11.shape[2], palmCenter[1] / image11.shape[1]];
|
||||||
const rotatedImage = config3.hand.rotation ? tf11.image.rotateWithOffset(image11, angle, 0, palmCenterNormalized) : image11.clone();
|
const rotatedImage = config3.hand.rotation ? tf11.image.rotateWithOffset(image11, angle, 0, palmCenterNormalized) : image11.clone();
|
||||||
|
@ -16811,7 +16915,7 @@ var HandPipeline = class {
|
||||||
}
|
}
|
||||||
keypoints.dispose();
|
keypoints.dispose();
|
||||||
} else {
|
} else {
|
||||||
const enlarged = enlargeBox2(squarifyBox2(currentBox), HAND_BOX_ENLARGE_FACTOR);
|
const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor);
|
||||||
const result = {
|
const result = {
|
||||||
confidence: currentBox.confidence,
|
confidence: currentBox.confidence,
|
||||||
box: {topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint}
|
box: {topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint}
|
||||||
|
@ -16823,13 +16927,6 @@ var HandPipeline = class {
|
||||||
this.detectedHands = hands.length;
|
this.detectedHands = hands.length;
|
||||||
return hands;
|
return hands;
|
||||||
}
|
}
|
||||||
calculateLandmarksBoundingBox(landmarks) {
|
|
||||||
const xs = landmarks.map((d) => d[0]);
|
|
||||||
const ys = landmarks.map((d) => d[1]);
|
|
||||||
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
|
||||||
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
|
||||||
return {startPoint, endPoint};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/handpose/handpose.ts
|
// src/handpose/handpose.ts
|
||||||
|
@ -18691,103 +18788,6 @@ async function all(inCanvas2, result, drawOptions) {
|
||||||
object(inCanvas2, result.object, localOptions);
|
object(inCanvas2, result.object, localOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/config.ts
|
|
||||||
var config2 = {
|
|
||||||
backend: "webgl",
|
|
||||||
modelBasePath: "../models/",
|
|
||||||
wasmPath: "../assets/",
|
|
||||||
debug: true,
|
|
||||||
async: true,
|
|
||||||
videoOptimized: true,
|
|
||||||
warmup: "full",
|
|
||||||
filter: {
|
|
||||||
enabled: true,
|
|
||||||
width: 0,
|
|
||||||
height: 0,
|
|
||||||
flip: false,
|
|
||||||
return: true,
|
|
||||||
brightness: 0,
|
|
||||||
contrast: 0,
|
|
||||||
sharpness: 0,
|
|
||||||
blur: 0,
|
|
||||||
saturation: 0,
|
|
||||||
hue: 0,
|
|
||||||
negative: false,
|
|
||||||
sepia: false,
|
|
||||||
vintage: false,
|
|
||||||
kodachrome: false,
|
|
||||||
technicolor: false,
|
|
||||||
polaroid: false,
|
|
||||||
pixelate: 0
|
|
||||||
},
|
|
||||||
gesture: {
|
|
||||||
enabled: true
|
|
||||||
},
|
|
||||||
face: {
|
|
||||||
enabled: true,
|
|
||||||
detector: {
|
|
||||||
modelPath: "blazeface.json",
|
|
||||||
rotation: false,
|
|
||||||
maxDetected: 10,
|
|
||||||
skipFrames: 21,
|
|
||||||
skipInitial: false,
|
|
||||||
minConfidence: 0.2,
|
|
||||||
iouThreshold: 0.1,
|
|
||||||
return: false
|
|
||||||
},
|
|
||||||
mesh: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "facemesh.json"
|
|
||||||
},
|
|
||||||
iris: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "iris.json"
|
|
||||||
},
|
|
||||||
description: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "faceres.json",
|
|
||||||
skipFrames: 31,
|
|
||||||
minConfidence: 0.1
|
|
||||||
},
|
|
||||||
emotion: {
|
|
||||||
enabled: true,
|
|
||||||
minConfidence: 0.1,
|
|
||||||
skipFrames: 32,
|
|
||||||
modelPath: "emotion.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
enabled: true,
|
|
||||||
modelPath: "posenet.json",
|
|
||||||
maxDetected: 1,
|
|
||||||
minConfidence: 0.1
|
|
||||||
},
|
|
||||||
hand: {
|
|
||||||
enabled: true,
|
|
||||||
rotation: false,
|
|
||||||
skipFrames: 12,
|
|
||||||
skipInitial: false,
|
|
||||||
minConfidence: 0.1,
|
|
||||||
iouThreshold: 0.1,
|
|
||||||
maxDetected: 1,
|
|
||||||
landmarks: true,
|
|
||||||
detector: {
|
|
||||||
modelPath: "handdetect.json"
|
|
||||||
},
|
|
||||||
skeleton: {
|
|
||||||
modelPath: "handskeleton.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
object: {
|
|
||||||
enabled: false,
|
|
||||||
modelPath: "nanodet.json",
|
|
||||||
minConfidence: 0.2,
|
|
||||||
iouThreshold: 0.4,
|
|
||||||
maxDetected: 10,
|
|
||||||
skipFrames: 41
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// src/sample.ts
|
// src/sample.ts
|
||||||
var face3 = `
|
var face3 = `
|
||||||
/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
|
/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
|
||||||
|
@ -19512,7 +19512,7 @@ lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/
|
||||||
2Q==`;
|
2Q==`;
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.8.2";
|
var version = "1.8.3";
|
||||||
|
|
||||||
// src/human.ts
|
// src/human.ts
|
||||||
var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _sanity, _checkBackend, _warmupBitmap, _warmupCanvas, _warmupNode;
|
var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _sanity, _checkBackend, _warmupBitmap, _warmupCanvas, _warmupNode;
|
||||||
|
@ -19675,7 +19675,7 @@ var Human = class {
|
||||||
this.tf = tf16;
|
this.tf = tf16;
|
||||||
this.draw = draw_exports;
|
this.draw = draw_exports;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.config = mergeDeep(config2, userConfig);
|
this.config = mergeDeep(config, userConfig);
|
||||||
this.state = "idle";
|
this.state = "idle";
|
||||||
__privateSet(this, _numTensors, 0);
|
__privateSet(this, _numTensors, 0);
|
||||||
__privateSet(this, _analyzeMemoryLeaks, false);
|
__privateSet(this, _analyzeMemoryLeaks, false);
|
||||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
510
server/build.log
510
server/build.log
|
@ -1,493 +1,17 @@
|
||||||
2021-04-15 09:36:00 [36mINFO: [39m @vladmandic/human version 1.5.2
|
2021-05-05 10:06:54 [36mINFO: [39m @vladmandic/human version 1.8.3
|
||||||
2021-04-15 09:36:00 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v15.7.0
|
2021-05-05 10:06:54 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
||||||
2021-04-15 09:36:00 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
2021-05-05 10:06:54 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
2021-05-05 10:06:54 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":545147,"outputBytes":304326,"outputFiles":"dist/human.node.js"}
|
2021-05-05 10:06:54 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":412756,"outputBytes":371901,"outputFiles":"dist/human.node.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
2021-05-05 10:06:54 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":545151,"outputBytes":304334,"outputFiles":"dist/human.node-gpu.js"}
|
2021-05-05 10:06:54 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":412760,"outputBytes":371905,"outputFiles":"dist/human.node-gpu.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
2021-05-05 10:06:54 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":545197,"outputBytes":304378,"outputFiles":"dist/human.node-wasm.js"}
|
2021-05-05 10:06:54 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":412806,"outputBytes":371955,"outputFiles":"dist/human.node-wasm.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
2021-05-05 10:06:55 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
||||||
2021-04-15 09:36:00 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":545808,"outputBytes":304324,"outputFiles":"dist/human.esm-nobundle.js"}
|
2021-05-05 10:06:55 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":413454,"outputBytes":229541,"outputFiles":"dist/human.esm-nobundle.js"}
|
||||||
2021-04-15 09:36:01 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1262,"moduleBytes":4068263,"imports":7,"importBytes":2488,"outputBytes":1097287,"outputFiles":"dist/tfjs.esm.js"}
|
2021-05-05 10:06:55 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1274,"moduleBytes":4114813,"imports":7,"importBytes":2488,"outputBytes":1111306,"outputFiles":"dist/tfjs.esm.js"}
|
||||||
2021-04-15 09:36:01 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1641701,"outputBytes":1397747,"outputFiles":"dist/human.js"}
|
2021-05-05 10:06:56 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1523366,"outputBytes":1337233,"outputFiles":"dist/human.js"}
|
||||||
2021-04-15 09:36:02 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1641701,"outputBytes":1397705,"outputFiles":"dist/human.esm.js"}
|
2021-05-05 10:06:57 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1523366,"outputBytes":1337191,"outputFiles":"dist/human.esm.js"}
|
||||||
2021-04-15 09:36:02 [36mINFO: [39m Generate types: ["src/human.ts"]
|
2021-05-05 10:06:57 [36mINFO: [39m Generate types: ["src/human.ts"]
|
||||||
2021-04-15 09:36:07 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
2021-05-05 10:07:01 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
||||||
2021-04-15 09:36:07 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
2021-05-05 10:07:01 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
||||||
2021-04-15 09:40:34 [36mINFO: [39m @vladmandic/human version 1.5.2
|
|
||||||
2021-04-15 09:40:34 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v15.7.0
|
|
||||||
2021-04-15 09:40:34 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-15 09:40:34 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-15 09:40:34 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":545147,"outputBytes":304326,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-15 09:40:34 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-15 09:40:35 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":545151,"outputBytes":304334,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-15 09:40:35 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-15 09:40:35 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":545197,"outputBytes":304378,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-15 09:40:35 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-15 09:40:35 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":545808,"outputBytes":304324,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-15 09:40:35 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1262,"moduleBytes":4068263,"imports":7,"importBytes":2488,"outputBytes":1097287,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-15 09:40:36 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1641701,"outputBytes":1397747,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-15 09:40:36 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1641701,"outputBytes":1397705,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-15 09:40:36 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-15 09:40:41 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-15 09:40:41 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-16 18:02:35 [36mINFO: [39m @vladmandic/human version 1.5.2
|
|
||||||
2021-04-16 18:02:35 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v15.7.0
|
|
||||||
2021-04-16 18:02:35 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":545147,"outputBytes":304326,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":545151,"outputBytes":304334,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":545197,"outputBytes":304378,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":545808,"outputBytes":304324,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-16 18:02:36 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1262,"moduleBytes":4068263,"imports":7,"importBytes":2488,"outputBytes":1097287,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-16 18:02:37 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1641701,"outputBytes":1397747,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-16 18:02:37 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1641701,"outputBytes":1397705,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-16 18:02:37 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-16 18:02:43 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-16 18:02:43 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-18 19:33:07 [36mINFO: [39m @vladmandic/human version 1.6.0
|
|
||||||
2021-04-18 19:33:07 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v15.7.0
|
|
||||||
2021-04-18 19:33:07 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":546322,"outputBytes":304931,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":546326,"outputBytes":304939,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":546372,"outputBytes":304983,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-18 19:33:07 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":546983,"outputBytes":304929,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-18 19:33:08 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1262,"moduleBytes":4068263,"imports":7,"importBytes":2488,"outputBytes":1097287,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-18 19:33:08 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1642876,"outputBytes":1398352,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-18 19:33:09 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1642876,"outputBytes":1398310,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-18 19:33:09 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-18 19:33:14 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-18 19:33:14 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-19 09:25:22 [36mINFO: [39m @vladmandic/human version 1.6.0
|
|
||||||
2021-04-19 09:25:22 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v15.7.0
|
|
||||||
2021-04-19 09:25:22 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-19 09:25:22 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 09:25:22 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":547188,"outputBytes":305386,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-19 09:25:22 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 09:25:22 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":547192,"outputBytes":305394,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-19 09:25:22 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 09:25:23 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":547238,"outputBytes":305438,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-19 09:25:23 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 09:25:23 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":547849,"outputBytes":305385,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-19 09:25:23 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1262,"moduleBytes":4068263,"imports":7,"importBytes":2488,"outputBytes":1097287,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 09:25:24 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1643742,"outputBytes":1398814,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-19 09:25:24 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1643742,"outputBytes":1398772,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-19 09:25:24 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-19 09:25:30 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-19 09:25:30 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-19 16:18:26 [36mINFO: [39m @vladmandic/human version 1.6.0
|
|
||||||
2021-04-19 16:18:26 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v15.7.0
|
|
||||||
2021-04-19 16:18:26 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-19 16:18:26 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":548010,"outputBytes":305576,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":548014,"outputBytes":305584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":548060,"outputBytes":305628,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":548671,"outputBytes":305575,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-19 16:18:27 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1262,"moduleBytes":4068263,"imports":7,"importBytes":2488,"outputBytes":1097287,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-19 16:18:28 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1644564,"outputBytes":1399008,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-19 16:18:28 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1644564,"outputBytes":1398966,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-19 16:18:28 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-19 16:18:32 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-19 16:18:32 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-22 19:41:11 [36mINFO: [39m @vladmandic/human version 1.6.0
|
|
||||||
2021-04-22 19:41:11 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-22 19:41:11 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":547988,"outputBytes":305576,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":547992,"outputBytes":305584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":548038,"outputBytes":305628,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-22 19:41:11 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:41:12 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":548649,"outputBytes":305575,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-22 19:41:12 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:41:13 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1648983,"outputBytes":1403464,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-22 19:41:13 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1648983,"outputBytes":1403422,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-22 19:41:13 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-22 19:41:18 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-22 19:41:18 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-22 19:46:35 [36mINFO: [39m @vladmandic/human version 1.6.1
|
|
||||||
2021-04-22 19:46:35 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-22 19:46:35 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: node type: node: {"imports":46,"importBytes":547988,"outputBytes":305576,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":46,"importBytes":547992,"outputBytes":305584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":46,"importBytes":548038,"outputBytes":305628,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:46:35 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":46,"importBytes":548649,"outputBytes":305575,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-22 19:46:36 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-22 19:46:36 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":46,"importBytes":1648983,"outputBytes":1403464,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-22 19:46:37 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":46,"importBytes":1648983,"outputBytes":1403422,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-22 19:46:37 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-22 19:46:41 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-22 19:46:41 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-24 11:48:49 [36mINFO: [39m @vladmandic/human version 1.6.1
|
|
||||||
2021-04-24 11:48:49 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-24 11:48:49 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: node type: node: {"imports":43,"importBytes":547909,"outputBytes":306333,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":43,"importBytes":547913,"outputBytes":306341,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":43,"importBytes":547959,"outputBytes":306385,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 11:48:49 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":43,"importBytes":548570,"outputBytes":306337,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-24 11:48:50 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 11:48:51 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":43,"importBytes":1648904,"outputBytes":1404224,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-24 11:48:51 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":43,"importBytes":1648904,"outputBytes":1404182,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-24 11:48:51 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-24 11:48:56 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-24 11:48:56 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-24 16:00:49 [36mINFO: [39m @vladmandic/human version 1.6.1
|
|
||||||
2021-04-24 16:00:49 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-24 16:00:49 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: node type: node: {"imports":40,"importBytes":542104,"outputBytes":304213,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":40,"importBytes":542108,"outputBytes":304221,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":40,"importBytes":542154,"outputBytes":304265,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:00:49 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":40,"importBytes":542765,"outputBytes":304246,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-24 16:00:50 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:00:51 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":40,"importBytes":1643099,"outputBytes":1402155,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-24 16:00:51 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":40,"importBytes":1643099,"outputBytes":1402113,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-24 16:00:51 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-24 16:00:57 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-24 16:00:57 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-24 16:03:56 [36mINFO: [39m @vladmandic/human version 1.6.1
|
|
||||||
2021-04-24 16:03:56 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-24 16:03:56 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-24 16:03:56 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:03:56 [35mSTATE:[39m Build for: node type: node: {"imports":40,"importBytes":542082,"outputBytes":304213,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-24 16:03:56 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:03:57 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":40,"importBytes":542086,"outputBytes":304221,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-24 16:03:57 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:03:57 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":40,"importBytes":542132,"outputBytes":304265,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-24 16:03:57 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:03:57 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":40,"importBytes":542743,"outputBytes":304246,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-24 16:03:57 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 16:03:58 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":40,"importBytes":1643077,"outputBytes":1402155,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-24 16:03:58 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":40,"importBytes":1643077,"outputBytes":1402113,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-24 16:03:58 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-24 16:04:03 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-24 16:04:03 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-24 18:43:24 [36mINFO: [39m @vladmandic/human version 1.7.0
|
|
||||||
2021-04-24 18:43:24 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-24 18:43:24 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: node type: node: {"imports":36,"importBytes":521048,"outputBytes":296170,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":36,"importBytes":521052,"outputBytes":296178,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":36,"importBytes":521098,"outputBytes":296222,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 18:43:24 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":36,"importBytes":521709,"outputBytes":296317,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-24 18:43:25 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-24 18:43:25 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":36,"importBytes":1622043,"outputBytes":1394426,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-24 18:43:26 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":36,"importBytes":1622043,"outputBytes":1394384,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-24 18:43:26 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-24 18:43:31 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-24 18:43:31 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 07:49:35 [36mINFO: [39m @vladmandic/human version 1.7.0
|
|
||||||
2021-04-25 07:49:35 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 07:49:35 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: node type: node: {"imports":36,"importBytes":521379,"outputBytes":296354,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":36,"importBytes":521383,"outputBytes":296362,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":36,"importBytes":521429,"outputBytes":296406,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:49:36 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":36,"importBytes":522040,"outputBytes":296501,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 07:49:37 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:49:37 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":36,"importBytes":1622374,"outputBytes":1394611,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 07:49:38 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":36,"importBytes":1622374,"outputBytes":1394569,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 07:49:38 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 07:49:43 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 07:49:43 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 07:50:15 [36mINFO: [39m @vladmandic/human version 1.7.1
|
|
||||||
2021-04-25 07:50:15 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 07:50:15 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: node type: node: {"imports":36,"importBytes":521379,"outputBytes":296354,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":36,"importBytes":521383,"outputBytes":296362,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":36,"importBytes":521429,"outputBytes":296406,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:50:15 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":36,"importBytes":522040,"outputBytes":296501,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 07:50:16 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 07:50:16 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":36,"importBytes":1622374,"outputBytes":1394611,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 07:50:17 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":36,"importBytes":1622374,"outputBytes":1394569,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 07:50:17 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 07:50:22 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 07:50:22 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 13:08:21 [36mINFO: [39m @vladmandic/human version 1.7.1
|
|
||||||
2021-04-25 13:08:21 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 13:08:21 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"sourcemap":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":733,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":514895,"outputBytes":294872,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":737,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":514899,"outputBytes":294880,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":783,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":514945,"outputBytes":294924,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:08:21 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":515556,"outputBytes":295030,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 13:08:22 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:08:23 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1615890,"outputBytes":1393163,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 13:08:23 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1615890,"outputBytes":1393121,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 13:08:23 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 13:08:28 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 13:08:28 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 13:13:05 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-25 13:13:05 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 13:13:05 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-25 13:13:05 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:13:05 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":514858,"outputBytes":294833,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 13:13:05 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:13:05 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":514862,"outputBytes":294837,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 13:13:05 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:13:06 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":514908,"outputBytes":294880,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 13:13:06 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:13:06 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":515556,"outputBytes":295030,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 13:13:06 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:13:07 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1615890,"outputBytes":1393163,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 13:13:08 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1615890,"outputBytes":1393121,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 13:13:08 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 13:13:12 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 13:13:12 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 13:58:37 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-25 13:58:37 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 13:58:37 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true,"bundle":true,"metafile":true,"target":"es2018"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":514853,"outputBytes":294828,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":514857,"outputBytes":294832,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":514903,"outputBytes":294875,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:58:37 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":515551,"outputBytes":295025,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 13:58:38 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 13:58:39 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1615885,"outputBytes":1393158,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 13:58:40 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1615885,"outputBytes":1393116,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 13:58:40 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 13:58:44 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 13:58:44 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 14:02:03 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-25 14:02:03 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 14:02:03 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":514853,"outputBytes":474171,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":514857,"outputBytes":474175,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":514903,"outputBytes":474225,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:02:03 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":515551,"outputBytes":295025,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 14:02:04 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:02:04 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1615885,"outputBytes":1393158,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 14:02:05 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1615885,"outputBytes":1393116,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 14:02:05 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 14:02:09 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 14:02:09 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 14:09:15 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-25 14:09:15 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 14:09:15 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":514853,"outputBytes":474171,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":514857,"outputBytes":474175,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":514903,"outputBytes":474225,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:09:15 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":515551,"outputBytes":295025,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 14:09:16 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:09:16 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1615885,"outputBytes":1393158,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 14:09:17 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1615885,"outputBytes":1393116,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 14:09:17 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 14:09:21 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 14:09:21 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 14:28:38 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-25 14:28:38 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 14:28:38 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":514853,"outputBytes":474171,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":514857,"outputBytes":474175,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":514903,"outputBytes":474225,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 14:28:38 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:28:39 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":515551,"outputBytes":295025,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 14:28:39 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 14:28:40 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1615885,"outputBytes":1393158,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 14:28:40 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1615885,"outputBytes":1393116,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 14:28:40 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 14:28:45 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 14:28:45 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-25 16:54:54 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-25 16:54:54 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-25 16:54:54 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414277,"outputBytes":373298,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414281,"outputBytes":373302,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414327,"outputBytes":373352,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 16:54:54 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":414975,"outputBytes":229880,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-25 16:54:55 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-25 16:54:56 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1515309,"outputBytes":1328044,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-25 16:54:56 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1515309,"outputBytes":1328002,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-25 16:54:56 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-25 16:55:01 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-25 16:55:01 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-26 07:18:22 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-26 07:18:22 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-26 07:18:22 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414277,"outputBytes":373298,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414281,"outputBytes":373302,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414327,"outputBytes":373352,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:18:22 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":414975,"outputBytes":229880,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-26 07:18:23 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:18:24 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1515309,"outputBytes":1328044,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-26 07:18:24 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1515309,"outputBytes":1328002,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-26 07:18:24 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-26 07:18:30 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-26 07:18:30 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-26 07:36:49 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-26 07:36:49 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-26 07:36:49 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-26 07:36:49 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":415008,"outputBytes":374028,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":415012,"outputBytes":374032,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":415058,"outputBytes":374082,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:36:50 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":415706,"outputBytes":230290,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-26 07:36:51 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-26 07:36:51 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1516040,"outputBytes":1328454,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-26 07:36:52 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1516040,"outputBytes":1328412,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-26 07:36:52 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-26 07:36:56 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-26 07:36:56 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-28 08:55:38 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-28 08:55:39 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-28 08:55:39 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414922,"outputBytes":373580,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414926,"outputBytes":373584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414972,"outputBytes":373634,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:55:39 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":415620,"outputBytes":230233,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-28 08:55:40 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:55:40 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1515954,"outputBytes":1328406,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-28 08:55:41 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1515954,"outputBytes":1328364,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-28 08:55:41 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-28 08:55:46 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-28 08:55:46 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-28 08:57:43 [36mINFO: [39m @vladmandic/human version 1.8.0
|
|
||||||
2021-04-28 08:57:43 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-28 08:57:43 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-28 08:57:43 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:57:43 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414920,"outputBytes":373580,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-28 08:57:43 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:57:43 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414924,"outputBytes":373584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-28 08:57:43 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:57:44 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414970,"outputBytes":373634,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-28 08:57:44 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:57:44 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":415618,"outputBytes":230233,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-28 08:57:44 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1267,"moduleBytes":4085087,"imports":7,"importBytes":2488,"outputBytes":1101728,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-28 08:57:45 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1515952,"outputBytes":1328406,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-28 08:57:45 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1515952,"outputBytes":1328364,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-28 08:57:45 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-28 08:57:51 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-28 08:57:51 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-04-30 11:54:11 [36mINFO: [39m @vladmandic/human version 1.8.1
|
|
||||||
2021-04-30 11:54:11 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-04-30 11:54:11 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414920,"outputBytes":373580,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414924,"outputBytes":373584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414970,"outputBytes":373634,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-30 11:54:11 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":415618,"outputBytes":230233,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-04-30 11:54:12 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1274,"moduleBytes":4114813,"imports":7,"importBytes":2488,"outputBytes":1111306,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-04-30 11:54:13 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1525530,"outputBytes":1337943,"outputFiles":"dist/human.js"}
|
|
||||||
2021-04-30 11:54:13 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1525530,"outputBytes":1337901,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-04-30 11:54:13 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-04-30 11:54:17 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-04-30 11:54:17 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-05-04 11:17:13 [36mINFO: [39m @vladmandic/human version 1.8.1
|
|
||||||
2021-05-04 11:17:13 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-05-04 11:17:13 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-05-04 11:17:13 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414920,"outputBytes":373580,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414924,"outputBytes":373584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414970,"outputBytes":373634,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:14 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":415618,"outputBytes":230233,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-05-04 11:17:15 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1274,"moduleBytes":4114813,"imports":7,"importBytes":2488,"outputBytes":1111306,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:16 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1525530,"outputBytes":1337943,"outputFiles":"dist/human.js"}
|
|
||||||
2021-05-04 11:17:16 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1525530,"outputBytes":1337901,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-05-04 11:17:16 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-05-04 11:17:23 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-05-04 11:17:23 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-05-04 11:17:53 [36mINFO: [39m @vladmandic/human version 1.8.2
|
|
||||||
2021-05-04 11:17:53 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-05-04 11:17:53 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":414920,"outputBytes":373580,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":414924,"outputBytes":373584,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":414970,"outputBytes":373634,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:53 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":415618,"outputBytes":230233,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-05-04 11:17:54 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1274,"moduleBytes":4114813,"imports":7,"importBytes":2488,"outputBytes":1111306,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 11:17:55 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1525530,"outputBytes":1337943,"outputFiles":"dist/human.js"}
|
|
||||||
2021-05-04 11:17:56 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1525530,"outputBytes":1337901,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-05-04 11:17:56 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-05-04 11:18:01 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-05-04 11:18:01 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
2021-05-04 20:45:53 [36mINFO: [39m @vladmandic/human version 1.8.2
|
|
||||||
2021-05-04 20:45:53 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.0.0
|
|
||||||
2021-05-04 20:45:53 [36mINFO: [39m Build: file startup all type: production config: {"minifyWhitespace":true,"minifyIdentifiers":true,"minifySyntax":true}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: node type: tfjs: {"imports":1,"importBytes":39,"outputBytes":696,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: node type: node: {"imports":35,"importBytes":413741,"outputBytes":372378,"outputFiles":"dist/human.node.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: nodeGPU type: tfjs: {"imports":1,"importBytes":43,"outputBytes":700,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: nodeGPU type: node: {"imports":35,"importBytes":413745,"outputBytes":372382,"outputFiles":"dist/human.node-gpu.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: nodeWASM type: tfjs: {"imports":1,"importBytes":81,"outputBytes":746,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: nodeWASM type: node: {"imports":35,"importBytes":413791,"outputBytes":372432,"outputFiles":"dist/human.node-wasm.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: browserNoBundle type: tfjs: {"imports":1,"importBytes":2488,"outputBytes":1394,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 20:45:53 [35mSTATE:[39m Build for: browserNoBundle type: esm: {"imports":35,"importBytes":414439,"outputBytes":229511,"outputFiles":"dist/human.esm-nobundle.js"}
|
|
||||||
2021-05-04 20:45:54 [35mSTATE:[39m Build for: browserBundle type: tfjs: {"modules":1274,"moduleBytes":4114813,"imports":7,"importBytes":2488,"outputBytes":1111306,"outputFiles":"dist/tfjs.esm.js"}
|
|
||||||
2021-05-04 20:45:55 [35mSTATE:[39m Build for: browserBundle type: iife: {"imports":35,"importBytes":1524351,"outputBytes":1337203,"outputFiles":"dist/human.js"}
|
|
||||||
2021-05-04 20:45:55 [35mSTATE:[39m Build for: browserBundle type: esm: {"imports":35,"importBytes":1524351,"outputBytes":1337161,"outputFiles":"dist/human.esm.js"}
|
|
||||||
2021-05-04 20:45:55 [36mINFO: [39m Generate types: ["src/human.ts"]
|
|
||||||
2021-05-04 20:46:01 [36mINFO: [39m Update Change log: ["/home/vlado/dev/human/CHANGELOG.md"]
|
|
||||||
2021-05-04 20:46:01 [36mINFO: [39m Generate TypeDocs: ["src/human.ts"]
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
#!/usr/bin/env -S node --no-deprecation --trace-warnings
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const log = require('@vladmandic/pilogger');
|
||||||
|
const tf = require('@tensorflow/tfjs-node');
|
||||||
|
|
||||||
|
async function analyzeGraph(modelPath) {
|
||||||
|
const model = await tf.loadGraphModel(`file://${modelPath}`);
|
||||||
|
log.info('graph model:', path.resolve(modelPath));
|
||||||
|
log.info('size:', tf.engine().memory());
|
||||||
|
|
||||||
|
const inputs = [];
|
||||||
|
if (model.modelSignature && model.modelSignature['inputs']) {
|
||||||
|
log.info('model inputs based on signature');
|
||||||
|
for (const [key, val] of Object.entries(model.modelSignature['inputs'])) {
|
||||||
|
const shape = val.tensorShape.dim.map((a) => parseInt(a.size));
|
||||||
|
inputs.push({ name: key, dtype: val.dtype, shape });
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
} else if (model.executor.graph['inputs']) {
|
||||||
|
log.info('model inputs based on executor');
|
||||||
|
// @ts-ignore
|
||||||
|
for (const t of model.executor.graph['inputs']) {
|
||||||
|
inputs.push({ name: t.name, dtype: t.attrParams.dtype.value, shape: t.attrParams.shape.value });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn('model inputs: cannot determine');
|
||||||
|
}
|
||||||
|
|
||||||
|
const outputs = [];
|
||||||
|
let i = 0;
|
||||||
|
if (model.modelSignature && model.modelSignature['outputs'] && Object.values(model.modelSignature['outputs'])[0].dtype) {
|
||||||
|
log.info('model outputs based on signature');
|
||||||
|
for (const [key, val] of Object.entries(model.modelSignature['outputs'])) {
|
||||||
|
const shape = val.tensorShape?.dim.map((a) => parseInt(a.size));
|
||||||
|
outputs.push({ id: i++, name: key, dytpe: val.dtype, shape });
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
} else if (model.executor.graph['outputs']) {
|
||||||
|
log.info('model outputs based on executor');
|
||||||
|
// @ts-ignore
|
||||||
|
for (const t of model.executor.graph['outputs']) {
|
||||||
|
outputs.push({ id: i++, name: t.name, dtype: t.attrParams.dtype?.value || t.rawAttrs.T.type, shape: t.attrParams.shape?.value });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn('model outputs: cannot determine');
|
||||||
|
}
|
||||||
|
|
||||||
|
log.data('inputs:', inputs);
|
||||||
|
log.data('outputs:', outputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function analyzeSaved(modelPath) {
|
||||||
|
const meta = await tf.node.getMetaGraphsFromSavedModel(modelPath);
|
||||||
|
log.info('saved model:', path.resolve(modelPath));
|
||||||
|
const sign = Object.values(meta[0].signatureDefs)[0];
|
||||||
|
log.data('tags:', meta[0].tags);
|
||||||
|
log.data('signature:', Object.keys(meta[0].signatureDefs));
|
||||||
|
const inputs = Object.values(sign.inputs)[0];
|
||||||
|
// @ts-ignore
|
||||||
|
const inputShape = inputs.shape?.map((a) => a.array[0]);
|
||||||
|
log.data('inputs:', { name: inputs.name, dtype: inputs.dtype, shape: inputShape });
|
||||||
|
const outputs = [];
|
||||||
|
let i = 0;
|
||||||
|
for (const [key, val] of Object.entries(sign.outputs)) {
|
||||||
|
// @ts-ignore
|
||||||
|
const shape = val.shape?.map((a) => a.array[0]);
|
||||||
|
outputs.push({ id: i++, name: key, dytpe: val.dtype, shape });
|
||||||
|
}
|
||||||
|
log.data('outputs:', outputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
log.header();
|
||||||
|
const param = process.argv[2];
|
||||||
|
if (process.argv.length !== 3) {
|
||||||
|
log.error('path required');
|
||||||
|
process.exit(0);
|
||||||
|
} else if (!fs.existsSync(param)) {
|
||||||
|
log.error(`path does not exist: ${param}`);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
const stat = fs.statSync(param);
|
||||||
|
log.data('created on:', stat.birthtime);
|
||||||
|
if (stat.isFile()) {
|
||||||
|
if (param.endsWith('.json')) analyzeGraph(param);
|
||||||
|
}
|
||||||
|
if (stat.isDirectory()) {
|
||||||
|
if (fs.existsSync(path.join(param, '/saved_model.pb'))) analyzeSaved(param);
|
||||||
|
if (fs.existsSync(path.join(param, '/model.json'))) analyzeGraph(path.join(param, '/model.json'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
|
@ -318,7 +318,7 @@ const config: Config = {
|
||||||
// should skipFrames be reset immediately to force new detection cycle
|
// should skipFrames be reset immediately to force new detection cycle
|
||||||
minConfidence: 0.1, // threshold for discarding a prediction
|
minConfidence: 0.1, // threshold for discarding a prediction
|
||||||
iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed
|
iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed
|
||||||
maxDetected: 1, // maximum number of hands detected in the input
|
maxDetected: 2, // maximum number of hands detected in the input
|
||||||
// should be set to the minimum number for performance
|
// should be set to the minimum number for performance
|
||||||
landmarks: true, // detect hand landmarks or just hand boundary box
|
landmarks: true, // detect hand landmarks or just hand boundary box
|
||||||
detector: {
|
detector: {
|
||||||
|
|
|
@ -2,13 +2,11 @@ import * as tf from '../../dist/tfjs.esm.js';
|
||||||
import * as box from './box';
|
import * as box from './box';
|
||||||
import * as util from './util';
|
import * as util from './util';
|
||||||
|
|
||||||
// const PALM_BOX_SHIFT_VECTOR = [0, -0.4];
|
const palmBoxEnlargeFactor = 5; // default 3
|
||||||
const PALM_BOX_ENLARGE_FACTOR = 5; // default 3
|
const handBoxEnlargeFactor = 1.65; // default 1.65
|
||||||
// const HAND_BOX_SHIFT_VECTOR = [0, -0.1]; // move detected hand box by x,y to ease landmark detection
|
const palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||||
const HAND_BOX_ENLARGE_FACTOR = 1.65; // default 1.65
|
const palmLandmarksPalmBase = 0;
|
||||||
const PALM_LANDMARK_IDS = [0, 5, 9, 13, 17, 1, 2];
|
const palmLandmarksMiddleFingerBase = 2;
|
||||||
const PALM_LANDMARKS_INDEX_OF_PALM_BASE = 0;
|
|
||||||
const PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE = 2;
|
|
||||||
|
|
||||||
export class HandPipeline {
|
export class HandPipeline {
|
||||||
handDetector: any;
|
handDetector: any;
|
||||||
|
@ -27,20 +25,27 @@ export class HandPipeline {
|
||||||
this.detectedHands = 0;
|
this.detectedHands = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line class-methods-use-this
|
||||||
|
calculateLandmarksBoundingBox(landmarks) {
|
||||||
|
const xs = landmarks.map((d) => d[0]);
|
||||||
|
const ys = landmarks.map((d) => d[1]);
|
||||||
|
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
||||||
|
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
||||||
|
return { startPoint, endPoint };
|
||||||
|
}
|
||||||
|
|
||||||
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {
|
||||||
const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));
|
const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));
|
||||||
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);
|
||||||
// return box.enlargeBox(box.squarifyBox(box.shiftBox(boxAroundPalm, PALM_BOX_SHIFT_VECTOR)), PALM_BOX_ENLARGE_FACTOR);
|
return box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);
|
||||||
return box.enlargeBox(box.squarifyBox(boxAroundPalm), PALM_BOX_ENLARGE_FACTOR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getBoxForHandLandmarks(landmarks) {
|
getBoxForHandLandmarks(landmarks) {
|
||||||
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
const boundingBox = this.calculateLandmarksBoundingBox(landmarks);
|
||||||
// const boxAroundHand = box.enlargeBox(box.squarifyBox(box.shiftBox(boundingBox, HAND_BOX_SHIFT_VECTOR)), HAND_BOX_ENLARGE_FACTOR);
|
const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), handBoxEnlargeFactor);
|
||||||
const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), HAND_BOX_ENLARGE_FACTOR);
|
|
||||||
boxAroundHand.palmLandmarks = [];
|
boxAroundHand.palmLandmarks = [];
|
||||||
for (let i = 0; i < PALM_LANDMARK_IDS.length; i++) {
|
for (let i = 0; i < palmLandmarkIds.length; i++) {
|
||||||
boxAroundHand.palmLandmarks.push(landmarks[PALM_LANDMARK_IDS[i]].slice(0, 2));
|
boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));
|
||||||
}
|
}
|
||||||
return boxAroundHand;
|
return boxAroundHand;
|
||||||
}
|
}
|
||||||
|
@ -98,7 +103,7 @@ export class HandPipeline {
|
||||||
const currentBox = this.storedBoxes[i];
|
const currentBox = this.storedBoxes[i];
|
||||||
if (!currentBox) continue;
|
if (!currentBox) continue;
|
||||||
if (config.hand.landmarks) {
|
if (config.hand.landmarks) {
|
||||||
const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_PALM_BASE], currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE]) : 0;
|
const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;
|
||||||
const palmCenter = box.getBoxCenter(currentBox);
|
const palmCenter = box.getBoxCenter(currentBox);
|
||||||
const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];
|
const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];
|
||||||
const rotatedImage = config.hand.rotation ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();
|
const rotatedImage = config.hand.rotation ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();
|
||||||
|
@ -131,8 +136,8 @@ export class HandPipeline {
|
||||||
}
|
}
|
||||||
keypoints.dispose();
|
keypoints.dispose();
|
||||||
} else {
|
} else {
|
||||||
// const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), HAND_BOX_ENLARGE_FACTOR);
|
// const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);
|
||||||
const enlarged = box.enlargeBox(box.squarifyBox(currentBox), HAND_BOX_ENLARGE_FACTOR);
|
const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);
|
||||||
const result = {
|
const result = {
|
||||||
confidence: currentBox.confidence,
|
confidence: currentBox.confidence,
|
||||||
box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },
|
box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },
|
||||||
|
@ -144,13 +149,4 @@ export class HandPipeline {
|
||||||
this.detectedHands = hands.length;
|
this.detectedHands = hands.length;
|
||||||
return hands;
|
return hands;
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line class-methods-use-this
|
|
||||||
calculateLandmarksBoundingBox(landmarks) {
|
|
||||||
const xs = landmarks.map((d) => d[0]);
|
|
||||||
const ys = landmarks.map((d) => d[1]);
|
|
||||||
const startPoint = [Math.min(...xs), Math.min(...ys)];
|
|
||||||
const endPoint = [Math.max(...xs), Math.max(...ys)];
|
|
||||||
return { startPoint, endPoint };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import { log, now, mergeDeep } from './helpers';
|
import { log, now, mergeDeep } from './helpers';
|
||||||
|
import { Config, defaults } from './config';
|
||||||
|
import { Result } from './result';
|
||||||
import * as sysinfo from './sysinfo';
|
import * as sysinfo from './sysinfo';
|
||||||
import * as tf from '../dist/tfjs.esm.js';
|
import * as tf from '../dist/tfjs.esm.js';
|
||||||
import * as backend from './tfjs/backend';
|
import * as backend from './tfjs/backend';
|
||||||
|
@ -13,8 +15,6 @@ import * as nanodet from './nanodet/nanodet';
|
||||||
import * as gesture from './gesture/gesture';
|
import * as gesture from './gesture/gesture';
|
||||||
import * as image from './image/image';
|
import * as image from './image/image';
|
||||||
import * as draw from './draw/draw';
|
import * as draw from './draw/draw';
|
||||||
import { Config, defaults } from './config';
|
|
||||||
import { Result } from './result';
|
|
||||||
import * as sample from './sample';
|
import * as sample from './sample';
|
||||||
import * as app from '../package.json';
|
import * as app from '../package.json';
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ const localMaximumRadius = 1;
|
||||||
const outputStride = 16;
|
const outputStride = 16;
|
||||||
const squaredNmsRadius = 50 ** 2;
|
const squaredNmsRadius = 50 ** 2;
|
||||||
|
|
||||||
function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scoresBuffer, offsets, displacements, offsetRefineStep = 2) {
|
function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {
|
||||||
const getDisplacement = (point) => ({
|
const getDisplacement = (point) => ({
|
||||||
y: displacements.get(point.y, point.x, edgeId),
|
y: displacements.get(point.y, point.x, edgeId),
|
||||||
x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),
|
x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),
|
||||||
|
@ -15,7 +15,7 @@ function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scor
|
||||||
x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),
|
x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),
|
||||||
});
|
});
|
||||||
|
|
||||||
const [height, width] = scoresBuffer.shape;
|
const [height, width] = scores.shape;
|
||||||
// Nearest neighbor interpolation for the source->target displacements.
|
// Nearest neighbor interpolation for the source->target displacements.
|
||||||
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);
|
||||||
const displacement = getDisplacement(sourceKeypointIndices);
|
const displacement = getDisplacement(sourceKeypointIndices);
|
||||||
|
@ -23,49 +23,48 @@ function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scor
|
||||||
let targetKeypoint = displacedPoint;
|
let targetKeypoint = displacedPoint;
|
||||||
for (let i = 0; i < offsetRefineStep; i++) {
|
for (let i = 0; i < offsetRefineStep; i++) {
|
||||||
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetKeypointId, offsets);
|
const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);
|
||||||
targetKeypoint = utils.addVectors({
|
targetKeypoint = utils.addVectors(
|
||||||
x: targetKeypointIndices.x * outputStride,
|
{ x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },
|
||||||
y: targetKeypointIndices.y * outputStride,
|
{ x: offsetPoint.x, y: offsetPoint.y },
|
||||||
}, { x: offsetPoint.x, y: offsetPoint.y });
|
);
|
||||||
}
|
}
|
||||||
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);
|
||||||
const score = scoresBuffer.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetKeypointId);
|
const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);
|
||||||
return { position: targetKeypoint, part: kpt.partNames[targetKeypointId], score };
|
return { position: targetKeypoint, part: kpt.partNames[targetId], score };
|
||||||
}
|
}
|
||||||
|
|
||||||
export function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
export function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {
|
||||||
const parentChildrenTuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));
|
const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));
|
||||||
const parentToChildEdges = parentChildrenTuples.map(([, childJointId]) => childJointId);
|
const edgesFwd = tuples.map(([, childJointId]) => childJointId);
|
||||||
const childToParentEdges = parentChildrenTuples.map(([parentJointId]) => parentJointId);
|
const edgesBwd = tuples.map(([parentJointId]) => parentJointId);
|
||||||
const numParts = scores.shape[2]; // [21,21,17]
|
const numParts = scores.shape[2]; // [21,21,17]
|
||||||
const numEdges = parentToChildEdges.length;
|
const numEdges = edgesFwd.length;
|
||||||
const instanceKeypoints = new Array(numParts);
|
const keypoints = new Array(numParts);
|
||||||
// Start a new detection instance at the position of the root.
|
// Start a new detection instance at the position of the root.
|
||||||
// const { part: rootPart, score: rootScore } = root;
|
|
||||||
const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);
|
const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);
|
||||||
instanceKeypoints[root.part.id] = {
|
keypoints[root.part.id] = {
|
||||||
score: root.score,
|
score: root.score,
|
||||||
part: kpt.partNames[root.part.id],
|
part: kpt.partNames[root.part.id],
|
||||||
position: rootPoint,
|
position: rootPoint,
|
||||||
};
|
};
|
||||||
// Decode the part positions upwards in the tree, following the backward displacements.
|
// Decode the part positions upwards in the tree, following the backward displacements.
|
||||||
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
for (let edge = numEdges - 1; edge >= 0; --edge) {
|
||||||
const sourceKeypointId = parentToChildEdges[edge];
|
const sourceId = edgesFwd[edge];
|
||||||
const targetKeypointId = childToParentEdges[edge];
|
const targetId = edgesBwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsBwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Decode the part positions downwards in the tree, following the forward displacements.
|
// Decode the part positions downwards in the tree, following the forward displacements.
|
||||||
for (let edge = 0; edge < numEdges; ++edge) {
|
for (let edge = 0; edge < numEdges; ++edge) {
|
||||||
const sourceKeypointId = childToParentEdges[edge];
|
const sourceId = edgesBwd[edge];
|
||||||
const targetKeypointId = parentToChildEdges[edge];
|
const targetId = edgesFwd[edge];
|
||||||
if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) {
|
if (keypoints[sourceId] && !keypoints[targetId]) {
|
||||||
instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, displacementsFwd);
|
keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return instanceKeypoints;
|
return keypoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {
|
||||||
|
@ -106,31 +105,32 @@ export function buildPartWithScoreQueue(minConfidence, scores) {
|
||||||
|
|
||||||
function withinRadius(poses, { x, y }, keypointId) {
|
function withinRadius(poses, { x, y }, keypointId) {
|
||||||
return poses.some(({ keypoints }) => {
|
return poses.some(({ keypoints }) => {
|
||||||
const correspondingKeypoint = keypoints[keypointId].position;
|
const correspondingKeypoint = keypoints[keypointId]?.position;
|
||||||
|
if (!correspondingKeypoint) return false;
|
||||||
return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getInstanceScore(existingPoses, instanceKeypoints) {
|
function getInstanceScore(existingPoses, keypoints) {
|
||||||
const notOverlappedKeypointScores = instanceKeypoints.reduce((result, { position, score }, keypointId) => {
|
const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {
|
||||||
if (!withinRadius(existingPoses, position, keypointId)) result += score;
|
if (!withinRadius(existingPoses, position, keypointId)) result += score;
|
||||||
return result;
|
return result;
|
||||||
}, 0.0);
|
}, 0.0);
|
||||||
return notOverlappedKeypointScores / instanceKeypoints.length;
|
return notOverlappedKeypointScores / keypoints.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function decode(offsetsBuffer, scoresBuffer, displacementsFwdBuffer, displacementsBwdBuffer, maxDetected, minConfidence) {
|
export function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {
|
||||||
const poses: Array<{ keypoints: any, box: any, score: number }> = [];
|
const poses: Array<{ keypoints: any, box: any, score: number }> = [];
|
||||||
const queue = buildPartWithScoreQueue(minConfidence, scoresBuffer);
|
const queue = buildPartWithScoreQueue(minConfidence, scores);
|
||||||
// Generate at most maxDetected object instances per image in decreasing root part score order.
|
// Generate at most maxDetected object instances per image in decreasing root part score order.
|
||||||
while (poses.length < maxDetected && !queue.empty()) {
|
while (poses.length < maxDetected && !queue.empty()) {
|
||||||
// The top element in the queue is the next root candidate.
|
// The top element in the queue is the next root candidate.
|
||||||
const root = queue.dequeue();
|
const root = queue.dequeue();
|
||||||
// Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.
|
// Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.
|
||||||
const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsetsBuffer);
|
const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);
|
||||||
if (withinRadius(poses, rootImageCoords, root.part.id)) continue;
|
if (withinRadius(poses, rootImageCoords, root.part.id)) continue;
|
||||||
// Else start a new detection instance at the position of the root.
|
// Else start a new detection instance at the position of the root.
|
||||||
let keypoints = decodePose(root, scoresBuffer, offsetsBuffer, displacementsFwdBuffer, displacementsBwdBuffer);
|
let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);
|
||||||
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
keypoints = keypoints.filter((a) => a.score > minConfidence);
|
||||||
const score = getInstanceScore(poses, keypoints);
|
const score = getInstanceScore(poses, keypoints);
|
||||||
const box = utils.getBoundingBox(keypoints);
|
const box = utils.getBoundingBox(keypoints);
|
||||||
|
|
|
@ -39,7 +39,6 @@ export function scalePoses(poses, [height, width], [inputResolutionHeight, input
|
||||||
position: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) },
|
position: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) },
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
|
|
||||||
const scaledPoses = poses.map((pose) => scalePose(pose, height / inputResolutionHeight, width / inputResolutionWidth));
|
const scaledPoses = poses.map((pose) => scalePose(pose, height / inputResolutionHeight, width / inputResolutionWidth));
|
||||||
return scaledPoses;
|
return scaledPoses;
|
||||||
}
|
}
|
||||||
|
|
1253
test/test.log
1253
test/test.log
File diff suppressed because it is too large
Load Diff
|
@ -6,6 +6,10 @@ export declare class HandPipeline {
|
||||||
skipped: number;
|
skipped: number;
|
||||||
detectedHands: number;
|
detectedHands: number;
|
||||||
constructor(handDetector: any, landmarkDetector: any);
|
constructor(handDetector: any, landmarkDetector: any);
|
||||||
|
calculateLandmarksBoundingBox(landmarks: any): {
|
||||||
|
startPoint: number[];
|
||||||
|
endPoint: number[];
|
||||||
|
};
|
||||||
getBoxForPalmLandmarks(palmLandmarks: any, rotationMatrix: any): {
|
getBoxForPalmLandmarks(palmLandmarks: any, rotationMatrix: any): {
|
||||||
startPoint: number[];
|
startPoint: number[];
|
||||||
endPoint: any[];
|
endPoint: any[];
|
||||||
|
@ -18,8 +22,4 @@ export declare class HandPipeline {
|
||||||
};
|
};
|
||||||
transformRawCoords(rawCoords: any, box2: any, angle: any, rotationMatrix: any): any;
|
transformRawCoords(rawCoords: any, box2: any, angle: any, rotationMatrix: any): any;
|
||||||
estimateHands(image: any, config: any): Promise<{}[]>;
|
estimateHands(image: any, config: any): Promise<{}[]>;
|
||||||
calculateLandmarksBoundingBox(landmarks: any): {
|
|
||||||
startPoint: number[];
|
|
||||||
endPoint: number[];
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import { Config } from './config';
|
||||||
|
import { Result } from './result';
|
||||||
import * as tf from '../dist/tfjs.esm.js';
|
import * as tf from '../dist/tfjs.esm.js';
|
||||||
import * as facemesh from './blazeface/facemesh';
|
import * as facemesh from './blazeface/facemesh';
|
||||||
import * as faceres from './faceres/faceres';
|
import * as faceres from './faceres/faceres';
|
||||||
|
@ -7,8 +9,6 @@ import * as handpose from './handpose/handpose';
|
||||||
import * as blazepose from './blazepose/blazepose';
|
import * as blazepose from './blazepose/blazepose';
|
||||||
import * as nanodet from './nanodet/nanodet';
|
import * as nanodet from './nanodet/nanodet';
|
||||||
import * as draw from './draw/draw';
|
import * as draw from './draw/draw';
|
||||||
import { Config } from './config';
|
|
||||||
import { Result } from './result';
|
|
||||||
/** Generic Tensor object type */
|
/** Generic Tensor object type */
|
||||||
export declare type Tensor = typeof tf.Tensor;
|
export declare type Tensor = typeof tf.Tensor;
|
||||||
export type { Config } from './config';
|
export type { Config } from './config';
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import * as utils from './utils';
|
import * as utils from './utils';
|
||||||
export declare function decodePose(root: any, scores: any, offsets: any, displacementsFwd: any, displacementsBwd: any): any[];
|
export declare function decodePose(root: any, scores: any, offsets: any, displacementsFwd: any, displacementsBwd: any): any[];
|
||||||
export declare function buildPartWithScoreQueue(minConfidence: any, scores: any): utils.MaxHeap;
|
export declare function buildPartWithScoreQueue(minConfidence: any, scores: any): utils.MaxHeap;
|
||||||
export declare function decode(offsetsBuffer: any, scoresBuffer: any, displacementsFwdBuffer: any, displacementsBwdBuffer: any, maxDetected: any, minConfidence: any): {
|
export declare function decode(offsets: any, scores: any, displacementsFwd: any, displacementsBwd: any, maxDetected: any, minConfidence: any): {
|
||||||
keypoints: any;
|
keypoints: any;
|
||||||
box: any;
|
box: any;
|
||||||
score: number;
|
score: number;
|
||||||
|
|
2
wiki
2
wiki
|
@ -1 +1 @@
|
||||||
Subproject commit f9fc859622290183712e7f984db59e3c8494afe9
|
Subproject commit 981e14523d86586926d9d1141b04e652decafe5f
|
Loading…
Reference in New Issue