mirror of https://github.com/vladmandic/human
time based caching
parent
89ac004612
commit
a64d6e9830
|
@ -60,6 +60,7 @@ Check out [**Live Demo**](https://vladmandic.github.io/human/demo/index.html) ap
|
|||
- [**Usage & Functions**](https://github.com/vladmandic/human/wiki/Usage)
|
||||
- [**Configuration Details**](https://github.com/vladmandic/human/wiki/Configuration)
|
||||
- [**Output Details**](https://github.com/vladmandic/human/wiki/Outputs)
|
||||
- [**Caching & Smoothing**](https://github.com/vladmandic/human/wiki/Caching)
|
||||
- [**Face Recognition & Face Description**](https://github.com/vladmandic/human/wiki/Embedding)
|
||||
- [**Gesture Recognition**](https://github.com/vladmandic/human/wiki/Gesture)
|
||||
- [**Common Issues**](https://github.com/vladmandic/human/wiki/Issues)
|
||||
|
|
9
TODO.md
9
TODO.md
|
@ -2,16 +2,14 @@
|
|||
|
||||
## Work in Progress
|
||||
|
||||
- `skipTime`: testing, documentation
|
||||
|
||||
<br>
|
||||
|
||||
### Exploring
|
||||
|
||||
- Optical Flow: <https://docs.opencv.org/3.3.1/db/d7f/tutorial_js_lucas_kanade.html>
|
||||
- TFLite Models: <https://js.tensorflow.org/api_tflite/0.0.1-alpha.4/>
|
||||
- Histogram Equalization: Regular, Adaptive, Contrast Limited
|
||||
- Switch to custom `tfjs` for main `human` ESM bundle
|
||||
- Optical Flow: <https://docs.opencv.org/3.3.1/db/d7f/tutorial_js_lucas_kanade.html>
|
||||
- Histogram Equalization: Regular, Adaptive, Contrast Limited
|
||||
- TFLite Models: <https://js.tensorflow.org/api_tflite/0.0.1-alpha.4/>
|
||||
- Body segmentation: `robust-video-matting`
|
||||
|
||||
#### WebGPU
|
||||
|
@ -55,6 +53,7 @@ Object detection using CenterNet or NanoDet models is not working when using WAS
|
|||
## Pending Release
|
||||
|
||||
- Update to TFJS 3.10.0
|
||||
- Time based caching
|
||||
- Multiple bug fixes
|
||||
- Utility class `human.env`
|
||||
- Add `skipTime` in addition to `skipFrames`
|
||||
|
|
|
@ -1016,6 +1016,7 @@ async function main() {
|
|||
|
||||
// create instance of human
|
||||
human = new Human(userConfig);
|
||||
human.env.perfadd = true;
|
||||
|
||||
log('human version:', human.version);
|
||||
// we've merged human defaults with user config and now lets store it back so it can be accessed by methods such as menu
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -115,8 +115,8 @@ var config = {
|
|||
debug: true,
|
||||
async: true,
|
||||
warmup: "full",
|
||||
cacheSensitivity: 0.75,
|
||||
skipFrame: false,
|
||||
cacheSensitivity: 0.7,
|
||||
skipAllowed: false,
|
||||
filter: {
|
||||
enabled: true,
|
||||
width: 0,
|
||||
|
@ -146,8 +146,8 @@ var config = {
|
|||
modelPath: "blazeface.json",
|
||||
rotation: true,
|
||||
maxDetected: 1,
|
||||
skipFrames: 11,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 2500,
|
||||
minConfidence: 0.2,
|
||||
iouThreshold: 0.1,
|
||||
return: false
|
||||
|
@ -163,21 +163,21 @@ var config = {
|
|||
emotion: {
|
||||
enabled: true,
|
||||
minConfidence: 0.1,
|
||||
skipFrames: 12,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 1500,
|
||||
modelPath: "emotion.json"
|
||||
},
|
||||
description: {
|
||||
enabled: true,
|
||||
modelPath: "faceres.json",
|
||||
skipFrames: 13,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 3e3,
|
||||
minConfidence: 0.1
|
||||
},
|
||||
antispoof: {
|
||||
enabled: false,
|
||||
skipFrames: 14,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 4e3,
|
||||
modelPath: "antispoof.json"
|
||||
}
|
||||
},
|
||||
|
@ -190,12 +190,12 @@ var config = {
|
|||
maxDetected: -1,
|
||||
minConfidence: 0.3,
|
||||
skipFrames: 1,
|
||||
skipTime: 2e3
|
||||
skipTime: 200
|
||||
},
|
||||
hand: {
|
||||
enabled: true,
|
||||
rotation: true,
|
||||
skipFrames: 2,
|
||||
skipFrames: 99,
|
||||
skipTime: 2e3,
|
||||
minConfidence: 0.5,
|
||||
iouThreshold: 0.2,
|
||||
|
@ -214,8 +214,8 @@ var config = {
|
|||
minConfidence: 0.2,
|
||||
iouThreshold: 0.4,
|
||||
maxDetected: 10,
|
||||
skipFrames: 15,
|
||||
skipTime: 2e3
|
||||
skipFrames: 99,
|
||||
skipTime: 1e3
|
||||
},
|
||||
segmentation: {
|
||||
enabled: false,
|
||||
|
@ -1181,6 +1181,7 @@ var Env = class {
|
|||
__publicField(this, "filter");
|
||||
__publicField(this, "tfjs");
|
||||
__publicField(this, "offscreen");
|
||||
__publicField(this, "perfadd", false);
|
||||
__publicField(this, "wasm", {
|
||||
supported: void 0,
|
||||
backend: void 0,
|
||||
|
@ -1304,7 +1305,7 @@ var model2;
|
|||
var cached = [];
|
||||
var skipped2 = Number.MAX_SAFE_INTEGER;
|
||||
var lastCount = 0;
|
||||
var last = 0;
|
||||
var lastTime = 0;
|
||||
async function load2(config3) {
|
||||
var _a, _b;
|
||||
if (env.initial)
|
||||
|
@ -1323,7 +1324,9 @@ async function predict(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model2)
|
||||
return null;
|
||||
if (skipped2 < (((_a = config3.face.antispoof) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.antispoof) == null ? void 0 : _b.skipTime) || 0) <= now() - last && config3.skipFrame && lastCount === count2 && cached[idx]) {
|
||||
const skipTime = (((_a = config3.face.antispoof) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime;
|
||||
const skipFrame = skipped2 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && cached[idx]) {
|
||||
skipped2++;
|
||||
return cached[idx];
|
||||
}
|
||||
|
@ -1334,7 +1337,7 @@ async function predict(image25, config3, idx, count2) {
|
|||
const num = (await res.data())[0];
|
||||
cached[idx] = Math.round(100 * num) / 100;
|
||||
lastCount = count2;
|
||||
last = now();
|
||||
lastTime = now();
|
||||
tfjs_esm_exports.dispose([resize, res]);
|
||||
resolve(cached[idx]);
|
||||
});
|
||||
|
@ -4910,7 +4913,7 @@ var skipped3 = Number.MAX_SAFE_INTEGER;
|
|||
var outputNodes;
|
||||
var cache = null;
|
||||
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
|
||||
var last2 = 0;
|
||||
var lastTime2 = 0;
|
||||
async function loadDetect(config3) {
|
||||
var _a, _b, _c;
|
||||
if (env3.initial)
|
||||
|
@ -5027,11 +5030,13 @@ async function detectParts(input, config3, outputSize2) {
|
|||
}
|
||||
async function predict2(input, config3) {
|
||||
const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
if (skipped3 < (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - last2 && config3.skipFrame && cache !== null) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime2;
|
||||
const skipFrame = skipped3 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && cache !== null) {
|
||||
skipped3++;
|
||||
} else {
|
||||
cache = await detectParts(input, config3, outputSize2);
|
||||
last2 = now();
|
||||
lastTime2 = now();
|
||||
skipped3 = 0;
|
||||
}
|
||||
if (cache)
|
||||
|
@ -5126,8 +5131,8 @@ var labels = [
|
|||
// src/object/centernet.ts
|
||||
var model4;
|
||||
var inputSize3 = 0;
|
||||
var last3 = [];
|
||||
var lastTime = 0;
|
||||
var last = [];
|
||||
var lastTime3 = 0;
|
||||
var skipped4 = Number.MAX_SAFE_INTEGER;
|
||||
async function load4(config3) {
|
||||
if (env.initial)
|
||||
|
@ -5192,21 +5197,23 @@ async function process3(res, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict3(input, config3) {
|
||||
if (skipped4 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime && config3.skipFrame && last3.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime3;
|
||||
const skipFrame = skipped4 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last.length > 0) {
|
||||
skipped4++;
|
||||
return last3;
|
||||
return last;
|
||||
}
|
||||
skipped4 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last3;
|
||||
return last;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [input.shape[2], input.shape[1]];
|
||||
const resize = tfjs_esm_exports.image.resizeBilinear(input, [inputSize3, inputSize3]);
|
||||
const objectT = config3.object.enabled ? model4 == null ? void 0 : model4.execute(resize, ["tower_0/detections"]) : null;
|
||||
lastTime = now();
|
||||
lastTime3 = now();
|
||||
tfjs_esm_exports.dispose(resize);
|
||||
const obj = await process3(objectT, outputSize2, config3);
|
||||
last3 = obj;
|
||||
last = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -5246,7 +5253,7 @@ var connected2 = {
|
|||
|
||||
// src/body/efficientpose.ts
|
||||
var model5;
|
||||
var last4 = 0;
|
||||
var lastTime4 = 0;
|
||||
var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} };
|
||||
var skipped5 = Number.MAX_SAFE_INTEGER;
|
||||
async function load5(config3) {
|
||||
|
@ -5278,14 +5285,15 @@ function max2d(inputs, minScore) {
|
|||
});
|
||||
}
|
||||
async function predict4(image25, config3) {
|
||||
var _a;
|
||||
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(cache2.keypoints).length > 0 && (config3.body.skipTime || 0) <= now() - last4) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime4;
|
||||
const skipFrame = skipped5 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) {
|
||||
skipped5++;
|
||||
return [cache2];
|
||||
}
|
||||
skipped5 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
var _a2;
|
||||
var _a;
|
||||
const tensor3 = tfjs_esm_exports.tidy(() => {
|
||||
if (!(model5 == null ? void 0 : model5.inputs[0].shape))
|
||||
return null;
|
||||
|
@ -5297,7 +5305,7 @@ async function predict4(image25, config3) {
|
|||
let resT;
|
||||
if (config3.body.enabled)
|
||||
resT = await (model5 == null ? void 0 : model5.predict(tensor3));
|
||||
last4 = now();
|
||||
lastTime4 = now();
|
||||
tfjs_esm_exports.dispose(tensor3);
|
||||
if (resT) {
|
||||
cache2.keypoints.length = 0;
|
||||
|
@ -5307,7 +5315,7 @@ async function predict4(image25, config3) {
|
|||
tfjs_esm_exports.dispose(squeeze8);
|
||||
for (let id = 0; id < stack3.length; id++) {
|
||||
const [x2, y2, partScore] = max2d(stack3[id], config3.body.minConfidence);
|
||||
if (partScore > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
|
||||
if (partScore > (((_a = config3.body) == null ? void 0 : _a.minConfidence) || 0)) {
|
||||
cache2.keypoints.push({
|
||||
score: Math.round(100 * partScore) / 100,
|
||||
part: kpt2[id],
|
||||
|
@ -5358,9 +5366,9 @@ async function predict4(image25, config3) {
|
|||
// src/gear/emotion.ts
|
||||
var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"];
|
||||
var model6;
|
||||
var last5 = [];
|
||||
var last2 = [];
|
||||
var lastCount2 = 0;
|
||||
var lastTime2 = 0;
|
||||
var lastTime5 = 0;
|
||||
var skipped6 = Number.MAX_SAFE_INTEGER;
|
||||
var rgb = [0.2989, 0.587, 0.114];
|
||||
async function load6(config3) {
|
||||
|
@ -5381,9 +5389,11 @@ async function predict5(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model6)
|
||||
return null;
|
||||
if (skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime2 && config3.skipFrame && lastCount2 === count2 && last5[idx] && last5[idx].length > 0) {
|
||||
const skipFrame = skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime5;
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount2 === count2 && last2[idx] && last2[idx].length > 0) {
|
||||
skipped6++;
|
||||
return last5[idx];
|
||||
return last2[idx];
|
||||
}
|
||||
skipped6 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5406,7 +5416,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
const normalize = tfjs_esm_exports.tidy(() => tfjs_esm_exports.mul(tfjs_esm_exports.sub(grayscale, 0.5), 2));
|
||||
tfjs_esm_exports.dispose(grayscale);
|
||||
const emotionT = await (model6 == null ? void 0 : model6.predict(normalize));
|
||||
lastTime2 = now();
|
||||
lastTime5 = now();
|
||||
const data = await emotionT.data();
|
||||
tfjs_esm_exports.dispose(emotionT);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
|
@ -5416,7 +5426,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
obj.sort((a, b) => b.score - a.score);
|
||||
tfjs_esm_exports.dispose(normalize);
|
||||
}
|
||||
last5[idx] = obj;
|
||||
last2[idx] = obj;
|
||||
lastCount2 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -5559,13 +5569,15 @@ var boxCache = [];
|
|||
var model8 = null;
|
||||
var inputSize5 = 0;
|
||||
var skipped7 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime3 = 0;
|
||||
var lastTime6 = 0;
|
||||
var detectedFaces = 0;
|
||||
async function predict6(input, config3) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
|
||||
if (!config3.skipFrame || (detectedFaces !== ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || !((_b = config3.face.mesh) == null ? void 0 : _b.enabled)) && (skipped7 > (((_c = config3.face.detector) == null ? void 0 : _c.skipFrames) || 0) && (((_d = config3.face.description) == null ? void 0 : _d.skipTime) || 0) <= now() - lastTime3)) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
||||
const skipTime = (((_a = config3.face.detector) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime6;
|
||||
const skipFrame = skipped7 < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (!config3.skipAllowed || !skipTime || !skipFrame || detectedFaces === 0) {
|
||||
const newBoxes2 = await getBoxes(input, config3);
|
||||
lastTime3 = now();
|
||||
lastTime6 = now();
|
||||
boxCache = [];
|
||||
for (const possible of newBoxes2.boxes) {
|
||||
const startPoint = await possible.box.startPoint.data();
|
||||
|
@ -5601,16 +5613,16 @@ async function predict6(input, config3) {
|
|||
faceScore: 0,
|
||||
annotations: {}
|
||||
};
|
||||
if (((_e = config3.face.detector) == null ? void 0 : _e.rotation) && ((_f = config3.face.mesh) == null ? void 0 : _f.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_c = config3.face.detector) == null ? void 0 : _c.rotation) && ((_d = config3.face.mesh) == null ? void 0 : _d.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
} else {
|
||||
rotationMatrix = IDENTITY_MATRIX;
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_g = config3.face.mesh) == null ? void 0 : _g.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_e = config3.face.mesh) == null ? void 0 : _e.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
face5.tensor = tfjs_esm_exports.div(cut, 255);
|
||||
tfjs_esm_exports.dispose(cut);
|
||||
}
|
||||
face5.boxScore = Math.round(100 * box4.confidence) / 100;
|
||||
if (!((_h = config3.face.mesh) == null ? void 0 : _h.enabled)) {
|
||||
if (!((_f = config3.face.mesh) == null ? void 0 : _f.enabled)) {
|
||||
face5.box = getClampedBox(box4, input);
|
||||
face5.boxRaw = getRawBox(box4, input);
|
||||
face5.score = Math.round(100 * box4.confidence || 0) / 100;
|
||||
|
@ -5633,17 +5645,17 @@ async function predict6(input, config3) {
|
|||
let rawCoords = await coordsReshaped.array();
|
||||
tfjs_esm_exports.dispose(contourCoords);
|
||||
tfjs_esm_exports.dispose(coordsReshaped);
|
||||
if (faceConfidence < (((_i = config3.face.detector) == null ? void 0 : _i.minConfidence) || 1)) {
|
||||
if (faceConfidence < (((_g = config3.face.detector) == null ? void 0 : _g.minConfidence) || 1)) {
|
||||
box4.confidence = faceConfidence;
|
||||
} else {
|
||||
if ((_j = config3.face.iris) == null ? void 0 : _j.enabled)
|
||||
if ((_h = config3.face.iris) == null ? void 0 : _h.enabled)
|
||||
rawCoords = await augmentIris(rawCoords, face5.tensor, config3, inputSize5);
|
||||
face5.mesh = transformRawCoords(rawCoords, box4, angle, rotationMatrix, inputSize5);
|
||||
face5.meshRaw = face5.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize5]);
|
||||
box4 = { ...enlargeBox(calculateLandmarksBoundingBox(face5.mesh), 1.5), confidence: box4.confidence };
|
||||
for (const key of Object.keys(meshAnnotations))
|
||||
face5.annotations[key] = meshAnnotations[key].map((index) => face5.mesh[index]);
|
||||
if (((_k = config3.face.detector) == null ? void 0 : _k.rotation) && config3.face.mesh.enabled && ((_l = config3.face.description) == null ? void 0 : _l.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_i = config3.face.detector) == null ? void 0 : _i.rotation) && config3.face.mesh.enabled && ((_j = config3.face.description) == null ? void 0 : _j.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
tfjs_esm_exports.dispose(face5.tensor);
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
}
|
||||
|
@ -5657,7 +5669,7 @@ async function predict6(input, config3) {
|
|||
faces.push(face5);
|
||||
newBoxes.push(box4);
|
||||
}
|
||||
if ((_m = config3.face.mesh) == null ? void 0 : _m.enabled)
|
||||
if ((_k = config3.face.mesh) == null ? void 0 : _k.enabled)
|
||||
boxCache = newBoxes.filter((a) => {
|
||||
var _a2;
|
||||
return a.confidence > (((_a2 = config3.face.detector) == null ? void 0 : _a2.minConfidence) || 0);
|
||||
|
@ -5687,8 +5699,8 @@ var uvmap = UV468;
|
|||
|
||||
// src/face/faceres.ts
|
||||
var model9;
|
||||
var last6 = [];
|
||||
var lastTime4 = 0;
|
||||
var last3 = [];
|
||||
var lastTime7 = 0;
|
||||
var lastCount3 = 0;
|
||||
var skipped8 = Number.MAX_SAFE_INTEGER;
|
||||
async function load9(config3) {
|
||||
|
@ -5724,9 +5736,11 @@ async function predict7(image25, config3, idx, count2) {
|
|||
var _a, _b, _c, _d;
|
||||
if (!model9)
|
||||
return null;
|
||||
if (skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime4 && config3.skipFrame && lastCount3 === count2 && ((_c = last6[idx]) == null ? void 0 : _c.age) && ((_d = last6[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
const skipFrame = skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime7;
|
||||
if (config3.skipAllowed && skipFrame && skipTime && lastCount3 === count2 && ((_c = last3[idx]) == null ? void 0 : _c.age) && ((_d = last3[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
skipped8++;
|
||||
return last6[idx];
|
||||
return last3[idx];
|
||||
}
|
||||
skipped8 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5740,7 +5754,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
if ((_a2 = config3.face.description) == null ? void 0 : _a2.enabled) {
|
||||
const enhanced = enhance(image25);
|
||||
const resT = await (model9 == null ? void 0 : model9.predict(enhanced));
|
||||
lastTime4 = now();
|
||||
lastTime7 = now();
|
||||
tfjs_esm_exports.dispose(enhanced);
|
||||
const genderT = await resT.find((t) => t.shape[1] === 1);
|
||||
const gender = await genderT.data();
|
||||
|
@ -5760,7 +5774,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
obj.descriptor = Array.from(descriptor);
|
||||
resT.forEach((t) => tfjs_esm_exports.dispose(t));
|
||||
}
|
||||
last6[idx] = obj;
|
||||
last3[idx] = obj;
|
||||
lastCount3 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -8907,7 +8921,7 @@ var handBoxEnlargeFactor = 1.65;
|
|||
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||
var palmLandmarksPalmBase = 0;
|
||||
var palmLandmarksMiddleFingerBase = 2;
|
||||
var lastTime5 = 0;
|
||||
var lastTime8 = 0;
|
||||
var HandPipeline = class {
|
||||
constructor(handDetector, handPoseModel2) {
|
||||
__publicField(this, "handDetector");
|
||||
|
@ -8920,7 +8934,7 @@ var HandPipeline = class {
|
|||
this.handPoseModel = handPoseModel2;
|
||||
this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
|
||||
this.storedBoxes = [];
|
||||
this.skipped = 0;
|
||||
this.skipped = Number.MAX_SAFE_INTEGER;
|
||||
this.detectedHands = 0;
|
||||
}
|
||||
calculateLandmarksBoundingBox(landmarks) {
|
||||
|
@ -8972,11 +8986,13 @@ var HandPipeline = class {
|
|||
async estimateHands(image25, config3) {
|
||||
let useFreshBox = false;
|
||||
let boxes;
|
||||
if (this.skipped === 0 || this.skipped > config3.hand.skipFrames && (config3.hand.skipTime || 0) <= now() - lastTime5 || !config3.hand.landmarks || !config3.skipFrame) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime8;
|
||||
const skipFrame = this.skipped < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
boxes = await this.handDetector.estimateHandBounds(image25, config3);
|
||||
this.skipped = 0;
|
||||
}
|
||||
if (config3.skipFrame)
|
||||
if (config3.skipAllowed)
|
||||
this.skipped++;
|
||||
if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) {
|
||||
this.detectedHands = 0;
|
||||
|
@ -9001,7 +9017,7 @@ var HandPipeline = class {
|
|||
tfjs_esm_exports.dispose(croppedInput);
|
||||
tfjs_esm_exports.dispose(rotatedImage);
|
||||
const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage);
|
||||
lastTime5 = now();
|
||||
lastTime8 = now();
|
||||
tfjs_esm_exports.dispose(handImage);
|
||||
const confidence = (await confidenceT.data())[0];
|
||||
tfjs_esm_exports.dispose(confidenceT);
|
||||
|
@ -9569,8 +9585,8 @@ var faceIndex = 4;
|
|||
var boxExpandFact = 1.6;
|
||||
var maxDetectorResolution = 512;
|
||||
var detectorExpandFact = 1.4;
|
||||
var skipped9 = 0;
|
||||
var lastTime6 = 0;
|
||||
var skipped9 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime9 = 0;
|
||||
var outputSize = [0, 0];
|
||||
var cache3 = {
|
||||
boxes: [],
|
||||
|
@ -9710,17 +9726,21 @@ async function predict9(input, config3) {
|
|||
return [];
|
||||
outputSize = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
skipped9++;
|
||||
if (config3.skipFrame && skipped9 <= (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= now() - lastTime6) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrame = skipped9 < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache3.hands;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
if (config3.skipFrame && cache3.hands.length === config3.hand.maxDetected) {
|
||||
const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrameExtended = skipped9 < 3 * (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && cache3.hands.length === config3.hand.maxDetected) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else if (config3.skipFrame && skipped9 < 3 * (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= 3 * (now() - lastTime6) && cache3.hands.length > 0) {
|
||||
} else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache3.hands.length > 0) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else {
|
||||
cache3.boxes = await detectHands(input, config3);
|
||||
lastTime6 = now();
|
||||
lastTime9 = now();
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
skipped9 = 0;
|
||||
}
|
||||
|
@ -10015,10 +10035,12 @@ async function parseMultiPose(res, config3, image25, inputBox) {
|
|||
async function predict10(input, config3) {
|
||||
if (!model10 || !(model10 == null ? void 0 : model10.inputs[0].shape))
|
||||
return [];
|
||||
if (!config3.skipFrame)
|
||||
if (!config3.skipAllowed)
|
||||
cache5.boxes.length = 0;
|
||||
skipped10++;
|
||||
if (config3.skipFrame && (skipped10 <= (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - cache5.last)) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - cache5.last;
|
||||
const skipFrame = skipped10 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache5.bodies;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -10040,8 +10062,8 @@ async function predict10(input, config3) {
|
|||
|
||||
// src/object/nanodet.ts
|
||||
var model11;
|
||||
var last7 = [];
|
||||
var lastTime7 = 0;
|
||||
var last4 = [];
|
||||
var lastTime10 = 0;
|
||||
var skipped11 = Number.MAX_SAFE_INTEGER;
|
||||
var scaleBox = 2.5;
|
||||
async function load12(config3) {
|
||||
|
@ -10121,13 +10143,15 @@ async function process4(res, inputSize8, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict11(image25, config3) {
|
||||
if (skipped11 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime7 && config3.skipFrame && last7.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime10;
|
||||
const skipFrame = skipped11 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last4.length > 0) {
|
||||
skipped11++;
|
||||
return last7;
|
||||
return last4;
|
||||
}
|
||||
skipped11 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last7;
|
||||
return last4;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [image25.shape[2], image25.shape[1]];
|
||||
const resize = tfjs_esm_exports.image.resizeBilinear(image25, [model11.inputSize, model11.inputSize], false);
|
||||
|
@ -10138,10 +10162,10 @@ async function predict11(image25, config3) {
|
|||
let objectT;
|
||||
if (config3.object.enabled)
|
||||
objectT = await model11.predict(transpose);
|
||||
lastTime7 = now();
|
||||
lastTime10 = now();
|
||||
tfjs_esm_exports.dispose(transpose);
|
||||
const obj = await process4(objectT, model11.inputSize, outputSize2, config3);
|
||||
last7 = obj;
|
||||
last4 = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -11336,7 +11360,7 @@ async function canvas2(input, output) {
|
|||
async function all(inCanvas2, result, drawOptions) {
|
||||
if (!result || !result.performance || !result || !inCanvas2)
|
||||
return null;
|
||||
const timestamp = now();
|
||||
const timeStamp = now();
|
||||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
const promise = Promise.all([
|
||||
face(inCanvas2, result.face, localOptions),
|
||||
|
@ -11345,7 +11369,7 @@ async function all(inCanvas2, result, drawOptions) {
|
|||
object(inCanvas2, result.object, localOptions),
|
||||
gesture(inCanvas2, result.gesture, localOptions)
|
||||
]);
|
||||
result.performance.draw = Math.trunc(now() - timestamp);
|
||||
result.performance.draw = env.perfadd ? (result.performance.draw || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
@ -11470,7 +11494,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:face";
|
||||
timeStamp = now();
|
||||
const faces = await predict6(input, parent.config);
|
||||
parent.performance.face = Math.trunc(now() - timeStamp);
|
||||
parent.performance.face = env.perfadd ? (parent.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
if (!input.shape || input.shape.length !== 4)
|
||||
return [];
|
||||
if (!faces)
|
||||
|
@ -11489,7 +11513,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
parent.performance.emotion = env.perfadd ? (parent.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
|
@ -11499,7 +11523,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
parent.performance.antispoof = env.perfadd ? (parent.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
|
@ -11509,7 +11533,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
parent.performance.embedding = env.perfadd ? (parent.performance.embedding || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
if (parent.config.async) {
|
||||
|
@ -12827,7 +12851,7 @@ var Human = class {
|
|||
const count2 = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (userConfig)
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
if (env.initial) {
|
||||
if (this.env.initial) {
|
||||
if (this.config.debug)
|
||||
log(`version: ${this.version}`);
|
||||
if (this.config.debug)
|
||||
|
@ -12843,9 +12867,9 @@ var Human = class {
|
|||
}
|
||||
}
|
||||
await load15(this);
|
||||
if (env.initial && this.config.debug)
|
||||
if (this.env.initial && this.config.debug)
|
||||
log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors");
|
||||
env.initial = false;
|
||||
this.env.initial = false;
|
||||
const loaded = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (loaded !== count2) {
|
||||
await validate2(this);
|
||||
|
@ -12853,7 +12877,7 @@ var Human = class {
|
|||
}
|
||||
const current = Math.trunc(now() - timeStamp);
|
||||
if (current > (this.performance.load || 0))
|
||||
this.performance.load = current;
|
||||
this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
|
||||
}
|
||||
next(result = this.result) {
|
||||
return calc2(result, this.config);
|
||||
|
@ -12867,7 +12891,6 @@ var Human = class {
|
|||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
||||
this.state = "config";
|
||||
let timeStamp;
|
||||
let elapsedTime;
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
this.state = "check";
|
||||
const error = __privateGet(this, _sanity).call(this, input);
|
||||
|
@ -12882,7 +12905,7 @@ var Human = class {
|
|||
this.state = "image";
|
||||
const img = process2(input, this.config);
|
||||
this.process = img;
|
||||
this.performance.image = Math.trunc(now() - timeStamp);
|
||||
this.performance.image = this.env.perfadd ? (this.performance.image || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Get Image:");
|
||||
if (!img.tensor) {
|
||||
if (this.config.debug)
|
||||
|
@ -12892,15 +12915,15 @@ var Human = class {
|
|||
}
|
||||
this.emit("image");
|
||||
timeStamp = now();
|
||||
this.config.skipFrame = await skip(this.config, img.tensor);
|
||||
this.config.skipAllowed = await skip(this.config, img.tensor);
|
||||
if (!this.performance.frames)
|
||||
this.performance.frames = 0;
|
||||
if (!this.performance.cached)
|
||||
this.performance.cached = 0;
|
||||
this.performance.frames++;
|
||||
if (this.config.skipFrame)
|
||||
if (this.config.skipAllowed)
|
||||
this.performance.cached++;
|
||||
this.performance.changed = Math.trunc(now() - timeStamp);
|
||||
this.performance.changed = this.env.perfadd ? (this.performance.changed || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Check Changed:");
|
||||
let faceRes = [];
|
||||
let bodyRes = [];
|
||||
|
@ -12914,9 +12937,7 @@ var Human = class {
|
|||
} else {
|
||||
timeStamp = now();
|
||||
faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.face = elapsedTime;
|
||||
this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1))
|
||||
faceRes = await faceRes;
|
||||
|
@ -12944,9 +12965,7 @@ var Human = class {
|
|||
bodyRes = this.config.body.enabled ? await predict4(img.tensor, bodyConfig) : [];
|
||||
else if ((_h = this.config.body.modelPath) == null ? void 0 : _h.includes("movenet"))
|
||||
bodyRes = this.config.body.enabled ? await predict10(img.tensor, bodyConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.body = elapsedTime;
|
||||
this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Body:");
|
||||
this.analyze("Start Hand:");
|
||||
|
@ -12965,9 +12984,7 @@ var Human = class {
|
|||
handRes = this.config.hand.enabled ? await predict8(img.tensor, handConfig) : [];
|
||||
else if ((_p = (_o = this.config.hand.detector) == null ? void 0 : _o.modelPath) == null ? void 0 : _p.includes("handtrack"))
|
||||
handRes = this.config.hand.enabled ? await predict9(img.tensor, handConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.hand = elapsedTime;
|
||||
this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Hand:");
|
||||
this.analyze("Start Object:");
|
||||
|
@ -12985,9 +13002,7 @@ var Human = class {
|
|||
objectRes = this.config.object.enabled ? await predict11(img.tensor, this.config) : [];
|
||||
else if ((_t = this.config.object.modelPath) == null ? void 0 : _t.includes("centernet"))
|
||||
objectRes = this.config.object.enabled ? await predict3(img.tensor, this.config) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.object = elapsedTime;
|
||||
this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Object:");
|
||||
this.state = "detect:await";
|
||||
|
@ -12999,7 +13014,7 @@ var Human = class {
|
|||
timeStamp = now();
|
||||
gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris3(faceRes)];
|
||||
if (!this.config.async)
|
||||
this.performance.gesture = Math.trunc(now() - timeStamp);
|
||||
this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
else if (this.performance.gesture)
|
||||
delete this.performance.gesture;
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -104,8 +104,8 @@ var config = {
|
|||
debug: true,
|
||||
async: true,
|
||||
warmup: "full",
|
||||
cacheSensitivity: 0.75,
|
||||
skipFrame: false,
|
||||
cacheSensitivity: 0.7,
|
||||
skipAllowed: false,
|
||||
filter: {
|
||||
enabled: true,
|
||||
width: 0,
|
||||
|
@ -135,8 +135,8 @@ var config = {
|
|||
modelPath: "blazeface.json",
|
||||
rotation: true,
|
||||
maxDetected: 1,
|
||||
skipFrames: 11,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 2500,
|
||||
minConfidence: 0.2,
|
||||
iouThreshold: 0.1,
|
||||
return: false
|
||||
|
@ -152,21 +152,21 @@ var config = {
|
|||
emotion: {
|
||||
enabled: true,
|
||||
minConfidence: 0.1,
|
||||
skipFrames: 12,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 1500,
|
||||
modelPath: "emotion.json"
|
||||
},
|
||||
description: {
|
||||
enabled: true,
|
||||
modelPath: "faceres.json",
|
||||
skipFrames: 13,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 3e3,
|
||||
minConfidence: 0.1
|
||||
},
|
||||
antispoof: {
|
||||
enabled: false,
|
||||
skipFrames: 14,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 4e3,
|
||||
modelPath: "antispoof.json"
|
||||
}
|
||||
},
|
||||
|
@ -179,12 +179,12 @@ var config = {
|
|||
maxDetected: -1,
|
||||
minConfidence: 0.3,
|
||||
skipFrames: 1,
|
||||
skipTime: 2e3
|
||||
skipTime: 200
|
||||
},
|
||||
hand: {
|
||||
enabled: true,
|
||||
rotation: true,
|
||||
skipFrames: 2,
|
||||
skipFrames: 99,
|
||||
skipTime: 2e3,
|
||||
minConfidence: 0.5,
|
||||
iouThreshold: 0.2,
|
||||
|
@ -203,8 +203,8 @@ var config = {
|
|||
minConfidence: 0.2,
|
||||
iouThreshold: 0.4,
|
||||
maxDetected: 10,
|
||||
skipFrames: 15,
|
||||
skipTime: 2e3
|
||||
skipFrames: 99,
|
||||
skipTime: 1e3
|
||||
},
|
||||
segmentation: {
|
||||
enabled: false,
|
||||
|
@ -34798,6 +34798,7 @@ var Env = class {
|
|||
__publicField(this, "filter");
|
||||
__publicField(this, "tfjs");
|
||||
__publicField(this, "offscreen");
|
||||
__publicField(this, "perfadd", false);
|
||||
__publicField(this, "wasm", {
|
||||
supported: void 0,
|
||||
backend: void 0,
|
||||
|
@ -34921,7 +34922,7 @@ var model2;
|
|||
var cached = [];
|
||||
var skipped2 = Number.MAX_SAFE_INTEGER;
|
||||
var lastCount = 0;
|
||||
var last = 0;
|
||||
var lastTime = 0;
|
||||
async function load2(config3) {
|
||||
var _a2, _b;
|
||||
if (env.initial)
|
||||
|
@ -34940,7 +34941,9 @@ async function predict(image6, config3, idx, count2) {
|
|||
var _a2, _b;
|
||||
if (!model2)
|
||||
return null;
|
||||
if (skipped2 < (((_a2 = config3.face.antispoof) == null ? void 0 : _a2.skipFrames) || 0) && (((_b = config3.face.antispoof) == null ? void 0 : _b.skipTime) || 0) <= now() - last && config3.skipFrame && lastCount === count2 && cached[idx]) {
|
||||
const skipTime = (((_a2 = config3.face.antispoof) == null ? void 0 : _a2.skipTime) || 0) > now() - lastTime;
|
||||
const skipFrame = skipped2 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && cached[idx]) {
|
||||
skipped2++;
|
||||
return cached[idx];
|
||||
}
|
||||
|
@ -34951,7 +34954,7 @@ async function predict(image6, config3, idx, count2) {
|
|||
const num = (await res.data())[0];
|
||||
cached[idx] = Math.round(100 * num) / 100;
|
||||
lastCount = count2;
|
||||
last = now();
|
||||
lastTime = now();
|
||||
De([resize, res]);
|
||||
resolve(cached[idx]);
|
||||
});
|
||||
|
@ -38527,7 +38530,7 @@ var skipped3 = Number.MAX_SAFE_INTEGER;
|
|||
var outputNodes;
|
||||
var cache = null;
|
||||
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
|
||||
var last2 = 0;
|
||||
var lastTime2 = 0;
|
||||
async function loadDetect(config3) {
|
||||
var _a2, _b, _c2;
|
||||
if (env2.initial)
|
||||
|
@ -38644,11 +38647,13 @@ async function detectParts(input, config3, outputSize2) {
|
|||
}
|
||||
async function predict2(input, config3) {
|
||||
const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
if (skipped3 < (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - last2 && config3.skipFrame && cache !== null) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime2;
|
||||
const skipFrame = skipped3 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && cache !== null) {
|
||||
skipped3++;
|
||||
} else {
|
||||
cache = await detectParts(input, config3, outputSize2);
|
||||
last2 = now();
|
||||
lastTime2 = now();
|
||||
skipped3 = 0;
|
||||
}
|
||||
if (cache)
|
||||
|
@ -38743,8 +38748,8 @@ var labels = [
|
|||
// src/object/centernet.ts
|
||||
var model4;
|
||||
var inputSize3 = 0;
|
||||
var last3 = [];
|
||||
var lastTime = 0;
|
||||
var last = [];
|
||||
var lastTime3 = 0;
|
||||
var skipped4 = Number.MAX_SAFE_INTEGER;
|
||||
async function load4(config3) {
|
||||
if (env.initial)
|
||||
|
@ -38809,21 +38814,23 @@ async function process3(res, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict3(input, config3) {
|
||||
if (skipped4 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime && config3.skipFrame && last3.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime3;
|
||||
const skipFrame = skipped4 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last.length > 0) {
|
||||
skipped4++;
|
||||
return last3;
|
||||
return last;
|
||||
}
|
||||
skipped4 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last3;
|
||||
return last;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [input.shape[2], input.shape[1]];
|
||||
const resize = Cn.resizeBilinear(input, [inputSize3, inputSize3]);
|
||||
const objectT = config3.object.enabled ? model4 == null ? void 0 : model4.execute(resize, ["tower_0/detections"]) : null;
|
||||
lastTime = now();
|
||||
lastTime3 = now();
|
||||
De(resize);
|
||||
const obj = await process3(objectT, outputSize2, config3);
|
||||
last3 = obj;
|
||||
last = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -38863,7 +38870,7 @@ var connected2 = {
|
|||
|
||||
// src/body/efficientpose.ts
|
||||
var model5;
|
||||
var last4 = 0;
|
||||
var lastTime4 = 0;
|
||||
var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} };
|
||||
var skipped5 = Number.MAX_SAFE_INTEGER;
|
||||
async function load5(config3) {
|
||||
|
@ -38895,14 +38902,15 @@ function max2d(inputs, minScore) {
|
|||
});
|
||||
}
|
||||
async function predict4(image6, config3) {
|
||||
var _a2;
|
||||
if (skipped5 < (((_a2 = config3.body) == null ? void 0 : _a2.skipFrames) || 0) && config3.skipFrame && Object.keys(cache2.keypoints).length > 0 && (config3.body.skipTime || 0) <= now() - last4) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime4;
|
||||
const skipFrame = skipped5 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) {
|
||||
skipped5++;
|
||||
return [cache2];
|
||||
}
|
||||
skipped5 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
var _a3;
|
||||
var _a2;
|
||||
const tensor = V(() => {
|
||||
if (!(model5 == null ? void 0 : model5.inputs[0].shape))
|
||||
return null;
|
||||
|
@ -38914,7 +38922,7 @@ async function predict4(image6, config3) {
|
|||
let resT;
|
||||
if (config3.body.enabled)
|
||||
resT = await (model5 == null ? void 0 : model5.predict(tensor));
|
||||
last4 = now();
|
||||
lastTime4 = now();
|
||||
De(tensor);
|
||||
if (resT) {
|
||||
cache2.keypoints.length = 0;
|
||||
|
@ -38924,7 +38932,7 @@ async function predict4(image6, config3) {
|
|||
De(squeeze);
|
||||
for (let id2 = 0; id2 < stack.length; id2++) {
|
||||
const [x7, y7, partScore] = max2d(stack[id2], config3.body.minConfidence);
|
||||
if (partScore > (((_a3 = config3.body) == null ? void 0 : _a3.minConfidence) || 0)) {
|
||||
if (partScore > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
|
||||
cache2.keypoints.push({
|
||||
score: Math.round(100 * partScore) / 100,
|
||||
part: kpt2[id2],
|
||||
|
@ -38975,9 +38983,9 @@ async function predict4(image6, config3) {
|
|||
// src/gear/emotion.ts
|
||||
var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"];
|
||||
var model6;
|
||||
var last5 = [];
|
||||
var last2 = [];
|
||||
var lastCount2 = 0;
|
||||
var lastTime2 = 0;
|
||||
var lastTime5 = 0;
|
||||
var skipped6 = Number.MAX_SAFE_INTEGER;
|
||||
var rgb = [0.2989, 0.587, 0.114];
|
||||
async function load6(config3) {
|
||||
|
@ -38998,9 +39006,11 @@ async function predict5(image6, config3, idx, count2) {
|
|||
var _a2, _b;
|
||||
if (!model6)
|
||||
return null;
|
||||
if (skipped6 < (((_a2 = config3.face.emotion) == null ? void 0 : _a2.skipFrames) || 0) && (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime2 && config3.skipFrame && lastCount2 === count2 && last5[idx] && last5[idx].length > 0) {
|
||||
const skipFrame = skipped6 < (((_a2 = config3.face.emotion) == null ? void 0 : _a2.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime5;
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount2 === count2 && last2[idx] && last2[idx].length > 0) {
|
||||
skipped6++;
|
||||
return last5[idx];
|
||||
return last2[idx];
|
||||
}
|
||||
skipped6 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -39023,7 +39033,7 @@ async function predict5(image6, config3, idx, count2) {
|
|||
const normalize = V(() => O(le(grayscale, 0.5), 2));
|
||||
De(grayscale);
|
||||
const emotionT = await (model6 == null ? void 0 : model6.predict(normalize));
|
||||
lastTime2 = now();
|
||||
lastTime5 = now();
|
||||
const data = await emotionT.data();
|
||||
De(emotionT);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
|
@ -39033,7 +39043,7 @@ async function predict5(image6, config3, idx, count2) {
|
|||
obj.sort((a, b10) => b10.score - a.score);
|
||||
De(normalize);
|
||||
}
|
||||
last5[idx] = obj;
|
||||
last2[idx] = obj;
|
||||
lastCount2 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -39176,13 +39186,15 @@ var boxCache = [];
|
|||
var model8 = null;
|
||||
var inputSize5 = 0;
|
||||
var skipped7 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime3 = 0;
|
||||
var lastTime6 = 0;
|
||||
var detectedFaces = 0;
|
||||
async function predict6(input, config3) {
|
||||
var _a2, _b, _c2, _d2, _e, _f2, _g, _h2, _i2, _j2, _k2, _l2, _m2;
|
||||
if (!config3.skipFrame || (detectedFaces !== ((_a2 = config3.face.detector) == null ? void 0 : _a2.maxDetected) || !((_b = config3.face.mesh) == null ? void 0 : _b.enabled)) && (skipped7 > (((_c2 = config3.face.detector) == null ? void 0 : _c2.skipFrames) || 0) && (((_d2 = config3.face.description) == null ? void 0 : _d2.skipTime) || 0) <= now() - lastTime3)) {
|
||||
var _a2, _b, _c2, _d2, _e, _f2, _g, _h2, _i2, _j2, _k2;
|
||||
const skipTime = (((_a2 = config3.face.detector) == null ? void 0 : _a2.skipTime) || 0) > now() - lastTime6;
|
||||
const skipFrame = skipped7 < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (!config3.skipAllowed || !skipTime || !skipFrame || detectedFaces === 0) {
|
||||
const newBoxes2 = await getBoxes(input, config3);
|
||||
lastTime3 = now();
|
||||
lastTime6 = now();
|
||||
boxCache = [];
|
||||
for (const possible of newBoxes2.boxes) {
|
||||
const startPoint = await possible.box.startPoint.data();
|
||||
|
@ -39218,16 +39230,16 @@ async function predict6(input, config3) {
|
|||
faceScore: 0,
|
||||
annotations: {}
|
||||
};
|
||||
if (((_e = config3.face.detector) == null ? void 0 : _e.rotation) && ((_f2 = config3.face.mesh) == null ? void 0 : _f2.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_c2 = config3.face.detector) == null ? void 0 : _c2.rotation) && ((_d2 = config3.face.mesh) == null ? void 0 : _d2.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
} else {
|
||||
rotationMatrix = IDENTITY_MATRIX;
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_g = config3.face.mesh) == null ? void 0 : _g.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_e = config3.face.mesh) == null ? void 0 : _e.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
face5.tensor = ce(cut, 255);
|
||||
De(cut);
|
||||
}
|
||||
face5.boxScore = Math.round(100 * box4.confidence) / 100;
|
||||
if (!((_h2 = config3.face.mesh) == null ? void 0 : _h2.enabled)) {
|
||||
if (!((_f2 = config3.face.mesh) == null ? void 0 : _f2.enabled)) {
|
||||
face5.box = getClampedBox(box4, input);
|
||||
face5.boxRaw = getRawBox(box4, input);
|
||||
face5.score = Math.round(100 * box4.confidence || 0) / 100;
|
||||
|
@ -39250,17 +39262,17 @@ async function predict6(input, config3) {
|
|||
let rawCoords = await coordsReshaped.array();
|
||||
De(contourCoords);
|
||||
De(coordsReshaped);
|
||||
if (faceConfidence < (((_i2 = config3.face.detector) == null ? void 0 : _i2.minConfidence) || 1)) {
|
||||
if (faceConfidence < (((_g = config3.face.detector) == null ? void 0 : _g.minConfidence) || 1)) {
|
||||
box4.confidence = faceConfidence;
|
||||
} else {
|
||||
if ((_j2 = config3.face.iris) == null ? void 0 : _j2.enabled)
|
||||
if ((_h2 = config3.face.iris) == null ? void 0 : _h2.enabled)
|
||||
rawCoords = await augmentIris(rawCoords, face5.tensor, config3, inputSize5);
|
||||
face5.mesh = transformRawCoords(rawCoords, box4, angle, rotationMatrix, inputSize5);
|
||||
face5.meshRaw = face5.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize5]);
|
||||
box4 = { ...enlargeBox(calculateLandmarksBoundingBox(face5.mesh), 1.5), confidence: box4.confidence };
|
||||
for (const key of Object.keys(meshAnnotations))
|
||||
face5.annotations[key] = meshAnnotations[key].map((index) => face5.mesh[index]);
|
||||
if (((_k2 = config3.face.detector) == null ? void 0 : _k2.rotation) && config3.face.mesh.enabled && ((_l2 = config3.face.description) == null ? void 0 : _l2.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_i2 = config3.face.detector) == null ? void 0 : _i2.rotation) && config3.face.mesh.enabled && ((_j2 = config3.face.description) == null ? void 0 : _j2.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
De(face5.tensor);
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
}
|
||||
|
@ -39274,7 +39286,7 @@ async function predict6(input, config3) {
|
|||
faces.push(face5);
|
||||
newBoxes.push(box4);
|
||||
}
|
||||
if ((_m2 = config3.face.mesh) == null ? void 0 : _m2.enabled)
|
||||
if ((_k2 = config3.face.mesh) == null ? void 0 : _k2.enabled)
|
||||
boxCache = newBoxes.filter((a) => {
|
||||
var _a3;
|
||||
return a.confidence > (((_a3 = config3.face.detector) == null ? void 0 : _a3.minConfidence) || 0);
|
||||
|
@ -39304,8 +39316,8 @@ var uvmap = UV468;
|
|||
|
||||
// src/face/faceres.ts
|
||||
var model9;
|
||||
var last6 = [];
|
||||
var lastTime4 = 0;
|
||||
var last3 = [];
|
||||
var lastTime7 = 0;
|
||||
var lastCount3 = 0;
|
||||
var skipped8 = Number.MAX_SAFE_INTEGER;
|
||||
async function load9(config3) {
|
||||
|
@ -39341,9 +39353,11 @@ async function predict7(image6, config3, idx, count2) {
|
|||
var _a2, _b, _c2, _d2;
|
||||
if (!model9)
|
||||
return null;
|
||||
if (skipped8 < (((_a2 = config3.face.description) == null ? void 0 : _a2.skipFrames) || 0) && (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime4 && config3.skipFrame && lastCount3 === count2 && ((_c2 = last6[idx]) == null ? void 0 : _c2.age) && ((_d2 = last6[idx]) == null ? void 0 : _d2.age) > 0) {
|
||||
const skipFrame = skipped8 < (((_a2 = config3.face.description) == null ? void 0 : _a2.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime7;
|
||||
if (config3.skipAllowed && skipFrame && skipTime && lastCount3 === count2 && ((_c2 = last3[idx]) == null ? void 0 : _c2.age) && ((_d2 = last3[idx]) == null ? void 0 : _d2.age) > 0) {
|
||||
skipped8++;
|
||||
return last6[idx];
|
||||
return last3[idx];
|
||||
}
|
||||
skipped8 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -39357,7 +39371,7 @@ async function predict7(image6, config3, idx, count2) {
|
|||
if ((_a3 = config3.face.description) == null ? void 0 : _a3.enabled) {
|
||||
const enhanced = enhance(image6);
|
||||
const resT = await (model9 == null ? void 0 : model9.predict(enhanced));
|
||||
lastTime4 = now();
|
||||
lastTime7 = now();
|
||||
De(enhanced);
|
||||
const genderT = await resT.find((t) => t.shape[1] === 1);
|
||||
const gender = await genderT.data();
|
||||
|
@ -39377,7 +39391,7 @@ async function predict7(image6, config3, idx, count2) {
|
|||
obj.descriptor = Array.from(descriptor);
|
||||
resT.forEach((t) => De(t));
|
||||
}
|
||||
last6[idx] = obj;
|
||||
last3[idx] = obj;
|
||||
lastCount3 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -42524,7 +42538,7 @@ var handBoxEnlargeFactor = 1.65;
|
|||
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||
var palmLandmarksPalmBase = 0;
|
||||
var palmLandmarksMiddleFingerBase = 2;
|
||||
var lastTime5 = 0;
|
||||
var lastTime8 = 0;
|
||||
var HandPipeline = class {
|
||||
constructor(handDetector, handPoseModel2) {
|
||||
__publicField(this, "handDetector");
|
||||
|
@ -42537,7 +42551,7 @@ var HandPipeline = class {
|
|||
this.handPoseModel = handPoseModel2;
|
||||
this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
|
||||
this.storedBoxes = [];
|
||||
this.skipped = 0;
|
||||
this.skipped = Number.MAX_SAFE_INTEGER;
|
||||
this.detectedHands = 0;
|
||||
}
|
||||
calculateLandmarksBoundingBox(landmarks) {
|
||||
|
@ -42589,11 +42603,13 @@ var HandPipeline = class {
|
|||
async estimateHands(image6, config3) {
|
||||
let useFreshBox = false;
|
||||
let boxes;
|
||||
if (this.skipped === 0 || this.skipped > config3.hand.skipFrames && (config3.hand.skipTime || 0) <= now() - lastTime5 || !config3.hand.landmarks || !config3.skipFrame) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime8;
|
||||
const skipFrame = this.skipped < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
boxes = await this.handDetector.estimateHandBounds(image6, config3);
|
||||
this.skipped = 0;
|
||||
}
|
||||
if (config3.skipFrame)
|
||||
if (config3.skipAllowed)
|
||||
this.skipped++;
|
||||
if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) {
|
||||
this.detectedHands = 0;
|
||||
|
@ -42618,7 +42634,7 @@ var HandPipeline = class {
|
|||
De(croppedInput);
|
||||
De(rotatedImage);
|
||||
const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage);
|
||||
lastTime5 = now();
|
||||
lastTime8 = now();
|
||||
De(handImage);
|
||||
const confidence = (await confidenceT.data())[0];
|
||||
De(confidenceT);
|
||||
|
@ -43186,8 +43202,8 @@ var faceIndex = 4;
|
|||
var boxExpandFact = 1.6;
|
||||
var maxDetectorResolution = 512;
|
||||
var detectorExpandFact = 1.4;
|
||||
var skipped9 = 0;
|
||||
var lastTime6 = 0;
|
||||
var skipped9 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime9 = 0;
|
||||
var outputSize = [0, 0];
|
||||
var cache3 = {
|
||||
boxes: [],
|
||||
|
@ -43327,17 +43343,21 @@ async function predict9(input, config3) {
|
|||
return [];
|
||||
outputSize = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
skipped9++;
|
||||
if (config3.skipFrame && skipped9 <= (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= now() - lastTime6) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrame = skipped9 < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache3.hands;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
if (config3.skipFrame && cache3.hands.length === config3.hand.maxDetected) {
|
||||
const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrameExtended = skipped9 < 3 * (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && cache3.hands.length === config3.hand.maxDetected) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else if (config3.skipFrame && skipped9 < 3 * (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= 3 * (now() - lastTime6) && cache3.hands.length > 0) {
|
||||
} else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache3.hands.length > 0) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else {
|
||||
cache3.boxes = await detectHands(input, config3);
|
||||
lastTime6 = now();
|
||||
lastTime9 = now();
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
skipped9 = 0;
|
||||
}
|
||||
|
@ -43632,10 +43652,12 @@ async function parseMultiPose(res, config3, image6, inputBox) {
|
|||
async function predict10(input, config3) {
|
||||
if (!model10 || !(model10 == null ? void 0 : model10.inputs[0].shape))
|
||||
return [];
|
||||
if (!config3.skipFrame)
|
||||
if (!config3.skipAllowed)
|
||||
cache5.boxes.length = 0;
|
||||
skipped10++;
|
||||
if (config3.skipFrame && (skipped10 <= (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - cache5.last)) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - cache5.last;
|
||||
const skipFrame = skipped10 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache5.bodies;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -43657,8 +43679,8 @@ async function predict10(input, config3) {
|
|||
|
||||
// src/object/nanodet.ts
|
||||
var model11;
|
||||
var last7 = [];
|
||||
var lastTime7 = 0;
|
||||
var last4 = [];
|
||||
var lastTime10 = 0;
|
||||
var skipped11 = Number.MAX_SAFE_INTEGER;
|
||||
var scaleBox = 2.5;
|
||||
async function load12(config3) {
|
||||
|
@ -43738,13 +43760,15 @@ async function process4(res, inputSize8, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict11(image6, config3) {
|
||||
if (skipped11 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime7 && config3.skipFrame && last7.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime10;
|
||||
const skipFrame = skipped11 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last4.length > 0) {
|
||||
skipped11++;
|
||||
return last7;
|
||||
return last4;
|
||||
}
|
||||
skipped11 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last7;
|
||||
return last4;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [image6.shape[2], image6.shape[1]];
|
||||
const resize = Cn.resizeBilinear(image6, [model11.inputSize, model11.inputSize], false);
|
||||
|
@ -43755,10 +43779,10 @@ async function predict11(image6, config3) {
|
|||
let objectT;
|
||||
if (config3.object.enabled)
|
||||
objectT = await model11.predict(transpose);
|
||||
lastTime7 = now();
|
||||
lastTime10 = now();
|
||||
De(transpose);
|
||||
const obj = await process4(objectT, model11.inputSize, outputSize2, config3);
|
||||
last7 = obj;
|
||||
last4 = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -44953,7 +44977,7 @@ async function canvas2(input, output) {
|
|||
async function all(inCanvas2, result, drawOptions) {
|
||||
if (!result || !result.performance || !result || !inCanvas2)
|
||||
return null;
|
||||
const timestamp = now();
|
||||
const timeStamp = now();
|
||||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
const promise = Promise.all([
|
||||
face(inCanvas2, result.face, localOptions),
|
||||
|
@ -44962,7 +44986,7 @@ async function all(inCanvas2, result, drawOptions) {
|
|||
object(inCanvas2, result.object, localOptions),
|
||||
gesture(inCanvas2, result.gesture, localOptions)
|
||||
]);
|
||||
result.performance.draw = Math.trunc(now() - timestamp);
|
||||
result.performance.draw = env.perfadd ? (result.performance.draw || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
@ -45087,7 +45111,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:face";
|
||||
timeStamp = now();
|
||||
const faces = await predict6(input, parent.config);
|
||||
parent.performance.face = Math.trunc(now() - timeStamp);
|
||||
parent.performance.face = env.perfadd ? (parent.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
if (!input.shape || input.shape.length !== 4)
|
||||
return [];
|
||||
if (!faces)
|
||||
|
@ -45106,7 +45130,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || Dr([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
parent.performance.emotion = env.perfadd ? (parent.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
|
@ -45116,7 +45140,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || Dr([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
parent.performance.antispoof = env.perfadd ? (parent.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
|
@ -45126,7 +45150,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || Dr([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
parent.performance.embedding = env.perfadd ? (parent.performance.embedding || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
if (parent.config.async) {
|
||||
|
@ -46444,7 +46468,7 @@ var Human = class {
|
|||
const count2 = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (userConfig)
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
if (env.initial) {
|
||||
if (this.env.initial) {
|
||||
if (this.config.debug)
|
||||
log(`version: ${this.version}`);
|
||||
if (this.config.debug)
|
||||
|
@ -46460,9 +46484,9 @@ var Human = class {
|
|||
}
|
||||
}
|
||||
await load15(this);
|
||||
if (env.initial && this.config.debug)
|
||||
if (this.env.initial && this.config.debug)
|
||||
log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors");
|
||||
env.initial = false;
|
||||
this.env.initial = false;
|
||||
const loaded = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (loaded !== count2) {
|
||||
await validate2(this);
|
||||
|
@ -46470,7 +46494,7 @@ var Human = class {
|
|||
}
|
||||
const current = Math.trunc(now() - timeStamp);
|
||||
if (current > (this.performance.load || 0))
|
||||
this.performance.load = current;
|
||||
this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
|
||||
}
|
||||
next(result = this.result) {
|
||||
return calc2(result, this.config);
|
||||
|
@ -46484,7 +46508,6 @@ var Human = class {
|
|||
var _a2, _b, _c2, _d2, _e, _f2, _g, _h2, _i2, _j2, _k2, _l2, _m2, _n2, _o2, _p2, _q2, _r, _s2, _t2, _u2, _v2;
|
||||
this.state = "config";
|
||||
let timeStamp;
|
||||
let elapsedTime;
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
this.state = "check";
|
||||
const error = __privateGet(this, _sanity).call(this, input);
|
||||
|
@ -46499,7 +46522,7 @@ var Human = class {
|
|||
this.state = "image";
|
||||
const img = process2(input, this.config);
|
||||
this.process = img;
|
||||
this.performance.image = Math.trunc(now() - timeStamp);
|
||||
this.performance.image = this.env.perfadd ? (this.performance.image || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Get Image:");
|
||||
if (!img.tensor) {
|
||||
if (this.config.debug)
|
||||
|
@ -46509,15 +46532,15 @@ var Human = class {
|
|||
}
|
||||
this.emit("image");
|
||||
timeStamp = now();
|
||||
this.config.skipFrame = await skip(this.config, img.tensor);
|
||||
this.config.skipAllowed = await skip(this.config, img.tensor);
|
||||
if (!this.performance.frames)
|
||||
this.performance.frames = 0;
|
||||
if (!this.performance.cached)
|
||||
this.performance.cached = 0;
|
||||
this.performance.frames++;
|
||||
if (this.config.skipFrame)
|
||||
if (this.config.skipAllowed)
|
||||
this.performance.cached++;
|
||||
this.performance.changed = Math.trunc(now() - timeStamp);
|
||||
this.performance.changed = this.env.perfadd ? (this.performance.changed || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Check Changed:");
|
||||
let faceRes = [];
|
||||
let bodyRes = [];
|
||||
|
@ -46531,9 +46554,7 @@ var Human = class {
|
|||
} else {
|
||||
timeStamp = now();
|
||||
faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.face = elapsedTime;
|
||||
this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1))
|
||||
faceRes = await faceRes;
|
||||
|
@ -46561,9 +46582,7 @@ var Human = class {
|
|||
bodyRes = this.config.body.enabled ? await predict4(img.tensor, bodyConfig) : [];
|
||||
else if ((_h2 = this.config.body.modelPath) == null ? void 0 : _h2.includes("movenet"))
|
||||
bodyRes = this.config.body.enabled ? await predict10(img.tensor, bodyConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.body = elapsedTime;
|
||||
this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Body:");
|
||||
this.analyze("Start Hand:");
|
||||
|
@ -46582,9 +46601,7 @@ var Human = class {
|
|||
handRes = this.config.hand.enabled ? await predict8(img.tensor, handConfig) : [];
|
||||
else if ((_p2 = (_o2 = this.config.hand.detector) == null ? void 0 : _o2.modelPath) == null ? void 0 : _p2.includes("handtrack"))
|
||||
handRes = this.config.hand.enabled ? await predict9(img.tensor, handConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.hand = elapsedTime;
|
||||
this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Hand:");
|
||||
this.analyze("Start Object:");
|
||||
|
@ -46602,9 +46619,7 @@ var Human = class {
|
|||
objectRes = this.config.object.enabled ? await predict11(img.tensor, this.config) : [];
|
||||
else if ((_t2 = this.config.object.modelPath) == null ? void 0 : _t2.includes("centernet"))
|
||||
objectRes = this.config.object.enabled ? await predict3(img.tensor, this.config) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.object = elapsedTime;
|
||||
this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Object:");
|
||||
this.state = "detect:await";
|
||||
|
@ -46616,7 +46631,7 @@ var Human = class {
|
|||
timeStamp = now();
|
||||
gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris3(faceRes)];
|
||||
if (!this.config.async)
|
||||
this.performance.gesture = Math.trunc(now() - timeStamp);
|
||||
this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
else if (this.performance.gesture)
|
||||
delete this.performance.gesture;
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -152,8 +152,8 @@ var config = {
|
|||
debug: true,
|
||||
async: true,
|
||||
warmup: "full",
|
||||
cacheSensitivity: 0.75,
|
||||
skipFrame: false,
|
||||
cacheSensitivity: 0.7,
|
||||
skipAllowed: false,
|
||||
filter: {
|
||||
enabled: true,
|
||||
width: 0,
|
||||
|
@ -183,8 +183,8 @@ var config = {
|
|||
modelPath: "blazeface.json",
|
||||
rotation: true,
|
||||
maxDetected: 1,
|
||||
skipFrames: 11,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 2500,
|
||||
minConfidence: 0.2,
|
||||
iouThreshold: 0.1,
|
||||
return: false
|
||||
|
@ -200,21 +200,21 @@ var config = {
|
|||
emotion: {
|
||||
enabled: true,
|
||||
minConfidence: 0.1,
|
||||
skipFrames: 12,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 1500,
|
||||
modelPath: "emotion.json"
|
||||
},
|
||||
description: {
|
||||
enabled: true,
|
||||
modelPath: "faceres.json",
|
||||
skipFrames: 13,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 3e3,
|
||||
minConfidence: 0.1
|
||||
},
|
||||
antispoof: {
|
||||
enabled: false,
|
||||
skipFrames: 14,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 4e3,
|
||||
modelPath: "antispoof.json"
|
||||
}
|
||||
},
|
||||
|
@ -227,12 +227,12 @@ var config = {
|
|||
maxDetected: -1,
|
||||
minConfidence: 0.3,
|
||||
skipFrames: 1,
|
||||
skipTime: 2e3
|
||||
skipTime: 200
|
||||
},
|
||||
hand: {
|
||||
enabled: true,
|
||||
rotation: true,
|
||||
skipFrames: 2,
|
||||
skipFrames: 99,
|
||||
skipTime: 2e3,
|
||||
minConfidence: 0.5,
|
||||
iouThreshold: 0.2,
|
||||
|
@ -251,8 +251,8 @@ var config = {
|
|||
minConfidence: 0.2,
|
||||
iouThreshold: 0.4,
|
||||
maxDetected: 10,
|
||||
skipFrames: 15,
|
||||
skipTime: 2e3
|
||||
skipFrames: 99,
|
||||
skipTime: 1e3
|
||||
},
|
||||
segmentation: {
|
||||
enabled: false,
|
||||
|
@ -1190,6 +1190,7 @@ var Env = class {
|
|||
__publicField(this, "filter");
|
||||
__publicField(this, "tfjs");
|
||||
__publicField(this, "offscreen");
|
||||
__publicField(this, "perfadd", false);
|
||||
__publicField(this, "wasm", {
|
||||
supported: void 0,
|
||||
backend: void 0,
|
||||
|
@ -1321,7 +1322,7 @@ var model2;
|
|||
var cached = [];
|
||||
var skipped2 = Number.MAX_SAFE_INTEGER;
|
||||
var lastCount = 0;
|
||||
var last = 0;
|
||||
var lastTime = 0;
|
||||
async function load2(config3) {
|
||||
var _a, _b;
|
||||
if (env.initial)
|
||||
|
@ -1340,7 +1341,9 @@ async function predict(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model2)
|
||||
return null;
|
||||
if (skipped2 < (((_a = config3.face.antispoof) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.antispoof) == null ? void 0 : _b.skipTime) || 0) <= now() - last && config3.skipFrame && lastCount === count2 && cached[idx]) {
|
||||
const skipTime = (((_a = config3.face.antispoof) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime;
|
||||
const skipFrame = skipped2 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && cached[idx]) {
|
||||
skipped2++;
|
||||
return cached[idx];
|
||||
}
|
||||
|
@ -1351,7 +1354,7 @@ async function predict(image25, config3, idx, count2) {
|
|||
const num = (await res.data())[0];
|
||||
cached[idx] = Math.round(100 * num) / 100;
|
||||
lastCount = count2;
|
||||
last = now();
|
||||
lastTime = now();
|
||||
tf4.dispose([resize, res]);
|
||||
resolve(cached[idx]);
|
||||
});
|
||||
|
@ -4936,7 +4939,7 @@ var skipped3 = Number.MAX_SAFE_INTEGER;
|
|||
var outputNodes;
|
||||
var cache = null;
|
||||
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
|
||||
var last2 = 0;
|
||||
var lastTime2 = 0;
|
||||
async function loadDetect(config3) {
|
||||
var _a, _b, _c;
|
||||
if (env3.initial)
|
||||
|
@ -5053,11 +5056,13 @@ async function detectParts(input, config3, outputSize2) {
|
|||
}
|
||||
async function predict2(input, config3) {
|
||||
const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
if (skipped3 < (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - last2 && config3.skipFrame && cache !== null) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime2;
|
||||
const skipFrame = skipped3 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && cache !== null) {
|
||||
skipped3++;
|
||||
} else {
|
||||
cache = await detectParts(input, config3, outputSize2);
|
||||
last2 = now();
|
||||
lastTime2 = now();
|
||||
skipped3 = 0;
|
||||
}
|
||||
if (cache)
|
||||
|
@ -5155,8 +5160,8 @@ var labels = [
|
|||
// src/object/centernet.ts
|
||||
var model4;
|
||||
var inputSize3 = 0;
|
||||
var last3 = [];
|
||||
var lastTime = 0;
|
||||
var last = [];
|
||||
var lastTime3 = 0;
|
||||
var skipped4 = Number.MAX_SAFE_INTEGER;
|
||||
async function load4(config3) {
|
||||
if (env.initial)
|
||||
|
@ -5221,21 +5226,23 @@ async function process3(res, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict3(input, config3) {
|
||||
if (skipped4 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime && config3.skipFrame && last3.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime3;
|
||||
const skipFrame = skipped4 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last.length > 0) {
|
||||
skipped4++;
|
||||
return last3;
|
||||
return last;
|
||||
}
|
||||
skipped4 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last3;
|
||||
return last;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [input.shape[2], input.shape[1]];
|
||||
const resize = tf8.image.resizeBilinear(input, [inputSize3, inputSize3]);
|
||||
const objectT = config3.object.enabled ? model4 == null ? void 0 : model4.execute(resize, ["tower_0/detections"]) : null;
|
||||
lastTime = now();
|
||||
lastTime3 = now();
|
||||
tf8.dispose(resize);
|
||||
const obj = await process3(objectT, outputSize2, config3);
|
||||
last3 = obj;
|
||||
last = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -5278,7 +5285,7 @@ var connected2 = {
|
|||
|
||||
// src/body/efficientpose.ts
|
||||
var model5;
|
||||
var last4 = 0;
|
||||
var lastTime4 = 0;
|
||||
var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} };
|
||||
var skipped5 = Number.MAX_SAFE_INTEGER;
|
||||
async function load5(config3) {
|
||||
|
@ -5310,14 +5317,15 @@ function max2d(inputs, minScore) {
|
|||
});
|
||||
}
|
||||
async function predict4(image25, config3) {
|
||||
var _a;
|
||||
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(cache2.keypoints).length > 0 && (config3.body.skipTime || 0) <= now() - last4) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime4;
|
||||
const skipFrame = skipped5 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) {
|
||||
skipped5++;
|
||||
return [cache2];
|
||||
}
|
||||
skipped5 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
var _a2;
|
||||
var _a;
|
||||
const tensor3 = tf9.tidy(() => {
|
||||
if (!(model5 == null ? void 0 : model5.inputs[0].shape))
|
||||
return null;
|
||||
|
@ -5329,7 +5337,7 @@ async function predict4(image25, config3) {
|
|||
let resT;
|
||||
if (config3.body.enabled)
|
||||
resT = await (model5 == null ? void 0 : model5.predict(tensor3));
|
||||
last4 = now();
|
||||
lastTime4 = now();
|
||||
tf9.dispose(tensor3);
|
||||
if (resT) {
|
||||
cache2.keypoints.length = 0;
|
||||
|
@ -5339,7 +5347,7 @@ async function predict4(image25, config3) {
|
|||
tf9.dispose(squeeze8);
|
||||
for (let id = 0; id < stack3.length; id++) {
|
||||
const [x2, y2, partScore] = max2d(stack3[id], config3.body.minConfidence);
|
||||
if (partScore > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
|
||||
if (partScore > (((_a = config3.body) == null ? void 0 : _a.minConfidence) || 0)) {
|
||||
cache2.keypoints.push({
|
||||
score: Math.round(100 * partScore) / 100,
|
||||
part: kpt2[id],
|
||||
|
@ -5391,9 +5399,9 @@ async function predict4(image25, config3) {
|
|||
var tf10 = __toModule(require_tfjs_esm());
|
||||
var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"];
|
||||
var model6;
|
||||
var last5 = [];
|
||||
var last2 = [];
|
||||
var lastCount2 = 0;
|
||||
var lastTime2 = 0;
|
||||
var lastTime5 = 0;
|
||||
var skipped6 = Number.MAX_SAFE_INTEGER;
|
||||
var rgb = [0.2989, 0.587, 0.114];
|
||||
async function load6(config3) {
|
||||
|
@ -5414,9 +5422,11 @@ async function predict5(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model6)
|
||||
return null;
|
||||
if (skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime2 && config3.skipFrame && lastCount2 === count2 && last5[idx] && last5[idx].length > 0) {
|
||||
const skipFrame = skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime5;
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount2 === count2 && last2[idx] && last2[idx].length > 0) {
|
||||
skipped6++;
|
||||
return last5[idx];
|
||||
return last2[idx];
|
||||
}
|
||||
skipped6 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5439,7 +5449,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
const normalize = tf10.tidy(() => tf10.mul(tf10.sub(grayscale, 0.5), 2));
|
||||
tf10.dispose(grayscale);
|
||||
const emotionT = await (model6 == null ? void 0 : model6.predict(normalize));
|
||||
lastTime2 = now();
|
||||
lastTime5 = now();
|
||||
const data = await emotionT.data();
|
||||
tf10.dispose(emotionT);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
|
@ -5449,7 +5459,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
obj.sort((a, b) => b.score - a.score);
|
||||
tf10.dispose(normalize);
|
||||
}
|
||||
last5[idx] = obj;
|
||||
last2[idx] = obj;
|
||||
lastCount2 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -5596,13 +5606,15 @@ var boxCache = [];
|
|||
var model8 = null;
|
||||
var inputSize5 = 0;
|
||||
var skipped7 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime3 = 0;
|
||||
var lastTime6 = 0;
|
||||
var detectedFaces = 0;
|
||||
async function predict6(input, config3) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
|
||||
if (!config3.skipFrame || (detectedFaces !== ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || !((_b = config3.face.mesh) == null ? void 0 : _b.enabled)) && (skipped7 > (((_c = config3.face.detector) == null ? void 0 : _c.skipFrames) || 0) && (((_d = config3.face.description) == null ? void 0 : _d.skipTime) || 0) <= now() - lastTime3)) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
||||
const skipTime = (((_a = config3.face.detector) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime6;
|
||||
const skipFrame = skipped7 < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (!config3.skipAllowed || !skipTime || !skipFrame || detectedFaces === 0) {
|
||||
const newBoxes2 = await getBoxes(input, config3);
|
||||
lastTime3 = now();
|
||||
lastTime6 = now();
|
||||
boxCache = [];
|
||||
for (const possible of newBoxes2.boxes) {
|
||||
const startPoint = await possible.box.startPoint.data();
|
||||
|
@ -5638,16 +5650,16 @@ async function predict6(input, config3) {
|
|||
faceScore: 0,
|
||||
annotations: {}
|
||||
};
|
||||
if (((_e = config3.face.detector) == null ? void 0 : _e.rotation) && ((_f = config3.face.mesh) == null ? void 0 : _f.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_c = config3.face.detector) == null ? void 0 : _c.rotation) && ((_d = config3.face.mesh) == null ? void 0 : _d.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
} else {
|
||||
rotationMatrix = IDENTITY_MATRIX;
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_g = config3.face.mesh) == null ? void 0 : _g.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_e = config3.face.mesh) == null ? void 0 : _e.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
face5.tensor = tf12.div(cut, 255);
|
||||
tf12.dispose(cut);
|
||||
}
|
||||
face5.boxScore = Math.round(100 * box4.confidence) / 100;
|
||||
if (!((_h = config3.face.mesh) == null ? void 0 : _h.enabled)) {
|
||||
if (!((_f = config3.face.mesh) == null ? void 0 : _f.enabled)) {
|
||||
face5.box = getClampedBox(box4, input);
|
||||
face5.boxRaw = getRawBox(box4, input);
|
||||
face5.score = Math.round(100 * box4.confidence || 0) / 100;
|
||||
|
@ -5670,17 +5682,17 @@ async function predict6(input, config3) {
|
|||
let rawCoords = await coordsReshaped.array();
|
||||
tf12.dispose(contourCoords);
|
||||
tf12.dispose(coordsReshaped);
|
||||
if (faceConfidence < (((_i = config3.face.detector) == null ? void 0 : _i.minConfidence) || 1)) {
|
||||
if (faceConfidence < (((_g = config3.face.detector) == null ? void 0 : _g.minConfidence) || 1)) {
|
||||
box4.confidence = faceConfidence;
|
||||
} else {
|
||||
if ((_j = config3.face.iris) == null ? void 0 : _j.enabled)
|
||||
if ((_h = config3.face.iris) == null ? void 0 : _h.enabled)
|
||||
rawCoords = await augmentIris(rawCoords, face5.tensor, config3, inputSize5);
|
||||
face5.mesh = transformRawCoords(rawCoords, box4, angle, rotationMatrix, inputSize5);
|
||||
face5.meshRaw = face5.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize5]);
|
||||
box4 = { ...enlargeBox(calculateLandmarksBoundingBox(face5.mesh), 1.5), confidence: box4.confidence };
|
||||
for (const key of Object.keys(meshAnnotations))
|
||||
face5.annotations[key] = meshAnnotations[key].map((index) => face5.mesh[index]);
|
||||
if (((_k = config3.face.detector) == null ? void 0 : _k.rotation) && config3.face.mesh.enabled && ((_l = config3.face.description) == null ? void 0 : _l.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_i = config3.face.detector) == null ? void 0 : _i.rotation) && config3.face.mesh.enabled && ((_j = config3.face.description) == null ? void 0 : _j.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
tf12.dispose(face5.tensor);
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
}
|
||||
|
@ -5694,7 +5706,7 @@ async function predict6(input, config3) {
|
|||
faces.push(face5);
|
||||
newBoxes.push(box4);
|
||||
}
|
||||
if ((_m = config3.face.mesh) == null ? void 0 : _m.enabled)
|
||||
if ((_k = config3.face.mesh) == null ? void 0 : _k.enabled)
|
||||
boxCache = newBoxes.filter((a) => {
|
||||
var _a2;
|
||||
return a.confidence > (((_a2 = config3.face.detector) == null ? void 0 : _a2.minConfidence) || 0);
|
||||
|
@ -5725,8 +5737,8 @@ var uvmap = UV468;
|
|||
// src/face/faceres.ts
|
||||
var tf13 = __toModule(require_tfjs_esm());
|
||||
var model9;
|
||||
var last6 = [];
|
||||
var lastTime4 = 0;
|
||||
var last3 = [];
|
||||
var lastTime7 = 0;
|
||||
var lastCount3 = 0;
|
||||
var skipped8 = Number.MAX_SAFE_INTEGER;
|
||||
async function load9(config3) {
|
||||
|
@ -5762,9 +5774,11 @@ async function predict7(image25, config3, idx, count2) {
|
|||
var _a, _b, _c, _d;
|
||||
if (!model9)
|
||||
return null;
|
||||
if (skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime4 && config3.skipFrame && lastCount3 === count2 && ((_c = last6[idx]) == null ? void 0 : _c.age) && ((_d = last6[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
const skipFrame = skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime7;
|
||||
if (config3.skipAllowed && skipFrame && skipTime && lastCount3 === count2 && ((_c = last3[idx]) == null ? void 0 : _c.age) && ((_d = last3[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
skipped8++;
|
||||
return last6[idx];
|
||||
return last3[idx];
|
||||
}
|
||||
skipped8 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5778,7 +5792,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
if ((_a2 = config3.face.description) == null ? void 0 : _a2.enabled) {
|
||||
const enhanced = enhance(image25);
|
||||
const resT = await (model9 == null ? void 0 : model9.predict(enhanced));
|
||||
lastTime4 = now();
|
||||
lastTime7 = now();
|
||||
tf13.dispose(enhanced);
|
||||
const genderT = await resT.find((t) => t.shape[1] === 1);
|
||||
const gender = await genderT.data();
|
||||
|
@ -5798,7 +5812,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
obj.descriptor = Array.from(descriptor);
|
||||
resT.forEach((t) => tf13.dispose(t));
|
||||
}
|
||||
last6[idx] = obj;
|
||||
last3[idx] = obj;
|
||||
lastCount3 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -8953,7 +8967,7 @@ var handBoxEnlargeFactor = 1.65;
|
|||
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||
var palmLandmarksPalmBase = 0;
|
||||
var palmLandmarksMiddleFingerBase = 2;
|
||||
var lastTime5 = 0;
|
||||
var lastTime8 = 0;
|
||||
var HandPipeline = class {
|
||||
constructor(handDetector, handPoseModel2) {
|
||||
__publicField(this, "handDetector");
|
||||
|
@ -8966,7 +8980,7 @@ var HandPipeline = class {
|
|||
this.handPoseModel = handPoseModel2;
|
||||
this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
|
||||
this.storedBoxes = [];
|
||||
this.skipped = 0;
|
||||
this.skipped = Number.MAX_SAFE_INTEGER;
|
||||
this.detectedHands = 0;
|
||||
}
|
||||
calculateLandmarksBoundingBox(landmarks) {
|
||||
|
@ -9018,11 +9032,13 @@ var HandPipeline = class {
|
|||
async estimateHands(image25, config3) {
|
||||
let useFreshBox = false;
|
||||
let boxes;
|
||||
if (this.skipped === 0 || this.skipped > config3.hand.skipFrames && (config3.hand.skipTime || 0) <= now() - lastTime5 || !config3.hand.landmarks || !config3.skipFrame) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime8;
|
||||
const skipFrame = this.skipped < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
boxes = await this.handDetector.estimateHandBounds(image25, config3);
|
||||
this.skipped = 0;
|
||||
}
|
||||
if (config3.skipFrame)
|
||||
if (config3.skipAllowed)
|
||||
this.skipped++;
|
||||
if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) {
|
||||
this.detectedHands = 0;
|
||||
|
@ -9047,7 +9063,7 @@ var HandPipeline = class {
|
|||
tf16.dispose(croppedInput);
|
||||
tf16.dispose(rotatedImage);
|
||||
const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage);
|
||||
lastTime5 = now();
|
||||
lastTime8 = now();
|
||||
tf16.dispose(handImage);
|
||||
const confidence = (await confidenceT.data())[0];
|
||||
tf16.dispose(confidenceT);
|
||||
|
@ -9616,8 +9632,8 @@ var faceIndex = 4;
|
|||
var boxExpandFact = 1.6;
|
||||
var maxDetectorResolution = 512;
|
||||
var detectorExpandFact = 1.4;
|
||||
var skipped9 = 0;
|
||||
var lastTime6 = 0;
|
||||
var skipped9 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime9 = 0;
|
||||
var outputSize = [0, 0];
|
||||
var cache3 = {
|
||||
boxes: [],
|
||||
|
@ -9757,17 +9773,21 @@ async function predict9(input, config3) {
|
|||
return [];
|
||||
outputSize = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
skipped9++;
|
||||
if (config3.skipFrame && skipped9 <= (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= now() - lastTime6) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrame = skipped9 < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache3.hands;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
if (config3.skipFrame && cache3.hands.length === config3.hand.maxDetected) {
|
||||
const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrameExtended = skipped9 < 3 * (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && cache3.hands.length === config3.hand.maxDetected) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else if (config3.skipFrame && skipped9 < 3 * (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= 3 * (now() - lastTime6) && cache3.hands.length > 0) {
|
||||
} else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache3.hands.length > 0) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else {
|
||||
cache3.boxes = await detectHands(input, config3);
|
||||
lastTime6 = now();
|
||||
lastTime9 = now();
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
skipped9 = 0;
|
||||
}
|
||||
|
@ -10066,10 +10086,12 @@ async function parseMultiPose(res, config3, image25, inputBox) {
|
|||
async function predict10(input, config3) {
|
||||
if (!model10 || !(model10 == null ? void 0 : model10.inputs[0].shape))
|
||||
return [];
|
||||
if (!config3.skipFrame)
|
||||
if (!config3.skipAllowed)
|
||||
cache5.boxes.length = 0;
|
||||
skipped10++;
|
||||
if (config3.skipFrame && (skipped10 <= (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - cache5.last)) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - cache5.last;
|
||||
const skipFrame = skipped10 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache5.bodies;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -10092,8 +10114,8 @@ async function predict10(input, config3) {
|
|||
// src/object/nanodet.ts
|
||||
var tf21 = __toModule(require_tfjs_esm());
|
||||
var model11;
|
||||
var last7 = [];
|
||||
var lastTime7 = 0;
|
||||
var last4 = [];
|
||||
var lastTime10 = 0;
|
||||
var skipped11 = Number.MAX_SAFE_INTEGER;
|
||||
var scaleBox = 2.5;
|
||||
async function load12(config3) {
|
||||
|
@ -10173,13 +10195,15 @@ async function process4(res, inputSize8, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict11(image25, config3) {
|
||||
if (skipped11 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime7 && config3.skipFrame && last7.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime10;
|
||||
const skipFrame = skipped11 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last4.length > 0) {
|
||||
skipped11++;
|
||||
return last7;
|
||||
return last4;
|
||||
}
|
||||
skipped11 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last7;
|
||||
return last4;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [image25.shape[2], image25.shape[1]];
|
||||
const resize = tf21.image.resizeBilinear(image25, [model11.inputSize, model11.inputSize], false);
|
||||
|
@ -10190,10 +10214,10 @@ async function predict11(image25, config3) {
|
|||
let objectT;
|
||||
if (config3.object.enabled)
|
||||
objectT = await model11.predict(transpose);
|
||||
lastTime7 = now();
|
||||
lastTime10 = now();
|
||||
tf21.dispose(transpose);
|
||||
const obj = await process4(objectT, model11.inputSize, outputSize2, config3);
|
||||
last7 = obj;
|
||||
last4 = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -11393,7 +11417,7 @@ async function canvas2(input, output) {
|
|||
async function all(inCanvas2, result, drawOptions) {
|
||||
if (!result || !result.performance || !result || !inCanvas2)
|
||||
return null;
|
||||
const timestamp = now();
|
||||
const timeStamp = now();
|
||||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
const promise = Promise.all([
|
||||
face(inCanvas2, result.face, localOptions),
|
||||
|
@ -11402,7 +11426,7 @@ async function all(inCanvas2, result, drawOptions) {
|
|||
object(inCanvas2, result.object, localOptions),
|
||||
gesture(inCanvas2, result.gesture, localOptions)
|
||||
]);
|
||||
result.performance.draw = Math.trunc(now() - timestamp);
|
||||
result.performance.draw = env.perfadd ? (result.performance.draw || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
@ -11530,7 +11554,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:face";
|
||||
timeStamp = now();
|
||||
const faces = await predict6(input, parent.config);
|
||||
parent.performance.face = Math.trunc(now() - timeStamp);
|
||||
parent.performance.face = env.perfadd ? (parent.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
if (!input.shape || input.shape.length !== 4)
|
||||
return [];
|
||||
if (!faces)
|
||||
|
@ -11549,7 +11573,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
parent.performance.emotion = env.perfadd ? (parent.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
|
@ -11559,7 +11583,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
parent.performance.antispoof = env.perfadd ? (parent.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
|
@ -11569,7 +11593,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
parent.performance.embedding = env.perfadd ? (parent.performance.embedding || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
if (parent.config.async) {
|
||||
|
@ -12888,7 +12912,7 @@ var Human = class {
|
|||
const count2 = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (userConfig)
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
if (env.initial) {
|
||||
if (this.env.initial) {
|
||||
if (this.config.debug)
|
||||
log(`version: ${this.version}`);
|
||||
if (this.config.debug)
|
||||
|
@ -12904,9 +12928,9 @@ var Human = class {
|
|||
}
|
||||
}
|
||||
await load15(this);
|
||||
if (env.initial && this.config.debug)
|
||||
if (this.env.initial && this.config.debug)
|
||||
log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors");
|
||||
env.initial = false;
|
||||
this.env.initial = false;
|
||||
const loaded = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (loaded !== count2) {
|
||||
await validate2(this);
|
||||
|
@ -12914,7 +12938,7 @@ var Human = class {
|
|||
}
|
||||
const current = Math.trunc(now() - timeStamp);
|
||||
if (current > (this.performance.load || 0))
|
||||
this.performance.load = current;
|
||||
this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
|
||||
}
|
||||
next(result = this.result) {
|
||||
return calc2(result, this.config);
|
||||
|
@ -12928,7 +12952,6 @@ var Human = class {
|
|||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
||||
this.state = "config";
|
||||
let timeStamp;
|
||||
let elapsedTime;
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
this.state = "check";
|
||||
const error = __privateGet(this, _sanity).call(this, input);
|
||||
|
@ -12943,7 +12966,7 @@ var Human = class {
|
|||
this.state = "image";
|
||||
const img = process2(input, this.config);
|
||||
this.process = img;
|
||||
this.performance.image = Math.trunc(now() - timeStamp);
|
||||
this.performance.image = this.env.perfadd ? (this.performance.image || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Get Image:");
|
||||
if (!img.tensor) {
|
||||
if (this.config.debug)
|
||||
|
@ -12953,15 +12976,15 @@ var Human = class {
|
|||
}
|
||||
this.emit("image");
|
||||
timeStamp = now();
|
||||
this.config.skipFrame = await skip(this.config, img.tensor);
|
||||
this.config.skipAllowed = await skip(this.config, img.tensor);
|
||||
if (!this.performance.frames)
|
||||
this.performance.frames = 0;
|
||||
if (!this.performance.cached)
|
||||
this.performance.cached = 0;
|
||||
this.performance.frames++;
|
||||
if (this.config.skipFrame)
|
||||
if (this.config.skipAllowed)
|
||||
this.performance.cached++;
|
||||
this.performance.changed = Math.trunc(now() - timeStamp);
|
||||
this.performance.changed = this.env.perfadd ? (this.performance.changed || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Check Changed:");
|
||||
let faceRes = [];
|
||||
let bodyRes = [];
|
||||
|
@ -12975,9 +12998,7 @@ var Human = class {
|
|||
} else {
|
||||
timeStamp = now();
|
||||
faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.face = elapsedTime;
|
||||
this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1))
|
||||
faceRes = await faceRes;
|
||||
|
@ -13005,9 +13026,7 @@ var Human = class {
|
|||
bodyRes = this.config.body.enabled ? await predict4(img.tensor, bodyConfig) : [];
|
||||
else if ((_h = this.config.body.modelPath) == null ? void 0 : _h.includes("movenet"))
|
||||
bodyRes = this.config.body.enabled ? await predict10(img.tensor, bodyConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.body = elapsedTime;
|
||||
this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Body:");
|
||||
this.analyze("Start Hand:");
|
||||
|
@ -13026,9 +13045,7 @@ var Human = class {
|
|||
handRes = this.config.hand.enabled ? await predict8(img.tensor, handConfig) : [];
|
||||
else if ((_p = (_o = this.config.hand.detector) == null ? void 0 : _o.modelPath) == null ? void 0 : _p.includes("handtrack"))
|
||||
handRes = this.config.hand.enabled ? await predict9(img.tensor, handConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.hand = elapsedTime;
|
||||
this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Hand:");
|
||||
this.analyze("Start Object:");
|
||||
|
@ -13046,9 +13063,7 @@ var Human = class {
|
|||
objectRes = this.config.object.enabled ? await predict11(img.tensor, this.config) : [];
|
||||
else if ((_t = this.config.object.modelPath) == null ? void 0 : _t.includes("centernet"))
|
||||
objectRes = this.config.object.enabled ? await predict3(img.tensor, this.config) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.object = elapsedTime;
|
||||
this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Object:");
|
||||
this.state = "detect:await";
|
||||
|
@ -13060,7 +13075,7 @@ var Human = class {
|
|||
timeStamp = now();
|
||||
gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris3(faceRes)];
|
||||
if (!this.config.async)
|
||||
this.performance.gesture = Math.trunc(now() - timeStamp);
|
||||
this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
else if (this.performance.gesture)
|
||||
delete this.performance.gesture;
|
||||
}
|
||||
|
|
|
@ -153,8 +153,8 @@ var config = {
|
|||
debug: true,
|
||||
async: true,
|
||||
warmup: "full",
|
||||
cacheSensitivity: 0.75,
|
||||
skipFrame: false,
|
||||
cacheSensitivity: 0.7,
|
||||
skipAllowed: false,
|
||||
filter: {
|
||||
enabled: true,
|
||||
width: 0,
|
||||
|
@ -184,8 +184,8 @@ var config = {
|
|||
modelPath: "blazeface.json",
|
||||
rotation: true,
|
||||
maxDetected: 1,
|
||||
skipFrames: 11,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 2500,
|
||||
minConfidence: 0.2,
|
||||
iouThreshold: 0.1,
|
||||
return: false
|
||||
|
@ -201,21 +201,21 @@ var config = {
|
|||
emotion: {
|
||||
enabled: true,
|
||||
minConfidence: 0.1,
|
||||
skipFrames: 12,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 1500,
|
||||
modelPath: "emotion.json"
|
||||
},
|
||||
description: {
|
||||
enabled: true,
|
||||
modelPath: "faceres.json",
|
||||
skipFrames: 13,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 3e3,
|
||||
minConfidence: 0.1
|
||||
},
|
||||
antispoof: {
|
||||
enabled: false,
|
||||
skipFrames: 14,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 4e3,
|
||||
modelPath: "antispoof.json"
|
||||
}
|
||||
},
|
||||
|
@ -228,12 +228,12 @@ var config = {
|
|||
maxDetected: -1,
|
||||
minConfidence: 0.3,
|
||||
skipFrames: 1,
|
||||
skipTime: 2e3
|
||||
skipTime: 200
|
||||
},
|
||||
hand: {
|
||||
enabled: true,
|
||||
rotation: true,
|
||||
skipFrames: 2,
|
||||
skipFrames: 99,
|
||||
skipTime: 2e3,
|
||||
minConfidence: 0.5,
|
||||
iouThreshold: 0.2,
|
||||
|
@ -252,8 +252,8 @@ var config = {
|
|||
minConfidence: 0.2,
|
||||
iouThreshold: 0.4,
|
||||
maxDetected: 10,
|
||||
skipFrames: 15,
|
||||
skipTime: 2e3
|
||||
skipFrames: 99,
|
||||
skipTime: 1e3
|
||||
},
|
||||
segmentation: {
|
||||
enabled: false,
|
||||
|
@ -1191,6 +1191,7 @@ var Env = class {
|
|||
__publicField(this, "filter");
|
||||
__publicField(this, "tfjs");
|
||||
__publicField(this, "offscreen");
|
||||
__publicField(this, "perfadd", false);
|
||||
__publicField(this, "wasm", {
|
||||
supported: void 0,
|
||||
backend: void 0,
|
||||
|
@ -1322,7 +1323,7 @@ var model2;
|
|||
var cached = [];
|
||||
var skipped2 = Number.MAX_SAFE_INTEGER;
|
||||
var lastCount = 0;
|
||||
var last = 0;
|
||||
var lastTime = 0;
|
||||
async function load2(config3) {
|
||||
var _a, _b;
|
||||
if (env.initial)
|
||||
|
@ -1341,7 +1342,9 @@ async function predict(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model2)
|
||||
return null;
|
||||
if (skipped2 < (((_a = config3.face.antispoof) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.antispoof) == null ? void 0 : _b.skipTime) || 0) <= now() - last && config3.skipFrame && lastCount === count2 && cached[idx]) {
|
||||
const skipTime = (((_a = config3.face.antispoof) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime;
|
||||
const skipFrame = skipped2 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && cached[idx]) {
|
||||
skipped2++;
|
||||
return cached[idx];
|
||||
}
|
||||
|
@ -1352,7 +1355,7 @@ async function predict(image25, config3, idx, count2) {
|
|||
const num = (await res.data())[0];
|
||||
cached[idx] = Math.round(100 * num) / 100;
|
||||
lastCount = count2;
|
||||
last = now();
|
||||
lastTime = now();
|
||||
tf4.dispose([resize, res]);
|
||||
resolve(cached[idx]);
|
||||
});
|
||||
|
@ -4937,7 +4940,7 @@ var skipped3 = Number.MAX_SAFE_INTEGER;
|
|||
var outputNodes;
|
||||
var cache = null;
|
||||
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
|
||||
var last2 = 0;
|
||||
var lastTime2 = 0;
|
||||
async function loadDetect(config3) {
|
||||
var _a, _b, _c;
|
||||
if (env3.initial)
|
||||
|
@ -5054,11 +5057,13 @@ async function detectParts(input, config3, outputSize2) {
|
|||
}
|
||||
async function predict2(input, config3) {
|
||||
const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
if (skipped3 < (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - last2 && config3.skipFrame && cache !== null) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime2;
|
||||
const skipFrame = skipped3 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && cache !== null) {
|
||||
skipped3++;
|
||||
} else {
|
||||
cache = await detectParts(input, config3, outputSize2);
|
||||
last2 = now();
|
||||
lastTime2 = now();
|
||||
skipped3 = 0;
|
||||
}
|
||||
if (cache)
|
||||
|
@ -5156,8 +5161,8 @@ var labels = [
|
|||
// src/object/centernet.ts
|
||||
var model4;
|
||||
var inputSize3 = 0;
|
||||
var last3 = [];
|
||||
var lastTime = 0;
|
||||
var last = [];
|
||||
var lastTime3 = 0;
|
||||
var skipped4 = Number.MAX_SAFE_INTEGER;
|
||||
async function load4(config3) {
|
||||
if (env.initial)
|
||||
|
@ -5222,21 +5227,23 @@ async function process3(res, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict3(input, config3) {
|
||||
if (skipped4 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime && config3.skipFrame && last3.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime3;
|
||||
const skipFrame = skipped4 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last.length > 0) {
|
||||
skipped4++;
|
||||
return last3;
|
||||
return last;
|
||||
}
|
||||
skipped4 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last3;
|
||||
return last;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [input.shape[2], input.shape[1]];
|
||||
const resize = tf8.image.resizeBilinear(input, [inputSize3, inputSize3]);
|
||||
const objectT = config3.object.enabled ? model4 == null ? void 0 : model4.execute(resize, ["tower_0/detections"]) : null;
|
||||
lastTime = now();
|
||||
lastTime3 = now();
|
||||
tf8.dispose(resize);
|
||||
const obj = await process3(objectT, outputSize2, config3);
|
||||
last3 = obj;
|
||||
last = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -5279,7 +5286,7 @@ var connected2 = {
|
|||
|
||||
// src/body/efficientpose.ts
|
||||
var model5;
|
||||
var last4 = 0;
|
||||
var lastTime4 = 0;
|
||||
var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} };
|
||||
var skipped5 = Number.MAX_SAFE_INTEGER;
|
||||
async function load5(config3) {
|
||||
|
@ -5311,14 +5318,15 @@ function max2d(inputs, minScore) {
|
|||
});
|
||||
}
|
||||
async function predict4(image25, config3) {
|
||||
var _a;
|
||||
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(cache2.keypoints).length > 0 && (config3.body.skipTime || 0) <= now() - last4) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime4;
|
||||
const skipFrame = skipped5 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) {
|
||||
skipped5++;
|
||||
return [cache2];
|
||||
}
|
||||
skipped5 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
var _a2;
|
||||
var _a;
|
||||
const tensor3 = tf9.tidy(() => {
|
||||
if (!(model5 == null ? void 0 : model5.inputs[0].shape))
|
||||
return null;
|
||||
|
@ -5330,7 +5338,7 @@ async function predict4(image25, config3) {
|
|||
let resT;
|
||||
if (config3.body.enabled)
|
||||
resT = await (model5 == null ? void 0 : model5.predict(tensor3));
|
||||
last4 = now();
|
||||
lastTime4 = now();
|
||||
tf9.dispose(tensor3);
|
||||
if (resT) {
|
||||
cache2.keypoints.length = 0;
|
||||
|
@ -5340,7 +5348,7 @@ async function predict4(image25, config3) {
|
|||
tf9.dispose(squeeze8);
|
||||
for (let id = 0; id < stack3.length; id++) {
|
||||
const [x2, y2, partScore] = max2d(stack3[id], config3.body.minConfidence);
|
||||
if (partScore > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
|
||||
if (partScore > (((_a = config3.body) == null ? void 0 : _a.minConfidence) || 0)) {
|
||||
cache2.keypoints.push({
|
||||
score: Math.round(100 * partScore) / 100,
|
||||
part: kpt2[id],
|
||||
|
@ -5392,9 +5400,9 @@ async function predict4(image25, config3) {
|
|||
var tf10 = __toModule(require_tfjs_esm());
|
||||
var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"];
|
||||
var model6;
|
||||
var last5 = [];
|
||||
var last2 = [];
|
||||
var lastCount2 = 0;
|
||||
var lastTime2 = 0;
|
||||
var lastTime5 = 0;
|
||||
var skipped6 = Number.MAX_SAFE_INTEGER;
|
||||
var rgb = [0.2989, 0.587, 0.114];
|
||||
async function load6(config3) {
|
||||
|
@ -5415,9 +5423,11 @@ async function predict5(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model6)
|
||||
return null;
|
||||
if (skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime2 && config3.skipFrame && lastCount2 === count2 && last5[idx] && last5[idx].length > 0) {
|
||||
const skipFrame = skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime5;
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount2 === count2 && last2[idx] && last2[idx].length > 0) {
|
||||
skipped6++;
|
||||
return last5[idx];
|
||||
return last2[idx];
|
||||
}
|
||||
skipped6 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5440,7 +5450,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
const normalize = tf10.tidy(() => tf10.mul(tf10.sub(grayscale, 0.5), 2));
|
||||
tf10.dispose(grayscale);
|
||||
const emotionT = await (model6 == null ? void 0 : model6.predict(normalize));
|
||||
lastTime2 = now();
|
||||
lastTime5 = now();
|
||||
const data = await emotionT.data();
|
||||
tf10.dispose(emotionT);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
|
@ -5450,7 +5460,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
obj.sort((a, b) => b.score - a.score);
|
||||
tf10.dispose(normalize);
|
||||
}
|
||||
last5[idx] = obj;
|
||||
last2[idx] = obj;
|
||||
lastCount2 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -5597,13 +5607,15 @@ var boxCache = [];
|
|||
var model8 = null;
|
||||
var inputSize5 = 0;
|
||||
var skipped7 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime3 = 0;
|
||||
var lastTime6 = 0;
|
||||
var detectedFaces = 0;
|
||||
async function predict6(input, config3) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
|
||||
if (!config3.skipFrame || (detectedFaces !== ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || !((_b = config3.face.mesh) == null ? void 0 : _b.enabled)) && (skipped7 > (((_c = config3.face.detector) == null ? void 0 : _c.skipFrames) || 0) && (((_d = config3.face.description) == null ? void 0 : _d.skipTime) || 0) <= now() - lastTime3)) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
||||
const skipTime = (((_a = config3.face.detector) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime6;
|
||||
const skipFrame = skipped7 < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (!config3.skipAllowed || !skipTime || !skipFrame || detectedFaces === 0) {
|
||||
const newBoxes2 = await getBoxes(input, config3);
|
||||
lastTime3 = now();
|
||||
lastTime6 = now();
|
||||
boxCache = [];
|
||||
for (const possible of newBoxes2.boxes) {
|
||||
const startPoint = await possible.box.startPoint.data();
|
||||
|
@ -5639,16 +5651,16 @@ async function predict6(input, config3) {
|
|||
faceScore: 0,
|
||||
annotations: {}
|
||||
};
|
||||
if (((_e = config3.face.detector) == null ? void 0 : _e.rotation) && ((_f = config3.face.mesh) == null ? void 0 : _f.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_c = config3.face.detector) == null ? void 0 : _c.rotation) && ((_d = config3.face.mesh) == null ? void 0 : _d.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
} else {
|
||||
rotationMatrix = IDENTITY_MATRIX;
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_g = config3.face.mesh) == null ? void 0 : _g.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_e = config3.face.mesh) == null ? void 0 : _e.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
face5.tensor = tf12.div(cut, 255);
|
||||
tf12.dispose(cut);
|
||||
}
|
||||
face5.boxScore = Math.round(100 * box4.confidence) / 100;
|
||||
if (!((_h = config3.face.mesh) == null ? void 0 : _h.enabled)) {
|
||||
if (!((_f = config3.face.mesh) == null ? void 0 : _f.enabled)) {
|
||||
face5.box = getClampedBox(box4, input);
|
||||
face5.boxRaw = getRawBox(box4, input);
|
||||
face5.score = Math.round(100 * box4.confidence || 0) / 100;
|
||||
|
@ -5671,17 +5683,17 @@ async function predict6(input, config3) {
|
|||
let rawCoords = await coordsReshaped.array();
|
||||
tf12.dispose(contourCoords);
|
||||
tf12.dispose(coordsReshaped);
|
||||
if (faceConfidence < (((_i = config3.face.detector) == null ? void 0 : _i.minConfidence) || 1)) {
|
||||
if (faceConfidence < (((_g = config3.face.detector) == null ? void 0 : _g.minConfidence) || 1)) {
|
||||
box4.confidence = faceConfidence;
|
||||
} else {
|
||||
if ((_j = config3.face.iris) == null ? void 0 : _j.enabled)
|
||||
if ((_h = config3.face.iris) == null ? void 0 : _h.enabled)
|
||||
rawCoords = await augmentIris(rawCoords, face5.tensor, config3, inputSize5);
|
||||
face5.mesh = transformRawCoords(rawCoords, box4, angle, rotationMatrix, inputSize5);
|
||||
face5.meshRaw = face5.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize5]);
|
||||
box4 = { ...enlargeBox(calculateLandmarksBoundingBox(face5.mesh), 1.5), confidence: box4.confidence };
|
||||
for (const key of Object.keys(meshAnnotations))
|
||||
face5.annotations[key] = meshAnnotations[key].map((index) => face5.mesh[index]);
|
||||
if (((_k = config3.face.detector) == null ? void 0 : _k.rotation) && config3.face.mesh.enabled && ((_l = config3.face.description) == null ? void 0 : _l.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_i = config3.face.detector) == null ? void 0 : _i.rotation) && config3.face.mesh.enabled && ((_j = config3.face.description) == null ? void 0 : _j.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
tf12.dispose(face5.tensor);
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
}
|
||||
|
@ -5695,7 +5707,7 @@ async function predict6(input, config3) {
|
|||
faces.push(face5);
|
||||
newBoxes.push(box4);
|
||||
}
|
||||
if ((_m = config3.face.mesh) == null ? void 0 : _m.enabled)
|
||||
if ((_k = config3.face.mesh) == null ? void 0 : _k.enabled)
|
||||
boxCache = newBoxes.filter((a) => {
|
||||
var _a2;
|
||||
return a.confidence > (((_a2 = config3.face.detector) == null ? void 0 : _a2.minConfidence) || 0);
|
||||
|
@ -5726,8 +5738,8 @@ var uvmap = UV468;
|
|||
// src/face/faceres.ts
|
||||
var tf13 = __toModule(require_tfjs_esm());
|
||||
var model9;
|
||||
var last6 = [];
|
||||
var lastTime4 = 0;
|
||||
var last3 = [];
|
||||
var lastTime7 = 0;
|
||||
var lastCount3 = 0;
|
||||
var skipped8 = Number.MAX_SAFE_INTEGER;
|
||||
async function load9(config3) {
|
||||
|
@ -5763,9 +5775,11 @@ async function predict7(image25, config3, idx, count2) {
|
|||
var _a, _b, _c, _d;
|
||||
if (!model9)
|
||||
return null;
|
||||
if (skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime4 && config3.skipFrame && lastCount3 === count2 && ((_c = last6[idx]) == null ? void 0 : _c.age) && ((_d = last6[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
const skipFrame = skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime7;
|
||||
if (config3.skipAllowed && skipFrame && skipTime && lastCount3 === count2 && ((_c = last3[idx]) == null ? void 0 : _c.age) && ((_d = last3[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
skipped8++;
|
||||
return last6[idx];
|
||||
return last3[idx];
|
||||
}
|
||||
skipped8 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5779,7 +5793,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
if ((_a2 = config3.face.description) == null ? void 0 : _a2.enabled) {
|
||||
const enhanced = enhance(image25);
|
||||
const resT = await (model9 == null ? void 0 : model9.predict(enhanced));
|
||||
lastTime4 = now();
|
||||
lastTime7 = now();
|
||||
tf13.dispose(enhanced);
|
||||
const genderT = await resT.find((t) => t.shape[1] === 1);
|
||||
const gender = await genderT.data();
|
||||
|
@ -5799,7 +5813,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
obj.descriptor = Array.from(descriptor);
|
||||
resT.forEach((t) => tf13.dispose(t));
|
||||
}
|
||||
last6[idx] = obj;
|
||||
last3[idx] = obj;
|
||||
lastCount3 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -8954,7 +8968,7 @@ var handBoxEnlargeFactor = 1.65;
|
|||
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||
var palmLandmarksPalmBase = 0;
|
||||
var palmLandmarksMiddleFingerBase = 2;
|
||||
var lastTime5 = 0;
|
||||
var lastTime8 = 0;
|
||||
var HandPipeline = class {
|
||||
constructor(handDetector, handPoseModel2) {
|
||||
__publicField(this, "handDetector");
|
||||
|
@ -8967,7 +8981,7 @@ var HandPipeline = class {
|
|||
this.handPoseModel = handPoseModel2;
|
||||
this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
|
||||
this.storedBoxes = [];
|
||||
this.skipped = 0;
|
||||
this.skipped = Number.MAX_SAFE_INTEGER;
|
||||
this.detectedHands = 0;
|
||||
}
|
||||
calculateLandmarksBoundingBox(landmarks) {
|
||||
|
@ -9019,11 +9033,13 @@ var HandPipeline = class {
|
|||
async estimateHands(image25, config3) {
|
||||
let useFreshBox = false;
|
||||
let boxes;
|
||||
if (this.skipped === 0 || this.skipped > config3.hand.skipFrames && (config3.hand.skipTime || 0) <= now() - lastTime5 || !config3.hand.landmarks || !config3.skipFrame) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime8;
|
||||
const skipFrame = this.skipped < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
boxes = await this.handDetector.estimateHandBounds(image25, config3);
|
||||
this.skipped = 0;
|
||||
}
|
||||
if (config3.skipFrame)
|
||||
if (config3.skipAllowed)
|
||||
this.skipped++;
|
||||
if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) {
|
||||
this.detectedHands = 0;
|
||||
|
@ -9048,7 +9064,7 @@ var HandPipeline = class {
|
|||
tf16.dispose(croppedInput);
|
||||
tf16.dispose(rotatedImage);
|
||||
const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage);
|
||||
lastTime5 = now();
|
||||
lastTime8 = now();
|
||||
tf16.dispose(handImage);
|
||||
const confidence = (await confidenceT.data())[0];
|
||||
tf16.dispose(confidenceT);
|
||||
|
@ -9617,8 +9633,8 @@ var faceIndex = 4;
|
|||
var boxExpandFact = 1.6;
|
||||
var maxDetectorResolution = 512;
|
||||
var detectorExpandFact = 1.4;
|
||||
var skipped9 = 0;
|
||||
var lastTime6 = 0;
|
||||
var skipped9 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime9 = 0;
|
||||
var outputSize = [0, 0];
|
||||
var cache3 = {
|
||||
boxes: [],
|
||||
|
@ -9758,17 +9774,21 @@ async function predict9(input, config3) {
|
|||
return [];
|
||||
outputSize = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
skipped9++;
|
||||
if (config3.skipFrame && skipped9 <= (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= now() - lastTime6) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrame = skipped9 < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache3.hands;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
if (config3.skipFrame && cache3.hands.length === config3.hand.maxDetected) {
|
||||
const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrameExtended = skipped9 < 3 * (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && cache3.hands.length === config3.hand.maxDetected) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else if (config3.skipFrame && skipped9 < 3 * (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= 3 * (now() - lastTime6) && cache3.hands.length > 0) {
|
||||
} else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache3.hands.length > 0) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else {
|
||||
cache3.boxes = await detectHands(input, config3);
|
||||
lastTime6 = now();
|
||||
lastTime9 = now();
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
skipped9 = 0;
|
||||
}
|
||||
|
@ -10067,10 +10087,12 @@ async function parseMultiPose(res, config3, image25, inputBox) {
|
|||
async function predict10(input, config3) {
|
||||
if (!model10 || !(model10 == null ? void 0 : model10.inputs[0].shape))
|
||||
return [];
|
||||
if (!config3.skipFrame)
|
||||
if (!config3.skipAllowed)
|
||||
cache5.boxes.length = 0;
|
||||
skipped10++;
|
||||
if (config3.skipFrame && (skipped10 <= (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - cache5.last)) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - cache5.last;
|
||||
const skipFrame = skipped10 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache5.bodies;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -10093,8 +10115,8 @@ async function predict10(input, config3) {
|
|||
// src/object/nanodet.ts
|
||||
var tf21 = __toModule(require_tfjs_esm());
|
||||
var model11;
|
||||
var last7 = [];
|
||||
var lastTime7 = 0;
|
||||
var last4 = [];
|
||||
var lastTime10 = 0;
|
||||
var skipped11 = Number.MAX_SAFE_INTEGER;
|
||||
var scaleBox = 2.5;
|
||||
async function load12(config3) {
|
||||
|
@ -10174,13 +10196,15 @@ async function process4(res, inputSize8, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict11(image25, config3) {
|
||||
if (skipped11 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime7 && config3.skipFrame && last7.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime10;
|
||||
const skipFrame = skipped11 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last4.length > 0) {
|
||||
skipped11++;
|
||||
return last7;
|
||||
return last4;
|
||||
}
|
||||
skipped11 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last7;
|
||||
return last4;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [image25.shape[2], image25.shape[1]];
|
||||
const resize = tf21.image.resizeBilinear(image25, [model11.inputSize, model11.inputSize], false);
|
||||
|
@ -10191,10 +10215,10 @@ async function predict11(image25, config3) {
|
|||
let objectT;
|
||||
if (config3.object.enabled)
|
||||
objectT = await model11.predict(transpose);
|
||||
lastTime7 = now();
|
||||
lastTime10 = now();
|
||||
tf21.dispose(transpose);
|
||||
const obj = await process4(objectT, model11.inputSize, outputSize2, config3);
|
||||
last7 = obj;
|
||||
last4 = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -11394,7 +11418,7 @@ async function canvas2(input, output) {
|
|||
async function all(inCanvas2, result, drawOptions) {
|
||||
if (!result || !result.performance || !result || !inCanvas2)
|
||||
return null;
|
||||
const timestamp = now();
|
||||
const timeStamp = now();
|
||||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
const promise = Promise.all([
|
||||
face(inCanvas2, result.face, localOptions),
|
||||
|
@ -11403,7 +11427,7 @@ async function all(inCanvas2, result, drawOptions) {
|
|||
object(inCanvas2, result.object, localOptions),
|
||||
gesture(inCanvas2, result.gesture, localOptions)
|
||||
]);
|
||||
result.performance.draw = Math.trunc(now() - timestamp);
|
||||
result.performance.draw = env.perfadd ? (result.performance.draw || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
@ -11531,7 +11555,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:face";
|
||||
timeStamp = now();
|
||||
const faces = await predict6(input, parent.config);
|
||||
parent.performance.face = Math.trunc(now() - timeStamp);
|
||||
parent.performance.face = env.perfadd ? (parent.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
if (!input.shape || input.shape.length !== 4)
|
||||
return [];
|
||||
if (!faces)
|
||||
|
@ -11550,7 +11574,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
parent.performance.emotion = env.perfadd ? (parent.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
|
@ -11560,7 +11584,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
parent.performance.antispoof = env.perfadd ? (parent.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
|
@ -11570,7 +11594,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
parent.performance.embedding = env.perfadd ? (parent.performance.embedding || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
if (parent.config.async) {
|
||||
|
@ -12889,7 +12913,7 @@ var Human = class {
|
|||
const count2 = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (userConfig)
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
if (env.initial) {
|
||||
if (this.env.initial) {
|
||||
if (this.config.debug)
|
||||
log(`version: ${this.version}`);
|
||||
if (this.config.debug)
|
||||
|
@ -12905,9 +12929,9 @@ var Human = class {
|
|||
}
|
||||
}
|
||||
await load15(this);
|
||||
if (env.initial && this.config.debug)
|
||||
if (this.env.initial && this.config.debug)
|
||||
log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors");
|
||||
env.initial = false;
|
||||
this.env.initial = false;
|
||||
const loaded = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (loaded !== count2) {
|
||||
await validate2(this);
|
||||
|
@ -12915,7 +12939,7 @@ var Human = class {
|
|||
}
|
||||
const current = Math.trunc(now() - timeStamp);
|
||||
if (current > (this.performance.load || 0))
|
||||
this.performance.load = current;
|
||||
this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
|
||||
}
|
||||
next(result = this.result) {
|
||||
return calc2(result, this.config);
|
||||
|
@ -12929,7 +12953,6 @@ var Human = class {
|
|||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
||||
this.state = "config";
|
||||
let timeStamp;
|
||||
let elapsedTime;
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
this.state = "check";
|
||||
const error = __privateGet(this, _sanity).call(this, input);
|
||||
|
@ -12944,7 +12967,7 @@ var Human = class {
|
|||
this.state = "image";
|
||||
const img = process2(input, this.config);
|
||||
this.process = img;
|
||||
this.performance.image = Math.trunc(now() - timeStamp);
|
||||
this.performance.image = this.env.perfadd ? (this.performance.image || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Get Image:");
|
||||
if (!img.tensor) {
|
||||
if (this.config.debug)
|
||||
|
@ -12954,15 +12977,15 @@ var Human = class {
|
|||
}
|
||||
this.emit("image");
|
||||
timeStamp = now();
|
||||
this.config.skipFrame = await skip(this.config, img.tensor);
|
||||
this.config.skipAllowed = await skip(this.config, img.tensor);
|
||||
if (!this.performance.frames)
|
||||
this.performance.frames = 0;
|
||||
if (!this.performance.cached)
|
||||
this.performance.cached = 0;
|
||||
this.performance.frames++;
|
||||
if (this.config.skipFrame)
|
||||
if (this.config.skipAllowed)
|
||||
this.performance.cached++;
|
||||
this.performance.changed = Math.trunc(now() - timeStamp);
|
||||
this.performance.changed = this.env.perfadd ? (this.performance.changed || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Check Changed:");
|
||||
let faceRes = [];
|
||||
let bodyRes = [];
|
||||
|
@ -12976,9 +12999,7 @@ var Human = class {
|
|||
} else {
|
||||
timeStamp = now();
|
||||
faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.face = elapsedTime;
|
||||
this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1))
|
||||
faceRes = await faceRes;
|
||||
|
@ -13006,9 +13027,7 @@ var Human = class {
|
|||
bodyRes = this.config.body.enabled ? await predict4(img.tensor, bodyConfig) : [];
|
||||
else if ((_h = this.config.body.modelPath) == null ? void 0 : _h.includes("movenet"))
|
||||
bodyRes = this.config.body.enabled ? await predict10(img.tensor, bodyConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.body = elapsedTime;
|
||||
this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Body:");
|
||||
this.analyze("Start Hand:");
|
||||
|
@ -13027,9 +13046,7 @@ var Human = class {
|
|||
handRes = this.config.hand.enabled ? await predict8(img.tensor, handConfig) : [];
|
||||
else if ((_p = (_o = this.config.hand.detector) == null ? void 0 : _o.modelPath) == null ? void 0 : _p.includes("handtrack"))
|
||||
handRes = this.config.hand.enabled ? await predict9(img.tensor, handConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.hand = elapsedTime;
|
||||
this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Hand:");
|
||||
this.analyze("Start Object:");
|
||||
|
@ -13047,9 +13064,7 @@ var Human = class {
|
|||
objectRes = this.config.object.enabled ? await predict11(img.tensor, this.config) : [];
|
||||
else if ((_t = this.config.object.modelPath) == null ? void 0 : _t.includes("centernet"))
|
||||
objectRes = this.config.object.enabled ? await predict3(img.tensor, this.config) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.object = elapsedTime;
|
||||
this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Object:");
|
||||
this.state = "detect:await";
|
||||
|
@ -13061,7 +13076,7 @@ var Human = class {
|
|||
timeStamp = now();
|
||||
gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris3(faceRes)];
|
||||
if (!this.config.async)
|
||||
this.performance.gesture = Math.trunc(now() - timeStamp);
|
||||
this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
else if (this.performance.gesture)
|
||||
delete this.performance.gesture;
|
||||
}
|
||||
|
|
|
@ -152,8 +152,8 @@ var config = {
|
|||
debug: true,
|
||||
async: true,
|
||||
warmup: "full",
|
||||
cacheSensitivity: 0.75,
|
||||
skipFrame: false,
|
||||
cacheSensitivity: 0.7,
|
||||
skipAllowed: false,
|
||||
filter: {
|
||||
enabled: true,
|
||||
width: 0,
|
||||
|
@ -183,8 +183,8 @@ var config = {
|
|||
modelPath: "blazeface.json",
|
||||
rotation: true,
|
||||
maxDetected: 1,
|
||||
skipFrames: 11,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 2500,
|
||||
minConfidence: 0.2,
|
||||
iouThreshold: 0.1,
|
||||
return: false
|
||||
|
@ -200,21 +200,21 @@ var config = {
|
|||
emotion: {
|
||||
enabled: true,
|
||||
minConfidence: 0.1,
|
||||
skipFrames: 12,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 1500,
|
||||
modelPath: "emotion.json"
|
||||
},
|
||||
description: {
|
||||
enabled: true,
|
||||
modelPath: "faceres.json",
|
||||
skipFrames: 13,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 3e3,
|
||||
minConfidence: 0.1
|
||||
},
|
||||
antispoof: {
|
||||
enabled: false,
|
||||
skipFrames: 14,
|
||||
skipTime: 2e3,
|
||||
skipFrames: 99,
|
||||
skipTime: 4e3,
|
||||
modelPath: "antispoof.json"
|
||||
}
|
||||
},
|
||||
|
@ -227,12 +227,12 @@ var config = {
|
|||
maxDetected: -1,
|
||||
minConfidence: 0.3,
|
||||
skipFrames: 1,
|
||||
skipTime: 2e3
|
||||
skipTime: 200
|
||||
},
|
||||
hand: {
|
||||
enabled: true,
|
||||
rotation: true,
|
||||
skipFrames: 2,
|
||||
skipFrames: 99,
|
||||
skipTime: 2e3,
|
||||
minConfidence: 0.5,
|
||||
iouThreshold: 0.2,
|
||||
|
@ -251,8 +251,8 @@ var config = {
|
|||
minConfidence: 0.2,
|
||||
iouThreshold: 0.4,
|
||||
maxDetected: 10,
|
||||
skipFrames: 15,
|
||||
skipTime: 2e3
|
||||
skipFrames: 99,
|
||||
skipTime: 1e3
|
||||
},
|
||||
segmentation: {
|
||||
enabled: false,
|
||||
|
@ -1190,6 +1190,7 @@ var Env = class {
|
|||
__publicField(this, "filter");
|
||||
__publicField(this, "tfjs");
|
||||
__publicField(this, "offscreen");
|
||||
__publicField(this, "perfadd", false);
|
||||
__publicField(this, "wasm", {
|
||||
supported: void 0,
|
||||
backend: void 0,
|
||||
|
@ -1321,7 +1322,7 @@ var model2;
|
|||
var cached = [];
|
||||
var skipped2 = Number.MAX_SAFE_INTEGER;
|
||||
var lastCount = 0;
|
||||
var last = 0;
|
||||
var lastTime = 0;
|
||||
async function load2(config3) {
|
||||
var _a, _b;
|
||||
if (env.initial)
|
||||
|
@ -1340,7 +1341,9 @@ async function predict(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model2)
|
||||
return null;
|
||||
if (skipped2 < (((_a = config3.face.antispoof) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.antispoof) == null ? void 0 : _b.skipTime) || 0) <= now() - last && config3.skipFrame && lastCount === count2 && cached[idx]) {
|
||||
const skipTime = (((_a = config3.face.antispoof) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime;
|
||||
const skipFrame = skipped2 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && cached[idx]) {
|
||||
skipped2++;
|
||||
return cached[idx];
|
||||
}
|
||||
|
@ -1351,7 +1354,7 @@ async function predict(image25, config3, idx, count2) {
|
|||
const num = (await res.data())[0];
|
||||
cached[idx] = Math.round(100 * num) / 100;
|
||||
lastCount = count2;
|
||||
last = now();
|
||||
lastTime = now();
|
||||
tf4.dispose([resize, res]);
|
||||
resolve(cached[idx]);
|
||||
});
|
||||
|
@ -4936,7 +4939,7 @@ var skipped3 = Number.MAX_SAFE_INTEGER;
|
|||
var outputNodes;
|
||||
var cache = null;
|
||||
var padding = [[0, 0], [0, 0], [0, 0], [0, 0]];
|
||||
var last2 = 0;
|
||||
var lastTime2 = 0;
|
||||
async function loadDetect(config3) {
|
||||
var _a, _b, _c;
|
||||
if (env3.initial)
|
||||
|
@ -5053,11 +5056,13 @@ async function detectParts(input, config3, outputSize2) {
|
|||
}
|
||||
async function predict2(input, config3) {
|
||||
const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
if (skipped3 < (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - last2 && config3.skipFrame && cache !== null) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime2;
|
||||
const skipFrame = skipped3 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && cache !== null) {
|
||||
skipped3++;
|
||||
} else {
|
||||
cache = await detectParts(input, config3, outputSize2);
|
||||
last2 = now();
|
||||
lastTime2 = now();
|
||||
skipped3 = 0;
|
||||
}
|
||||
if (cache)
|
||||
|
@ -5155,8 +5160,8 @@ var labels = [
|
|||
// src/object/centernet.ts
|
||||
var model4;
|
||||
var inputSize3 = 0;
|
||||
var last3 = [];
|
||||
var lastTime = 0;
|
||||
var last = [];
|
||||
var lastTime3 = 0;
|
||||
var skipped4 = Number.MAX_SAFE_INTEGER;
|
||||
async function load4(config3) {
|
||||
if (env.initial)
|
||||
|
@ -5221,21 +5226,23 @@ async function process3(res, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict3(input, config3) {
|
||||
if (skipped4 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime && config3.skipFrame && last3.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime3;
|
||||
const skipFrame = skipped4 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last.length > 0) {
|
||||
skipped4++;
|
||||
return last3;
|
||||
return last;
|
||||
}
|
||||
skipped4 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last3;
|
||||
return last;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [input.shape[2], input.shape[1]];
|
||||
const resize = tf8.image.resizeBilinear(input, [inputSize3, inputSize3]);
|
||||
const objectT = config3.object.enabled ? model4 == null ? void 0 : model4.execute(resize, ["tower_0/detections"]) : null;
|
||||
lastTime = now();
|
||||
lastTime3 = now();
|
||||
tf8.dispose(resize);
|
||||
const obj = await process3(objectT, outputSize2, config3);
|
||||
last3 = obj;
|
||||
last = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -5278,7 +5285,7 @@ var connected2 = {
|
|||
|
||||
// src/body/efficientpose.ts
|
||||
var model5;
|
||||
var last4 = 0;
|
||||
var lastTime4 = 0;
|
||||
var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} };
|
||||
var skipped5 = Number.MAX_SAFE_INTEGER;
|
||||
async function load5(config3) {
|
||||
|
@ -5310,14 +5317,15 @@ function max2d(inputs, minScore) {
|
|||
});
|
||||
}
|
||||
async function predict4(image25, config3) {
|
||||
var _a;
|
||||
if (skipped5 < (((_a = config3.body) == null ? void 0 : _a.skipFrames) || 0) && config3.skipFrame && Object.keys(cache2.keypoints).length > 0 && (config3.body.skipTime || 0) <= now() - last4) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - lastTime4;
|
||||
const skipFrame = skipped5 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) {
|
||||
skipped5++;
|
||||
return [cache2];
|
||||
}
|
||||
skipped5 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
var _a2;
|
||||
var _a;
|
||||
const tensor3 = tf9.tidy(() => {
|
||||
if (!(model5 == null ? void 0 : model5.inputs[0].shape))
|
||||
return null;
|
||||
|
@ -5329,7 +5337,7 @@ async function predict4(image25, config3) {
|
|||
let resT;
|
||||
if (config3.body.enabled)
|
||||
resT = await (model5 == null ? void 0 : model5.predict(tensor3));
|
||||
last4 = now();
|
||||
lastTime4 = now();
|
||||
tf9.dispose(tensor3);
|
||||
if (resT) {
|
||||
cache2.keypoints.length = 0;
|
||||
|
@ -5339,7 +5347,7 @@ async function predict4(image25, config3) {
|
|||
tf9.dispose(squeeze8);
|
||||
for (let id = 0; id < stack3.length; id++) {
|
||||
const [x2, y2, partScore] = max2d(stack3[id], config3.body.minConfidence);
|
||||
if (partScore > (((_a2 = config3.body) == null ? void 0 : _a2.minConfidence) || 0)) {
|
||||
if (partScore > (((_a = config3.body) == null ? void 0 : _a.minConfidence) || 0)) {
|
||||
cache2.keypoints.push({
|
||||
score: Math.round(100 * partScore) / 100,
|
||||
part: kpt2[id],
|
||||
|
@ -5391,9 +5399,9 @@ async function predict4(image25, config3) {
|
|||
var tf10 = __toModule(require_tfjs_esm());
|
||||
var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"];
|
||||
var model6;
|
||||
var last5 = [];
|
||||
var last2 = [];
|
||||
var lastCount2 = 0;
|
||||
var lastTime2 = 0;
|
||||
var lastTime5 = 0;
|
||||
var skipped6 = Number.MAX_SAFE_INTEGER;
|
||||
var rgb = [0.2989, 0.587, 0.114];
|
||||
async function load6(config3) {
|
||||
|
@ -5414,9 +5422,11 @@ async function predict5(image25, config3, idx, count2) {
|
|||
var _a, _b;
|
||||
if (!model6)
|
||||
return null;
|
||||
if (skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime2 && config3.skipFrame && lastCount2 === count2 && last5[idx] && last5[idx].length > 0) {
|
||||
const skipFrame = skipped6 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime5;
|
||||
if (config3.skipAllowed && skipTime && skipFrame && lastCount2 === count2 && last2[idx] && last2[idx].length > 0) {
|
||||
skipped6++;
|
||||
return last5[idx];
|
||||
return last2[idx];
|
||||
}
|
||||
skipped6 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5439,7 +5449,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
const normalize = tf10.tidy(() => tf10.mul(tf10.sub(grayscale, 0.5), 2));
|
||||
tf10.dispose(grayscale);
|
||||
const emotionT = await (model6 == null ? void 0 : model6.predict(normalize));
|
||||
lastTime2 = now();
|
||||
lastTime5 = now();
|
||||
const data = await emotionT.data();
|
||||
tf10.dispose(emotionT);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
|
@ -5449,7 +5459,7 @@ async function predict5(image25, config3, idx, count2) {
|
|||
obj.sort((a, b) => b.score - a.score);
|
||||
tf10.dispose(normalize);
|
||||
}
|
||||
last5[idx] = obj;
|
||||
last2[idx] = obj;
|
||||
lastCount2 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -5596,13 +5606,15 @@ var boxCache = [];
|
|||
var model8 = null;
|
||||
var inputSize5 = 0;
|
||||
var skipped7 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime3 = 0;
|
||||
var lastTime6 = 0;
|
||||
var detectedFaces = 0;
|
||||
async function predict6(input, config3) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
|
||||
if (!config3.skipFrame || (detectedFaces !== ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || !((_b = config3.face.mesh) == null ? void 0 : _b.enabled)) && (skipped7 > (((_c = config3.face.detector) == null ? void 0 : _c.skipFrames) || 0) && (((_d = config3.face.description) == null ? void 0 : _d.skipTime) || 0) <= now() - lastTime3)) {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
||||
const skipTime = (((_a = config3.face.detector) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime6;
|
||||
const skipFrame = skipped7 < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0);
|
||||
if (!config3.skipAllowed || !skipTime || !skipFrame || detectedFaces === 0) {
|
||||
const newBoxes2 = await getBoxes(input, config3);
|
||||
lastTime3 = now();
|
||||
lastTime6 = now();
|
||||
boxCache = [];
|
||||
for (const possible of newBoxes2.boxes) {
|
||||
const startPoint = await possible.box.startPoint.data();
|
||||
|
@ -5638,16 +5650,16 @@ async function predict6(input, config3) {
|
|||
faceScore: 0,
|
||||
annotations: {}
|
||||
};
|
||||
if (((_e = config3.face.detector) == null ? void 0 : _e.rotation) && ((_f = config3.face.mesh) == null ? void 0 : _f.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_c = config3.face.detector) == null ? void 0 : _c.rotation) && ((_d = config3.face.mesh) == null ? void 0 : _d.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
} else {
|
||||
rotationMatrix = IDENTITY_MATRIX;
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_g = config3.face.mesh) == null ? void 0 : _g.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
const cut = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, input, ((_e = config3.face.mesh) == null ? void 0 : _e.enabled) ? [inputSize5, inputSize5] : [size(), size()]);
|
||||
face5.tensor = tf12.div(cut, 255);
|
||||
tf12.dispose(cut);
|
||||
}
|
||||
face5.boxScore = Math.round(100 * box4.confidence) / 100;
|
||||
if (!((_h = config3.face.mesh) == null ? void 0 : _h.enabled)) {
|
||||
if (!((_f = config3.face.mesh) == null ? void 0 : _f.enabled)) {
|
||||
face5.box = getClampedBox(box4, input);
|
||||
face5.boxRaw = getRawBox(box4, input);
|
||||
face5.score = Math.round(100 * box4.confidence || 0) / 100;
|
||||
|
@ -5670,17 +5682,17 @@ async function predict6(input, config3) {
|
|||
let rawCoords = await coordsReshaped.array();
|
||||
tf12.dispose(contourCoords);
|
||||
tf12.dispose(coordsReshaped);
|
||||
if (faceConfidence < (((_i = config3.face.detector) == null ? void 0 : _i.minConfidence) || 1)) {
|
||||
if (faceConfidence < (((_g = config3.face.detector) == null ? void 0 : _g.minConfidence) || 1)) {
|
||||
box4.confidence = faceConfidence;
|
||||
} else {
|
||||
if ((_j = config3.face.iris) == null ? void 0 : _j.enabled)
|
||||
if ((_h = config3.face.iris) == null ? void 0 : _h.enabled)
|
||||
rawCoords = await augmentIris(rawCoords, face5.tensor, config3, inputSize5);
|
||||
face5.mesh = transformRawCoords(rawCoords, box4, angle, rotationMatrix, inputSize5);
|
||||
face5.meshRaw = face5.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize5]);
|
||||
box4 = { ...enlargeBox(calculateLandmarksBoundingBox(face5.mesh), 1.5), confidence: box4.confidence };
|
||||
for (const key of Object.keys(meshAnnotations))
|
||||
face5.annotations[key] = meshAnnotations[key].map((index) => face5.mesh[index]);
|
||||
if (((_k = config3.face.detector) == null ? void 0 : _k.rotation) && config3.face.mesh.enabled && ((_l = config3.face.description) == null ? void 0 : _l.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
if (((_i = config3.face.detector) == null ? void 0 : _i.rotation) && config3.face.mesh.enabled && ((_j = config3.face.description) == null ? void 0 : _j.enabled) && env.kernels.includes("rotatewithoffset")) {
|
||||
tf12.dispose(face5.tensor);
|
||||
[angle, rotationMatrix, face5.tensor] = correctFaceRotation(box4, input, inputSize5);
|
||||
}
|
||||
|
@ -5694,7 +5706,7 @@ async function predict6(input, config3) {
|
|||
faces.push(face5);
|
||||
newBoxes.push(box4);
|
||||
}
|
||||
if ((_m = config3.face.mesh) == null ? void 0 : _m.enabled)
|
||||
if ((_k = config3.face.mesh) == null ? void 0 : _k.enabled)
|
||||
boxCache = newBoxes.filter((a) => {
|
||||
var _a2;
|
||||
return a.confidence > (((_a2 = config3.face.detector) == null ? void 0 : _a2.minConfidence) || 0);
|
||||
|
@ -5725,8 +5737,8 @@ var uvmap = UV468;
|
|||
// src/face/faceres.ts
|
||||
var tf13 = __toModule(require_tfjs_esm());
|
||||
var model9;
|
||||
var last6 = [];
|
||||
var lastTime4 = 0;
|
||||
var last3 = [];
|
||||
var lastTime7 = 0;
|
||||
var lastCount3 = 0;
|
||||
var skipped8 = Number.MAX_SAFE_INTEGER;
|
||||
async function load9(config3) {
|
||||
|
@ -5762,9 +5774,11 @@ async function predict7(image25, config3, idx, count2) {
|
|||
var _a, _b, _c, _d;
|
||||
if (!model9)
|
||||
return null;
|
||||
if (skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0) && (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) <= now() - lastTime4 && config3.skipFrame && lastCount3 === count2 && ((_c = last6[idx]) == null ? void 0 : _c.age) && ((_d = last6[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
const skipFrame = skipped8 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0);
|
||||
const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime7;
|
||||
if (config3.skipAllowed && skipFrame && skipTime && lastCount3 === count2 && ((_c = last3[idx]) == null ? void 0 : _c.age) && ((_d = last3[idx]) == null ? void 0 : _d.age) > 0) {
|
||||
skipped8++;
|
||||
return last6[idx];
|
||||
return last3[idx];
|
||||
}
|
||||
skipped8 = 0;
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -5778,7 +5792,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
if ((_a2 = config3.face.description) == null ? void 0 : _a2.enabled) {
|
||||
const enhanced = enhance(image25);
|
||||
const resT = await (model9 == null ? void 0 : model9.predict(enhanced));
|
||||
lastTime4 = now();
|
||||
lastTime7 = now();
|
||||
tf13.dispose(enhanced);
|
||||
const genderT = await resT.find((t) => t.shape[1] === 1);
|
||||
const gender = await genderT.data();
|
||||
|
@ -5798,7 +5812,7 @@ async function predict7(image25, config3, idx, count2) {
|
|||
obj.descriptor = Array.from(descriptor);
|
||||
resT.forEach((t) => tf13.dispose(t));
|
||||
}
|
||||
last6[idx] = obj;
|
||||
last3[idx] = obj;
|
||||
lastCount3 = count2;
|
||||
resolve(obj);
|
||||
});
|
||||
|
@ -8953,7 +8967,7 @@ var handBoxEnlargeFactor = 1.65;
|
|||
var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];
|
||||
var palmLandmarksPalmBase = 0;
|
||||
var palmLandmarksMiddleFingerBase = 2;
|
||||
var lastTime5 = 0;
|
||||
var lastTime8 = 0;
|
||||
var HandPipeline = class {
|
||||
constructor(handDetector, handPoseModel2) {
|
||||
__publicField(this, "handDetector");
|
||||
|
@ -8966,7 +8980,7 @@ var HandPipeline = class {
|
|||
this.handPoseModel = handPoseModel2;
|
||||
this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
|
||||
this.storedBoxes = [];
|
||||
this.skipped = 0;
|
||||
this.skipped = Number.MAX_SAFE_INTEGER;
|
||||
this.detectedHands = 0;
|
||||
}
|
||||
calculateLandmarksBoundingBox(landmarks) {
|
||||
|
@ -9018,11 +9032,13 @@ var HandPipeline = class {
|
|||
async estimateHands(image25, config3) {
|
||||
let useFreshBox = false;
|
||||
let boxes;
|
||||
if (this.skipped === 0 || this.skipped > config3.hand.skipFrames && (config3.hand.skipTime || 0) <= now() - lastTime5 || !config3.hand.landmarks || !config3.skipFrame) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime8;
|
||||
const skipFrame = this.skipped < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
boxes = await this.handDetector.estimateHandBounds(image25, config3);
|
||||
this.skipped = 0;
|
||||
}
|
||||
if (config3.skipFrame)
|
||||
if (config3.skipAllowed)
|
||||
this.skipped++;
|
||||
if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) {
|
||||
this.detectedHands = 0;
|
||||
|
@ -9047,7 +9063,7 @@ var HandPipeline = class {
|
|||
tf16.dispose(croppedInput);
|
||||
tf16.dispose(rotatedImage);
|
||||
const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage);
|
||||
lastTime5 = now();
|
||||
lastTime8 = now();
|
||||
tf16.dispose(handImage);
|
||||
const confidence = (await confidenceT.data())[0];
|
||||
tf16.dispose(confidenceT);
|
||||
|
@ -9616,8 +9632,8 @@ var faceIndex = 4;
|
|||
var boxExpandFact = 1.6;
|
||||
var maxDetectorResolution = 512;
|
||||
var detectorExpandFact = 1.4;
|
||||
var skipped9 = 0;
|
||||
var lastTime6 = 0;
|
||||
var skipped9 = Number.MAX_SAFE_INTEGER;
|
||||
var lastTime9 = 0;
|
||||
var outputSize = [0, 0];
|
||||
var cache3 = {
|
||||
boxes: [],
|
||||
|
@ -9757,17 +9773,21 @@ async function predict9(input, config3) {
|
|||
return [];
|
||||
outputSize = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
skipped9++;
|
||||
if (config3.skipFrame && skipped9 <= (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= now() - lastTime6) {
|
||||
const skipTime = (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrame = skipped9 < (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache3.hands;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
if (config3.skipFrame && cache3.hands.length === config3.hand.maxDetected) {
|
||||
const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime9;
|
||||
const skipFrameExtended = skipped9 < 3 * (config3.hand.skipFrames || 0);
|
||||
if (config3.skipAllowed && cache3.hands.length === config3.hand.maxDetected) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else if (config3.skipFrame && skipped9 < 3 * (config3.hand.skipFrames || 0) && (config3.hand.skipTime || 0) <= 3 * (now() - lastTime6) && cache3.hands.length > 0) {
|
||||
} else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache3.hands.length > 0) {
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
} else {
|
||||
cache3.boxes = await detectHands(input, config3);
|
||||
lastTime6 = now();
|
||||
lastTime9 = now();
|
||||
cache3.hands = await Promise.all(cache3.boxes.map((handBox) => detectFingers(input, handBox, config3)));
|
||||
skipped9 = 0;
|
||||
}
|
||||
|
@ -10066,10 +10086,12 @@ async function parseMultiPose(res, config3, image25, inputBox) {
|
|||
async function predict10(input, config3) {
|
||||
if (!model10 || !(model10 == null ? void 0 : model10.inputs[0].shape))
|
||||
return [];
|
||||
if (!config3.skipFrame)
|
||||
if (!config3.skipAllowed)
|
||||
cache5.boxes.length = 0;
|
||||
skipped10++;
|
||||
if (config3.skipFrame && (skipped10 <= (config3.body.skipFrames || 0) && (config3.body.skipTime || 0) <= now() - cache5.last)) {
|
||||
const skipTime = (config3.body.skipTime || 0) > now() - cache5.last;
|
||||
const skipFrame = skipped10 < (config3.body.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame) {
|
||||
return cache5.bodies;
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
|
@ -10092,8 +10114,8 @@ async function predict10(input, config3) {
|
|||
// src/object/nanodet.ts
|
||||
var tf21 = __toModule(require_tfjs_esm());
|
||||
var model11;
|
||||
var last7 = [];
|
||||
var lastTime7 = 0;
|
||||
var last4 = [];
|
||||
var lastTime10 = 0;
|
||||
var skipped11 = Number.MAX_SAFE_INTEGER;
|
||||
var scaleBox = 2.5;
|
||||
async function load12(config3) {
|
||||
|
@ -10173,13 +10195,15 @@ async function process4(res, inputSize8, outputShape, config3) {
|
|||
return results;
|
||||
}
|
||||
async function predict11(image25, config3) {
|
||||
if (skipped11 < (config3.object.skipFrames || 0) && (config3.object.skipTime || 0) <= now() - lastTime7 && config3.skipFrame && last7.length > 0) {
|
||||
const skipTime = (config3.object.skipTime || 0) > now() - lastTime10;
|
||||
const skipFrame = skipped11 < (config3.object.skipFrames || 0);
|
||||
if (config3.skipAllowed && skipTime && skipFrame && last4.length > 0) {
|
||||
skipped11++;
|
||||
return last7;
|
||||
return last4;
|
||||
}
|
||||
skipped11 = 0;
|
||||
if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense"))
|
||||
return last7;
|
||||
return last4;
|
||||
return new Promise(async (resolve) => {
|
||||
const outputSize2 = [image25.shape[2], image25.shape[1]];
|
||||
const resize = tf21.image.resizeBilinear(image25, [model11.inputSize, model11.inputSize], false);
|
||||
|
@ -10190,10 +10214,10 @@ async function predict11(image25, config3) {
|
|||
let objectT;
|
||||
if (config3.object.enabled)
|
||||
objectT = await model11.predict(transpose);
|
||||
lastTime7 = now();
|
||||
lastTime10 = now();
|
||||
tf21.dispose(transpose);
|
||||
const obj = await process4(objectT, model11.inputSize, outputSize2, config3);
|
||||
last7 = obj;
|
||||
last4 = obj;
|
||||
resolve(obj);
|
||||
});
|
||||
}
|
||||
|
@ -11393,7 +11417,7 @@ async function canvas2(input, output) {
|
|||
async function all(inCanvas2, result, drawOptions) {
|
||||
if (!result || !result.performance || !result || !inCanvas2)
|
||||
return null;
|
||||
const timestamp = now();
|
||||
const timeStamp = now();
|
||||
const localOptions = mergeDeep(options2, drawOptions);
|
||||
const promise = Promise.all([
|
||||
face(inCanvas2, result.face, localOptions),
|
||||
|
@ -11402,7 +11426,7 @@ async function all(inCanvas2, result, drawOptions) {
|
|||
object(inCanvas2, result.object, localOptions),
|
||||
gesture(inCanvas2, result.gesture, localOptions)
|
||||
]);
|
||||
result.performance.draw = Math.trunc(now() - timestamp);
|
||||
result.performance.draw = env.perfadd ? (result.performance.draw || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
@ -11530,7 +11554,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:face";
|
||||
timeStamp = now();
|
||||
const faces = await predict6(input, parent.config);
|
||||
parent.performance.face = Math.trunc(now() - timeStamp);
|
||||
parent.performance.face = env.perfadd ? (parent.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
if (!input.shape || input.shape.length !== 4)
|
||||
return [];
|
||||
if (!faces)
|
||||
|
@ -11549,7 +11573,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:emotion";
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await predict5(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
parent.performance.emotion = env.perfadd ? (parent.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Emotion:");
|
||||
parent.analyze("Start AntiSpoof:");
|
||||
|
@ -11559,7 +11583,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:antispoof";
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await predict(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
parent.performance.antispoof = env.perfadd ? (parent.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End AntiSpoof:");
|
||||
parent.analyze("Start Description:");
|
||||
|
@ -11569,7 +11593,7 @@ var detectFace = async (parent, input) => {
|
|||
parent.state = "run:description";
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await predict7(faces[i].tensor || tf26.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
parent.performance.embedding = env.perfadd ? (parent.performance.embedding || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze("End Description:");
|
||||
if (parent.config.async) {
|
||||
|
@ -12888,7 +12912,7 @@ var Human = class {
|
|||
const count2 = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (userConfig)
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
if (env.initial) {
|
||||
if (this.env.initial) {
|
||||
if (this.config.debug)
|
||||
log(`version: ${this.version}`);
|
||||
if (this.config.debug)
|
||||
|
@ -12904,9 +12928,9 @@ var Human = class {
|
|||
}
|
||||
}
|
||||
await load15(this);
|
||||
if (env.initial && this.config.debug)
|
||||
if (this.env.initial && this.config.debug)
|
||||
log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors");
|
||||
env.initial = false;
|
||||
this.env.initial = false;
|
||||
const loaded = Object.values(this.models).filter((model14) => model14).length;
|
||||
if (loaded !== count2) {
|
||||
await validate2(this);
|
||||
|
@ -12914,7 +12938,7 @@ var Human = class {
|
|||
}
|
||||
const current = Math.trunc(now() - timeStamp);
|
||||
if (current > (this.performance.load || 0))
|
||||
this.performance.load = current;
|
||||
this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
|
||||
}
|
||||
next(result = this.result) {
|
||||
return calc2(result, this.config);
|
||||
|
@ -12928,7 +12952,6 @@ var Human = class {
|
|||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
||||
this.state = "config";
|
||||
let timeStamp;
|
||||
let elapsedTime;
|
||||
this.config = mergeDeep(this.config, userConfig);
|
||||
this.state = "check";
|
||||
const error = __privateGet(this, _sanity).call(this, input);
|
||||
|
@ -12943,7 +12966,7 @@ var Human = class {
|
|||
this.state = "image";
|
||||
const img = process2(input, this.config);
|
||||
this.process = img;
|
||||
this.performance.image = Math.trunc(now() - timeStamp);
|
||||
this.performance.image = this.env.perfadd ? (this.performance.image || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Get Image:");
|
||||
if (!img.tensor) {
|
||||
if (this.config.debug)
|
||||
|
@ -12953,15 +12976,15 @@ var Human = class {
|
|||
}
|
||||
this.emit("image");
|
||||
timeStamp = now();
|
||||
this.config.skipFrame = await skip(this.config, img.tensor);
|
||||
this.config.skipAllowed = await skip(this.config, img.tensor);
|
||||
if (!this.performance.frames)
|
||||
this.performance.frames = 0;
|
||||
if (!this.performance.cached)
|
||||
this.performance.cached = 0;
|
||||
this.performance.frames++;
|
||||
if (this.config.skipFrame)
|
||||
if (this.config.skipAllowed)
|
||||
this.performance.cached++;
|
||||
this.performance.changed = Math.trunc(now() - timeStamp);
|
||||
this.performance.changed = this.env.perfadd ? (this.performance.changed || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze("Check Changed:");
|
||||
let faceRes = [];
|
||||
let bodyRes = [];
|
||||
|
@ -12975,9 +12998,7 @@ var Human = class {
|
|||
} else {
|
||||
timeStamp = now();
|
||||
faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.face = elapsedTime;
|
||||
this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1))
|
||||
faceRes = await faceRes;
|
||||
|
@ -13005,9 +13026,7 @@ var Human = class {
|
|||
bodyRes = this.config.body.enabled ? await predict4(img.tensor, bodyConfig) : [];
|
||||
else if ((_h = this.config.body.modelPath) == null ? void 0 : _h.includes("movenet"))
|
||||
bodyRes = this.config.body.enabled ? await predict10(img.tensor, bodyConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.body = elapsedTime;
|
||||
this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Body:");
|
||||
this.analyze("Start Hand:");
|
||||
|
@ -13026,9 +13045,7 @@ var Human = class {
|
|||
handRes = this.config.hand.enabled ? await predict8(img.tensor, handConfig) : [];
|
||||
else if ((_p = (_o = this.config.hand.detector) == null ? void 0 : _o.modelPath) == null ? void 0 : _p.includes("handtrack"))
|
||||
handRes = this.config.hand.enabled ? await predict9(img.tensor, handConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.hand = elapsedTime;
|
||||
this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Hand:");
|
||||
this.analyze("Start Object:");
|
||||
|
@ -13046,9 +13063,7 @@ var Human = class {
|
|||
objectRes = this.config.object.enabled ? await predict11(img.tensor, this.config) : [];
|
||||
else if ((_t = this.config.object.modelPath) == null ? void 0 : _t.includes("centernet"))
|
||||
objectRes = this.config.object.enabled ? await predict3(img.tensor, this.config) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0)
|
||||
this.performance.object = elapsedTime;
|
||||
this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze("End Object:");
|
||||
this.state = "detect:await";
|
||||
|
@ -13060,7 +13075,7 @@ var Human = class {
|
|||
timeStamp = now();
|
||||
gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris3(faceRes)];
|
||||
if (!this.config.async)
|
||||
this.performance.gesture = Math.trunc(now() - timeStamp);
|
||||
this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
else if (this.performance.gesture)
|
||||
delete this.performance.gesture;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ let skipped = Number.MAX_SAFE_INTEGER;
|
|||
let outputNodes: string[]; // different for lite/full/heavy
|
||||
let cache: BodyResult | null = null;
|
||||
let padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];
|
||||
let last = 0;
|
||||
let lastTime = 0;
|
||||
|
||||
export async function loadDetect(config: Config): Promise<GraphModel> {
|
||||
if (env.initial) models[0] = null;
|
||||
|
@ -136,11 +136,13 @@ async function detectParts(input: Tensor, config: Config, outputSize: [number, n
|
|||
|
||||
export async function predict(input: Tensor, config: Config): Promise<BodyResult[]> {
|
||||
const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
if ((skipped < (config.body.skipFrames || 0)) && ((config.body.skipTime || 0) <= (now() - last)) && config.skipFrame && cache !== null) {
|
||||
const skipTime = (config.body.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.body.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && cache !== null) {
|
||||
skipped++;
|
||||
} else {
|
||||
cache = await detectParts(input, config, outputSize);
|
||||
last = now();
|
||||
lastTime = now();
|
||||
skipped = 0;
|
||||
}
|
||||
if (cache) return [cache];
|
||||
|
|
|
@ -13,7 +13,7 @@ import type { Config } from '../config';
|
|||
import { env } from '../util/env';
|
||||
|
||||
let model: GraphModel | null;
|
||||
let last = 0;
|
||||
let lastTime = 0;
|
||||
const cache: BodyResult = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} };
|
||||
|
||||
// const keypoints: Array<BodyKeypoint> = [];
|
||||
|
@ -50,7 +50,9 @@ function max2d(inputs, minScore) {
|
|||
}
|
||||
|
||||
export async function predict(image: Tensor, config: Config): Promise<BodyResult[]> {
|
||||
if ((skipped < (config.body?.skipFrames || 0)) && config.skipFrame && Object.keys(cache.keypoints).length > 0 && ((config.body.skipTime || 0) <= (now() - last))) {
|
||||
const skipTime = (config.body.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.body.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && Object.keys(cache.keypoints).length > 0) {
|
||||
skipped++;
|
||||
return [cache];
|
||||
}
|
||||
|
@ -66,7 +68,7 @@ export async function predict(image: Tensor, config: Config): Promise<BodyResult
|
|||
|
||||
let resT;
|
||||
if (config.body.enabled) resT = await model?.predict(tensor);
|
||||
last = now();
|
||||
lastTime = now();
|
||||
tf.dispose(tensor);
|
||||
|
||||
if (resT) {
|
||||
|
|
|
@ -132,9 +132,11 @@ async function parseMultiPose(res, config, image, inputBox) {
|
|||
|
||||
export async function predict(input: Tensor, config: Config): Promise<BodyResult[]> {
|
||||
if (!model || !model?.inputs[0].shape) return []; // something is wrong with the model
|
||||
if (!config.skipFrame) cache.boxes.length = 0; // allowed to use cache or not
|
||||
if (!config.skipAllowed) cache.boxes.length = 0; // allowed to use cache or not
|
||||
skipped++; // increment skip frames
|
||||
if (config.skipFrame && (skipped <= (config.body.skipFrames || 0) && ((config.body.skipTime || 0) <= (now() - cache.last)))) {
|
||||
const skipTime = (config.body.skipTime || 0) > (now() - cache.last);
|
||||
const skipFrame = skipped < (config.body.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame) {
|
||||
return cache.bodies; // return cached results without running anything
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
|
|
|
@ -255,7 +255,7 @@ export interface Config {
|
|||
cacheSensitivity: number;
|
||||
|
||||
/** Internal Variable */
|
||||
skipFrame: boolean;
|
||||
skipAllowed: boolean;
|
||||
|
||||
/** Run input through image filters before inference
|
||||
* - image filters run with near-zero latency as they are executed on the GPU
|
||||
|
@ -302,10 +302,10 @@ const config: Config = {
|
|||
// warmup pre-initializes all models for faster inference but can take
|
||||
// significant time on startup
|
||||
// only used for `webgl` and `humangl` backends
|
||||
cacheSensitivity: 0.75, // cache sensitivity
|
||||
cacheSensitivity: 0.70, // cache sensitivity
|
||||
// values 0..1 where 0.01 means reset cache if input changed more than 1%
|
||||
// set to 0 to disable caching
|
||||
skipFrame: false, // internal & dynamic
|
||||
skipAllowed: false, // internal & dynamic
|
||||
filter: { // run input through image filters before inference
|
||||
// image filters run with near-zero latency as they are executed on the GPU
|
||||
enabled: true, // enable image pre-processing filters
|
||||
|
@ -347,9 +347,9 @@ const config: Config = {
|
|||
// this parameter is not valid in nodejs
|
||||
maxDetected: 1, // maximum number of faces detected in the input
|
||||
// should be set to the minimum number for performance
|
||||
skipFrames: 11, // how many max frames to go without re-running the face bounding box detector
|
||||
skipFrames: 99, // how many max frames to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
skipTime: 2500, // how many ms to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
minConfidence: 0.2, // threshold for discarding a prediction
|
||||
iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed
|
||||
|
@ -371,9 +371,9 @@ const config: Config = {
|
|||
emotion: {
|
||||
enabled: true,
|
||||
minConfidence: 0.1, // threshold for discarding a prediction
|
||||
skipFrames: 12, // how max many frames to go without re-running the detector
|
||||
skipFrames: 99, // how max many frames to go without re-running the detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
skipTime: 1500, // how many ms to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath
|
||||
},
|
||||
|
@ -383,18 +383,18 @@ const config: Config = {
|
|||
// recommended to enable detector.rotation and mesh.enabled
|
||||
modelPath: 'faceres.json', // face description model
|
||||
// can be either absolute path or relative to modelBasePath
|
||||
skipFrames: 13, // how many max frames to go without re-running the detector
|
||||
skipFrames: 99, // how many max frames to go without re-running the detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
skipTime: 3000, // how many ms to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
minConfidence: 0.1, // threshold for discarding a prediction
|
||||
},
|
||||
|
||||
antispoof: {
|
||||
enabled: false,
|
||||
skipFrames: 14, // how max many frames to go without re-running the detector
|
||||
skipFrames: 99, // how max many frames to go without re-running the detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
skipTime: 4000, // how many ms to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
modelPath: 'antispoof.json', // face description model
|
||||
// can be either absolute path or relative to modelBasePath
|
||||
|
@ -415,7 +415,7 @@ const config: Config = {
|
|||
minConfidence: 0.3, // threshold for discarding a prediction
|
||||
skipFrames: 1, // how many max frames to go without re-running the detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
skipTime: 200, // how many ms to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
},
|
||||
|
||||
|
@ -424,7 +424,7 @@ const config: Config = {
|
|||
rotation: true, // use best-guess rotated hand image or just box with rotation as-is
|
||||
// false means higher performance, but incorrect finger mapping if hand is inverted
|
||||
// only valid for `handdetect` variation
|
||||
skipFrames: 2, // how many max frames to go without re-running the hand bounding box detector
|
||||
skipFrames: 99, // how many max frames to go without re-running the hand bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
|
@ -450,9 +450,9 @@ const config: Config = {
|
|||
minConfidence: 0.2, // threshold for discarding a prediction
|
||||
iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed
|
||||
maxDetected: 10, // maximum number of objects detected in the input
|
||||
skipFrames: 15, // how many max frames to go without re-running the detector
|
||||
skipFrames: 99, // how many max frames to go without re-running the detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
skipTime: 2000, // how many ms to go without re-running the face bounding box detector
|
||||
skipTime: 1000, // how many ms to go without re-running object detector
|
||||
// only used when cacheSensitivity is not zero
|
||||
},
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ let model: GraphModel | null;
|
|||
const cached: Array<number> = [];
|
||||
let skipped = Number.MAX_SAFE_INTEGER;
|
||||
let lastCount = 0;
|
||||
let last = 0;
|
||||
let lastTime = 0;
|
||||
|
||||
export async function load(config: Config): Promise<GraphModel> {
|
||||
if (env.initial) model = null;
|
||||
|
@ -26,7 +26,9 @@ export async function load(config: Config): Promise<GraphModel> {
|
|||
|
||||
export async function predict(image: Tensor, config: Config, idx, count) {
|
||||
if (!model) return null;
|
||||
if ((skipped < (config.face.antispoof?.skipFrames || 0)) && ((config.face.antispoof?.skipTime || 0) <= (now() - last)) && config.skipFrame && (lastCount === count) && cached[idx]) {
|
||||
const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {
|
||||
skipped++;
|
||||
return cached[idx];
|
||||
}
|
||||
|
@ -37,7 +39,7 @@ export async function predict(image: Tensor, config: Config, idx, count) {
|
|||
const num = (await res.data())[0];
|
||||
cached[idx] = Math.round(100 * num) / 100;
|
||||
lastCount = count;
|
||||
last = now();
|
||||
lastTime = now();
|
||||
tf.dispose([resize, res]);
|
||||
resolve(cached[idx]);
|
||||
});
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
import { log, now } from '../util/util';
|
||||
import { env } from '../util/env';
|
||||
import * as tf from '../../dist/tfjs.esm.js';
|
||||
import * as facemesh from './facemesh';
|
||||
import * as emotion from '../gear/emotion';
|
||||
|
@ -29,7 +30,7 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
timeStamp = now();
|
||||
|
||||
const faces = await facemesh.predict(input, parent.config);
|
||||
parent.performance.face = Math.trunc(now() - timeStamp);
|
||||
parent.performance.face = env.perfadd ? (parent.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
if (!input.shape || input.shape.length !== 4) return [];
|
||||
if (!faces) return [];
|
||||
// for (const face of faces) {
|
||||
|
@ -53,7 +54,7 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
parent.state = 'run:emotion';
|
||||
timeStamp = now();
|
||||
emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.emotion = Math.trunc(now() - timeStamp);
|
||||
parent.performance.emotion = env.perfadd ? (parent.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze('End Emotion:');
|
||||
|
||||
|
@ -65,7 +66,7 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
parent.state = 'run:antispoof';
|
||||
timeStamp = now();
|
||||
antispoofRes = parent.config.face.antispoof.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.antispoof = Math.trunc(now() - timeStamp);
|
||||
parent.performance.antispoof = env.perfadd ? (parent.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze('End AntiSpoof:');
|
||||
|
||||
|
@ -91,7 +92,7 @@ export const detectFace = async (parent /* instance of human */, input: Tensor):
|
|||
parent.state = 'run:description';
|
||||
timeStamp = now();
|
||||
descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : null;
|
||||
parent.performance.embedding = Math.trunc(now() - timeStamp);
|
||||
parent.performance.embedding = env.perfadd ? (parent.performance.embedding || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
parent.analyze('End Description:');
|
||||
|
||||
|
|
|
@ -28,7 +28,10 @@ let detectedFaces = 0;
|
|||
|
||||
export async function predict(input: Tensor, config: Config): Promise<FaceResult[]> {
|
||||
// reset cached boxes
|
||||
if (!config.skipFrame || (((detectedFaces !== config.face.detector?.maxDetected) || !config.face.mesh?.enabled)) && (skipped > (config.face.detector?.skipFrames || 0) && ((config.face.description?.skipTime || 0) <= (now() - lastTime)))) {
|
||||
|
||||
const skipTime = (config.face.detector?.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.face.detector?.skipFrames || 0);
|
||||
if (!config.skipAllowed || !skipTime || !skipFrame || detectedFaces === 0) {
|
||||
const newBoxes = await blazeface.getBoxes(input, config); // get results from blazeface detector
|
||||
lastTime = now();
|
||||
boxCache = []; // empty cache
|
||||
|
|
|
@ -91,7 +91,9 @@ export function enhance(input): Tensor {
|
|||
|
||||
export async function predict(image: Tensor, config: Config, idx, count) {
|
||||
if (!model) return null;
|
||||
if ((skipped < (config.face.description?.skipFrames || 0)) && ((config.face.description?.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {
|
||||
const skipFrame = skipped < (config.face.description?.skipFrames || 0);
|
||||
const skipTime = (config.face.description?.skipTime || 0) > (now() - lastTime);
|
||||
if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {
|
||||
skipped++;
|
||||
return last[idx];
|
||||
}
|
||||
|
|
|
@ -33,7 +33,9 @@ export async function load(config: Config): Promise<GraphModel> {
|
|||
|
||||
export async function predict(image: Tensor, config: Config, idx, count) {
|
||||
if (!model) return null;
|
||||
if ((skipped < (config.face.emotion?.skipFrames || 0)) && ((config.face.emotion?.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {
|
||||
const skipFrame = skipped < (config.face.emotion?.skipFrames || 0);
|
||||
const skipTime = (config.face.emotion?.skipTime || 0) > (now() - lastTime);
|
||||
if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {
|
||||
skipped++;
|
||||
return last[idx];
|
||||
}
|
||||
|
|
|
@ -34,7 +34,11 @@ export async function load(config: Config | any) {
|
|||
export async function predict(image: Tensor, config: Config) {
|
||||
if (!model) return null;
|
||||
// @ts-ignore config disabled
|
||||
if ((skipped < config.face.agegenderrace?.skipFrames) && ((config.face.agegenderrace?.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && last.age && (last.age > 0)) {
|
||||
const skipFrame = skipped < (config.face.agegenderrace?.skipFrames || 0);
|
||||
// @ts-ignore config disabled
|
||||
const skipTime = (config.face.agegenderrace?.skipTime || 0) > (now() - lastTime);
|
||||
// @ts-ignore config disabled
|
||||
if (config.skipAllowed && skipTime && skipFrame && last.age && (last.age > 0)) {
|
||||
skipped++;
|
||||
return last;
|
||||
}
|
||||
|
|
|
@ -33,7 +33,9 @@ export async function load(config: Config | any) {
|
|||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export async function predict(image: Tensor, config: Config | any) {
|
||||
if (!model) return null;
|
||||
if ((skipped < config.face.age.skipFrames) && ((config.face.age.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && last.age && (last.age > 0)) {
|
||||
const skipTime = (config.face.age?.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.face.age?.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && last.age && (last.age > 0)) {
|
||||
skipped++;
|
||||
return last;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,9 @@ export async function load(config: Config | any) {
|
|||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export async function predict(image: Tensor, config: Config | any) {
|
||||
if (!model) return null;
|
||||
if ((skipped < config.face.gender.skipFrames) && ((config.face.gender.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && last.gender !== '') {
|
||||
const skipTime = (config.face.gender?.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.face.gender?.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && last.gender !== '') {
|
||||
skipped++;
|
||||
return last;
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ export class HandPipeline {
|
|||
this.handPoseModel = handPoseModel;
|
||||
this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;
|
||||
this.storedBoxes = [];
|
||||
this.skipped = 0;
|
||||
this.skipped = Number.MAX_SAFE_INTEGER;
|
||||
this.detectedHands = 0;
|
||||
}
|
||||
|
||||
|
@ -88,15 +88,15 @@ export class HandPipeline {
|
|||
async estimateHands(image, config) {
|
||||
let useFreshBox = false;
|
||||
|
||||
// run new detector every skipFrames unless we only want box to start with
|
||||
// run new detector every skipFrames
|
||||
let boxes;
|
||||
|
||||
// console.log('handpipeline:estimateHands:skip criteria', this.skipped, config.hand.skipFrames, !config.hand.landmarks, !config.skipFrame); // should skip hand detector?
|
||||
if ((this.skipped === 0) || ((this.skipped > config.hand.skipFrames) && ((config.hand.skipTime || 0) <= (now() - lastTime))) || !config.hand.landmarks || !config.skipFrame) {
|
||||
const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = this.skipped < (config.hand.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame) {
|
||||
boxes = await this.handDetector.estimateHandBounds(image, config);
|
||||
this.skipped = 0;
|
||||
}
|
||||
if (config.skipFrame) this.skipped++;
|
||||
if (config.skipAllowed) this.skipped++;
|
||||
|
||||
// if detector result count doesn't match current working set, use it to reset current working set
|
||||
if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {
|
||||
|
|
|
@ -28,7 +28,7 @@ const boxExpandFact = 1.6;
|
|||
const maxDetectorResolution = 512;
|
||||
const detectorExpandFact = 1.4;
|
||||
|
||||
let skipped = 0;
|
||||
let skipped = Number.MAX_SAFE_INTEGER;
|
||||
let lastTime = 0;
|
||||
let outputSize: [number, number] = [0, 0];
|
||||
|
||||
|
@ -183,23 +183,20 @@ async function detectFingers(input: Tensor, h: HandDetectResult, config: Config)
|
|||
}
|
||||
|
||||
export async function predict(input: Tensor, config: Config): Promise<HandResult[]> {
|
||||
/** handtrack caching
|
||||
* 1. if skipFrame returned cached
|
||||
* 2. if any cached results but although not sure if its enough we continute anyhow for 3x skipframes
|
||||
* 3. if not skipframe or eventually rerun detector to generated new cached boxes and reset skipped
|
||||
* 4. generate cached boxes based on detected keypoints
|
||||
*/
|
||||
if (!models[0] || !models[1] || !models[0]?.inputs[0].shape || !models[1]?.inputs[0].shape) return []; // something is wrong with the model
|
||||
outputSize = [input.shape[2] || 0, input.shape[1] || 0];
|
||||
|
||||
skipped++; // increment skip frames
|
||||
if (config.skipFrame && (skipped <= (config.hand.skipFrames || 0)) && ((config.hand.skipTime || 0) <= (now() - lastTime))) {
|
||||
const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.hand.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame) {
|
||||
return cache.hands; // return cached results without running anything
|
||||
}
|
||||
return new Promise(async (resolve) => {
|
||||
if (config.skipFrame && cache.hands.length === config.hand.maxDetected) { // we have all detected hands
|
||||
const skipTimeExtended = 3 * (config.hand.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrameExtended = skipped < 3 * (config.hand.skipFrames || 0);
|
||||
if (config.skipAllowed && cache.hands.length === config.hand.maxDetected) { // we have all detected hands so we're definitely skipping
|
||||
cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));
|
||||
} else if (config.skipFrame && skipped < 3 * (config.hand.skipFrames || 0) && ((config.hand.skipTime || 0) <= 3 * (now() - lastTime)) && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer
|
||||
} else if (config.skipAllowed && skipTimeExtended && skipFrameExtended && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer
|
||||
cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));
|
||||
} else { // finally rerun detector
|
||||
cache.boxes = await detectHands(input, config);
|
||||
|
|
31
src/human.ts
31
src/human.ts
|
@ -326,7 +326,7 @@ export class Human {
|
|||
const count = Object.values(this.models).filter((model) => model).length;
|
||||
if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;
|
||||
|
||||
if (env.initial) { // print version info on first run and check for correct backend setup
|
||||
if (this.env.initial) { // print version info on first run and check for correct backend setup
|
||||
if (this.config.debug) log(`version: ${this.version}`);
|
||||
if (this.config.debug) log(`tfjs version: ${this.tf.version_core}`);
|
||||
if (!await backend.check(this)) log('error: backend check failed');
|
||||
|
@ -338,8 +338,8 @@ export class Human {
|
|||
}
|
||||
|
||||
await models.load(this); // actually loads models
|
||||
if (env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run
|
||||
env.initial = false;
|
||||
if (this.env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run
|
||||
this.env.initial = false;
|
||||
|
||||
const loaded = Object.values(this.models).filter((model) => model).length;
|
||||
if (loaded !== count) { // number of loaded models changed
|
||||
|
@ -348,7 +348,7 @@ export class Human {
|
|||
}
|
||||
|
||||
const current = Math.trunc(now() - timeStamp);
|
||||
if (current > (this.performance.load as number || 0)) this.performance.load = current;
|
||||
if (current > (this.performance.load as number || 0)) this.performance.load = this.env.perfadd ? (this.performance.load || 0) + current : current;
|
||||
}
|
||||
|
||||
// emit event
|
||||
|
@ -393,7 +393,6 @@ export class Human {
|
|||
return new Promise(async (resolve) => {
|
||||
this.state = 'config';
|
||||
let timeStamp;
|
||||
let elapsedTime;
|
||||
|
||||
// update configuration
|
||||
this.config = mergeDeep(this.config, userConfig) as Config;
|
||||
|
@ -418,7 +417,7 @@ export class Human {
|
|||
this.state = 'image';
|
||||
const img = image.process(input, this.config) as { canvas: HTMLCanvasElement | OffscreenCanvas, tensor: Tensor };
|
||||
this.process = img;
|
||||
this.performance.image = Math.trunc(now() - timeStamp);
|
||||
this.performance.image = this.env.perfadd ? (this.performance.image || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze('Get Image:');
|
||||
|
||||
if (!img.tensor) {
|
||||
|
@ -429,12 +428,12 @@ export class Human {
|
|||
this.emit('image');
|
||||
|
||||
timeStamp = now();
|
||||
this.config.skipFrame = await image.skip(this.config, img.tensor);
|
||||
this.config.skipAllowed = await image.skip(this.config, img.tensor);
|
||||
if (!this.performance.frames) this.performance.frames = 0;
|
||||
if (!this.performance.cached) this.performance.cached = 0;
|
||||
(this.performance.frames as number)++;
|
||||
if (this.config.skipFrame) this.performance.cached++;
|
||||
this.performance.changed = Math.trunc(now() - timeStamp);
|
||||
if (this.config.skipAllowed) this.performance.cached++;
|
||||
this.performance.changed = this.env.perfadd ? (this.performance.changed || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
this.analyze('Check Changed:');
|
||||
|
||||
// prepare where to store model results
|
||||
|
@ -452,8 +451,7 @@ export class Human {
|
|||
} else {
|
||||
timeStamp = now();
|
||||
faceRes = this.config.face.enabled ? await face.detectFace(this, img.tensor) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0) this.performance.face = elapsedTime;
|
||||
this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
|
||||
if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) faceRes = await faceRes; // need face result for auto-detect number of hands or bodies
|
||||
|
@ -474,8 +472,7 @@ export class Human {
|
|||
else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(img.tensor, bodyConfig) : [];
|
||||
else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(img.tensor, bodyConfig) : [];
|
||||
else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(img.tensor, bodyConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0) this.performance.body = elapsedTime;
|
||||
this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze('End Body:');
|
||||
|
||||
|
@ -491,8 +488,7 @@ export class Human {
|
|||
timeStamp = now();
|
||||
if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? await handpose.predict(img.tensor, handConfig) : [];
|
||||
else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? await handtrack.predict(img.tensor, handConfig) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0) this.performance.hand = elapsedTime;
|
||||
this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze('End Hand:');
|
||||
|
||||
|
@ -507,8 +503,7 @@ export class Human {
|
|||
timeStamp = now();
|
||||
if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(img.tensor, this.config) : [];
|
||||
else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(img.tensor, this.config) : [];
|
||||
elapsedTime = Math.trunc(now() - timeStamp);
|
||||
if (elapsedTime > 0) this.performance.object = elapsedTime;
|
||||
this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
}
|
||||
this.analyze('End Object:');
|
||||
|
||||
|
@ -522,7 +517,7 @@ export class Human {
|
|||
if (this.config.gesture.enabled) {
|
||||
timeStamp = now();
|
||||
gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];
|
||||
if (!this.config.async) this.performance.gesture = Math.trunc(now() - timeStamp);
|
||||
if (!this.config.async) this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
else if (this.performance.gesture) delete this.performance.gesture;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,9 @@ async function process(res: Tensor | null, outputShape, config: Config) {
|
|||
}
|
||||
|
||||
export async function predict(input: Tensor, config: Config): Promise<ObjectResult[]> {
|
||||
if ((skipped < (config.object.skipFrames || 0)) && ((config.object.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && (last.length > 0)) {
|
||||
const skipTime = (config.object.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.object.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {
|
||||
skipped++;
|
||||
return last;
|
||||
}
|
||||
|
|
|
@ -107,7 +107,9 @@ async function process(res, inputSize, outputShape, config) {
|
|||
}
|
||||
|
||||
export async function predict(image: Tensor, config: Config): Promise<ObjectResult[]> {
|
||||
if ((skipped < (config.object.skipFrames || 0)) && ((config.object.skipTime || 0) <= (now() - lastTime)) && config.skipFrame && (last.length > 0)) {
|
||||
const skipTime = (config.object.skipTime || 0) > (now() - lastTime);
|
||||
const skipFrame = skipped < (config.object.skipFrames || 0);
|
||||
if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {
|
||||
skipped++;
|
||||
return last;
|
||||
}
|
||||
|
|
|
@ -194,7 +194,7 @@ export interface Result {
|
|||
/** {@link ObjectResult}: detection & analysis results */
|
||||
object: Array<ObjectResult>
|
||||
/** global performance object with timing values for each operation */
|
||||
performance: Record<string, unknown>,
|
||||
performance: Record<string, number>,
|
||||
/** optional processed canvas that can be used to draw input on screen */
|
||||
canvas?: OffscreenCanvas | HTMLCanvasElement | null | undefined,
|
||||
/** timestamp of detection representing the milliseconds elapsed since the UNIX epoch */
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
import { TRI468 as triangulation } from '../face/facemeshcoords';
|
||||
import { mergeDeep, now } from './util';
|
||||
import { env } from './env';
|
||||
import type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Point } from '../result';
|
||||
|
||||
/**
|
||||
|
@ -479,7 +480,7 @@ export async function canvas(input: HTMLCanvasElement | OffscreenCanvas | HTMLIm
|
|||
|
||||
export async function all(inCanvas: HTMLCanvasElement | OffscreenCanvas, result: Result, drawOptions?: Partial<DrawOptions>) {
|
||||
if (!result || !result.performance || !result || !inCanvas) return null;
|
||||
const timestamp = now();
|
||||
const timeStamp = now();
|
||||
const localOptions = mergeDeep(options, drawOptions);
|
||||
const promise = Promise.all([
|
||||
face(inCanvas, result.face, localOptions),
|
||||
|
@ -489,6 +490,6 @@ export async function all(inCanvas: HTMLCanvasElement | OffscreenCanvas, result:
|
|||
gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering
|
||||
// person(inCanvas, result.persons, localOptions); // already included above
|
||||
]);
|
||||
result.performance.draw = Math.trunc(now() - timestamp);
|
||||
result.performance.draw = env.perfadd ? (result.performance.draw as number || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
|
||||
return promise;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@ export class Env {
|
|||
};
|
||||
/** Is offscreenCanvas supported? */
|
||||
offscreen: undefined | boolean;
|
||||
/** Are performance counter instant values or additive */
|
||||
perfadd: boolean = false;
|
||||
/** WASM detected capabilities */
|
||||
wasm: {
|
||||
supported: undefined | boolean,
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
2021-10-22 20:12:29 [36mINFO: [39m @vladmandic/human version 2.4.0
|
||||
2021-10-22 20:12:29 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.10.0
|
||||
2021-10-22 20:12:29 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"2.4.0"}
|
||||
2021-10-22 20:12:29 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
|
||||
2021-10-22 20:12:29 [36mINFO: [39m Toolchain: {"build":"0.6.2","esbuild":"0.13.8","typescript":"4.4.4","typedoc":"0.22.6","eslint":"8.0.1"}
|
||||
2021-10-22 20:12:29 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Clean: {"locations":["dist/*","types/*","typedoc/*"]}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1275}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":54,"inputBytes":525194,"outputBytes":437512}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1283}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":54,"inputBytes":525202,"outputBytes":437516}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1350}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":54,"inputBytes":525269,"outputBytes":437588}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":1652}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2323,"outputBytes":973}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":54,"inputBytes":524892,"outputBytes":439413}
|
||||
2021-10-22 20:12:29 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2572202,"outputBytes":2491625}
|
||||
2021-10-22 20:12:30 [35mSTATE:[39m Compile: {"name":"human/browser/esm/custom","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.custom.esm.js","files":54,"inputBytes":3015544,"outputBytes":1606543}
|
||||
2021-10-22 20:12:31 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":8,"inputBytes":2323,"outputBytes":1155160}
|
||||
2021-10-22 20:12:31 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":1679079,"outputBytes":1430229}
|
||||
2021-10-22 20:12:32 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":1679079,"outputBytes":1878008}
|
||||
2021-10-22 20:12:50 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types","files":16}
|
||||
2021-10-22 20:12:57 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":37,"generated":true}
|
||||
2021-10-22 20:13:38 [35mSTATE:[39m Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":89,"errors":0,"warnings":0}
|
||||
2021-10-22 20:13:39 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
|
||||
2021-10-22 20:13:39 [36mINFO: [39m Done...
|
||||
2021-10-23 09:35:22 [36mINFO: [39m @vladmandic/human version 2.4.0
|
||||
2021-10-23 09:35:22 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v16.10.0
|
||||
2021-10-23 09:35:22 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"2.4.0"}
|
||||
2021-10-23 09:35:22 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
|
||||
2021-10-23 09:35:22 [36mINFO: [39m Toolchain: {"build":"0.6.2","esbuild":"0.13.8","typescript":"4.4.4","typedoc":"0.22.6","eslint":"8.0.1"}
|
||||
2021-10-23 09:35:22 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Clean: {"locations":["dist/*","types/*","typedoc/*"]}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1275}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":54,"inputBytes":526471,"outputBytes":438971}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1283}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":54,"inputBytes":526479,"outputBytes":438975}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1350}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":54,"inputBytes":526546,"outputBytes":439047}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":1652}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2323,"outputBytes":973}
|
||||
2021-10-23 09:35:22 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":54,"inputBytes":526169,"outputBytes":440872}
|
||||
2021-10-23 09:35:23 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2572202,"outputBytes":2491625}
|
||||
2021-10-23 09:35:23 [35mSTATE:[39m Compile: {"name":"human/browser/esm/custom","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.custom.esm.js","files":54,"inputBytes":3016821,"outputBytes":1607405}
|
||||
2021-10-23 09:35:24 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":8,"inputBytes":2323,"outputBytes":1155160}
|
||||
2021-10-23 09:35:24 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":54,"inputBytes":1680356,"outputBytes":1431091}
|
||||
2021-10-23 09:35:25 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":54,"inputBytes":1680356,"outputBytes":1879461}
|
||||
2021-10-23 09:35:44 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types","files":16}
|
||||
2021-10-23 09:35:50 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":37,"generated":true}
|
||||
2021-10-23 09:36:28 [35mSTATE:[39m Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":89,"errors":0,"warnings":0}
|
||||
2021-10-23 09:36:28 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
|
||||
2021-10-23 09:36:28 [36mINFO: [39m Done...
|
||||
|
|
1018
test/test.log
1018
test/test.log
File diff suppressed because it is too large
Load Diff
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
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html><html class="default no-js"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Config | @vladmandic/human - v2.4.0</title><meta name="description" content="Documentation for @vladmandic/human - v2.4.0"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@vladmandic/human - v2.4.0</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../index.html">@vladmandic/human - v2.4.0</a></li><li><a href="Config.html">Config</a></li></ul><h1>Interface Config</h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>Configuration interface definition for <strong>Human</strong> library</p>
|
||||
</div><div><p>Contains all configurable parameters</p>
|
||||
</div></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Config</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#async" class="tsd-kind-icon">async</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#backend" class="tsd-kind-icon">backend</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#cacheSensitivity" class="tsd-kind-icon">cache<wbr/>Sensitivity</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#debug" class="tsd-kind-icon">debug</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#filter" class="tsd-kind-icon">filter</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#modelBasePath" class="tsd-kind-icon">model<wbr/>Base<wbr/>Path</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#skipFrame" class="tsd-kind-icon">skip<wbr/>Frame</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#warmup" class="tsd-kind-icon">warmup</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#wasmPath" class="tsd-kind-icon">wasm<wbr/>Path</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="async" class="tsd-anchor"></a><h3>async</h3><div class="tsd-signature tsd-kind-icon">async<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L238">config.ts:238</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
</div></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">Config</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#async" class="tsd-kind-icon">async</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#backend" class="tsd-kind-icon">backend</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#cacheSensitivity" class="tsd-kind-icon">cache<wbr/>Sensitivity</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#debug" class="tsd-kind-icon">debug</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#filter" class="tsd-kind-icon">filter</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#modelBasePath" class="tsd-kind-icon">model<wbr/>Base<wbr/>Path</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#skipAllowed" class="tsd-kind-icon">skip<wbr/>Allowed</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#warmup" class="tsd-kind-icon">warmup</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#wasmPath" class="tsd-kind-icon">wasm<wbr/>Path</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="async" class="tsd-anchor"></a><h3>async</h3><div class="tsd-signature tsd-kind-icon">async<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L238">config.ts:238</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>Perform model loading and inference concurrently or sequentially</p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="backend" class="tsd-anchor"></a><h3>backend</h3><div class="tsd-signature tsd-kind-icon">backend<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">""</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"cpu"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"wasm"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"webgl"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"humangl"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"tensorflow"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"webgpu"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L226">config.ts:226</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>Backend used for TFJS operations
|
||||
|
@ -46,7 +46,7 @@ Valid build-in backends are:</p>
|
|||
<p><a href="ObjectConfig.html">ObjectConfig</a></p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="segmentation" class="tsd-anchor"></a><h3>segmentation</h3><div class="tsd-signature tsd-kind-icon">segmentation<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol"><</span><a href="SegmentationConfig.html" class="tsd-signature-type" data-tsd-kind="Interface">SegmentationConfig</a><span class="tsd-signature-symbol">></span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L283">config.ts:283</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p><a href="SegmentationConfig.html">SegmentationConfig</a></p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="skipFrame" class="tsd-anchor"></a><h3>skip<wbr/>Frame</h3><div class="tsd-signature tsd-kind-icon">skip<wbr/>Frame<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L258">config.ts:258</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="skipAllowed" class="tsd-anchor"></a><h3>skip<wbr/>Allowed</h3><div class="tsd-signature tsd-kind-icon">skip<wbr/>Allowed<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L258">config.ts:258</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>Internal Variable</p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="warmup" class="tsd-anchor"></a><h3>warmup</h3><div class="tsd-signature tsd-kind-icon">warmup<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"face"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"body"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"none"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"full"</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/config.ts#L243">config.ts:243</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>What to use for <code>human.warmup()</code></p>
|
||||
|
@ -58,4 +58,4 @@ Valid build-in backends are:</p>
|
|||
<ul>
|
||||
<li>if not set, auto-detects to link to CDN <code>jsdelivr</code> when running in browser</li>
|
||||
</ul>
|
||||
</div></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../index.html">Exports</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-interface"><a href="Config.html" class="tsd-kind-icon">Config</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#async" class="tsd-kind-icon">async</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#backend" class="tsd-kind-icon">backend</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#cacheSensitivity" class="tsd-kind-icon">cache<wbr/>Sensitivity</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#debug" class="tsd-kind-icon">debug</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#filter" class="tsd-kind-icon">filter</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#modelBasePath" class="tsd-kind-icon">model<wbr/>Base<wbr/>Path</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#skipFrame" class="tsd-kind-icon">skip<wbr/>Frame</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#warmup" class="tsd-kind-icon">warmup</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#wasmPath" class="tsd-kind-icon">wasm<wbr/>Path</a></li></ul></li></ul></nav></div></div></div><footer class=""><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="overlay"></div><script src="../assets/main.js"></script></body></html>
|
||||
</div></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../index.html">Exports</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-interface"><a href="Config.html" class="tsd-kind-icon">Config</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#async" class="tsd-kind-icon">async</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#backend" class="tsd-kind-icon">backend</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#body" class="tsd-kind-icon">body</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#cacheSensitivity" class="tsd-kind-icon">cache<wbr/>Sensitivity</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#debug" class="tsd-kind-icon">debug</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#face" class="tsd-kind-icon">face</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#filter" class="tsd-kind-icon">filter</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#gesture" class="tsd-kind-icon">gesture</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#hand" class="tsd-kind-icon">hand</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#modelBasePath" class="tsd-kind-icon">model<wbr/>Base<wbr/>Path</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#object" class="tsd-kind-icon">object</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#segmentation" class="tsd-kind-icon">segmentation</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#skipAllowed" class="tsd-kind-icon">skip<wbr/>Allowed</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#warmup" class="tsd-kind-icon">warmup</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="Config.html#wasmPath" class="tsd-kind-icon">wasm<wbr/>Path</a></li></ul></li></ul></nav></div></div></div><footer class=""><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="overlay"></div><script src="../assets/main.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
|
@ -13,7 +13,7 @@
|
|||
<p><a href="HandResult.html">HandResult</a>: detection & analysis results</p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="object" class="tsd-anchor"></a><h3>object</h3><div class="tsd-signature tsd-kind-icon">object<span class="tsd-signature-symbol">:</span> <a href="ObjectResult.html" class="tsd-signature-type" data-tsd-kind="Interface">ObjectResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L195">result.ts:195</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p><a href="ObjectResult.html">ObjectResult</a>: detection & analysis results</p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="performance" class="tsd-anchor"></a><h3>performance</h3><div class="tsd-signature tsd-kind-icon">performance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">></span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L197">result.ts:197</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="performance" class="tsd-anchor"></a><h3>performance</h3><div class="tsd-signature tsd-kind-icon">performance<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">></span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L197">result.ts:197</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>global performance object with timing values for each operation</p>
|
||||
</div></div></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="persons" class="tsd-anchor"></a><h3>persons</h3><div class="tsd-signature tsd-kind-icon">persons<span class="tsd-signature-symbol">:</span> <a href="PersonResult.html" class="tsd-signature-type" data-tsd-kind="Interface">PersonResult</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/result.ts#L203">result.ts:203</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
|
||||
<p>getter property that returns unified persons object</p>
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"blazepose.d.ts","sourceRoot":"","sources":["../../../src/body/blazepose.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAYxC,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWpE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAalE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAI1F;AAoFD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAWlF"}
|
||||
{"version":3,"file":"blazepose.d.ts","sourceRoot":"","sources":["../../../src/body/blazepose.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAYxC,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWpE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAalE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAI1F;AAoFD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAalF"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"efficientpose.d.ts","sourceRoot":"","sources":["../../../src/body/efficientpose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAaxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAmBD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA4ElF"}
|
||||
{"version":3,"file":"efficientpose.d.ts","sourceRoot":"","sources":["../../../src/body/efficientpose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAaxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAmBD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA8ElF"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"movenet.d.ts","sourceRoot":"","sources":["../../../src/body/movenet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAmBxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9D;AAyFD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2DlF"}
|
||||
{"version":3,"file":"movenet.d.ts","sourceRoot":"","sources":["../../../src/body/movenet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAgB,UAAU,EAAc,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAmBxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9D;AAyFD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA6DlF"}
|
|
@ -229,7 +229,7 @@ export interface Config {
|
|||
*/
|
||||
cacheSensitivity: number;
|
||||
/** Internal Variable */
|
||||
skipFrame: boolean;
|
||||
skipAllowed: boolean;
|
||||
/** Run input through image filters before inference
|
||||
* - image filters run with near-zero latency as they are executed on the GPU
|
||||
*
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"antispoof.d.ts","sourceRoot":"","sources":["../../../src/face/antispoof.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAUxD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,oBAiBtE"}
|
||||
{"version":3,"file":"antispoof.d.ts","sourceRoot":"","sources":["../../../src/face/antispoof.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAUxD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,oBAmBtE"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"face.d.ts","sourceRoot":"","sources":["../../../src/face/face.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,UAAU,uBAAiD,MAAM,KAAG,QAAQ,UAAU,EAAE,CAmIpG,CAAC"}
|
||||
{"version":3,"file":"face.d.ts","sourceRoot":"","sources":["../../../src/face/face.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,UAAU,uBAAiD,MAAM,KAAG,QAAQ,UAAU,EAAE,CAmIpG,CAAC"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"facemesh.d.ts","sourceRoot":"","sources":["../../../src/face/facemesh.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWxC,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAiGlF;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAU9D;AAED,eAAO,MAAM,aAAa,UAAgB,CAAC;AAC3C,eAAO,MAAM,KAAK,oBAAe,CAAC"}
|
||||
{"version":3,"file":"facemesh.d.ts","sourceRoot":"","sources":["../../../src/face/facemesh.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWxC,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAoGlF;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAU9D;AAED,eAAO,MAAM,aAAa,UAAgB,CAAC;AAC3C,eAAO,MAAM,KAAK,oBAAe,CAAC"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"faceres.d.ts","sourceRoot":"","sources":["../../../src/face/faceres.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAexC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAS9D;AAED,wBAAgB,OAAO,CAAC,KAAK,KAAA,GAAG,MAAM,CAmDrC;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,oBA8CtE"}
|
||||
{"version":3,"file":"faceres.d.ts","sourceRoot":"","sources":["../../../src/face/faceres.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAexC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAS9D;AAED,wBAAgB,OAAO,CAAC,KAAK,KAAA,GAAG,MAAM,CAmDrC;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,oBAgDtE"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"emotion.d.ts","sourceRoot":"","sources":["../../../src/gear/emotion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAexD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,oBAwCtE"}
|
||||
{"version":3,"file":"emotion.d.ts","sourceRoot":"","sources":["../../../src/gear/emotion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAexD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,oBA0CtE"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"gear-agegenderrace.d.ts","sourceRoot":"","sources":["../../../src/gear/gear-agegenderrace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAUxD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,uBAQ9C;AAGD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBA2C1D"}
|
||||
{"version":3,"file":"gear-agegenderrace.d.ts","sourceRoot":"","sources":["../../../src/gear/gear-agegenderrace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAUxD,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,uBAQ9C;AAGD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBA+C1D"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"handtrack.d.ts","sourceRoot":"","sources":["../../../src/hand/handtrack.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AA+CxC,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAepE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWtE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAI1F;AA0FD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA8ClF"}
|
||||
{"version":3,"file":"handtrack.d.ts","sourceRoot":"","sources":["../../../src/hand/handtrack.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AA+CxC,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAepE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWtE;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC,CAI1F;AA0FD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2ClF"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/human.ts"],"names":[],"mappings":"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"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"centernet.d.ts","sourceRoot":"","sources":["../../../src/object/centernet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAO,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAUxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9D;AAgDD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBpF"}
|
||||
{"version":3,"file":"centernet.d.ts","sourceRoot":"","sources":["../../../src/object/centernet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAO,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAUxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9D;AAgDD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqBpF"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"nanodet.d.ts","sourceRoot":"","sources":["../../../src/object/nanodet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAO,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAUxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAU9D;AA6ED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBpF"}
|
||||
{"version":3,"file":"nanodet.d.ts","sourceRoot":"","sources":["../../../src/object/nanodet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAO,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAUxC,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAU9D;AA6ED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0BpF"}
|
|
@ -202,7 +202,7 @@ export interface Result {
|
|||
/** {@link ObjectResult}: detection & analysis results */
|
||||
object: Array<ObjectResult>;
|
||||
/** global performance object with timing values for each operation */
|
||||
performance: Record<string, unknown>;
|
||||
performance: Record<string, number>;
|
||||
/** optional processed canvas that can be used to draw input on screen */
|
||||
canvas?: OffscreenCanvas | HTMLCanvasElement | null | undefined;
|
||||
/** timestamp of detection representing the milliseconds elapsed since the UNIX epoch */
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/result.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/result.ts"],"names":[],"mappings":"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"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"draw.d.ts","sourceRoot":"","sources":["../../../src/util/draw.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAS,MAAM,WAAW,CAAC;AAE9H;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,OAAO,EAAE,WAmBrB,CAAC;AAmGF,wBAAsB,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAyB5I;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuHtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwCtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBA+DtI;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuB1I;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwB1I;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,iBAI1J;AAED,wBAAsB,GAAG,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,kDAc1H"}
|
||||
{"version":3,"file":"draw.d.ts","sourceRoot":"","sources":["../../../src/util/draw.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAS,MAAM,WAAW,CAAC;AAE9H;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,OAAO,EAAE,WAmBrB,CAAC;AAmGF,wBAAsB,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAyB5I;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuHtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwCtI;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBA+DtI;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAuB1I;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,iBAwB1I;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,iBAI1J;AAED,wBAAsB,GAAG,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,kDAc1H"}
|
|
@ -22,6 +22,8 @@ export declare class Env {
|
|||
};
|
||||
/** Is offscreenCanvas supported? */
|
||||
offscreen: undefined | boolean;
|
||||
/** Are performance counter instant values or additive */
|
||||
perfadd: boolean;
|
||||
/** WASM detected capabilities */
|
||||
wasm: {
|
||||
supported: undefined | boolean;
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/util/env.ts"],"names":[],"mappings":"AAGA,iDAAiD;AACjD,qBAAa,GAAG;IACd,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAM;IACtB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAM;IACnB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,4BAA4B;IAC5B,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAAC;IACF,oCAAoC;IACpC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,iCAAiC;IACjC,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAC1B,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;KAClC,CAKG;IACJ,kCAAkC;IAClC,KAAK,EAAE;QACL,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;QAC5B,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;KAC9B,CAKG;IACJ,mCAAmC;IACnC,MAAM,EAAE;QACN,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAIG;IACJ,eAAe;IACf,GAAG,EAAE;QACH,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAGG;IACJ,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,6BAA6B;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,SAAS,CAAC;;IAkCf,aAAa;IA6Bb,SAAS;CAoBhB;AAED,eAAO,MAAM,GAAG,KAAY,CAAC"}
|
||||
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/util/env.ts"],"names":[],"mappings":"AAGA,iDAAiD;AACjD,qBAAa,GAAG;IACd,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAM;IACtB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAM;IACnB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,4BAA4B;IAC5B,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAAC;IACF,oCAAoC;IACpC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAS;IACzB,iCAAiC;IACjC,IAAI,EAAE;QACJ,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAC1B,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;KAClC,CAKG;IACJ,kCAAkC;IAClC,KAAK,EAAE;QACL,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;QAC5B,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;KAC9B,CAKG;IACJ,mCAAmC;IACnC,MAAM,EAAE;QACN,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;QAC/B,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;KAC7B,CAIG;IACJ,eAAe;IACf,GAAG,EAAE;QACH,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAGG;IACJ,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,6BAA6B;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,SAAS,CAAC;;IAkCf,aAAa;IA6Bb,SAAS;CAoBhB;AAED,eAAO,MAAM,GAAG,KAAY,CAAC"}
|
2
wiki
2
wiki
|
@ -1 +1 @@
|
|||
Subproject commit d6c2c8c474f1d55f36e4ab4ffc9a1852f2f2b4fb
|
||||
Subproject commit 97e86c65f64df007c25250bcb513d48e5c602242
|
Loading…
Reference in New Issue