add insightface

pull/356/head
Vladimir Mandic 2022-08-08 15:09:26 -04:00
parent ef4caa68fa
commit 5e1743695d
17 changed files with 583 additions and 825 deletions

View File

@ -1,6 +1,6 @@
# @vladmandic/human # @vladmandic/human
Version: **2.9.1** Version: **2.9.2**
Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition** Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition**
Author: **Vladimir Mandic <mandic00@live.com>** Author: **Vladimir Mandic <mandic00@live.com>**
@ -9,7 +9,10 @@
## Changelog ## Changelog
### **HEAD -> main** 2022/07/29 mandic00@live.com ### **2.9.2** 2022/08/08 mandic00@live.com
### **origin/main** 2022/08/04 mandic00@live.com
### **release: 2.9.1** 2022/07/25 mandic00@live.com ### **release: 2.9.1** 2022/07/25 mandic00@live.com

12
TODO.md
View File

@ -49,3 +49,15 @@ Feature is automatically disabled in **NodeJS** without user impact
## Pending Release Changes ## Pending Release Changes
- Add **InsightFace** model as alternative for face embedding/descriptor detection
compatible with multiple variations of **InsightFace** models
configurable using `config.face.insightface` config section
see `demo/faceid/index.ts` for usage
models can be downloaded from <https://github.com/vladmandic/insightface>
- Fix **MobileFaceNet** model as alternative for face embedding/descriptor detection
configurable using `config.face.mobilefacenet` config section
- Fix **EfficientPose** module
- Fix **NanoDet** module
- Fix `human.match` when using mixed descriptor lengths
- Update profiling methods in `human.profile()`
- Update project dependencies

View File

@ -38,4 +38,5 @@ designed to serve as a quick check when used together with other indicators:
**FaceID** is compatible with **FaceID** is compatible with
- `faceres.json` (default) perfoms combined age/gender/descriptor analysis - `faceres.json` (default) perfoms combined age/gender/descriptor analysis
- `faceres-deep.json` higher resolution variation of `faceres` - `faceres-deep.json` higher resolution variation of `faceres`
- `insightface` alternative model for face descriptor analysis
- `mobilefacenet` alternative model for face descriptor analysis - `mobilefacenet` alternative model for face descriptor analysis

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,8 @@ const humanConfig = { // user configuration for human, used to fine-tune behavio
enabled: true, enabled: true,
detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image
description: { enabled: true }, // default model for face descriptor extraction is faceres description: { enabled: true }, // default model for face descriptor extraction is faceres
mobilefacenet: { enabled: false, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model
// insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model
iris: { enabled: true }, // needed to determine gaze direction iris: { enabled: true }, // needed to determine gaze direction
emotion: { enabled: false }, // not needed emotion: { enabled: false }, // not needed
antispoof: { enabled: true }, // enable optional antispoof module antispoof: { enabled: true }, // enable optional antispoof module
@ -142,7 +143,7 @@ async function validationLoop(): Promise<FaceResult> { // main screen refresh lo
if (ok.blinkDetected && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start); if (ok.blinkDetected && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start);
ok.facingCenter = gestures.includes('facing center'); ok.facingCenter = gestures.includes('facing center');
ok.lookingCenter = gestures.includes('looking center'); // must face camera and look at camera ok.lookingCenter = gestures.includes('looking center'); // must face camera and look at camera
ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence && (human.result.face[0].genderScore || 0) > options.minConfidence; ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence;
ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence; ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence;
ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence; ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence;
ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize; ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize;
@ -184,7 +185,8 @@ async function saveRecords() {
const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData; const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData;
const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image }; const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image };
await indexDb.save(rec); await indexDb.save(rec);
log('saved face record:', rec.name); log('saved face record:', rec.name, 'descriptor length:', current.face?.embedding?.length);
log('known face records:', await indexDb.count());
} else { } else {
log('invalid name'); log('invalid name');
} }
@ -209,7 +211,7 @@ async function detectFace() {
return false; return false;
} }
const db = await indexDb.load(); const db = await indexDb.load();
const descriptors = db.map((rec) => rec.descriptor); const descriptors = db.map((rec) => rec.descriptor).filter((desc) => desc.length > 0);
const res = await human.match(current.face.embedding, descriptors, matchOptions); const res = await human.match(current.face.embedding, descriptors, matchOptions);
current.record = db[res.index] || null; current.record = db[res.index] || null;
if (current.record) { if (current.record) {
@ -258,6 +260,7 @@ async function main() { // main entry point
async function init() { async function init() {
log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']); log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);
log('face embedding model:', humanConfig.face['description']?.enabled ? 'faceres' : '', humanConfig.face['mobilefacenet']?.enabled ? 'mobilefacenet' : '', humanConfig.face['insightface']?.enabled ? 'insightface' : '');
log('options:', JSON.stringify(options).replace(/{|}|"|\[|\]/g, '').replace(/,/g, ' ')); log('options:', JSON.stringify(options).replace(/{|}|"|\[|\]/g, '').replace(/,/g, ' '));
printFPS('loading...'); printFPS('loading...');
log('known face records:', await indexDb.count()); log('known face records:', await indexDb.count());

View File

@ -32,23 +32,24 @@ export async function load(config: Config): Promise<GraphModel> {
} }
// performs argmax and max functions on a 2d tensor // performs argmax and max functions on a 2d tensor
async function max2d(inputs, minScore) { async function max2d(inputs, minScore): Promise<[number, number, number]> {
const [width, height] = inputs.shape; const [width, height] = inputs.shape;
const reshaped = tf.reshape(inputs, [height * width]); // combine all data const reshaped = tf.reshape(inputs, [height * width]); // combine all data
const max = tf.max(reshaped, 0); const max = tf.max(reshaped, 0);
const newScore = (await max.data())[0]; // get highest score const newScore: number = (await max.data())[0]; // get highest score
tf.dispose([reshaped, max]);
if (newScore > minScore) { // skip coordinate calculation is score is too low if (newScore > minScore) { // skip coordinate calculation is score is too low
const coordinates = tf.argMax(reshaped, 0); const coordinates = tf.argMax(reshaped, 0);
const mod = tf.mod(coordinates, width); const mod = tf.mod(coordinates, width);
const x = (await mod.data())[0]; const x = (await mod.data())[0];
const div = tf.div(coordinates, tf.scalar(width, 'int32')); const div = tf.div(coordinates, width);
const y = (await div.data())[0]; const y: number = (await div.data())[0];
tf.dispose([mod, div]); tf.dispose([reshaped, max, coordinates, mod, div]);
return [x, y, newScore]; return [x, y, newScore];
} } else {
tf.dispose([reshaped, max]);
return [0, 0, newScore]; return [0, 0, newScore];
} }
}
export async function predict(image: Tensor, config: Config): Promise<BodyResult[]> { export async function predict(image: Tensor, config: Config): Promise<BodyResult[]> {
const skipTime = (config.body.skipTime || 0) > (now() - lastTime); const skipTime = (config.body.skipTime || 0) > (now() - lastTime);
@ -66,7 +67,6 @@ export async function predict(image: Tensor, config: Config): Promise<BodyResult
const norm = tf.sub(enhance, constants.tf1); const norm = tf.sub(enhance, constants.tf1);
return norm; return norm;
}); });
let resT; let resT;
if (config.body.enabled) resT = model?.execute(tensor); if (config.body.enabled) resT = model?.execute(tensor);
lastTime = now(); lastTime = now();
@ -74,11 +74,12 @@ export async function predict(image: Tensor, config: Config): Promise<BodyResult
if (resT) { if (resT) {
cache.keypoints.length = 0; cache.keypoints.length = 0;
const squeeze = resT.squeeze(); const squeeze = tf.squeeze(resT);
tf.dispose(resT); tf.dispose(resT);
// body parts are basically just a stack of 2d tensors // body parts are basically just a stack of 2d tensors
const stack = squeeze.unstack(2); const stack = tf.unstack(squeeze, 2);
tf.dispose(squeeze); tf.dispose(squeeze);
// process each unstacked tensor as a separate body part // process each unstacked tensor as a separate body part
for (let id = 0; id < stack.length; id++) { for (let id = 0; id < stack.length; id++) {
// actual processing to get coordinates and score // actual processing to get coordinates and score

View File

@ -16,6 +16,7 @@ import * as gear from '../gear/gear';
import * as ssrnetAge from '../gear/ssrnet-age'; import * as ssrnetAge from '../gear/ssrnet-age';
import * as ssrnetGender from '../gear/ssrnet-gender'; import * as ssrnetGender from '../gear/ssrnet-gender';
import * as mobilefacenet from './mobilefacenet'; import * as mobilefacenet from './mobilefacenet';
import * as insightface from './insightface';
import type { FaceResult, Emotion, Gender, Race } from '../result'; import type { FaceResult, Emotion, Gender, Race } from '../result';
import type { Tensor } from '../tfjs/types'; import type { Tensor } from '../tfjs/types';
import type { Human } from '../human'; import type { Human } from '../human';
@ -32,6 +33,7 @@ export const detectFace = async (instance: Human /* instance of human */, input:
let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null; let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null;
let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>; let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>;
let mobilefacenetRes: number[] | Promise<number[]> | null; let mobilefacenetRes: number[] | Promise<number[]> | null;
let insightfaceRes: number[] | Promise<number[]> | null;
let antispoofRes: number | Promise<number> | null; let antispoofRes: number | Promise<number> | null;
let livenessRes: number | Promise<number> | null; let livenessRes: number | Promise<number> | null;
let descRes: DescRes | Promise<DescRes> | null; let descRes: DescRes | Promise<DescRes> | null;
@ -126,7 +128,7 @@ export const detectFace = async (instance: Human /* instance of human */, input:
} }
instance.analyze('End SSRNet:'); instance.analyze('End SSRNet:');
// run gear, inherits face from blazeface // run mobilefacenet alternative, inherits face from blazeface
instance.analyze('Start MobileFaceNet:'); instance.analyze('Start MobileFaceNet:');
if (instance.config.async) { if (instance.config.async) {
mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null; mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;
@ -138,21 +140,33 @@ export const detectFace = async (instance: Human /* instance of human */, input:
} }
instance.analyze('End MobileFaceNet:'); instance.analyze('End MobileFaceNet:');
// run emotion, inherits face from blazeface // run insightface alternative, inherits face from blazeface
instance.analyze('Start InsightFace:');
if (instance.config.async) {
insightfaceRes = instance.config.face['insightface']?.enabled ? insightface.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;
} else {
instance.state = 'run:mobilefacenet';
timeStamp = now();
insightfaceRes = instance.config.face['insightface']?.enabled ? await insightface.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;
instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);
}
instance.analyze('End InsightFace:');
// run faceres, inherits face from blazeface
instance.analyze('Start Description:'); instance.analyze('Start Description:');
if (instance.config.async) { if (instance.config.async) {
descRes = instance.config.face.description?.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null; descRes = faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length);
} else { } else {
instance.state = 'run:description'; instance.state = 'run:description';
timeStamp = now(); timeStamp = now();
descRes = instance.config.face.description?.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null; descRes = await faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length);
instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);
} }
instance.analyze('End Description:'); instance.analyze('End Description:');
// if async wait for results // if async wait for results
if (instance.config.async) { if (instance.config.async) {
[ageRes, genderRes, emotionRes, mobilefacenetRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, descRes, gearRes, antispoofRes, livenessRes]); [ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes]);
} }
instance.analyze('Finish Face:'); instance.analyze('Finish Face:');
@ -173,10 +187,14 @@ export const detectFace = async (instance: Human /* instance of human */, input:
race: (gearRes as gear.GearType).race, race: (gearRes as gear.GearType).race,
}; };
} }
if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if embedding model is used if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if mobilefacenet model is used
(descRes as DescRes).descriptor = mobilefacenetRes as number[]; (descRes as DescRes).descriptor = mobilefacenetRes as number[];
} }
if (instance.config.face['insightface']?.enabled && insightfaceRes) { // override descriptor if insightface model is used
(descRes as DescRes).descriptor = insightfaceRes as number[];
}
// calculate iris distance // calculate iris distance
// iris: array[ center, left, top, right, bottom] // iris: array[ center, left, top, right, bottom]
if (!instance.config.face.iris?.enabled) { if (!instance.config.face.iris?.enabled) {

55
src/face/insightface.ts Normal file
View File

@ -0,0 +1,55 @@
/**
* InsightFace model implementation
*
* Based on: [**DeepInsight InsightFace**](https://github.com/deepinsight/insightface)
*
* Alternative face embedding detection
*/
import { log, now } from '../util/util';
import * as tf from '../../dist/tfjs.esm.js';
import { loadModel } from '../tfjs/load';
import type { Tensor, GraphModel } from '../tfjs/types';
import type { Config } from '../config';
import { env } from '../util/env';
let model: GraphModel | null;
const last: Array<number[]> = [];
let lastCount = 0;
let lastTime = 0;
let skipped = Number.MAX_SAFE_INTEGER;
export async function load(config: Config): Promise<GraphModel> {
if (env.initial) model = null;
if (!model) model = await loadModel(config.face['insightface'].modelPath);
else if (config.debug) log('cached model:', model['modelUrl']);
return model;
}
export async function predict(input: Tensor, config: Config, idx, count): Promise<number[]> {
if (!model) return [];
const skipFrame = skipped < (config.face['insightface']?.skipFrames || 0);
const skipTime = (config.face['insightface']?.skipTime || 0) > (now() - lastTime);
if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {
skipped++;
return last[idx];
}
return new Promise(async (resolve) => {
let data: Array<number> = [];
if (config.face['insightface']?.enabled && model?.inputs[0].shape) {
const t: Record<string, Tensor> = {};
t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model
// do a tight crop of image and resize it to fit the model
// const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right
// t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);
t.data = model?.execute(t.crop) as Tensor;
const output = await t.data.data();
data = Array.from(output); // convert typed array to simple array
Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
}
last[idx] = data;
lastCount = count;
lastTime = now();
resolve(data);
});
}

View File

@ -54,13 +54,13 @@ export function similarity(descriptor1: Descriptor, descriptor2: Descriptor, opt
* - `similarity` calculated normalized `similarity` of given descriptor to the best match * - `similarity` calculated normalized `similarity` of given descriptor to the best match
*/ */
export function match(descriptor: Descriptor, descriptors: Array<Descriptor>, options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) { export function match(descriptor: Descriptor, descriptors: Array<Descriptor>, options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) {
if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0 || descriptor.length !== descriptors[0].length) { // validate input if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0) { // validate input
return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 }; return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 };
} }
let lowestDistance = Number.MAX_SAFE_INTEGER; let lowestDistance = Number.MAX_SAFE_INTEGER;
let index = -1; let index = -1;
for (let i = 0; i < descriptors.length; i++) { for (let i = 0; i < descriptors.length; i++) {
const res = distance(descriptor, descriptors[i], options); const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options) : Number.MAX_SAFE_INTEGER;
if (res < lowestDistance) { if (res < lowestDistance) {
lowestDistance = res; lowestDistance = res;
index = i; index = i;

View File

@ -1,5 +1,5 @@
/** /**
* EfficientPose model implementation * MobileFaceNet model implementation
* *
* Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace) * Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace)
* *
@ -46,15 +46,15 @@ const contrast = merge.sub(mean).mul(factor).add(mean);
export async function predict(input: Tensor, config: Config, idx, count): Promise<number[]> { export async function predict(input: Tensor, config: Config, idx, count): Promise<number[]> {
if (!model) return []; if (!model) return [];
const skipFrame = skipped < (config.face['embedding']?.skipFrames || 0); const skipFrame = skipped < (config.face['mobilefacenet']?.skipFrames || 0);
const skipTime = (config.face['embedding']?.skipTime || 0) > (now() - lastTime); const skipTime = (config.face['mobilefacenet']?.skipTime || 0) > (now() - lastTime);
if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) { if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {
skipped++; skipped++;
return last[idx]; return last[idx];
} }
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
let data: Array<number> = []; let data: Array<number> = [];
if (config.face['embedding']?.enabled && model?.inputs[0].shape) { if (config.face['mobilefacenet']?.enabled && model?.inputs[0].shape) {
const t: Record<string, Tensor> = {}; const t: Record<string, Tensor> = {};
t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model
// do a tight crop of image and resize it to fit the model // do a tight crop of image and resize it to fit the model
@ -75,6 +75,7 @@ export async function predict(input: Tensor, config: Config, idx, count): Promis
*/ */
const output = await t.data.data(); const output = await t.data.data();
data = Array.from(output); // convert typed array to simple array data = Array.from(output); // convert typed array to simple array
Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
} }
last[idx] = data; last[idx] = data;
lastCount = count; lastCount = count;

View File

@ -14,6 +14,7 @@ import * as centernet from './object/centernet';
import * as efficientpose from './body/efficientpose'; import * as efficientpose from './body/efficientpose';
import * as emotion from './gear/emotion'; import * as emotion from './gear/emotion';
import * as mobilefacenet from './face/mobilefacenet'; import * as mobilefacenet from './face/mobilefacenet';
import * as insightface from './face/insightface';
import * as facemesh from './face/facemesh'; import * as facemesh from './face/facemesh';
import * as faceres from './face/faceres'; import * as faceres from './face/faceres';
import * as handpose from './hand/handpose'; import * as handpose from './hand/handpose';
@ -42,6 +43,7 @@ export class Models {
centernet: null | GraphModel | Promise<GraphModel> = null; centernet: null | GraphModel | Promise<GraphModel> = null;
efficientpose: null | GraphModel | Promise<GraphModel> = null; efficientpose: null | GraphModel | Promise<GraphModel> = null;
mobilefacenet: null | GraphModel | Promise<GraphModel> = null; mobilefacenet: null | GraphModel | Promise<GraphModel> = null;
insightface: null | GraphModel | Promise<GraphModel> = null;
emotion: null | GraphModel | Promise<GraphModel> = null; emotion: null | GraphModel | Promise<GraphModel> = null;
facedetect: null | GraphModel | Promise<GraphModel> = null; facedetect: null | GraphModel | Promise<GraphModel> = null;
faceiris: null | GraphModel | Promise<GraphModel> = null; faceiris: null | GraphModel | Promise<GraphModel> = null;
@ -131,6 +133,7 @@ export async function load(instance: Human): Promise<void> {
if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetgender) instance.models.ssrnetgender = ssrnetGender.load(instance.config); if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetgender) instance.models.ssrnetgender = ssrnetGender.load(instance.config);
// @ts-ignore optional model // @ts-ignore optional model
if (instance.config.face.enabled && instance.config.face['mobilefacenet']?.enabled && !instance.models.mobilefacenet) instance.models.mobilefacenet = mobilefacenet.load(instance.config); if (instance.config.face.enabled && instance.config.face['mobilefacenet']?.enabled && !instance.models.mobilefacenet) instance.models.mobilefacenet = mobilefacenet.load(instance.config);
if (instance.config.face.enabled && instance.config.face['insightface']?.enabled && !instance.models.insightface) instance.models.insightface = insightface.load(instance.config);
if (instance.config.hand.enabled && !instance.models.handtrack && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handtrack = handtrack.loadDetect(instance.config); if (instance.config.hand.enabled && !instance.models.handtrack && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handtrack = handtrack.loadDetect(instance.config);
if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handskeleton = handtrack.loadSkeleton(instance.config); if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handskeleton = handtrack.loadSkeleton(instance.config);
if (instance.config.object.enabled && !instance.models.centernet && instance.config.object?.modelPath?.includes('centernet')) instance.models.centernet = centernet.load(instance.config); if (instance.config.object.enabled && !instance.models.centernet && instance.config.object?.modelPath?.includes('centernet')) instance.models.centernet = centernet.load(instance.config);

View File

@ -36,14 +36,14 @@ async function process(res: Tensor[], outputShape: [number, number], config: Con
let results: Array<ObjectResult> = []; let results: Array<ObjectResult> = [];
for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects
// find scores, boxes, classes // find scores, boxes, classes
tf.tidy(async () => { // wrap in tidy to automatically deallocate temp tensors
const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704 const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704
// find boxes and scores output depending on stride // find boxes and scores output depending on stride
const scoresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length))); const scoresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length)));
const featuresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)));
const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride
const boxIdx = await boxesMax.argMax(2).array(); // what we need is indexes of features with highest scores, not values itself
const scores = await scoresT.array(); // optionally use exponential scores or just as-is const scores = await scoresT.array(); // optionally use exponential scores or just as-is
const featuresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)));
const boxesMaxT = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride
const boxIdxT = boxesMaxT.argMax(2); // what we need is indexes of features with highest scores, not values itself
const boxIdx = await boxIdxT.array(); // what we need is indexes of features with highest scores, not values itself
for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix) for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)
for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class
const score = scores[i][j]; // get score for current position const score = scores[i][j]; // get score for current position
@ -82,10 +82,8 @@ async function process(res: Tensor[], outputShape: [number, number], config: Con
} }
} }
} }
}); tf.dispose([scoresT, featuresT, boxesMaxT, boxIdxT]);
} }
// deallocate tensors
res.forEach((t) => tf.dispose(t));
// normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of
// unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered) // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)
@ -117,19 +115,17 @@ export async function predict(image: Tensor, config: Config): Promise<ObjectResu
if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last; if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last;
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const outputSize = [image.shape[2] || 0, image.shape[1] || 0]; const outputSize = [image.shape[2] || 0, image.shape[1] || 0];
const resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false); const resizeT = tf.image.resizeBilinear(image, [inputSize, inputSize], false);
const norm = tf.div(resize, constants.tf255); const normT = tf.div(resizeT, constants.tf255);
const transpose = norm.transpose([0, 3, 1, 2]); const transposeT = tf.transpose(normT, [0, 3, 1, 2]);
tf.dispose(norm);
tf.dispose(resize);
let objectT; let objectT;
if (config.object.enabled) objectT = model.execute(transpose); if (config.object.enabled) objectT = model.execute(transposeT);
lastTime = now(); lastTime = now();
tf.dispose(transpose);
const obj = await process(objectT as Tensor[], outputSize as [number, number], config); const obj = await process(objectT as Tensor[], outputSize as [number, number], config);
last = obj; last = obj;
tf.dispose([resizeT, normT, transposeT, ...objectT]);
resolve(obj); resolve(obj);
}); });
} }

View File

@ -1,24 +1,24 @@
2022-08-04 09:11:15 INFO:  Application: {"name":"@vladmandic/human","version":"2.9.1"} 2022-08-08 15:08:28 INFO:  Application: {"name":"@vladmandic/human","version":"2.9.2"}
2022-08-04 09:11:15 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} 2022-08-08 15:08:28 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
2022-08-04 09:11:15 INFO:  Toolchain: {"build":"0.7.8","esbuild":"0.14.53","typescript":"4.7.4","typedoc":"0.23.10","eslint":"8.21.0"} 2022-08-08 15:08:28 INFO:  Toolchain: {"build":"0.7.8","esbuild":"0.14.54","typescript":"4.7.4","typedoc":"0.23.10","eslint":"8.21.0"}
2022-08-04 09:11:15 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} 2022-08-08 15:08:28 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
2022-08-04 09:11:15 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]} 2022-08-08 15:08:28 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]}
2022-08-04 09:11:15 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":608} 2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":608}
2022-08-04 09:11:15 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":74,"inputBytes":649269,"outputBytes":304361} 2022-08-08 15:08:28 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":652676,"outputBytes":305745}
2022-08-04 09:11:15 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":612} 2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":612}
2022-08-04 09:11:15 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":74,"inputBytes":649273,"outputBytes":304365} 2022-08-08 15:08:28 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":652680,"outputBytes":305749}
2022-08-04 09:11:15 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":664} 2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":664}
2022-08-04 09:11:15 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":74,"inputBytes":649325,"outputBytes":304415} 2022-08-08 15:08:28 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":652732,"outputBytes":305799}
2022-08-04 09:11:15 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":358} 2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":358}
2022-08-04 09:11:15 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1032,"outputBytes":583} 2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1032,"outputBytes":583}
2022-08-04 09:11:15 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":74,"inputBytes":649244,"outputBytes":303238} 2022-08-08 15:08:28 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652651,"outputBytes":304598}
2022-08-04 09:11:15 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":1271,"outputBytes":2787569} 2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":1271,"outputBytes":2787569}
2022-08-04 09:11:15 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":74,"inputBytes":3436230,"outputBytes":1666096} 2022-08-08 15:08:29 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3439637,"outputBytes":1667460}
2022-08-04 09:11:16 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":74,"inputBytes":3436230,"outputBytes":3066923} 2022-08-08 15:08:29 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3439637,"outputBytes":3069462}
2022-08-04 09:11:22 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":30} 2022-08-08 15:08:36 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":30}
2022-08-04 09:11:25 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} 2022-08-08 15:08:38 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true}
2022-08-04 09:11:25 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6787,"outputBytes":3141} 2022-08-08 15:08:38 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6787,"outputBytes":3141}
2022-08-04 09:11:25 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15174,"outputBytes":7604} 2022-08-08 15:08:38 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":7798}
2022-08-04 09:11:35 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":107,"errors":0,"warnings":0} 2022-08-08 15:08:47 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":108,"errors":0,"warnings":0}
2022-08-04 09:11:35 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} 2022-08-08 15:08:47 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
2022-08-04 09:11:35 INFO:  Done... 2022-08-08 15:08:47 INFO:  Done...

View File

@ -5,11 +5,12 @@ const { fork } = require('child_process');
const log = require('@vladmandic/pilogger'); const log = require('@vladmandic/pilogger');
let logFile = 'test.log'; let logFile = 'test.log';
log.configure({ inspect: { breakLength: 500 } });
const tests = [ const tests = [
'test-node.js', 'test-node.js',
'test-node-gpu.js', // 'test-node-gpu.js',
'test-node-wasm.js', // 'test-node-wasm.js',
]; ];
const demos = [ const demos = [

View File

@ -254,7 +254,7 @@ async function test(Human, inputConfig) {
await human.load(); await human.load();
const models = Object.keys(human.models).map((model) => ({ name: model, loaded: (human.models[model] !== null), url: human.models[model] ? human.models[model].modelUrl : null })); const models = Object.keys(human.models).map((model) => ({ name: model, loaded: (human.models[model] !== null), url: human.models[model] ? human.models[model].modelUrl : null }));
const loaded = models.filter((model) => model.loaded); const loaded = models.filter((model) => model.loaded);
if (models.length === 22 && loaded.length === 12) log('state', 'passed: models loaded', models.length, loaded.length, models); if (models.length === 23 && loaded.length === 12) log('state', 'passed: models loaded', models.length, loaded.length, models);
else log('error', 'failed: models loaded', models.length, loaded.length, models); else log('error', 'failed: models loaded', models.length, loaded.length, models);
// increase defaults // increase defaults
@ -292,7 +292,7 @@ async function test(Human, inputConfig) {
human.reset(); human.reset();
config.async = true; config.async = true;
config.cacheSensitivity = 0; config.cacheSensitivity = 0;
res = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); res = await testDetect(human, 'samples/in/ai-body.jpg', 'async');
if (!res || res?.face?.length !== 1 || res?.face[0].gender !== 'female') log('error', 'failed: default result face mismatch', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore); if (!res || res?.face?.length !== 1 || res?.face[0].gender !== 'female') log('error', 'failed: default result face mismatch', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore);
else log('state', 'passed: default result face match', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore); else log('state', 'passed: default result face match', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore);
@ -301,7 +301,7 @@ async function test(Human, inputConfig) {
human.reset(); human.reset();
config.async = false; config.async = false;
config.cacheSensitivity = 0; config.cacheSensitivity = 0;
res = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); res = await testDetect(human, 'samples/in/ai-body.jpg', 'sync');
if (!res || res?.face?.length !== 1 || res?.face[0].gender !== 'female') log('error', 'failed: default sync', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore); if (!res || res?.face?.length !== 1 || res?.face[0].gender !== 'female') log('error', 'failed: default sync', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore);
else log('state', 'passed: default sync', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore); else log('state', 'passed: default sync', res?.face?.length, res?.face[0].gender, res?.face[0].genderScore);
@ -319,21 +319,25 @@ async function test(Human, inputConfig) {
else log('state', 'passed: invalid input', res.error || res); else log('state', 'passed: invalid input', res.error || res);
// test face attention // test face attention
/*
log('info', 'test face attention'); log('info', 'test face attention');
config.face.mesh = { enabled: true };
res = await testDetect(human, 'samples/in/ai-face.jpg', 'face mesh');
if (!res || !res.face[0] || res.face[0].mesh.length !== 478 || Object.keys(res.face[0].annotations).length !== 36) log('error', 'failed: face mesh', { mesh: res.face[0]?.mesh?.length, annotations: Object.keys(res.face[0].annotations).length });
else log('state', 'passed: face attention');
human.models.facemesh = null; // unload model human.models.facemesh = null; // unload model
config.face.attention = { enabled: true }; config.face.attention = { enabled: true };
res = await testDetect(human, 'samples/in/ai-face.jpg', 'default'); res = await testDetect(human, 'samples/in/ai-face.jpg', 'face attention');
*/ if (!res || !res.face[0] || res.face[0].mesh.length !== 478 || Object.keys(res.face[0].annotations).length !== 36) log('error', 'failed: face attention', { mesh: res.face[0]?.mesh?.length, annotations: Object.keys(res.face[0].annotations).length });
else log('state', 'passed: face attention');
// test face similarity // test face similarity
log('info', 'test face similarity'); log('info', 'test face similarity');
human.reset(); human.reset();
config.async = false; config.async = false;
config.cacheSensitivity = 0; config.cacheSensitivity = 0;
let res1 = await testDetect(human, 'samples/in/ai-face.jpg', 'default'); let res1 = await testDetect(human, 'samples/in/ai-face.jpg', 'face similarity');
let res2 = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); let res2 = await testDetect(human, 'samples/in/ai-body.jpg', 'face similarity');
let res3 = await testDetect(human, 'samples/in/ai-upper.jpg', 'default'); let res3 = await testDetect(human, 'samples/in/ai-upper.jpg', 'face similarity');
const desc1 = res1 && res1.face && res1.face[0] && res1.face[0].embedding ? [...res1.face[0].embedding] : null; const desc1 = res1 && res1.face && res1.face[0] && res1.face[0].embedding ? [...res1.face[0].embedding] : null;
const desc2 = res2 && res2.face && res2.face[0] && res2.face[0].embedding ? [...res2.face[0].embedding] : null; const desc2 = res2 && res2.face && res2.face[0] && res2.face[0].embedding ? [...res2.face[0].embedding] : null;
const desc3 = res3 && res3.face && res3.face[0] && res3.face[0].embedding ? [...res3.face[0].embedding] : null; const desc3 = res3 && res3.face && res3.face[0] && res3.face[0].embedding ? [...res3.face[0].embedding] : null;
@ -345,6 +349,20 @@ async function test(Human, inputConfig) {
if (res1 < 1 || res2 < 0.40 || res3 < 0.40 || res2 > 0.75 || res3 > 0.75) log('error', 'failed: face similarity', { similarity: [res1, res2, res3], descriptors: [desc1?.length, desc2?.length, desc3?.length] }); if (res1 < 1 || res2 < 0.40 || res3 < 0.40 || res2 > 0.75 || res3 > 0.75) log('error', 'failed: face similarity', { similarity: [res1, res2, res3], descriptors: [desc1?.length, desc2?.length, desc3?.length] });
else log('state', 'passed: face similarity', { similarity: [res1, res2, res3], descriptors: [desc1?.length, desc2?.length, desc3?.length] }); else log('state', 'passed: face similarity', { similarity: [res1, res2, res3], descriptors: [desc1?.length, desc2?.length, desc3?.length] });
// test alternative face embeddings
log('info', 'test face similarity alternative');
human.reset();
config.async = false;
config.cacheSensitivity = 0;
config.face['mobilefacenet'] = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' };
res = await testDetect(human, 'samples/in/ai-face.jpg', 'face embeddings');
if (!res || !res.face || !res.face[0] || res.face[0].embedding.length !== 192) log('error', 'failed: mobilefacenet', { embedding: res.face[0]?.embedding?.length });
else log('state', 'passed: mobilefacenet');
config.face['insightface'] = { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' };
res = await testDetect(human, 'samples/in/ai-face.jpg', 'face embeddings');
if (!res || !res.face || !res.face[0] || res.face[0].embedding.length !== 512) log('error', 'failed: insightface', { embedding: res.face[0]?.embedding?.length });
else log('state', 'passed: insightface');
// test face matching // test face matching
log('info', 'test face matching'); log('info', 'test face matching');
const db = JSON.parse(fs.readFileSync('demo/facematch/faces.json').toString()); const db = JSON.parse(fs.readFileSync('demo/facematch/faces.json').toString());
@ -360,10 +378,16 @@ async function test(Human, inputConfig) {
// test object detection // test object detection
log('info', 'test object'); log('info', 'test object');
human.reset(); human.reset();
config.object = { enabled: true }; config.object = { enabled: true, modelPath: 'mb3-centernet.json' };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); res = await testDetect(human, 'samples/in/ai-body.jpg', 'object');
if (!res || res?.object?.length !== 1 || res?.object[0]?.label !== 'person') log('error', 'failed: object result mismatch', res?.object?.length); if (!res || res?.object?.length < 1 || res?.object[0]?.label !== 'person') log('error', 'failed: centernet', res?.object);
else log('state', 'passed: object result match'); else log('state', 'passed: centernet');
config.object = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/nanodet.json' };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'object');
if (!res || res?.object?.length < 1 || res?.object[0]?.label !== 'person') log('error', 'failed: nanodet', res?.object);
else log('state', 'passed: nanodet');
config.object.enabled = false;
// test sensitive config // test sensitive config
log('info', 'test sensitive'); log('info', 'test sensitive');
@ -372,7 +396,7 @@ async function test(Human, inputConfig) {
config.face = { detector: { minConfidence: 0.0001, maxDetected: 1 } }; config.face = { detector: { minConfidence: 0.0001, maxDetected: 1 } };
config.body = { minConfidence: 0.0001 }; config.body = { minConfidence: 0.0001 };
config.hand = { minConfidence: 0.0001 }; config.hand = { minConfidence: 0.0001 };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); res = await testDetect(human, 'samples/in/ai-body.jpg', 'sensitive');
if (!res || res?.face?.length !== 1 || res?.body?.length !== 1 || res?.hand?.length !== 2 || res?.gesture?.length < 8) log('error', 'failed: sensitive result mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length); if (!res || res?.face?.length !== 1 || res?.body?.length !== 1 || res?.hand?.length !== 2 || res?.gesture?.length < 8) log('error', 'failed: sensitive result mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length);
else log('state', 'passed: sensitive result match'); else log('state', 'passed: sensitive result match');
@ -394,13 +418,39 @@ async function test(Human, inputConfig) {
if (!hand || hand?.box?.length !== 4 || hand?.keypoints?.length !== 21) log('error', 'failed: sensitive hand result mismatch', hand?.keypoints?.length); if (!hand || hand?.box?.length !== 4 || hand?.keypoints?.length !== 21) log('error', 'failed: sensitive hand result mismatch', hand?.keypoints?.length);
else log('state', 'passed: sensitive hand result match'); else log('state', 'passed: sensitive hand result match');
// test body alternatives
log('info', 'test body');
human.reset();
config.async = false;
config.cacheSensitivity = 0;
config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/blazepose-heavy.json' };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'blazepose');
if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 39) log('error', 'failed: blazepose', { body: res.body[0] });
else log('state', 'passed: blazepose');
config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/efficientpose.json' };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'efficientpose');
if (!res || !res.body || !res.body[0] || res.body[0].score < 0.7 || res.body[0].keypoints?.length !== 13) log('error', 'failed: efficientpose', { body: res.body[0] });
else log('state', 'passed: efficientpose');
config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/posenet.json' };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'posenet');
if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 16) log('error', 'failed: posenet', { body: res.body[0] });
else log('state', 'passed: posenet');
config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/movenet-lightning.json' };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'movenet');
if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 17) log('error', 'failed: movenet', { body: res.body[0] });
else log('state', 'passed: movenet');
// test detectors only // test detectors only
log('info', 'test detectors'); log('info', 'test detectors');
human.reset(); human.reset();
config.face = { mesh: { enabled: false }, iris: { enabled: false }, description: { enabled: false }, emotion: { enabled: false } }; config.face = { mesh: { enabled: false }, iris: { enabled: false }, description: { enabled: false }, emotion: { enabled: false } };
config.hand = { landmarks: false }; config.hand = { landmarks: false };
res = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); res = await testDetect(human, 'samples/in/ai-body.jpg', 'detectors');
if (!res || res?.face?.length !== 1 || res?.face[0]?.gender || res?.face[0]?.age || res?.face[0]?.embedding) log('error', 'failed: detectors result face mismatch', res?.face); if (!res || res?.face?.length !== 1 || res?.face[0]?.gender !== 'unknown' || res?.face[0]?.age || res?.face[0]?.embedding?.length > 0) log('error', 'failed: detectors result face mismatch', res?.face);
else log('state', 'passed: detector result face match'); else log('state', 'passed: detector result face match');
if (!res || res?.hand?.length !== 1 || res?.hand[0]?.landmarks?.length > 0) log('error', 'failed: detectors result hand mismatch', res?.hand?.length); if (!res || res?.hand?.length !== 1 || res?.hand[0]?.landmarks?.length > 0) log('error', 'failed: detectors result hand mismatch', res?.hand?.length);
else log('state', 'passed: detector result hand match'); else log('state', 'passed: detector result hand match');
@ -409,24 +459,24 @@ async function test(Human, inputConfig) {
log('info', 'test: multi-instance'); log('info', 'test: multi-instance');
const first = new Human(config); const first = new Human(config);
const second = new Human(config); const second = new Human(config);
await testDetect(human, null, 'default'); await testDetect(human, null, 'multi instance');
log('info', 'test: first instance'); log('info', 'test: first instance');
await testDetect(first, 'samples/in/ai-upper.jpg', 'default'); await testDetect(first, 'samples/in/ai-upper.jpg', 'multi instance');
log('info', 'test: second instance'); log('info', 'test: second instance');
await testDetect(second, 'samples/in/ai-upper.jpg', 'default'); await testDetect(second, 'samples/in/ai-upper.jpg', 'multi instance');
// test async multiple instances // test async multiple instances
log('info', 'test: concurrent'); log('info', 'test: concurrent');
await Promise.all([ await Promise.all([
testDetect(human, 'samples/in/ai-face.jpg', 'default', false), testDetect(human, 'samples/in/ai-face.jpg', 'concurrent', false),
testDetect(first, 'samples/in/ai-face.jpg', 'default', false), testDetect(first, 'samples/in/ai-face.jpg', 'concurrent', false),
testDetect(second, 'samples/in/ai-face.jpg', 'default', false), testDetect(second, 'samples/in/ai-face.jpg', 'concurrent', false),
testDetect(human, 'samples/in/ai-body.jpg', 'default', false), testDetect(human, 'samples/in/ai-body.jpg', 'concurrent', false),
testDetect(first, 'samples/in/ai-body.jpg', 'default', false), testDetect(first, 'samples/in/ai-body.jpg', 'concurrent', false),
testDetect(second, 'samples/in/ai-body.jpg', 'default', false), testDetect(second, 'samples/in/ai-body.jpg', 'concurrent', false),
testDetect(human, 'samples/in/ai-upper.jpg', 'default', false), testDetect(human, 'samples/in/ai-upper.jpg', 'concurrent', false),
testDetect(first, 'samples/in/ai-upper.jpg', 'default', false), testDetect(first, 'samples/in/ai-upper.jpg', 'concurrent', false),
testDetect(second, 'samples/in/ai-upper.jpg', 'default', false), testDetect(second, 'samples/in/ai-upper.jpg', 'concurrent', false),
]); ]);
// test monkey-patch // test monkey-patch

View File

@ -1,684 +1,298 @@
2022-08-04 09:13:03 INFO:  @vladmandic/human version 2.9.1 2022-08-08 15:09:00 INFO:  @vladmandic/human version 2.9.2
2022-08-04 09:13:03 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.15.0 2022-08-08 15:09:00 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.15.0
2022-08-04 09:13:03 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] 2022-08-08 15:09:00 INFO:  tests: ["test-node.js"]
2022-08-04 09:13:03 INFO:  demos: ["../demo/nodejs/node.js","../demo/nodejs/node-canvas.js","../demo/nodejs/node-env.js","../demo/nodejs/node-event.js","../demo/nodejs/node-multiprocess.js"] 2022-08-08 15:09:00 INFO:  demos: ["../demo/nodejs/node.js","../demo/nodejs/node-canvas.js","../demo/nodejs/node-env.js","../demo/nodejs/node-event.js","../demo/nodejs/node-multiprocess.js"]
2022-08-04 09:13:03 INFO:  2022-08-08 15:09:00 INFO: 
2022-08-04 09:13:03 INFO:  test-node.js start 2022-08-08 15:09:00 INFO:  test-node.js start
2022-08-04 09:13:03 INFO:  test-node.js test: configuration validation 2022-08-08 15:09:00 INFO:  test-node.js test: configuration validation
2022-08-04 09:13:03 STATE: test-node.js passed: configuration default validation [] 2022-08-08 15:09:00 STATE: test-node.js passed: configuration default validation []
2022-08-04 09:13:03 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] 2022-08-08 15:09:00 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2022-08-04 09:13:03 INFO:  test-node.js test: model load 2022-08-08 15:09:00 INFO:  test-node.js test: model load
2022-08-04 09:13:04 STATE: test-node.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] 2022-08-08 15:09:00 STATE: test-node.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}]
2022-08-04 09:13:04 INFO:  test-node.js test: warmup 2022-08-08 15:09:00 INFO:  test-node.js test: warmup
2022-08-04 09:13:04 STATE: test-node.js passed: create human 2022-08-08 15:09:00 STATE: test-node.js passed: create human
2022-08-04 09:13:04 INFO:  test-node.js human version: 2.9.1 2022-08-08 15:09:00 INFO:  test-node.js human version: 2.9.2
2022-08-04 09:13:04 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.15.0 2022-08-08 15:09:00 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.15.0
2022-08-04 09:13:04 INFO:  test-node.js tfjs version: 3.19.0 2022-08-08 15:09:00 INFO:  test-node.js tfjs version: 3.19.0
2022-08-04 09:13:04 INFO:  test-node.js tensorflow binding version: 2.7.3-dev20220521 2022-08-08 15:09:00 INFO:  test-node.js tensorflow binding version: 2.7.3-dev20220521
2022-08-04 09:13:04 STATE: test-node.js passed: set backend: tensorflow 2022-08-08 15:09:00 STATE: test-node.js passed: set backend: tensorflow
2022-08-04 09:13:04 STATE: test-node.js tensors 1921 2022-08-08 15:09:00 STATE: test-node.js tensors 1921
2022-08-04 09:13:04 STATE: test-node.js passed: load models 2022-08-08 15:09:00 STATE: test-node.js passed: load models
2022-08-04 09:13:04 STATE: test-node.js result: defined models: 22 loaded models: 12 2022-08-08 15:09:00 STATE: test-node.js result: defined models: 23 loaded models: 12
2022-08-04 09:13:04 STATE: test-node.js passed: warmup: none default 2022-08-08 15:09:00 STATE: test-node.js passed: warmup: none default
2022-08-04 09:13:04 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} 2022-08-08 15:09:00 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
2022-08-04 09:13:04 DATA:  test-node.js result: performance: load: null total: null 2022-08-08 15:09:00 DATA:  test-node.js result: performance: load: null total: null
2022-08-04 09:13:04 STATE: test-node.js passed: warmup none result match 2022-08-08 15:09:00 STATE: test-node.js passed: warmup none result match
2022-08-04 09:13:04 STATE: test-node.js event: image 2022-08-08 15:09:00 STATE: test-node.js event: image
2022-08-04 09:13:04 STATE: test-node.js event: detect 2022-08-08 15:09:00 STATE: test-node.js event: detect
2022-08-04 09:13:04 STATE: test-node.js event: warmup 2022-08-08 15:09:00 STATE: test-node.js event: warmup
2022-08-04 09:13:04 STATE: test-node.js passed: warmup: face default 2022-08-08 15:09:00 STATE: test-node.js passed: warmup: face default
2022-08-04 09:13:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} 2022-08-08 15:09:00 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
2022-08-04 09:13:04 DATA:  test-node.js result: performance: load: null total: 354 2022-08-08 15:09:00 DATA:  test-node.js result: performance: load: null total: 361
2022-08-04 09:13:04 STATE: test-node.js passed: warmup face result match 2022-08-08 15:09:00 STATE: test-node.js passed: warmup face result match
2022-08-04 09:13:04 STATE: test-node.js event: image 2022-08-08 15:09:00 STATE: test-node.js event: image
2022-08-04 09:13:04 STATE: test-node.js event: detect 2022-08-08 15:09:01 STATE: test-node.js event: detect
2022-08-04 09:13:04 STATE: test-node.js event: warmup 2022-08-08 15:09:01 STATE: test-node.js event: warmup
2022-08-04 09:13:04 STATE: test-node.js passed: warmup: body default 2022-08-08 15:09:01 STATE: test-node.js passed: warmup: body default
2022-08-04 09:13:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:01 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:04 DATA:  test-node.js result: performance: load: null total: 270 2022-08-08 15:09:01 DATA:  test-node.js result: performance: load: null total: 270
2022-08-04 09:13:04 STATE: test-node.js passed: warmup body result match 2022-08-08 15:09:01 STATE: test-node.js passed: warmup body result match
2022-08-04 09:13:04 STATE: test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} 2022-08-08 15:09:01 STATE: test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
2022-08-04 09:13:04 INFO:  test-node.js test: details verification 2022-08-08 15:09:01 INFO:  test-node.js test: details verification
2022-08-04 09:13:04 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:01 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:04 STATE: test-node.js event: image 2022-08-08 15:09:01 STATE: test-node.js event: image
2022-08-04 09:13:05 STATE: test-node.js event: detect 2022-08-08 15:09:01 STATE: test-node.js event: detect
2022-08-04 09:13:05 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:01 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:01 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:05 DATA:  test-node.js result: performance: load: null total: 248 2022-08-08 15:09:01 DATA:  test-node.js result: performance: load: null total: 257
2022-08-04 09:13:05 STATE: test-node.js passed: details face length 1 2022-08-08 15:09:01 STATE: test-node.js passed: details face length 1
2022-08-04 09:13:05 STATE: test-node.js passed: details face score 1 0.93 1 2022-08-08 15:09:01 STATE: test-node.js passed: details face score 1 0.93 1
2022-08-04 09:13:05 STATE: test-node.js passed: details face age/gender 23.7 female 0.97 85.47 2022-08-08 15:09:01 STATE: test-node.js passed: details face age/gender 23.7 female 0.97 85.47
2022-08-04 09:13:05 STATE: test-node.js passed: details face arrays 4 478 1024 2022-08-08 15:09:01 STATE: test-node.js passed: details face arrays 4 478 1024
2022-08-04 09:13:05 STATE: test-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} 2022-08-08 15:09:01 STATE: test-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
2022-08-04 09:13:05 STATE: test-node.js passed: details face anti-spoofing 0.79 2022-08-08 15:09:01 STATE: test-node.js passed: details face anti-spoofing 0.79
2022-08-04 09:13:05 STATE: test-node.js passed: details face liveness 0.83 2022-08-08 15:09:01 STATE: test-node.js passed: details face liveness 0.83
2022-08-04 09:13:05 STATE: test-node.js passed: details body length 1 2022-08-08 15:09:01 STATE: test-node.js passed: details body length 1
2022-08-04 09:13:05 STATE: test-node.js passed: details body 0.92 17 6 2022-08-08 15:09:01 STATE: test-node.js passed: details body 0.92 17 6
2022-08-04 09:13:05 STATE: test-node.js passed: details hand length 1 2022-08-08 15:09:01 STATE: test-node.js passed: details hand length 1
2022-08-04 09:13:05 STATE: test-node.js passed: details hand 0.51 0.73 point 2022-08-08 15:09:01 STATE: test-node.js passed: details hand 0.51 0.73 point
2022-08-04 09:13:05 STATE: test-node.js passed: details hand arrays 21 5 7 2022-08-08 15:09:01 STATE: test-node.js passed: details hand arrays 21 5 7
2022-08-04 09:13:05 STATE: test-node.js passed: details gesture length 7 2022-08-08 15:09:01 STATE: test-node.js passed: details gesture length 7
2022-08-04 09:13:05 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"} 2022-08-08 15:09:01 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"}
2022-08-04 09:13:05 STATE: test-node.js passed: details object length 1 2022-08-08 15:09:01 STATE: test-node.js passed: details object length 1
2022-08-04 09:13:05 STATE: test-node.js passed: details object 0.72 person 2022-08-08 15:09:01 STATE: test-node.js passed: details object 0.72 person
2022-08-04 09:13:05 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} 2022-08-08 15:09:01 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
2022-08-04 09:13:05 STATE: test-node.js event: image 2022-08-08 15:09:01 STATE: test-node.js event: image
2022-08-04 09:13:05 STATE: test-node.js event: detect 2022-08-08 15:09:02 STATE: test-node.js event: detect
2022-08-04 09:13:05 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 2022-08-08 15:09:02 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32
2022-08-04 09:13:05 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} 2022-08-08 15:09:02 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
2022-08-04 09:13:05 STATE: test-node.js event: image 2022-08-08 15:09:02 STATE: test-node.js event: image
2022-08-04 09:13:06 STATE: test-node.js event: detect 2022-08-08 15:09:02 STATE: test-node.js event: detect
2022-08-04 09:13:06 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32 2022-08-08 15:09:02 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32
2022-08-04 09:13:06 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:02 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:06 STATE: test-node.js event: image 2022-08-08 15:09:02 STATE: test-node.js event: image
2022-08-04 09:13:06 STATE: test-node.js event: detect 2022-08-08 15:09:03 STATE: test-node.js event: detect
2022-08-04 09:13:06 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 2022-08-08 15:09:03 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32
2022-08-04 09:13:06 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:03 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:06 STATE: test-node.js event: image 2022-08-08 15:09:03 STATE: test-node.js event: image
2022-08-04 09:13:06 STATE: test-node.js event: detect 2022-08-08 15:09:03 STATE: test-node.js event: detect
2022-08-04 09:13:06 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32 2022-08-08 15:09:03 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32
2022-08-04 09:13:07 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} 2022-08-08 15:09:03 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
2022-08-04 09:13:07 STATE: test-node.js event: image 2022-08-08 15:09:03 STATE: test-node.js event: image
2022-08-04 09:13:07 STATE: test-node.js event: detect 2022-08-08 15:09:03 STATE: test-node.js event: detect
2022-08-04 09:13:07 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 2022-08-08 15:09:03 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32
2022-08-04 09:13:07 INFO:  test-node.js test default 2022-08-08 15:09:03 INFO:  test-node.js test default
2022-08-04 09:13:07 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:07 STATE: test-node.js event: image 2022-08-08 15:09:04 STATE: test-node.js event: image
2022-08-04 09:13:07 STATE: test-node.js event: detect 2022-08-08 15:09:04 STATE: test-node.js event: detect
2022-08-04 09:13:07 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:04 STATE: test-node.js passed: detect: samples/in/ai-body.jpg async
2022-08-04 09:13:07 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:07 DATA:  test-node.js result: performance: load: null total: 212 2022-08-08 15:09:04 DATA:  test-node.js result: performance: load: null total: 248
2022-08-04 09:13:07 STATE: test-node.js passed: default result face match 1 female 0.97 2022-08-08 15:09:04 STATE: test-node.js passed: default result face match 1 female 0.97
2022-08-04 09:13:07 INFO:  test-node.js test sync 2022-08-08 15:09:04 INFO:  test-node.js test sync
2022-08-04 09:13:08 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:08 STATE: test-node.js event: image 2022-08-08 15:09:04 STATE: test-node.js event: image
2022-08-04 09:13:08 STATE: test-node.js event: detect 2022-08-08 15:09:04 STATE: test-node.js event: detect
2022-08-04 09:13:08 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:04 STATE: test-node.js passed: detect: samples/in/ai-body.jpg sync
2022-08-04 09:13:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:08 DATA:  test-node.js result: performance: load: null total: 207 2022-08-08 15:09:04 DATA:  test-node.js result: performance: load: null total: 219
2022-08-04 09:13:08 STATE: test-node.js passed: default sync 1 female 0.97 2022-08-08 15:09:04 STATE: test-node.js passed: default sync 1 female 0.97
2022-08-04 09:13:08 INFO:  test-node.js test: image process 2022-08-08 15:09:04 INFO:  test-node.js test: image process
2022-08-04 09:13:08 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} 2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:08 STATE: test-node.js passed: image input null [1,256,256,3] 2022-08-08 15:09:04 STATE: test-node.js passed: image input null [1,256,256,3]
2022-08-04 09:13:08 INFO:  test-node.js test: image null 2022-08-08 15:09:04 INFO:  test-node.js test: image null
2022-08-04 09:13:08 STATE: test-node.js passed: invalid input could not convert input to tensor 2022-08-08 15:09:04 STATE: test-node.js passed: invalid input could not convert input to tensor
2022-08-04 09:13:08 INFO:  test-node.js test face similarity 2022-08-08 15:09:04 INFO:  test-node.js test face attention
2022-08-04 09:13:08 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} 2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:08 STATE: test-node.js event: image 2022-08-08 15:09:04 STATE: test-node.js event: image
2022-08-04 09:13:08 STATE: test-node.js event: detect 2022-08-08 15:09:04 STATE: test-node.js event: detect
2022-08-04 09:13:08 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default 2022-08-08 15:09:04 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face mesh
2022-08-04 09:13:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} 2022-08-08 15:09:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:08 DATA:  test-node.js result: performance: load: null total: 210 2022-08-08 15:09:04 DATA:  test-node.js result: performance: load: null total: 213
2022-08-04 09:13:08 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:04 STATE: test-node.js passed: face attention
2022-08-04 09:13:08 STATE: test-node.js event: image 2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:08 STATE: test-node.js event: detect 2022-08-08 15:09:04 STATE: test-node.js event: image
2022-08-04 09:13:08 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:05 STATE: test-node.js event: detect
2022-08-04 09:13:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:05 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face attention
2022-08-04 09:13:08 DATA:  test-node.js result: performance: load: null total: 219 2022-08-08 15:09:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:09 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} 2022-08-08 15:09:05 DATA:  test-node.js result: performance: load: null total: 231
2022-08-04 09:13:09 STATE: test-node.js event: image 2022-08-08 15:09:05 STATE: test-node.js passed: face attention
2022-08-04 09:13:09 STATE: test-node.js event: detect 2022-08-08 15:09:05 INFO:  test-node.js test face similarity
2022-08-04 09:13:09 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default 2022-08-08 15:09:05 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:09 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} 2022-08-08 15:09:05 STATE: test-node.js event: image
2022-08-04 09:13:09 DATA:  test-node.js result: performance: load: null total: 199 2022-08-08 15:09:05 STATE: test-node.js event: detect
2022-08-04 09:13:09 STATE: test-node.js passed: face descriptor 2022-08-08 15:09:05 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face similarity
2022-08-04 09:13:09 STATE: test-node.js passed: face similarity {"similarity":[1,0.44727452329649126,0.5567935850640406],"descriptors":[1024,1024,1024]} 2022-08-08 15:09:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:09 INFO:  test-node.js test face matching 2022-08-08 15:09:05 DATA:  test-node.js result: performance: load: null total: 213
2022-08-04 09:13:09 STATE: test-node.js passed: face database 40 2022-08-08 15:09:05 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:09 STATE: test-node.js passed: face match {"first":{"index":4,"similarity":0.7827852615252829}} {"second":{"index":4,"similarity":0.5002052633015844}} {"third":{"index":4,"similarity":0.5401587887998899}} 2022-08-08 15:09:05 STATE: test-node.js event: image
2022-08-04 09:13:09 INFO:  test-node.js test object 2022-08-08 15:09:05 STATE: test-node.js event: detect
2022-08-04 09:13:09 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:05 STATE: test-node.js passed: detect: samples/in/ai-body.jpg face similarity
2022-08-04 09:13:09 STATE: test-node.js event: image 2022-08-08 15:09:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:09 STATE: test-node.js event: detect 2022-08-08 15:09:05 DATA:  test-node.js result: performance: load: null total: 230
2022-08-04 09:13:09 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:05 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
2022-08-04 09:13:09 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:05 STATE: test-node.js event: image
2022-08-04 09:13:09 DATA:  test-node.js result: performance: load: null total: 207 2022-08-08 15:09:06 STATE: test-node.js event: detect
2022-08-04 09:13:09 STATE: test-node.js passed: object result match 2022-08-08 15:09:06 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg face similarity
2022-08-04 09:13:09 INFO:  test-node.js test sensitive 2022-08-08 15:09:06 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 5 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
2022-08-04 09:13:09 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:06 DATA:  test-node.js result: performance: load: null total: 206
2022-08-04 09:13:09 STATE: test-node.js event: image 2022-08-08 15:09:06 STATE: test-node.js passed: face descriptor
2022-08-04 09:13:10 STATE: test-node.js event: detect 2022-08-08 15:09:06 STATE: test-node.js passed: face similarity {"similarity":[1,0.44727452329649126,0.5567935850640406],"descriptors":[1024,1024,1024]}
2022-08-04 09:13:10 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:06 INFO:  test-node.js test face similarity alternative
2022-08-04 09:13:10 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:06 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:10 DATA:  test-node.js result: performance: load: null total: 229 2022-08-08 15:09:06 STATE: test-node.js event: image
2022-08-04 09:13:10 STATE: test-node.js passed: sensitive result match 2022-08-08 15:09:07 STATE: test-node.js event: detect
2022-08-04 09:13:10 STATE: test-node.js passed: sensitive face result match 2022-08-08 15:09:07 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face embeddings
2022-08-04 09:13:10 STATE: test-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] 2022-08-08 15:09:07 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:10 STATE: test-node.js passed: sensitive body result match 2022-08-08 15:09:07 DATA:  test-node.js result: performance: load: null total: 247
2022-08-04 09:13:10 STATE: test-node.js passed: sensitive hand result match 2022-08-08 15:09:07 STATE: test-node.js passed: mobilefacenet
2022-08-04 09:13:10 INFO:  test-node.js test detectors 2022-08-08 15:09:07 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:10 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:07 STATE: test-node.js event: image
2022-08-04 09:13:10 STATE: test-node.js event: image 2022-08-08 15:09:08 STATE: test-node.js event: detect
2022-08-04 09:13:10 STATE: test-node.js event: detect 2022-08-08 15:09:08 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face embeddings
2022-08-04 09:13:10 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:10 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:08 DATA:  test-node.js result: performance: load: null total: 263
2022-08-04 09:13:10 DATA:  test-node.js result: performance: load: null total: 141 2022-08-08 15:09:08 STATE: test-node.js passed: insightface
2022-08-04 09:13:10 STATE: test-node.js passed: detector result face match 2022-08-08 15:09:08 INFO:  test-node.js test face matching
2022-08-04 09:13:10 STATE: test-node.js passed: detector result hand match 2022-08-08 15:09:08 STATE: test-node.js passed: face database 40
2022-08-04 09:13:10 INFO:  test-node.js test: multi-instance 2022-08-08 15:09:08 STATE: test-node.js passed: face match {"first":{"index":4,"similarity":0.7827852615252829}} {"second":{"index":4,"similarity":0.5002052633015844}} {"third":{"index":4,"similarity":0.5401587887998899}}
2022-08-04 09:13:10 STATE: test-node.js event: image 2022-08-08 15:09:08 INFO:  test-node.js test object
2022-08-04 09:13:10 STATE: test-node.js event: detect 2022-08-08 15:09:08 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:10 STATE: test-node.js passed: detect: random default 2022-08-08 15:09:08 STATE: test-node.js event: image
2022-08-04 09:13:10 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} 2022-08-08 15:09:08 STATE: test-node.js event: detect
2022-08-04 09:13:10 DATA:  test-node.js result: performance: load: null total: 140 2022-08-08 15:09:08 STATE: test-node.js passed: detect: samples/in/ai-body.jpg object
2022-08-04 09:13:10 INFO:  test-node.js test: first instance 2022-08-08 15:09:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:10 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} 2022-08-08 15:09:08 DATA:  test-node.js result: performance: load: null total: 268
2022-08-04 09:13:10 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default 2022-08-08 15:09:08 STATE: test-node.js passed: centernet
2022-08-04 09:13:10 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} 2022-08-08 15:09:09 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:10 DATA:  test-node.js result: performance: load: null total: 146 2022-08-08 15:09:09 STATE: test-node.js event: image
2022-08-04 09:13:10 INFO:  test-node.js test: second instance 2022-08-08 15:09:10 STATE: test-node.js event: detect
2022-08-04 09:13:10 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} 2022-08-08 15:09:10 STATE: test-node.js passed: detect: samples/in/ai-body.jpg object
2022-08-04 09:13:11 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default 2022-08-08 15:09:10 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:11 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} 2022-08-08 15:09:10 DATA:  test-node.js result: performance: load: null total: 263
2022-08-04 09:13:11 DATA:  test-node.js result: performance: load: null total: 135 2022-08-08 15:09:10 STATE: test-node.js passed: nanodet
2022-08-04 09:13:11 INFO:  test-node.js test: concurrent 2022-08-08 15:09:10 INFO:  test-node.js test sensitive
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} 2022-08-08 15:09:10 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} 2022-08-08 15:09:10 STATE: test-node.js event: image
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:10 STATE: test-node.js event: detect
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:10 STATE: test-node.js passed: detect: samples/in/ai-body.jpg sensitive
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} 2022-08-08 15:09:10 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17}
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} 2022-08-08 15:09:10 DATA:  test-node.js result: performance: load: null total: 205
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} 2022-08-08 15:09:10 STATE: test-node.js passed: sensitive result match
2022-08-04 09:13:11 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:10 STATE: test-node.js passed: sensitive face result match
2022-08-04 09:13:12 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} 2022-08-08 15:09:10 STATE: test-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
2022-08-04 09:13:12 STATE: test-node.js event: image 2022-08-08 15:09:10 STATE: test-node.js passed: sensitive body result match
2022-08-04 09:13:12 STATE: test-node.js event: image 2022-08-08 15:09:10 STATE: test-node.js passed: sensitive hand result match
2022-08-04 09:13:12 STATE: test-node.js event: image 2022-08-08 15:09:10 INFO:  test-node.js test body
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default 2022-08-08 15:09:12 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} 2022-08-08 15:09:12 STATE: test-node.js event: image
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1440 2022-08-08 15:09:12 STATE: test-node.js event: detect
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default 2022-08-08 15:09:12 STATE: test-node.js passed: detect: samples/in/ai-body.jpg blazepose
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} 2022-08-08 15:09:12 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39}
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1440 2022-08-08 15:09:12 DATA:  test-node.js result: performance: load: null total: 270
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default 2022-08-08 15:09:12 STATE: test-node.js passed: blazepose
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} 2022-08-08 15:09:14 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1581 2022-08-08 15:09:14 STATE: test-node.js event: image
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default 2022-08-08 15:09:15 STATE: test-node.js event: detect
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} 2022-08-08 15:09:15 STATE: test-node.js passed: detect: samples/in/ai-body.jpg efficientpose
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1581 2022-08-08 15:09:15 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13}
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:15 DATA:  test-node.js result: performance: load: null total: 281
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:15 STATE: test-node.js passed: efficientpose
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1581 2022-08-08 15:09:16 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:16 STATE: test-node.js event: image
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:16 STATE: test-node.js event: detect
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1581 2022-08-08 15:09:16 STATE: test-node.js passed: detect: samples/in/ai-body.jpg posenet
2022-08-04 09:13:13 STATE: test-node.js event: detect 2022-08-08 15:09:16 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16}
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default 2022-08-08 15:09:16 DATA:  test-node.js result: performance: load: null total: 209
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} 2022-08-08 15:09:16 STATE: test-node.js passed: posenet
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1278 2022-08-08 15:09:16 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:13 STATE: test-node.js event: detect 2022-08-08 15:09:16 STATE: test-node.js event: image
2022-08-04 09:13:13 STATE: test-node.js event: detect 2022-08-08 15:09:16 STATE: test-node.js event: detect
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default 2022-08-08 15:09:16 STATE: test-node.js passed: detect: samples/in/ai-body.jpg movenet
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} 2022-08-08 15:09:16 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17}
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1278 2022-08-08 15:09:16 DATA:  test-node.js result: performance: load: null total: 206
2022-08-04 09:13:13 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:16 STATE: test-node.js passed: movenet
2022-08-04 09:13:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:16 INFO:  test-node.js test detectors
2022-08-04 09:13:13 DATA:  test-node.js result: performance: load: null total: 1278 2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:13 INFO:  test-node.js test: monkey-patch 2022-08-08 15:09:17 STATE: test-node.js event: image
2022-08-04 09:13:13 STATE: test-node.js event: image 2022-08-08 15:09:17 STATE: test-node.js event: detect
2022-08-04 09:13:13 STATE: test-node.js event: detect 2022-08-08 15:09:17 STATE: test-node.js passed: detect: samples/in/ai-body.jpg detectors
2022-08-04 09:13:13 STATE: test-node.js passed: monkey patch 2022-08-08 15:09:17 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
2022-08-04 09:13:13 STATE: test-node.js passed: segmentation [65536] 2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 94
2022-08-04 09:13:13 STATE: test-node.js passeed: equal usage 2022-08-08 15:09:17 STATE: test-node.js passed: detector result face match
2022-08-04 09:13:13 INFO:  test-node.js test: input compare 2022-08-08 15:09:17 STATE: test-node.js passed: detector result hand match
2022-08-04 09:13:13 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} 2022-08-08 15:09:17 INFO:  test-node.js test: multi-instance
2022-08-04 09:13:13 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} 2022-08-08 15:09:17 STATE: test-node.js event: image
2022-08-04 09:13:13 STATE: test-node.js passed: image compare 0 23.275441687091504 2022-08-08 15:09:17 STATE: test-node.js event: detect
2022-08-04 09:13:13 INFO:  test-node.js events: {"image":21,"detect":21,"warmup":2} 2022-08-08 15:09:17 STATE: test-node.js passed: detect: random multi instance
2022-08-04 09:13:13 INFO:  test-node.js tensors 1927 2022-08-08 15:09:17 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
2022-08-04 09:13:13 INFO:  test-node.js test complete: 9854 ms 2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 86
2022-08-04 09:13:13 INFO:  2022-08-08 15:09:17 INFO:  test-node.js test: first instance
2022-08-04 09:13:13 INFO:  test-node-gpu.js start 2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
2022-08-04 09:13:14 INFO:  test-node-gpu.js test: configuration validation 2022-08-08 15:09:17 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg multi instance
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: configuration default validation [] 2022-08-08 15:09:17 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] 2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 88
2022-08-04 09:13:14 INFO:  test-node-gpu.js test: model load 2022-08-08 15:09:17 INFO:  test-node.js test: second instance
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] 2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
2022-08-04 09:13:14 INFO:  test-node-gpu.js test: warmup 2022-08-08 15:09:17 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg multi instance
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: create human 2022-08-08 15:09:17 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
2022-08-04 09:13:14 INFO:  test-node-gpu.js human version: 2.9.1 2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 85
2022-08-04 09:13:14 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.15.0 2022-08-08 15:09:17 INFO:  test-node.js test: concurrent
2022-08-04 09:13:14 INFO:  test-node-gpu.js tfjs version: 3.19.0 2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:14 INFO:  test-node-gpu.js tensorflow binding version: 2.7.3-dev20220521 2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: set backend: tensorflow 2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:14 STATE: test-node-gpu.js tensors 1921 2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: load models 2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
2022-08-04 09:13:14 STATE: test-node-gpu.js result: defined models: 22 loaded models: 12 2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: warmup: none default 2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:14 DATA:  test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} 2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:14 DATA:  test-node-gpu.js result: performance: load: null total: null 2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
2022-08-04 09:13:14 STATE: test-node-gpu.js passed: warmup none result match 2022-08-08 15:09:18 STATE: test-node.js event: image
2022-08-04 09:13:15 STATE: test-node-gpu.js event: image 2022-08-08 15:09:18 STATE: test-node.js event: image
2022-08-04 09:13:19 STATE: test-node-gpu.js event: detect 2022-08-08 15:09:18 STATE: test-node.js event: image
2022-08-04 09:13:19 STATE: test-node-gpu.js event: warmup 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
2022-08-04 09:13:19 STATE: test-node-gpu.js passed: warmup: face default 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
2022-08-04 09:13:19 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936
2022-08-04 09:13:19 DATA:  test-node-gpu.js result: performance: load: null total: 3847 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
2022-08-04 09:13:19 STATE: test-node-gpu.js passed: warmup face result match 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
2022-08-04 09:13:19 STATE: test-node-gpu.js event: image 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936
2022-08-04 09:13:19 STATE: test-node-gpu.js event: detect 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent
2022-08-04 09:13:19 STATE: test-node-gpu.js event: warmup 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
2022-08-04 09:13:19 STATE: test-node-gpu.js passed: warmup: body default 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936
2022-08-04 09:13:19 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent
2022-08-04 09:13:19 DATA:  test-node-gpu.js result: performance: load: null total: 240 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
2022-08-04 09:13:19 STATE: test-node-gpu.js passed: warmup body result match 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936
2022-08-04 09:13:19 STATE: test-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent
2022-08-04 09:13:19 INFO:  test-node-gpu.js test: details verification 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
2022-08-04 09:13:19 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936
2022-08-04 09:13:19 STATE: test-node-gpu.js event: image 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent
2022-08-04 09:13:20 STATE: test-node-gpu.js event: detect 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936
2022-08-04 09:13:20 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} 2022-08-08 15:09:19 STATE: test-node.js event: detect
2022-08-04 09:13:20 DATA:  test-node-gpu.js result: performance: load: null total: 224 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face length 1 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face score 1 0.93 1 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 742
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47 2022-08-08 15:09:19 STATE: test-node.js event: detect
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face arrays 4 478 1024 2022-08-08 15:09:19 STATE: test-node.js event: detect
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face anti-spoofing 0.79 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details face liveness 0.83 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 742
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details body length 1 2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details body 0.92 17 6 2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details hand length 1 2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 742
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details hand 0.51 0.73 point 2022-08-08 15:09:19 INFO:  test-node.js test: monkey-patch
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details hand arrays 21 5 7 2022-08-08 15:09:19 STATE: test-node.js event: image
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details gesture length 7 2022-08-08 15:09:19 STATE: test-node.js event: detect
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} 2022-08-08 15:09:19 STATE: test-node.js passed: monkey patch
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details object length 1 2022-08-08 15:09:19 STATE: test-node.js passed: segmentation [65536]
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: details object 0.72 person 2022-08-08 15:09:19 STATE: test-node.js passeed: equal usage
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} 2022-08-08 15:09:19 INFO:  test-node.js test: input compare
2022-08-04 09:13:20 STATE: test-node-gpu.js event: image 2022-08-08 15:09:19 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:20 STATE: test-node-gpu.js event: detect 2022-08-08 15:09:19 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 2022-08-08 15:09:19 STATE: test-node.js passed: image compare 0 23.275441687091504
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} 2022-08-08 15:09:19 INFO:  test-node.js events: {"image":30,"detect":30,"warmup":2}
2022-08-04 09:13:20 STATE: test-node-gpu.js event: image 2022-08-08 15:09:19 INFO:  test-node.js tensors 4105
2022-08-04 09:13:20 STATE: test-node-gpu.js event: detect 2022-08-08 15:09:19 INFO:  test-node.js test complete: 19131 ms
2022-08-04 09:13:20 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 2022-08-08 15:09:19 INFO:  all tests complete
2022-08-04 09:13:21 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} 2022-08-08 15:09:19 INFO:  failed: {"count":0,"messages":[]}
2022-08-04 09:13:21 STATE: test-node-gpu.js event: image 2022-08-08 15:09:19 INFO:  status: {"test":"test-node.js","passed":128,"failed":0}
2022-08-04 09:13:21 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:21 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32
2022-08-04 09:13:21 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:21 STATE: test-node-gpu.js event: image
2022-08-04 09:13:21 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:21 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32
2022-08-04 09:13:22 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
2022-08-04 09:13:22 STATE: test-node-gpu.js event: image
2022-08-04 09:13:22 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:22 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32
2022-08-04 09:13:22 INFO:  test-node-gpu.js test default
2022-08-04 09:13:22 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:22 STATE: test-node-gpu.js event: image
2022-08-04 09:13:22 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:22 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:22 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:22 DATA:  test-node-gpu.js result: performance: load: null total: 238
2022-08-04 09:13:22 STATE: test-node-gpu.js passed: default result face match 1 female 0.97
2022-08-04 09:13:22 INFO:  test-node-gpu.js test sync
2022-08-04 09:13:22 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:22 STATE: test-node-gpu.js event: image
2022-08-04 09:13:23 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: performance: load: null total: 188
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: default sync 1 female 0.97
2022-08-04 09:13:23 INFO:  test-node-gpu.js test: image process
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: image input null [1,256,256,3]
2022-08-04 09:13:23 INFO:  test-node-gpu.js test: image null
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: invalid input could not convert input to tensor
2022-08-04 09:13:23 INFO:  test-node-gpu.js test face similarity
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:23 STATE: test-node-gpu.js event: image
2022-08-04 09:13:23 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: performance: load: null total: 164
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:23 STATE: test-node-gpu.js event: image
2022-08-04 09:13:23 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: performance: load: null total: 196
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
2022-08-04 09:13:23 STATE: test-node-gpu.js event: image
2022-08-04 09:13:23 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
2022-08-04 09:13:23 DATA:  test-node-gpu.js result: performance: load: null total: 171
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: face descriptor
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: face similarity {"similarity":[1,0.447238756461232,0.556914029877052],"descriptors":[1024,1024,1024]}
2022-08-04 09:13:23 INFO:  test-node-gpu.js test face matching
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: face database 40
2022-08-04 09:13:23 STATE: test-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7828184453007331}} {"second":{"index":4,"similarity":0.5001334216773398}} {"third":{"index":4,"similarity":0.5403054967489764}}
2022-08-04 09:13:23 INFO:  test-node-gpu.js test object
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:24 STATE: test-node-gpu.js event: image
2022-08-04 09:13:24 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:24 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:24 DATA:  test-node-gpu.js result: performance: load: null total: 194
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: object result match
2022-08-04 09:13:24 INFO:  test-node-gpu.js test sensitive
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:24 STATE: test-node-gpu.js event: image
2022-08-04 09:13:24 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:24 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:24 DATA:  test-node-gpu.js result: performance: load: null total: 196
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: sensitive result match
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: sensitive face result match
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: sensitive body result match
2022-08-04 09:13:24 STATE: test-node-gpu.js passed: sensitive hand result match
2022-08-04 09:13:24 INFO:  test-node-gpu.js test detectors
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:25 STATE: test-node-gpu.js event: image
2022-08-04 09:13:25 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: performance: load: null total: 116
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: detector result face match
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: detector result hand match
2022-08-04 09:13:25 INFO:  test-node-gpu.js test: multi-instance
2022-08-04 09:13:25 STATE: test-node-gpu.js event: image
2022-08-04 09:13:25 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: detect: random default
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15}
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: performance: load: null total: 110
2022-08-04 09:13:25 INFO:  test-node-gpu.js test: first instance
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: performance: load: null total: 108
2022-08-04 09:13:25 INFO:  test-node-gpu.js test: second instance
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:25 DATA:  test-node-gpu.js result: performance: load: null total: 105
2022-08-04 09:13:25 INFO:  test-node-gpu.js test: concurrent
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:25 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:26 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
2022-08-04 09:13:26 STATE: test-node-gpu.js event: image
2022-08-04 09:13:26 STATE: test-node-gpu.js event: image
2022-08-04 09:13:26 STATE: test-node-gpu.js event: image
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 1079
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 1079
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 1151
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 1151
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 1151
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 1151
2022-08-04 09:13:27 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 831
2022-08-04 09:13:27 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:27 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 831
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:27 DATA:  test-node-gpu.js result: performance: load: null total: 831
2022-08-04 09:13:27 INFO:  test-node-gpu.js test: monkey-patch
2022-08-04 09:13:27 STATE: test-node-gpu.js event: image
2022-08-04 09:13:27 STATE: test-node-gpu.js event: detect
2022-08-04 09:13:27 STATE: test-node-gpu.js passed: monkey patch
2022-08-04 09:13:28 STATE: test-node-gpu.js passed: segmentation [65536]
2022-08-04 09:13:28 STATE: test-node-gpu.js passeed: equal usage
2022-08-04 09:13:28 INFO:  test-node-gpu.js test: input compare
2022-08-04 09:13:28 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
2022-08-04 09:13:28 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
2022-08-04 09:13:28 STATE: test-node-gpu.js passed: image compare 0 23.275441687091504
2022-08-04 09:13:28 INFO:  test-node-gpu.js events: {"image":21,"detect":21,"warmup":2}
2022-08-04 09:13:28 INFO:  test-node-gpu.js tensors 1927
2022-08-04 09:13:28 INFO:  test-node-gpu.js test complete: 13503 ms
2022-08-04 09:13:29 INFO: 
2022-08-04 09:13:29 INFO:  test-node-wasm.js start
2022-08-04 09:13:29 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/
2022-08-04 09:13:29 INFO:  test-node-wasm.js test: configuration validation
2022-08-04 09:13:29 STATE: test-node-wasm.js passed: configuration default validation []
2022-08-04 09:13:29 STATE: test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
2022-08-04 09:13:29 INFO:  test-node-wasm.js test: model load
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"https://vladmandic.github.io/human/models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"https://vladmandic.github.io/human/models/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human/models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"https://vladmandic.github.io/human/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human/models/liveness.json"},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"https://vladmandic.github.io/human/models/selfie.json"},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human/models/antispoof.json"}]
2022-08-04 09:13:31 INFO:  test-node-wasm.js test: warmup
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: create human
2022-08-04 09:13:31 INFO:  test-node-wasm.js human version: 2.9.1
2022-08-04 09:13:31 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v16.15.0
2022-08-04 09:13:31 INFO:  test-node-wasm.js tfjs version: 3.19.0
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: set backend: wasm
2022-08-04 09:13:31 STATE: test-node-wasm.js tensors 1921
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: load models
2022-08-04 09:13:31 STATE: test-node-wasm.js result: defined models: 22 loaded models: 12
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: warmup: none default
2022-08-04 09:13:31 DATA:  test-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
2022-08-04 09:13:31 DATA:  test-node-wasm.js result: performance: load: null total: null
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: warmup none result match
2022-08-04 09:13:31 STATE: test-node-wasm.js event: image
2022-08-04 09:13:31 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:31 STATE: test-node-wasm.js event: warmup
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: warmup: face default
2022-08-04 09:13:31 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:31 DATA:  test-node-wasm.js result: performance: load: null total: 595
2022-08-04 09:13:31 STATE: test-node-wasm.js passed: warmup face result match
2022-08-04 09:13:32 STATE: test-node-wasm.js event: image
2022-08-04 09:13:32 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:32 STATE: test-node-wasm.js event: warmup
2022-08-04 09:13:32 STATE: test-node-wasm.js passed: warmup: body default
2022-08-04 09:13:32 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:32 DATA:  test-node-wasm.js result: performance: load: null total: 421
2022-08-04 09:13:32 STATE: test-node-wasm.js passed: warmup body result match
2022-08-04 09:13:32 STATE: test-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 21% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
2022-08-04 09:13:32 INFO:  test-node-wasm.js test: details verification
2022-08-04 09:13:32 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:32 STATE: test-node-wasm.js event: image
2022-08-04 09:13:33 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:33 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:33 DATA:  test-node-wasm.js result: performance: load: null total: 399
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face length 1
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face score 1 0.93 1
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face arrays 4 478 1024
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face anti-spoofing 0.79
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details face liveness 0.83
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details body length 1
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details body 0.92 17 6
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details hand length 1
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details hand 0.51 0.73 point
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details hand arrays 21 5 7
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details gesture length 7
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"}
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details object length 1
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: details object 0.72 person
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264}
2022-08-04 09:13:33 STATE: test-node-wasm.js event: image
2022-08-04 09:13:33 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:33 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32
2022-08-04 09:13:34 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264}
2022-08-04 09:13:34 STATE: test-node-wasm.js event: image
2022-08-04 09:13:34 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:34 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32
2022-08-04 09:13:34 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:34 STATE: test-node-wasm.js event: image
2022-08-04 09:13:35 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:35 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32
2022-08-04 09:13:35 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:35 STATE: test-node-wasm.js event: image
2022-08-04 09:13:36 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:36 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32
2022-08-04 09:13:36 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
2022-08-04 09:13:36 STATE: test-node-wasm.js event: image
2022-08-04 09:13:36 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:36 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32
2022-08-04 09:13:36 INFO:  test-node-wasm.js test default
2022-08-04 09:13:37 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:37 STATE: test-node-wasm.js event: image
2022-08-04 09:13:37 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:37 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:37 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:37 DATA:  test-node-wasm.js result: performance: load: null total: 471
2022-08-04 09:13:37 STATE: test-node-wasm.js passed: default result face match 1 female 0.97
2022-08-04 09:13:37 INFO:  test-node-wasm.js test sync
2022-08-04 09:13:37 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:37 STATE: test-node-wasm.js event: image
2022-08-04 09:13:38 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:38 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:38 DATA:  test-node-wasm.js result: performance: load: null total: 394
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: default sync 1 female 0.97
2022-08-04 09:13:38 INFO:  test-node-wasm.js test: image process
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: image input null [1,256,256,3]
2022-08-04 09:13:38 INFO:  test-node-wasm.js test: image null
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: invalid input could not convert input to tensor
2022-08-04 09:13:38 INFO:  test-node-wasm.js test face similarity
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2022-08-04 09:13:38 STATE: test-node-wasm.js event: image
2022-08-04 09:13:38 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:38 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
2022-08-04 09:13:38 DATA:  test-node-wasm.js result: performance: load: null total: 372
2022-08-04 09:13:38 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:38 STATE: test-node-wasm.js event: image
2022-08-04 09:13:39 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:39 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:39 DATA:  test-node-wasm.js result: performance: load: null total: 472
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2022-08-04 09:13:39 STATE: test-node-wasm.js event: image
2022-08-04 09:13:39 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:39 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
2022-08-04 09:13:39 DATA:  test-node-wasm.js result: performance: load: null total: 386
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: face descriptor
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]}
2022-08-04 09:13:39 INFO:  test-node-wasm.js test face matching
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: face database 40
2022-08-04 09:13:39 STATE: test-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.7827852754786533}} {"second":{"index":4,"similarity":0.5660821189104794}} {"third":{"index":4,"similarity":0.45074189882665594}}
2022-08-04 09:13:39 INFO:  test-node-wasm.js test object
2022-08-04 09:13:40 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:40 STATE: test-node-wasm.js event: image
2022-08-04 09:13:40 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:40 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:40 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:40 DATA:  test-node-wasm.js result: performance: load: null total: 431
2022-08-04 09:13:40 STATE: test-node-wasm.js passed: object result match
2022-08-04 09:13:40 INFO:  test-node-wasm.js test sensitive
2022-08-04 09:13:40 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:40 STATE: test-node-wasm.js event: image
2022-08-04 09:13:41 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:41 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:41 DATA:  test-node-wasm.js result: performance: load: null total: 442
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: sensitive result match
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: sensitive face result match
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}]
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: sensitive body result match
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: sensitive hand result match
2022-08-04 09:13:41 INFO:  test-node-wasm.js test detectors
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:41 STATE: test-node-wasm.js event: image
2022-08-04 09:13:41 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:41 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:41 DATA:  test-node-wasm.js result: performance: load: null total: 269
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: detector result face match
2022-08-04 09:13:41 STATE: test-node-wasm.js passed: detector result hand match
2022-08-04 09:13:41 INFO:  test-node-wasm.js test: multi-instance
2022-08-04 09:13:41 STATE: test-node-wasm.js event: image
2022-08-04 09:13:42 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: detect: random default
2022-08-04 09:13:42 DATA:  test-node-wasm.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15}
2022-08-04 09:13:42 DATA:  test-node-wasm.js result: performance: load: null total: 239
2022-08-04 09:13:42 INFO:  test-node-wasm.js test: first instance
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:42 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:42 DATA:  test-node-wasm.js result: performance: load: null total: 280
2022-08-04 09:13:42 INFO:  test-node-wasm.js test: second instance
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:42 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:42 DATA:  test-node-wasm.js result: performance: load: null total: 255
2022-08-04 09:13:42 INFO:  test-node-wasm.js test: concurrent
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2022-08-04 09:13:42 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2022-08-04 09:13:43 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:43 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:43 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2022-08-04 09:13:43 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2022-08-04 09:13:43 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2022-08-04 09:13:44 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:44 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
2022-08-04 09:13:44 STATE: test-node-wasm.js event: image
2022-08-04 09:13:44 STATE: test-node-wasm.js event: image
2022-08-04 09:13:44 STATE: test-node-wasm.js event: image
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2455
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2455
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2721
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2721
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2721
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2721
2022-08-04 09:13:46 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2334
2022-08-04 09:13:46 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:46 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2334
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
2022-08-04 09:13:46 DATA:  test-node-wasm.js result: performance: load: null total: 2334
2022-08-04 09:13:46 INFO:  test-node-wasm.js test: monkey-patch
2022-08-04 09:13:46 STATE: test-node-wasm.js event: image
2022-08-04 09:13:46 STATE: test-node-wasm.js event: detect
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: monkey patch
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: segmentation [65536]
2022-08-04 09:13:46 STATE: test-node-wasm.js passeed: equal usage
2022-08-04 09:13:46 INFO:  test-node-wasm.js test: input compare
2022-08-04 09:13:46 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
2022-08-04 09:13:47 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
2022-08-04 09:13:47 STATE: test-node-wasm.js passed: image compare 0 23.280073018790848
2022-08-04 09:13:47 INFO:  test-node-wasm.js events: {"image":21,"detect":21,"warmup":2}
2022-08-04 09:13:47 INFO:  test-node-wasm.js tensors 1929
2022-08-04 09:13:47 INFO:  test-node-wasm.js test complete: 17201 ms
2022-08-04 09:13:47 INFO:  all tests complete
2022-08-04 09:13:47 INFO:  failed: {"count":0,"messages":[]}
2022-08-04 09:13:47 INFO:  status: {"test":"test-node.js","passed":101,"failed":0}
2022-08-04 09:13:47 INFO:  status: {"test":"test-node-gpu.js","passed":101,"failed":0}
2022-08-04 09:13:47 INFO:  status: {"test":"test-node-wasm.js","passed":102,"failed":0}