From 1713990f667600b112809762f5791075f45c6e58 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 16 Nov 2022 17:47:28 -0500 Subject: [PATCH] add basic anthropometry --- CHANGELOG.md | 3 +- TODO.md | 2 + samples/out/ai-body.jpg | Bin 60016 -> 60091 bytes src/draw/face.ts | 2 +- src/face/anthropometry.ts | 28 + src/face/face.ts | 17 +- test/build.log | 100 +-- test/test-node-main.js | 2 +- test/test.log | 1315 +++++++++++++++++++------------------ 9 files changed, 746 insertions(+), 723 deletions(-) create mode 100644 src/face/anthropometry.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c7a79a98..863a030c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ ## Changelog -### **HEAD -> main** 2022/11/12 mandic00@live.com +### **HEAD -> main** 2022/11/16 mandic00@live.com +- include external typedefs - prepare external typedefs - rebuild all - include project files for types diff --git a/TODO.md b/TODO.md index 41fb08d7..8f58e523 100644 --- a/TODO.md +++ b/TODO.md @@ -69,6 +69,8 @@ Features: Image and video on-demand histogram equalization - Support selecting specific video source when multiple cameras are present See `human.webcam.enumerate()` +- Updated algorithm to determine distance from camera based on iris size + See `human.result.face[n].iris` Architecture: - Reduce build dependencies diff --git a/samples/out/ai-body.jpg b/samples/out/ai-body.jpg index 5001f415bb7db4e20ee0407268f48ee0aa58fb3f..e5a7ec9f9fadad46869166c3696049749e7f81f3 100644 GIT binary patch delta 40843 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ℑ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 O7wg5y*?-6HkNzLeF6@>7 delta 40871 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 diff --git a/src/draw/face.ts b/src/draw/face.ts index 71e72690..ca1ad5d0 100644 --- a/src/draw/face.ts +++ b/src/draw/face.ts @@ -15,7 +15,7 @@ function drawLabels(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanv if (f.gender) l = replace(l, '[gender]', f.gender); if (f.genderScore) l = replace(l, '[genderScore]', 100 * f.genderScore); if (f.age) l = replace(l, '[age]', f.age); - if (f.iris) l = replace(l, '[distance]', f.iris); + if (f.iris) l = replace(l, '[distance]', 100 * f.iris); if (f.real) l = replace(l, '[real]', 100 * f.real); if (f.live) l = replace(l, '[live]', 100 * f.live); if (f.emotion && f.emotion.length > 0) { diff --git a/src/face/anthropometry.ts b/src/face/anthropometry.ts new file mode 100644 index 00000000..84248857 --- /dev/null +++ b/src/face/anthropometry.ts @@ -0,0 +1,28 @@ +import type { FaceResult } from '../result'; + +export function calculateCameraDistance(face: FaceResult, width: number): number { + // iris points are [center, left, top, right, bottom] + // average size of human iris is 11.7mm - fairly constant for all ages/genders/races + const f = face?.annotations; + if (!f) return 0; + // get size of left and right iris in pixels, pick larger one as its likely to be more accurate and normalize to 0..1 range instead of pixels + const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width; + // distance of eye from camera in meters + const cameraDistance = Math.round(1.17 / irisSize) / 100; + return cameraDistance; +} + +export function calculateEyesDistance(face: FaceResult, width: number): number { + // average distance between eyes is 65mm - fairly constant for typical adult male, but varies otherwise + const f = face?.annotations; + if (!f) return 0; + // get size of left and right iris in pixels, pick larger one as its likely to be more accurate and normalize to 0..1 range instead of pixels + const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width; + // pixel x and y distance of centers of left and right iris, you can use edges instead + const irisDistanceXY = [f.leftEyeIris[0][0] - f.rightEyeIris[0][0], f.leftEyeIris[0][1] - f.rightEyeIris[0][1]]; + // absolute distance bewtween eyes in 0..1 range to account for head pitch (we can ignore yaw) + const irisDistance = Math.sqrt((irisDistanceXY[0] * irisDistanceXY[0]) + (irisDistanceXY[1] * irisDistanceXY[1])) / width; + // distance between eyes in meters + const eyesDistance = Math.round(1.17 * irisDistance / irisSize) / 100; + return eyesDistance; +} diff --git a/src/face/face.ts b/src/face/face.ts index bb8fbca2..68d84c29 100644 --- a/src/face/face.ts +++ b/src/face/face.ts @@ -21,6 +21,7 @@ import type { FaceResult, Emotion, Gender, Race } from '../result'; import type { Tensor4D } from '../tfjs/types'; import type { Human } from '../human'; import { calculateFaceAngle } from './angles'; +import { calculateCameraDistance } from './anthropometry'; interface DescRes { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] } @@ -40,7 +41,7 @@ export const detectFace = async (instance: Human /* instance of human */, input: const faceRes: FaceResult[] = []; instance.state = 'run:face'; - const faces = await facemesh.predict(input, instance.config); + const faces: FaceResult[] = await facemesh.predict(input, instance.config); instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); if (!input.shape || input.shape.length !== 4) return []; if (!faces) return []; @@ -194,17 +195,7 @@ export const detectFace = async (instance: Human /* instance of human */, input: (descRes as DescRes).descriptor = insightfaceRes as number[]; } - // calculate iris distance - // iris: array[ center, left, top, right, bottom] - if (!instance.config.face.iris?.enabled) { - // if (faces[i]?.annotations?.leftEyeIris) delete faces[i].annotations.leftEyeIris; - // if (faces[i]?.annotations?.rightEyeIris) delete faces[i].annotations.rightEyeIris; - } - const irisSize = (faces[i]?.annotations?.leftEyeIris?.[0] && faces[i]?.annotations?.rightEyeIris?.[0] - && (faces[i].annotations.leftEyeIris.length > 0) && (faces[i].annotations.rightEyeIris.length > 0) - && (faces[i].annotations.leftEyeIris[0] !== null) && (faces[i].annotations.rightEyeIris[0] !== null)) - ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2] - : 0; // note: average human iris size is 11.7mm + const irisSize = instance.config.face.iris?.enabled ? calculateCameraDistance(faces[i], input.shape[2]) : 0; // optionally return tensor const tensor = instance.config.face.detector?.return ? tf.squeeze(faces[i].tensor as Tensor4D) : null; @@ -225,7 +216,7 @@ export const detectFace = async (instance: Human /* instance of human */, input: if (emotionRes) res.emotion = emotionRes as { score: number, emotion: Emotion }[]; if (antispoofRes) res.real = antispoofRes as number; if (livenessRes) res.live = livenessRes as number; - if (irisSize && irisSize !== 0) res.iris = Math.trunc(500 / irisSize / 11.7) / 100; + if (irisSize > 0) res.iris = irisSize; if (rotation) res.rotation = rotation; if (tensor) res.tensor = tensor; faceRes.push(res); diff --git a/test/build.log b/test/build.log index 314f8897..7eca27d0 100644 --- a/test/build.log +++ b/test/build.log @@ -1,50 +1,50 @@ -2022-11-16 11:18:02 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} -2022-11-16 11:18:02 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} -2022-11-16 11:18:02 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-11-16 11:18:02 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.14","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.27.0"} -2022-11-16 11:18:02 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-11-16 11:18:02 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} -2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} -2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} -2022-11-16 11:18:02 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":79,"inputBytes":672671,"outputBytes":318315} -2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} -2022-11-16 11:18:02 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":79,"inputBytes":672675,"outputBytes":318319} -2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} -2022-11-16 11:18:02 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":79,"inputBytes":673623,"outputBytes":318430} -2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} -2022-11-16 11:18:02 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":79,"inputBytes":672417,"outputBytes":316894} -2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} -2022-11-16 11:18:02 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":79,"inputBytes":1816647,"outputBytes":1458374} -2022-11-16 11:18:02 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":79,"inputBytes":1816647,"outputBytes":1917806} -2022-11-16 11:18:06 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} -2022-11-16 11:18:09 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} -2022-11-16 11:18:09 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6136,"outputBytes":2914} -2022-11-16 11:18:09 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17166,"outputBytes":9243} -2022-11-16 11:18:17 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":113,"errors":0,"warnings":0} -2022-11-16 11:18:17 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-11-16 11:18:17 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} -2022-11-16 11:18:17 INFO:  Done... -2022-11-16 11:18:17 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} -2022-11-16 11:18:17 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} -2022-11-16 11:18:17 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} -2022-11-16 11:18:17 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} -2022-11-16 11:18:17 STATE: Filter: {"input":"types/tfjs-core.d.ts"} -2022-11-16 11:18:19 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} -2022-11-16 11:18:19 STATE: Filter: {"input":"types/human.d.ts"} -2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} -2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.esm.d.ts"} -2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.d.ts"} -2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} -2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.node.d.ts"} -2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} -2022-11-16 11:18:19 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} -2022-11-16 11:18:19 STATE: Models {"folder":"./models","models":12} -2022-11-16 11:18:19 STATE: Models {"folder":"../human-models/models","models":43} -2022-11-16 11:18:19 STATE: Models {"folder":"../blazepose/model/","models":4} -2022-11-16 11:18:19 STATE: Models {"folder":"../anti-spoofing/model","models":1} -2022-11-16 11:18:19 STATE: Models {"folder":"../efficientpose/models","models":3} -2022-11-16 11:18:19 STATE: Models {"folder":"../insightface/models","models":5} -2022-11-16 11:18:19 STATE: Models {"folder":"../movenet/models","models":3} -2022-11-16 11:18:19 STATE: Models {"folder":"../nanodet/models","models":4} -2022-11-16 11:18:19 STATE: Models: {"count":58,"totalSize":386543911} -2022-11-16 11:18:19 INFO:  Human Build complete... {"logFile":"test/build.log"} +2022-11-16 17:46:46 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-16 17:46:46 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-16 17:46:46 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-11-16 17:46:46 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.14","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.27.0"} +2022-11-16 17:46:46 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-11-16 17:46:46 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} +2022-11-16 17:46:46 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} +2022-11-16 17:46:46 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} +2022-11-16 17:46:46 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":673738,"outputBytes":317961} +2022-11-16 17:46:46 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} +2022-11-16 17:46:46 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":673742,"outputBytes":317965} +2022-11-16 17:46:46 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} +2022-11-16 17:46:46 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":674690,"outputBytes":318076} +2022-11-16 17:46:46 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} +2022-11-16 17:46:46 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":673484,"outputBytes":316540} +2022-11-16 17:46:46 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} +2022-11-16 17:46:46 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1817714,"outputBytes":1458000} +2022-11-16 17:46:46 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1817714,"outputBytes":1917498} +2022-11-16 17:46:50 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} +2022-11-16 17:46:52 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} +2022-11-16 17:46:52 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6136,"outputBytes":2914} +2022-11-16 17:46:52 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17166,"outputBytes":9243} +2022-11-16 17:47:01 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":114,"errors":0,"warnings":0} +2022-11-16 17:47:01 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-11-16 17:47:01 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} +2022-11-16 17:47:01 INFO:  Done... +2022-11-16 17:47:01 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} +2022-11-16 17:47:01 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} +2022-11-16 17:47:01 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} +2022-11-16 17:47:01 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} +2022-11-16 17:47:01 STATE: Filter: {"input":"types/tfjs-core.d.ts"} +2022-11-16 17:47:02 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} +2022-11-16 17:47:02 STATE: Filter: {"input":"types/human.d.ts"} +2022-11-16 17:47:02 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} +2022-11-16 17:47:02 STATE: Write: {"output":"dist/human.esm.d.ts"} +2022-11-16 17:47:02 STATE: Write: {"output":"dist/human.d.ts"} +2022-11-16 17:47:02 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} +2022-11-16 17:47:02 STATE: Write: {"output":"dist/human.node.d.ts"} +2022-11-16 17:47:02 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} +2022-11-16 17:47:02 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} +2022-11-16 17:47:02 STATE: Models {"folder":"./models","models":12} +2022-11-16 17:47:02 STATE: Models {"folder":"../human-models/models","models":43} +2022-11-16 17:47:02 STATE: Models {"folder":"../blazepose/model/","models":4} +2022-11-16 17:47:02 STATE: Models {"folder":"../anti-spoofing/model","models":1} +2022-11-16 17:47:02 STATE: Models {"folder":"../efficientpose/models","models":3} +2022-11-16 17:47:02 STATE: Models {"folder":"../insightface/models","models":5} +2022-11-16 17:47:02 STATE: Models {"folder":"../movenet/models","models":3} +2022-11-16 17:47:02 STATE: Models {"folder":"../nanodet/models","models":4} +2022-11-16 17:47:02 STATE: Models: {"count":58,"totalSize":386543911} +2022-11-16 17:47:02 INFO:  Human Build complete... {"logFile":"test/build.log"} diff --git a/test/test-node-main.js b/test/test-node-main.js index 5aba0c6d..8c138b31 100644 --- a/test/test-node-main.js +++ b/test/test-node-main.js @@ -189,7 +189,7 @@ async function verifyDetails(human) { verify(res.face.length === 1, 'details face length', res.face.length); for (const face of res.face) { verify(face.score > 0.9 && face.boxScore > 0.9 && face.faceScore > 0.9, 'details face score', face.score, face.boxScore, face.faceScore); - verify(face.age > 23 && face.age < 30 && face.gender === 'female' && face.genderScore > 0.9 && face.iris > 70 && face.iris < 105, 'details face age/gender', face.age, face.gender, face.genderScore, face.iris); + verify(face.age > 23 && face.age < 30 && face.gender === 'female' && face.genderScore > 0.9 && face.iris > 0.5 && face.iris < 2.5, 'details face age/gender', face.age, face.gender, face.genderScore, face.iris); verify(face.box.length === 4 && face.boxRaw.length === 4 && face.mesh.length === 478 && face.meshRaw.length === 478 && face.embedding.length === 1024, 'details face arrays', face.box.length, face.mesh.length, face.embedding.length); verify(face.emotion.length >= 2 && face.emotion[0].score > 0.30 && face.emotion[0].emotion === 'angry', 'details face emotion', face.emotion.length, face.emotion[0]); verify(face.real > 0.55, 'details face anti-spoofing', face.real); diff --git a/test/test.log b/test/test.log index 15248515..0962b59f 100644 --- a/test/test.log +++ b/test/test.log @@ -1,657 +1,658 @@ -2022-11-16 11:24:32 INFO:  @vladmandic/human version 3.0.0 -2022-11-16 11:24:32 INFO:  User: vlado Platform: linux Arch: x64 Node: v19.1.0 -2022-11-16 11:24:32 INFO:  demos: [{"cmd":"../demo/nodejs/node.js","args":[]},{"cmd":"../demo/nodejs/node-simple.js","args":[]},{"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]},{"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]},{"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]},{"cmd":"../demo/nodejs/process-folder.js","args":["samples"]},{"cmd":"../demo/multithread/node-multiprocess.js","args":[]},{"cmd":"../demo/facematch/node-match.js","args":[]}] -2022-11-16 11:24:32 INFO:  {"cmd":"../demo/nodejs/node.js","args":[]} start -2022-11-16 11:24:33 INFO:  {"cmd":"../demo/nodejs/node-simple.js","args":[]} start -2022-11-16 11:24:34 INFO:  {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start -2022-11-16 11:24:34 INFO:  {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start -2022-11-16 11:24:35 INFO:  {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start -2022-11-16 11:24:36 INFO:  {"cmd":"../demo/nodejs/process-folder.js","args":["samples"]} start -2022-11-16 11:24:38 INFO:  {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start -2022-11-16 11:24:51 INFO:  {"cmd":"../demo/facematch/node-match.js","args":[]} start -2022-11-16 11:24:52 INFO:  tests: ["test-node-load.js","test-node-gear.js","test-backend-node.js","test-backend-node-gpu.js","test-backend-node-wasm.js"] -2022-11-16 11:24:52 INFO:  -2022-11-16 11:24:52 INFO:  test-node-load.js start -2022-11-16 11:24:52 INFO:  test-node-load.js load start {"human":"3.0.0","tf":"4.0.0","progress":0} -2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":1,"progress":0} -2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":11,"progress":0} -2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":30,"progress":0.11143791531203556} -2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":58,"progress":0.3299591712723044} -2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":79,"progress":0.7259096583739463} -2022-11-16 11:24:52 STATE: test-node-load.js passed {"progress":1} -2022-11-16 11:24:52 INFO:  test-node-load.js load final {"progress":1} -2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":465,"progress":1} -2022-11-16 11:24:52 INFO:  -2022-11-16 11:24:52 INFO:  test-node-gear.js start -2022-11-16 11:24:53 DATA:  test-node-gear.js input: ["samples/in/ai-face.jpg"] -2022-11-16 11:24:54 STATE: test-node-gear.js passed: gear faceres samples/in/ai-face.jpg -2022-11-16 11:24:54 DATA:  test-node-gear.js results {"face":0,"model":"faceres","image":"samples/in/ai-face.jpg","age":23.5,"gender":"female","genderScore":0.92} -2022-11-16 11:24:54 STATE: test-node-gear.js passed: gear gear samples/in/ai-face.jpg -2022-11-16 11:24:54 DATA:  test-node-gear.js results {"face":0,"model":"gear","image":"samples/in/ai-face.jpg","age":23.3,"gender":"female","genderScore":0.51,"race":[{"score":0.93,"race":"white"}]} -2022-11-16 11:24:54 STATE: test-node-gear.js passed: gear ssrnet samples/in/ai-face.jpg -2022-11-16 11:24:54 DATA:  test-node-gear.js results {"face":0,"model":"ssrnet","image":"samples/in/ai-face.jpg","age":23.4,"gender":"female","genderScore":0.99} -2022-11-16 11:24:54 INFO:  -2022-11-16 11:24:54 INFO:  test-backend-node.js start -2022-11-16 11:24:54 INFO:  test-backend-node.js test: configuration validation -2022-11-16 11:24:54 STATE: test-backend-node.js passed: configuration default validation [] -2022-11-16 11:24:54 STATE: test-backend-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-11-16 11:24:54 INFO:  test-backend-node.js test: model load -2022-11-16 11:24:54 STATE: test-backend-node.js passed: models loaded 25 11 [{"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":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] -2022-11-16 11:24:54 INFO:  test-backend-node.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} -2022-11-16 11:24:54 INFO:  test-backend-node.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} -2022-11-16 11:24:54 INFO:  test-backend-node.js test: warmup -2022-11-16 11:24:54 STATE: test-backend-node.js passed: create human -2022-11-16 11:24:54 INFO:  test-backend-node.js human version: 3.0.0 -2022-11-16 11:24:54 INFO:  test-backend-node.js platform: linux x64 agent: NodeJS v19.1.0 -2022-11-16 11:24:54 INFO:  test-backend-node.js tfjs version: 4.0.0 -2022-11-16 11:24:54 INFO:  test-backend-node.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.9.1","gpu":false},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169} -2022-11-16 11:24:54 STATE: test-backend-node.js passed: set backend: tensorflow -2022-11-16 11:24:54 STATE: test-backend-node.js tensors 1785 -2022-11-16 11:24:54 STATE: test-backend-node.js passed: load models -2022-11-16 11:24:54 STATE: test-backend-node.js result: defined models: 25 loaded models: 11 -2022-11-16 11:24:54 STATE: test-backend-node.js passed: warmup: none default -2022-11-16 11:24:54 DATA:  test-backend-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-11-16 11:24:54 DATA:  test-backend-node.js result: performance: load: null total: null -2022-11-16 11:24:54 STATE: test-backend-node.js passed: warmup none result match -2022-11-16 11:24:54 STATE: test-backend-node.js event: image -2022-11-16 11:24:55 STATE: test-backend-node.js event: detect -2022-11-16 11:24:55 STATE: test-backend-node.js event: warmup -2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup: face default -2022-11-16 11:24:55 DATA:  test-backend-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-11-16 11:24:55 DATA:  test-backend-node.js result: performance: load: null total: 439 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup face result match -2022-11-16 11:24:55 STATE: test-backend-node.js event: image -2022-11-16 11:24:55 STATE: test-backend-node.js event: detect -2022-11-16 11:24:55 STATE: test-backend-node.js event: warmup -2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup: body default -2022-11-16 11:24:55 DATA:  test-backend-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-11-16 11:24:55 DATA:  test-backend-node.js result: performance: load: null total: 350 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup body result match -2022-11-16 11:24:55 STATE: test-backend-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-11-16 11:24:55 INFO:  test-backend-node.js test: details verification -2022-11-16 11:24:55 STATE: test-backend-node.js start default -2022-11-16 11:24:55 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:24:55 STATE: test-backend-node.js event: image -2022-11-16 11:24:55 STATE: test-backend-node.js event: detect -2022-11-16 11:24:55 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg default -2022-11-16 11:24:55 DATA:  test-backend-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-11-16 11:24:55 DATA:  test-backend-node.js result: performance: load: null total: 314 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face length 1 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face score 1 0.93 1 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face arrays 4 478 1024 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face anti-spoofing 0.79 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face liveness 0.83 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details body length 1 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details body 0.92 17 6 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details hand length 1 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details hand 0.51 0.73 point -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details hand arrays 21 5 7 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details gesture length 7 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details object length 1 -2022-11-16 11:24:55 STATE: test-backend-node.js passed: details object 0.72 person -2022-11-16 11:24:56 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} -2022-11-16 11:24:56 STATE: test-backend-node.js event: image -2022-11-16 11:24:56 STATE: test-backend-node.js event: detect -2022-11-16 11:24:56 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-11-16 11:24:56 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-11-16 11:24:56 STATE: test-backend-node.js event: image -2022-11-16 11:24:57 STATE: test-backend-node.js event: detect -2022-11-16 11:24:57 STATE: test-backend-node.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-11-16 11:24:57 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:24:57 STATE: test-backend-node.js event: image -2022-11-16 11:24:57 STATE: test-backend-node.js event: detect -2022-11-16 11:24:57 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-11-16 11:24:57 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} -2022-11-16 11:24:57 STATE: test-backend-node.js event: image -2022-11-16 11:24:58 STATE: test-backend-node.js event: detect -2022-11-16 11:24:58 STATE: test-backend-node.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-11-16 11:24:58 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-11-16 11:24:58 STATE: test-backend-node.js event: image -2022-11-16 11:24:58 STATE: test-backend-node.js event: detect -2022-11-16 11:24:58 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-11-16 11:24:58 INFO:  test-backend-node.js test default -2022-11-16 11:24:58 STATE: test-backend-node.js start async -2022-11-16 11:24:58 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:24:58 STATE: test-backend-node.js event: image -2022-11-16 11:24:59 STATE: test-backend-node.js event: detect -2022-11-16 11:24:59 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg async -2022-11-16 11:24:59 DATA:  test-backend-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-11-16 11:24:59 DATA:  test-backend-node.js result: performance: load: null total: 298 -2022-11-16 11:24:59 STATE: test-backend-node.js passed: default result face match 1 female 0.97 -2022-11-16 11:24:59 INFO:  test-backend-node.js test sync -2022-11-16 11:24:59 STATE: test-backend-node.js start sync -2022-11-16 11:24:59 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:24:59 STATE: test-backend-node.js event: image -2022-11-16 11:24:59 STATE: test-backend-node.js event: detect -2022-11-16 11:24:59 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sync -2022-11-16 11:24:59 DATA:  test-backend-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-11-16 11:24:59 DATA:  test-backend-node.js result: performance: load: null total: 298 -2022-11-16 11:24:59 STATE: test-backend-node.js passed: default sync 1 female 0.97 -2022-11-16 11:24:59 INFO:  test-backend-node.js test: image process -2022-11-16 11:24:59 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-16 11:24:59 STATE: test-backend-node.js passed: image input null [1,256,256,3] -2022-11-16 11:24:59 INFO:  test-backend-node.js test: image null -2022-11-16 11:24:59 STATE: test-backend-node.js passed: invalid input could not convert input to tensor -2022-11-16 11:24:59 INFO:  test-backend-node.js test face similarity -2022-11-16 11:24:59 STATE: test-backend-node.js start face similarity -2022-11-16 11:24:59 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-16 11:24:59 STATE: test-backend-node.js event: image -2022-11-16 11:24:59 STATE: test-backend-node.js event: detect -2022-11-16 11:24:59 STATE: test-backend-node.js passed: detect: samples/in/ai-face.jpg face similarity -2022-11-16 11:24:59 DATA:  test-backend-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-11-16 11:24:59 DATA:  test-backend-node.js result: performance: load: null total: 292 -2022-11-16 11:24:59 STATE: test-backend-node.js start face similarity -2022-11-16 11:25:00 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:00 STATE: test-backend-node.js event: image -2022-11-16 11:25:00 STATE: test-backend-node.js event: detect -2022-11-16 11:25:00 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg face similarity -2022-11-16 11:25:00 DATA:  test-backend-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-11-16 11:25:00 DATA:  test-backend-node.js result: performance: load: null total: 303 -2022-11-16 11:25:00 STATE: test-backend-node.js start face similarity -2022-11-16 11:25:00 STATE: test-backend-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-11-16 11:25:00 STATE: test-backend-node.js event: image -2022-11-16 11:25:00 STATE: test-backend-node.js event: detect -2022-11-16 11:25:00 STATE: test-backend-node.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-11-16 11:25:00 DATA:  test-backend-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-11-16 11:25:00 DATA:  test-backend-node.js result: performance: load: null total: 271 -2022-11-16 11:25:00 STATE: test-backend-node.js passed: face descriptor -2022-11-16 11:25:00 STATE: test-backend-node.js passed: face similarity {"similarity":[1,0.44727441595492046,0.556793560189727],"descriptors":[1024,1024,1024]} -2022-11-16 11:25:00 INFO:  test-backend-node.js test object -2022-11-16 11:25:00 STATE: test-backend-node.js start object -2022-11-16 11:25:00 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:00 STATE: test-backend-node.js event: image -2022-11-16 11:25:01 STATE: test-backend-node.js event: detect -2022-11-16 11:25:01 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object -2022-11-16 11:25:01 DATA:  test-backend-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-11-16 11:25:01 DATA:  test-backend-node.js result: performance: load: null total: 297 -2022-11-16 11:25:01 STATE: test-backend-node.js passed: centernet -2022-11-16 11:25:01 STATE: test-backend-node.js start object -2022-11-16 11:25:03 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:03 STATE: test-backend-node.js event: image -2022-11-16 11:25:03 STATE: test-backend-node.js event: detect -2022-11-16 11:25:03 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object -2022-11-16 11:25:03 DATA:  test-backend-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-11-16 11:25:03 DATA:  test-backend-node.js result: performance: load: null total: 296 -2022-11-16 11:25:03 STATE: test-backend-node.js passed: nanodet -2022-11-16 11:25:03 INFO:  test-backend-node.js test sensitive -2022-11-16 11:25:03 STATE: test-backend-node.js start sensitive -2022-11-16 11:25:03 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:03 STATE: test-backend-node.js event: image -2022-11-16 11:25:04 STATE: test-backend-node.js event: detect -2022-11-16 11:25:04 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sensitive -2022-11-16 11:25:04 DATA:  test-backend-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-11-16 11:25:04 DATA:  test-backend-node.js result: performance: load: null total: 256 -2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive result match -2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive face result match -2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] -2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive body result match -2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive hand result match -2022-11-16 11:25:04 INFO:  test-backend-node.js test body -2022-11-16 11:25:04 STATE: test-backend-node.js start blazepose -2022-11-16 11:25:06 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:06 STATE: test-backend-node.js event: image -2022-11-16 11:25:06 STATE: test-backend-node.js event: detect -2022-11-16 11:25:06 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg blazepose -2022-11-16 11:25:06 DATA:  test-backend-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-11-16 11:25:06 DATA:  test-backend-node.js result: performance: load: null total: 346 -2022-11-16 11:25:06 STATE: test-backend-node.js passed: blazepose -2022-11-16 11:25:06 STATE: test-backend-node.js start efficientpose -2022-11-16 11:25:08 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:08 STATE: test-backend-node.js event: image -2022-11-16 11:25:08 STATE: test-backend-node.js event: detect -2022-11-16 11:25:08 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-11-16 11:25:08 DATA:  test-backend-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-11-16 11:25:08 DATA:  test-backend-node.js result: performance: load: null total: 318 -2022-11-16 11:25:08 STATE: test-backend-node.js passed: efficientpose -2022-11-16 11:25:08 STATE: test-backend-node.js start posenet -2022-11-16 11:25:09 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:09 STATE: test-backend-node.js event: image -2022-11-16 11:25:09 STATE: test-backend-node.js event: detect -2022-11-16 11:25:09 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg posenet -2022-11-16 11:25:09 DATA:  test-backend-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-11-16 11:25:09 DATA:  test-backend-node.js result: performance: load: null total: 252 -2022-11-16 11:25:09 STATE: test-backend-node.js passed: posenet -2022-11-16 11:25:09 STATE: test-backend-node.js start movenet -2022-11-16 11:25:09 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-16 11:25:09 STATE: test-backend-node.js event: image -2022-11-16 11:25:10 STATE: test-backend-node.js event: detect -2022-11-16 11:25:10 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg movenet -2022-11-16 11:25:10 DATA:  test-backend-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-11-16 11:25:10 DATA:  test-backend-node.js result: performance: load: null total: 256 -2022-11-16 11:25:10 STATE: test-backend-node.js passed: movenet -2022-11-16 11:25:10 INFO:  test-backend-node.js test face matching -2022-11-16 11:25:10 STATE: test-backend-node.js passed: face database 40 -2022-11-16 11:25:10 STATE: test-backend-node.js passed: face match {"first":{"index":4,"similarity":0.7827852251220577}} {"second":{"index":4,"similarity":0.5002052057057577}} {"third":{"index":4,"similarity":0.5401588464054732}} -2022-11-16 11:25:10 INFO:  test-backend-node.js test face similarity alternative -2022-11-16 11:25:10 STATE: test-backend-node.js start face embeddings -2022-11-16 11:25:10 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-16 11:25:10 STATE: test-backend-node.js event: image -2022-11-16 11:25:10 ERROR: test-backend-node.js failed: testDetect face embeddings -2022-11-16 11:25:10 ERROR: test-backend-node.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node.js:99:176887"," at new Promise ()"," at J5 (/home/vlado/dev/human/dist/human.node.js:99:176656)"," at S1 (/home/vlado/dev/human/dist/human.node.js:121:6622)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node.js:840:9036"]} -2022-11-16 11:25:10 INFO:  -2022-11-16 11:25:10 INFO:  test-backend-node-gpu.js start -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js test: configuration validation -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: configuration default validation [] -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js test: model load -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: models loaded 25 11 [{"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":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js test: warmup -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: create human -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js human version: 3.0.0 -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js platform: linux x64 agent: NodeJS v19.1.0 -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js tfjs version: 4.0.0 -2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.9.1","gpu":true},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169} -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: set backend: tensorflow -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js tensors 1785 -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: load models -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js result: defined models: 25 loaded models: 11 -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: warmup: none default -2022-11-16 11:25:11 DATA:  test-backend-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-11-16 11:25:11 DATA:  test-backend-node-gpu.js result: performance: load: null total: null -2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: warmup none result match -2022-11-16 11:25:12 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: warmup -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup: face default -2022-11-16 11:25:15 DATA:  test-backend-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-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: performance: load: null total: 3118 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup face result match -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: warmup -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup: body default -2022-11-16 11:25:15 DATA:  test-backend-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-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: performance: load: null total: 152 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup body result match -2022-11-16 11:25:15 STATE: test-backend-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-11-16 11:25:15 INFO:  test-backend-node-gpu.js test: details verification -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js start default -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-11-16 11:25:15 DATA:  test-backend-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-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: performance: load: null total: 135 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face length 1 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face score 1 0.93 1 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face arrays 4 478 1024 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face anti-spoofing 0.79 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face liveness 0.83 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details body length 1 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details body 0.92 17 6 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details hand length 1 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details hand 0.51 0.73 point -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details hand arrays 21 5 7 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details gesture length 7 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details object length 1 -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details object 0.72 person -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} -2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-11-16 11:25:17 INFO:  test-backend-node-gpu.js test default -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js start async -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg async -2022-11-16 11:25:17 DATA:  test-backend-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-11-16 11:25:17 DATA:  test-backend-node-gpu.js result: performance: load: null total: 127 -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: default result face match 1 female 0.97 -2022-11-16 11:25:17 INFO:  test-backend-node-gpu.js test sync -2022-11-16 11:25:17 STATE: test-backend-node-gpu.js start sync -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sync -2022-11-16 11:25:18 DATA:  test-backend-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-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: performance: load: null total: 153 -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: default sync 1 female 0.97 -2022-11-16 11:25:18 INFO:  test-backend-node-gpu.js test: image process -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: image input null [1,256,256,3] -2022-11-16 11:25:18 INFO:  test-backend-node-gpu.js test: image null -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: invalid input could not convert input to tensor -2022-11-16 11:25:18 INFO:  test-backend-node-gpu.js test face similarity -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js start face similarity -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity -2022-11-16 11:25:18 DATA:  test-backend-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-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: performance: load: null total: 133 -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js start face similarity -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity -2022-11-16 11:25:18 DATA:  test-backend-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-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: performance: load: null total: 148 -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js start face similarity -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-11-16 11:25:19 DATA:  test-backend-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-11-16 11:25:19 DATA:  test-backend-node-gpu.js result: performance: load: null total: 139 -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: face descriptor -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: face similarity {"similarity":[1,0.4475002983522097,0.5570879556505012],"descriptors":[1024,1024,1024]} -2022-11-16 11:25:19 INFO:  test-backend-node-gpu.js test object -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js start object -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object -2022-11-16 11:25:19 DATA:  test-backend-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-11-16 11:25:19 DATA:  test-backend-node-gpu.js result: performance: load: null total: 165 -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: centernet -2022-11-16 11:25:19 STATE: test-backend-node-gpu.js start object -2022-11-16 11:25:20 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:20 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:20 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:20 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object -2022-11-16 11:25:20 DATA:  test-backend-node-gpu.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-11-16 11:25:20 DATA:  test-backend-node-gpu.js result: performance: load: null total: 522 -2022-11-16 11:25:20 STATE: test-backend-node-gpu.js passed: nanodet -2022-11-16 11:25:20 INFO:  test-backend-node-gpu.js test sensitive -2022-11-16 11:25:20 STATE: test-backend-node-gpu.js start sensitive -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive -2022-11-16 11:25:21 DATA:  test-backend-node-gpu.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-11-16 11:25:21 DATA:  test-backend-node-gpu.js result: performance: load: null total: 115 -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive result match -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive face result match -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive body result match -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive hand result match -2022-11-16 11:25:21 INFO:  test-backend-node-gpu.js test body -2022-11-16 11:25:21 STATE: test-backend-node-gpu.js start blazepose -2022-11-16 11:25:23 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:23 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:23 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:23 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose -2022-11-16 11:25:23 DATA:  test-backend-node-gpu.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-11-16 11:25:23 DATA:  test-backend-node-gpu.js result: performance: load: null total: 259 -2022-11-16 11:25:23 STATE: test-backend-node-gpu.js passed: blazepose -2022-11-16 11:25:23 STATE: test-backend-node-gpu.js start efficientpose -2022-11-16 11:25:24 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:24 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-11-16 11:25:25 DATA:  test-backend-node-gpu.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-11-16 11:25:25 DATA:  test-backend-node-gpu.js result: performance: load: null total: 1067 -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: efficientpose -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js start posenet -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet -2022-11-16 11:25:25 DATA:  test-backend-node-gpu.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-11-16 11:25:25 DATA:  test-backend-node-gpu.js result: performance: load: null total: 209 -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: posenet -2022-11-16 11:25:25 STATE: test-backend-node-gpu.js start movenet -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js event: detect -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet -2022-11-16 11:25:26 DATA:  test-backend-node-gpu.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-11-16 11:25:26 DATA:  test-backend-node-gpu.js result: performance: load: null total: 112 -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: movenet -2022-11-16 11:25:26 INFO:  test-backend-node-gpu.js test face matching -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: face database 40 -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7829338043932047}} {"second":{"index":4,"similarity":0.5002928781584631}} {"third":{"index":4,"similarity":0.5402934771672516}} -2022-11-16 11:25:26 INFO:  test-backend-node-gpu.js test face similarity alternative -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js start face embeddings -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-16 11:25:26 STATE: test-backend-node-gpu.js event: image -2022-11-16 11:25:26 ERROR: test-backend-node-gpu.js failed: testDetect face embeddings -2022-11-16 11:25:26 ERROR: test-backend-node-gpu.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-gpu.js:99:176887"," at new Promise ()"," at J5 (/home/vlado/dev/human/dist/human.node-gpu.js:99:176656)"," at S1 (/home/vlado/dev/human/dist/human.node-gpu.js:121:6622)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-gpu.js:840:9036"]} -2022-11-16 11:25:27 INFO:  -2022-11-16 11:25:27 INFO:  test-backend-node-wasm.js start -2022-11-16 11:25:27 DATA:  test-backend-node-wasm.js stdout: 2022-11-16 11:25:27 INFO:  { supported: true, backend: true, simd: undefined, multithread: undefined } https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.0.0/dist/ -2022-11-16 11:25:27 STATE: test-backend-node-wasm.js passed: model server: https://vladmandic.github.io/human-models/models/ -2022-11-16 11:25:27 INFO:  test-backend-node-wasm.js test: configuration validation -2022-11-16 11:25:27 STATE: test-backend-node-wasm.js passed: configuration default validation [] -2022-11-16 11:25:27 STATE: test-backend-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-11-16 11:25:27 INFO:  test-backend-node-wasm.js test: model load -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: models loaded 25 11 [{"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/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":"https://vladmandic.github.io/human-models/models/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human-models/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human-models/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human-models/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human-models/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/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human-models/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human-models/models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human-models/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human-models/models/antispoof.json"}] -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js test: warmup -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: create human -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js human version: 3.0.0 -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js platform: linux x64 agent: NodeJS v19.1.0 -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js tfjs version: 4.0.0 -2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["wasm"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{},"wasm":{"supported":true,"backend":true,"simd":true,"multithread":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":126} -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: set backend: wasm -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js tensors 1785 -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: load models -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js result: defined models: 25 loaded models: 11 -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup: none default -2022-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: performance: load: null total: null -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup none result match -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: warmup -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup: face default -2022-11-16 11:25:30 DATA:  test-backend-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-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: performance: load: null total: 518 -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup face result match -2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: warmup -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: warmup: body default -2022-11-16 11:25:31 DATA:  test-backend-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-11-16 11:25:31 DATA:  test-backend-node-wasm.js result: performance: load: null total: 350 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: warmup body result match -2022-11-16 11:25:31 STATE: test-backend-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-11-16 11:25:31 INFO:  test-backend-node-wasm.js test: details verification -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js start default -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-11-16 11:25:31 DATA:  test-backend-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-11-16 11:25:31 DATA:  test-backend-node-wasm.js result: performance: load: null total: 339 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face length 1 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face score 1 0.93 1 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face arrays 4 478 1024 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face anti-spoofing 0.79 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face liveness 0.83 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details body length 1 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details body 0.92 17 6 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details hand length 1 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details hand 0.51 0.73 point -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details hand arrays 21 5 7 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details gesture length 7 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details object length 1 -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details object 0.72 person -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264} -2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:32 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:32 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-11-16 11:25:32 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} -2022-11-16 11:25:32 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:32 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:32 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-11-16 11:25:34 INFO:  test-backend-node-wasm.js test default -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js start async -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:34 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg async -2022-11-16 11:25:35 DATA:  test-backend-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-11-16 11:25:35 DATA:  test-backend-node-wasm.js result: performance: load: null total: 326 -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: default result face match 1 female 0.97 -2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test sync -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js start sync -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sync -2022-11-16 11:25:35 DATA:  test-backend-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-11-16 11:25:35 DATA:  test-backend-node-wasm.js result: performance: load: null total: 322 -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: default sync 1 female 0.97 -2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test: image process -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: image input null [1,256,256,3] -2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test: image null -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: invalid input could not convert input to tensor -2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test face similarity -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js start face similarity -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity -2022-11-16 11:25:36 DATA:  test-backend-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-11-16 11:25:36 DATA:  test-backend-node-wasm.js result: performance: load: null total: 333 -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js start face similarity -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity -2022-11-16 11:25:36 DATA:  test-backend-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-11-16 11:25:36 DATA:  test-backend-node-wasm.js result: performance: load: null total: 387 -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js start face similarity -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-11-16 11:25:37 DATA:  test-backend-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-11-16 11:25:37 DATA:  test-backend-node-wasm.js result: performance: load: null total: 300 -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: face descriptor -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]} -2022-11-16 11:25:37 INFO:  test-backend-node-wasm.js test object -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js start object -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object -2022-11-16 11:25:37 DATA:  test-backend-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-11-16 11:25:37 DATA:  test-backend-node-wasm.js result: performance: load: null total: 317 -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: centernet -2022-11-16 11:25:37 STATE: test-backend-node-wasm.js start object -2022-11-16 11:25:38 WARN:  test-backend-node-wasm.js missing kernel ops {"title":"object","model":"nanodet","url":"https://vladmandic.github.io/human-models/models/nanodet.json","missing":["sparsetodense"],"backkend":"wasm"} -2022-11-16 11:25:38 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:38 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:38 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:38 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object -2022-11-16 11:25:38 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-16 11:25:38 DATA:  test-backend-node-wasm.js result: performance: load: null total: 224 -2022-11-16 11:25:38 ERROR: test-backend-node-wasm.js failed: nanodet [] -2022-11-16 11:25:38 INFO:  test-backend-node-wasm.js test sensitive -2022-11-16 11:25:38 STATE: test-backend-node-wasm.js start sensitive -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive -2022-11-16 11:25:39 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-16 11:25:39 DATA:  test-backend-node-wasm.js result: performance: load: null total: 262 -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive result match -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive face result match -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}] -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive body result match -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive hand result match -2022-11-16 11:25:39 INFO:  test-backend-node-wasm.js test body -2022-11-16 11:25:39 STATE: test-backend-node-wasm.js start blazepose -2022-11-16 11:25:42 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:42 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:42 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:42 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose -2022-11-16 11:25:42 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.99,"keypoints":39} -2022-11-16 11:25:42 DATA:  test-backend-node-wasm.js result: performance: load: null total: 458 -2022-11-16 11:25:42 STATE: test-backend-node-wasm.js passed: blazepose -2022-11-16 11:25:42 STATE: test-backend-node-wasm.js start efficientpose -2022-11-16 11:25:43 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:43 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:44 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:44 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-11-16 11:25:44 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.75,"keypoints":13} -2022-11-16 11:25:44 DATA:  test-backend-node-wasm.js result: performance: load: null total: 687 -2022-11-16 11:25:44 STATE: test-backend-node-wasm.js passed: efficientpose -2022-11-16 11:25:44 STATE: test-backend-node-wasm.js start posenet -2022-11-16 11:25:45 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:45 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:45 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:45 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet -2022-11-16 11:25:45 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.96,"keypoints":16} -2022-11-16 11:25:45 DATA:  test-backend-node-wasm.js result: performance: load: null total: 305 -2022-11-16 11:25:45 STATE: test-backend-node-wasm.js passed: posenet -2022-11-16 11:25:45 STATE: test-backend-node-wasm.js start movenet -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js event: detect -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet -2022-11-16 11:25:46 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-16 11:25:46 DATA:  test-backend-node-wasm.js result: performance: load: null total: 253 -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: movenet -2022-11-16 11:25:46 INFO:  test-backend-node-wasm.js test face matching -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: face database 40 -2022-11-16 11:25:46 STATE: test-backend-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-11-16 11:25:46 INFO:  test-backend-node-wasm.js test face similarity alternative -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js start face embeddings -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-11-16 11:25:46 STATE: test-backend-node-wasm.js event: image -2022-11-16 11:25:46 ERROR: test-backend-node-wasm.js failed: testDetect face embeddings -2022-11-16 11:25:46 ERROR: test-backend-node-wasm.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-wasm.js:99:176887"," at new Promise ()"," at Q5 (/home/vlado/dev/human/dist/human.node-wasm.js:99:176656)"," at j1 (/home/vlado/dev/human/dist/human.node-wasm.js:121:6622)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-wasm.js:840:9036"]} -2022-11-16 11:25:46 STATE: all tests complete -2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/process-folder.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"test-node-load.js","passed":1,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"test-node-gear.js","passed":3,"failed":0} -2022-11-16 11:25:46 INFO:  status {"test":"test-backend-node.js","passed":85,"failed":1} -2022-11-16 11:25:46 INFO:  status {"test":"test-backend-node-gpu.js","passed":85,"failed":1} -2022-11-16 11:25:46 INFO:  status {"test":"test-backend-node-wasm.js","passed":85,"failed":2} -2022-11-16 11:25:46 INFO:  failures {"count":4} -2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node.js","message":["error",["failed:","testDetect face embeddings"]]} -2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node-gpu.js","message":["error",["failed:","testDetect face embeddings"]]} -2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed: nanodet",[]]]} -2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed:","testDetect face embeddings"]]} +2022-11-16 17:45:10 INFO:  @vladmandic/human version 3.0.0 +2022-11-16 17:45:10 INFO:  User: vlado Platform: linux Arch: x64 Node: v19.1.0 +2022-11-16 17:45:10 INFO:  demos: [{"cmd":"../demo/nodejs/node.js","args":[]},{"cmd":"../demo/nodejs/node-simple.js","args":[]},{"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]},{"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]},{"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]},{"cmd":"../demo/nodejs/process-folder.js","args":["samples"]},{"cmd":"../demo/multithread/node-multiprocess.js","args":[]},{"cmd":"../demo/facematch/node-match.js","args":[]}] +2022-11-16 17:45:10 INFO:  {"cmd":"../demo/nodejs/node.js","args":[]} start +2022-11-16 17:45:11 INFO:  {"cmd":"../demo/nodejs/node-simple.js","args":[]} start +2022-11-16 17:45:12 INFO:  {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start +2022-11-16 17:45:13 INFO:  {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start +2022-11-16 17:45:13 INFO:  {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start +2022-11-16 17:45:14 INFO:  {"cmd":"../demo/nodejs/process-folder.js","args":["samples"]} start +2022-11-16 17:45:15 INFO:  {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start +2022-11-16 17:45:27 INFO:  {"cmd":"../demo/facematch/node-match.js","args":[]} start +2022-11-16 17:45:28 INFO:  tests: ["test-node-load.js","test-node-gear.js","test-backend-node.js","test-backend-node-gpu.js","test-backend-node-wasm.js"] +2022-11-16 17:45:28 INFO:  +2022-11-16 17:45:28 INFO:  test-node-load.js start +2022-11-16 17:45:28 INFO:  test-node-load.js load start {"human":"3.0.0","tf":"4.0.0","progress":0} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":1,"progress":0} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":12,"progress":0} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":24,"progress":0.03222546277199007} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":35,"progress":0.2135162934143239} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":61,"progress":0.3299591712723044} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":79,"progress":0.7259096583739463} +2022-11-16 17:45:28 STATE: test-node-load.js passed {"progress":1} +2022-11-16 17:45:28 INFO:  test-node-load.js load final {"progress":1} +2022-11-16 17:45:28 DATA:  test-node-load.js load interval {"elapsed":426,"progress":1} +2022-11-16 17:45:28 INFO:  +2022-11-16 17:45:28 INFO:  test-node-gear.js start +2022-11-16 17:45:28 DATA:  test-node-gear.js input: ["samples/in/ai-face.jpg"] +2022-11-16 17:45:29 STATE: test-node-gear.js passed: gear faceres samples/in/ai-face.jpg +2022-11-16 17:45:29 DATA:  test-node-gear.js results {"face":0,"model":"faceres","image":"samples/in/ai-face.jpg","age":23.5,"gender":"female","genderScore":0.92} +2022-11-16 17:45:29 STATE: test-node-gear.js passed: gear gear samples/in/ai-face.jpg +2022-11-16 17:45:29 DATA:  test-node-gear.js results {"face":0,"model":"gear","image":"samples/in/ai-face.jpg","age":23.3,"gender":"female","genderScore":0.51,"race":[{"score":0.93,"race":"white"}]} +2022-11-16 17:45:30 STATE: test-node-gear.js passed: gear ssrnet samples/in/ai-face.jpg +2022-11-16 17:45:30 DATA:  test-node-gear.js results {"face":0,"model":"ssrnet","image":"samples/in/ai-face.jpg","age":23.4,"gender":"female","genderScore":0.99} +2022-11-16 17:45:30 INFO:  +2022-11-16 17:45:30 INFO:  test-backend-node.js start +2022-11-16 17:45:30 INFO:  test-backend-node.js test: configuration validation +2022-11-16 17:45:30 STATE: test-backend-node.js passed: configuration default validation [] +2022-11-16 17:45:30 STATE: test-backend-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-11-16 17:45:30 INFO:  test-backend-node.js test: model load +2022-11-16 17:45:30 STATE: test-backend-node.js passed: models loaded 25 11 [{"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":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] +2022-11-16 17:45:30 INFO:  test-backend-node.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} +2022-11-16 17:45:30 INFO:  test-backend-node.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} +2022-11-16 17:45:30 INFO:  test-backend-node.js test: warmup +2022-11-16 17:45:30 STATE: test-backend-node.js passed: create human +2022-11-16 17:45:30 INFO:  test-backend-node.js human version: 3.0.0 +2022-11-16 17:45:30 INFO:  test-backend-node.js platform: linux x64 agent: NodeJS v19.1.0 +2022-11-16 17:45:30 INFO:  test-backend-node.js tfjs version: 4.0.0 +2022-11-16 17:45:30 INFO:  test-backend-node.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.9.1","gpu":false},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169} +2022-11-16 17:45:30 STATE: test-backend-node.js passed: set backend: tensorflow +2022-11-16 17:45:30 STATE: test-backend-node.js tensors 1785 +2022-11-16 17:45:30 STATE: test-backend-node.js passed: load models +2022-11-16 17:45:30 STATE: test-backend-node.js result: defined models: 25 loaded models: 11 +2022-11-16 17:45:30 STATE: test-backend-node.js passed: warmup: none default +2022-11-16 17:45:30 DATA:  test-backend-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-11-16 17:45:30 DATA:  test-backend-node.js result: performance: load: null total: null +2022-11-16 17:45:30 STATE: test-backend-node.js passed: warmup none result match +2022-11-16 17:45:30 STATE: test-backend-node.js event: image +2022-11-16 17:45:30 STATE: test-backend-node.js event: detect +2022-11-16 17:45:30 STATE: test-backend-node.js event: warmup +2022-11-16 17:45:30 STATE: test-backend-node.js passed: warmup: face default +2022-11-16 17:45:30 DATA:  test-backend-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-11-16 17:45:30 DATA:  test-backend-node.js result: performance: load: null total: 421 +2022-11-16 17:45:30 STATE: test-backend-node.js passed: warmup face result match +2022-11-16 17:45:30 STATE: test-backend-node.js event: image +2022-11-16 17:45:31 STATE: test-backend-node.js event: detect +2022-11-16 17:45:31 STATE: test-backend-node.js event: warmup +2022-11-16 17:45:31 STATE: test-backend-node.js passed: warmup: body default +2022-11-16 17:45:31 DATA:  test-backend-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-11-16 17:45:31 DATA:  test-backend-node.js result: performance: load: null total: 317 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: warmup body result match +2022-11-16 17:45:31 STATE: test-backend-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-11-16 17:45:31 INFO:  test-backend-node.js test: details verification +2022-11-16 17:45:31 STATE: test-backend-node.js start default +2022-11-16 17:45:31 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:31 STATE: test-backend-node.js event: image +2022-11-16 17:45:31 STATE: test-backend-node.js event: detect +2022-11-16 17:45:31 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg default +2022-11-16 17:45:31 DATA:  test-backend-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-11-16 17:45:31 DATA:  test-backend-node.js result: performance: load: null total: 313 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face length 1 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face score 1 0.93 1 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face age/gender 23.7 female 0.97 2.34 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face arrays 4 478 1024 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face anti-spoofing 0.79 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details face liveness 0.83 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details body length 1 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details body 0.92 17 6 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details hand length 1 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details hand 0.51 0.73 point +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details hand arrays 21 5 7 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details gesture length 7 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details object length 1 +2022-11-16 17:45:31 STATE: test-backend-node.js passed: details object 0.72 person +2022-11-16 17:45:31 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-11-16 17:45:31 STATE: test-backend-node.js event: image +2022-11-16 17:45:32 STATE: test-backend-node.js event: detect +2022-11-16 17:45:32 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-11-16 17:45:32 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-11-16 17:45:32 STATE: test-backend-node.js event: image +2022-11-16 17:45:32 STATE: test-backend-node.js event: detect +2022-11-16 17:45:32 STATE: test-backend-node.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-11-16 17:45:32 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:32 STATE: test-backend-node.js event: image +2022-11-16 17:45:33 STATE: test-backend-node.js event: detect +2022-11-16 17:45:33 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-11-16 17:45:33 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:33 STATE: test-backend-node.js event: image +2022-11-16 17:45:33 STATE: test-backend-node.js event: detect +2022-11-16 17:45:33 STATE: test-backend-node.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-11-16 17:45:33 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-11-16 17:45:33 STATE: test-backend-node.js event: image +2022-11-16 17:45:34 STATE: test-backend-node.js event: detect +2022-11-16 17:45:34 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-11-16 17:45:34 INFO:  test-backend-node.js test default +2022-11-16 17:45:34 STATE: test-backend-node.js start async +2022-11-16 17:45:34 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:34 STATE: test-backend-node.js event: image +2022-11-16 17:45:34 STATE: test-backend-node.js event: detect +2022-11-16 17:45:34 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg async +2022-11-16 17:45:34 DATA:  test-backend-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-11-16 17:45:34 DATA:  test-backend-node.js result: performance: load: null total: 314 +2022-11-16 17:45:34 STATE: test-backend-node.js passed: default result face match 1 female 0.97 +2022-11-16 17:45:34 INFO:  test-backend-node.js test sync +2022-11-16 17:45:34 STATE: test-backend-node.js start sync +2022-11-16 17:45:34 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:34 STATE: test-backend-node.js event: image +2022-11-16 17:45:35 STATE: test-backend-node.js event: detect +2022-11-16 17:45:35 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sync +2022-11-16 17:45:35 DATA:  test-backend-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-11-16 17:45:35 DATA:  test-backend-node.js result: performance: load: null total: 295 +2022-11-16 17:45:35 STATE: test-backend-node.js passed: default sync 1 female 0.97 +2022-11-16 17:45:35 INFO:  test-backend-node.js test: image process +2022-11-16 17:45:35 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 17:45:35 STATE: test-backend-node.js passed: image input null [1,256,256,3] +2022-11-16 17:45:35 INFO:  test-backend-node.js test: image null +2022-11-16 17:45:35 STATE: test-backend-node.js passed: invalid input could not convert input to tensor +2022-11-16 17:45:35 INFO:  test-backend-node.js test face similarity +2022-11-16 17:45:35 STATE: test-backend-node.js start face similarity +2022-11-16 17:45:35 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 17:45:35 STATE: test-backend-node.js event: image +2022-11-16 17:45:35 STATE: test-backend-node.js event: detect +2022-11-16 17:45:35 STATE: test-backend-node.js passed: detect: samples/in/ai-face.jpg face similarity +2022-11-16 17:45:35 DATA:  test-backend-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-11-16 17:45:35 DATA:  test-backend-node.js result: performance: load: null total: 284 +2022-11-16 17:45:35 STATE: test-backend-node.js start face similarity +2022-11-16 17:45:35 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:35 STATE: test-backend-node.js event: image +2022-11-16 17:45:35 STATE: test-backend-node.js event: detect +2022-11-16 17:45:35 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg face similarity +2022-11-16 17:45:35 DATA:  test-backend-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-11-16 17:45:35 DATA:  test-backend-node.js result: performance: load: null total: 292 +2022-11-16 17:45:35 STATE: test-backend-node.js start face similarity +2022-11-16 17:45:35 STATE: test-backend-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-11-16 17:45:35 STATE: test-backend-node.js event: image +2022-11-16 17:45:36 STATE: test-backend-node.js event: detect +2022-11-16 17:45:36 STATE: test-backend-node.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-11-16 17:45:36 DATA:  test-backend-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-11-16 17:45:36 DATA:  test-backend-node.js result: performance: load: null total: 267 +2022-11-16 17:45:36 STATE: test-backend-node.js passed: face descriptor +2022-11-16 17:45:36 STATE: test-backend-node.js passed: face similarity {"similarity":[1,0.44727441595492046,0.556793560189727],"descriptors":[1024,1024,1024]} +2022-11-16 17:45:36 INFO:  test-backend-node.js test object +2022-11-16 17:45:36 STATE: test-backend-node.js start object +2022-11-16 17:45:36 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:36 STATE: test-backend-node.js event: image +2022-11-16 17:45:36 STATE: test-backend-node.js event: detect +2022-11-16 17:45:36 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 17:45:36 DATA:  test-backend-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-11-16 17:45:36 DATA:  test-backend-node.js result: performance: load: null total: 291 +2022-11-16 17:45:36 STATE: test-backend-node.js passed: centernet +2022-11-16 17:45:36 STATE: test-backend-node.js start object +2022-11-16 17:45:37 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:37 STATE: test-backend-node.js event: image +2022-11-16 17:45:37 STATE: test-backend-node.js event: detect +2022-11-16 17:45:37 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 17:45:37 DATA:  test-backend-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-11-16 17:45:37 DATA:  test-backend-node.js result: performance: load: null total: 295 +2022-11-16 17:45:37 STATE: test-backend-node.js passed: nanodet +2022-11-16 17:45:37 INFO:  test-backend-node.js test sensitive +2022-11-16 17:45:37 STATE: test-backend-node.js start sensitive +2022-11-16 17:45:38 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:38 STATE: test-backend-node.js event: image +2022-11-16 17:45:38 STATE: test-backend-node.js event: detect +2022-11-16 17:45:38 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sensitive +2022-11-16 17:45:38 DATA:  test-backend-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-11-16 17:45:38 DATA:  test-backend-node.js result: performance: load: null total: 263 +2022-11-16 17:45:38 STATE: test-backend-node.js passed: sensitive result match +2022-11-16 17:45:38 STATE: test-backend-node.js passed: sensitive face result match +2022-11-16 17:45:38 STATE: test-backend-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] +2022-11-16 17:45:38 STATE: test-backend-node.js passed: sensitive body result match +2022-11-16 17:45:38 STATE: test-backend-node.js passed: sensitive hand result match +2022-11-16 17:45:38 INFO:  test-backend-node.js test body +2022-11-16 17:45:38 STATE: test-backend-node.js start blazepose +2022-11-16 17:45:40 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:40 STATE: test-backend-node.js event: image +2022-11-16 17:45:40 STATE: test-backend-node.js event: detect +2022-11-16 17:45:40 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg blazepose +2022-11-16 17:45:40 DATA:  test-backend-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-11-16 17:45:40 DATA:  test-backend-node.js result: performance: load: null total: 338 +2022-11-16 17:45:40 STATE: test-backend-node.js passed: blazepose +2022-11-16 17:45:40 STATE: test-backend-node.js start efficientpose +2022-11-16 17:45:41 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:41 STATE: test-backend-node.js event: image +2022-11-16 17:45:41 STATE: test-backend-node.js event: detect +2022-11-16 17:45:41 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-11-16 17:45:41 DATA:  test-backend-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-11-16 17:45:41 DATA:  test-backend-node.js result: performance: load: null total: 307 +2022-11-16 17:45:41 STATE: test-backend-node.js passed: efficientpose +2022-11-16 17:45:41 STATE: test-backend-node.js start posenet +2022-11-16 17:45:41 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:41 STATE: test-backend-node.js event: image +2022-11-16 17:45:42 STATE: test-backend-node.js event: detect +2022-11-16 17:45:42 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg posenet +2022-11-16 17:45:42 DATA:  test-backend-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-11-16 17:45:42 DATA:  test-backend-node.js result: performance: load: null total: 254 +2022-11-16 17:45:42 STATE: test-backend-node.js passed: posenet +2022-11-16 17:45:42 STATE: test-backend-node.js start movenet +2022-11-16 17:45:42 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 17:45:42 STATE: test-backend-node.js event: image +2022-11-16 17:45:42 STATE: test-backend-node.js event: detect +2022-11-16 17:45:42 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg movenet +2022-11-16 17:45:42 DATA:  test-backend-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-11-16 17:45:42 DATA:  test-backend-node.js result: performance: load: null total: 252 +2022-11-16 17:45:42 STATE: test-backend-node.js passed: movenet +2022-11-16 17:45:42 INFO:  test-backend-node.js test face matching +2022-11-16 17:45:42 STATE: test-backend-node.js passed: face database 40 +2022-11-16 17:45:42 STATE: test-backend-node.js passed: face match {"first":{"index":4,"similarity":0.7827852251220577}} {"second":{"index":4,"similarity":0.5002052057057577}} {"third":{"index":4,"similarity":0.5401588464054732}} +2022-11-16 17:45:42 INFO:  test-backend-node.js test face similarity alternative +2022-11-16 17:45:42 STATE: test-backend-node.js start face embeddings +2022-11-16 17:45:43 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 17:45:43 STATE: test-backend-node.js event: image +2022-11-16 17:45:43 ERROR: test-backend-node.js failed: testDetect face embeddings +2022-11-16 17:45:43 ERROR: test-backend-node.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node.js:99:176887"," at new Promise ()"," at q5 (/home/vlado/dev/human/dist/human.node.js:99:176656)"," at k1 (/home/vlado/dev/human/dist/human.node.js:121:6792)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node.js:840:9036"]} +2022-11-16 17:45:43 INFO:  +2022-11-16 17:45:43 INFO:  test-backend-node-gpu.js start +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js test: configuration validation +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: configuration default validation [] +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js test: model load +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: models loaded 25 11 [{"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":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js test: warmup +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: create human +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js human version: 3.0.0 +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js platform: linux x64 agent: NodeJS v19.1.0 +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js tfjs version: 4.0.0 +2022-11-16 17:45:44 INFO:  test-backend-node-gpu.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.9.1","gpu":true},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169} +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: set backend: tensorflow +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js tensors 1785 +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: load models +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js result: defined models: 25 loaded models: 11 +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: warmup: none default +2022-11-16 17:45:44 DATA:  test-backend-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-11-16 17:45:44 DATA:  test-backend-node-gpu.js result: performance: load: null total: null +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js passed: warmup none result match +2022-11-16 17:45:44 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: warmup +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: warmup: face default +2022-11-16 17:45:46 DATA:  test-backend-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-11-16 17:45:46 DATA:  test-backend-node-gpu.js result: performance: load: null total: 1862 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: warmup face result match +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: warmup +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: warmup: body default +2022-11-16 17:45:46 DATA:  test-backend-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-11-16 17:45:46 DATA:  test-backend-node-gpu.js result: performance: load: null total: 155 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: warmup body result match +2022-11-16 17:45:46 STATE: test-backend-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-11-16 17:45:46 INFO:  test-backend-node-gpu.js test: details verification +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js start default +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-11-16 17:45:46 DATA:  test-backend-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-11-16 17:45:46 DATA:  test-backend-node-gpu.js result: performance: load: null total: 169 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face length 1 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face score 1 0.93 1 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face age/gender 23.7 female 0.97 2.34 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face arrays 4 478 1024 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face anti-spoofing 0.79 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details face liveness 0.83 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details body length 1 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details body 0.92 17 6 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details hand length 1 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details hand 0.51 0.73 point +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details hand arrays 21 5 7 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details gesture length 7 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details object length 1 +2022-11-16 17:45:46 STATE: test-backend-node-gpu.js passed: details object 0.72 person +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:47 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-11-16 17:45:48 INFO:  test-backend-node-gpu.js test default +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js start async +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg async +2022-11-16 17:45:48 DATA:  test-backend-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-11-16 17:45:48 DATA:  test-backend-node-gpu.js result: performance: load: null total: 149 +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js passed: default result face match 1 female 0.97 +2022-11-16 17:45:48 INFO:  test-backend-node-gpu.js test sync +2022-11-16 17:45:48 STATE: test-backend-node-gpu.js start sync +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sync +2022-11-16 17:45:49 DATA:  test-backend-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-11-16 17:45:49 DATA:  test-backend-node-gpu.js result: performance: load: null total: 145 +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: default sync 1 female 0.97 +2022-11-16 17:45:49 INFO:  test-backend-node-gpu.js test: image process +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: image input null [1,256,256,3] +2022-11-16 17:45:49 INFO:  test-backend-node-gpu.js test: image null +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: invalid input could not convert input to tensor +2022-11-16 17:45:49 INFO:  test-backend-node-gpu.js test face similarity +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js start face similarity +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity +2022-11-16 17:45:49 DATA:  test-backend-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-11-16 17:45:49 DATA:  test-backend-node-gpu.js result: performance: load: null total: 145 +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js start face similarity +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity +2022-11-16 17:45:49 DATA:  test-backend-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-11-16 17:45:49 DATA:  test-backend-node-gpu.js result: performance: load: null total: 137 +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js start face similarity +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-11-16 17:45:49 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-11-16 17:45:50 DATA:  test-backend-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-11-16 17:45:50 DATA:  test-backend-node-gpu.js result: performance: load: null total: 149 +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js passed: face descriptor +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js passed: face similarity {"similarity":[1,0.4475002983522097,0.5570879556505012],"descriptors":[1024,1024,1024]} +2022-11-16 17:45:50 INFO:  test-backend-node-gpu.js test object +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js start object +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 17:45:50 DATA:  test-backend-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-11-16 17:45:50 DATA:  test-backend-node-gpu.js result: performance: load: null total: 139 +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js passed: centernet +2022-11-16 17:45:50 STATE: test-backend-node-gpu.js start object +2022-11-16 17:45:51 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:51 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:51 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:51 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 17:45:51 DATA:  test-backend-node-gpu.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-11-16 17:45:51 DATA:  test-backend-node-gpu.js result: performance: load: null total: 566 +2022-11-16 17:45:51 STATE: test-backend-node-gpu.js passed: nanodet +2022-11-16 17:45:51 INFO:  test-backend-node-gpu.js test sensitive +2022-11-16 17:45:51 STATE: test-backend-node-gpu.js start sensitive +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive +2022-11-16 17:45:52 DATA:  test-backend-node-gpu.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-11-16 17:45:52 DATA:  test-backend-node-gpu.js result: performance: load: null total: 125 +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: sensitive result match +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: sensitive face result match +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: sensitive body result match +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js passed: sensitive hand result match +2022-11-16 17:45:52 INFO:  test-backend-node-gpu.js test body +2022-11-16 17:45:52 STATE: test-backend-node-gpu.js start blazepose +2022-11-16 17:45:54 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:54 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:54 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:54 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose +2022-11-16 17:45:54 DATA:  test-backend-node-gpu.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-11-16 17:45:54 DATA:  test-backend-node-gpu.js result: performance: load: null total: 300 +2022-11-16 17:45:54 STATE: test-backend-node-gpu.js passed: blazepose +2022-11-16 17:45:54 STATE: test-backend-node-gpu.js start efficientpose +2022-11-16 17:45:55 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:55 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:55 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:55 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-11-16 17:45:55 DATA:  test-backend-node-gpu.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-11-16 17:45:55 DATA:  test-backend-node-gpu.js result: performance: load: null total: 942 +2022-11-16 17:45:55 STATE: test-backend-node-gpu.js passed: efficientpose +2022-11-16 17:45:55 STATE: test-backend-node-gpu.js start posenet +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet +2022-11-16 17:45:56 DATA:  test-backend-node-gpu.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-11-16 17:45:56 DATA:  test-backend-node-gpu.js result: performance: load: null total: 119 +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js passed: posenet +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js start movenet +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 17:45:56 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js event: detect +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet +2022-11-16 17:45:57 DATA:  test-backend-node-gpu.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-11-16 17:45:57 DATA:  test-backend-node-gpu.js result: performance: load: null total: 130 +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js passed: movenet +2022-11-16 17:45:57 INFO:  test-backend-node-gpu.js test face matching +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js passed: face database 40 +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7829338043932047}} {"second":{"index":4,"similarity":0.5002928781584631}} {"third":{"index":4,"similarity":0.5402934771672516}} +2022-11-16 17:45:57 INFO:  test-backend-node-gpu.js test face similarity alternative +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js start face embeddings +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 17:45:57 STATE: test-backend-node-gpu.js event: image +2022-11-16 17:45:57 ERROR: test-backend-node-gpu.js failed: testDetect face embeddings +2022-11-16 17:45:57 ERROR: test-backend-node-gpu.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-gpu.js:99:176887"," at new Promise ()"," at q5 (/home/vlado/dev/human/dist/human.node-gpu.js:99:176656)"," at k1 (/home/vlado/dev/human/dist/human.node-gpu.js:121:6792)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-gpu.js:840:9036"]} +2022-11-16 17:45:57 INFO:  +2022-11-16 17:45:57 INFO:  test-backend-node-wasm.js start +2022-11-16 17:45:58 DATA:  test-backend-node-wasm.js stdout: 2022-11-16 17:45:58 INFO:  { supported: true, backend: true, simd: undefined, multithread: undefined } https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.0.0/dist/ +2022-11-16 17:45:58 STATE: test-backend-node-wasm.js passed: model server: https://vladmandic.github.io/human-models/models/ +2022-11-16 17:45:58 INFO:  test-backend-node-wasm.js test: configuration validation +2022-11-16 17:45:58 STATE: test-backend-node-wasm.js passed: configuration default validation [] +2022-11-16 17:45:58 STATE: test-backend-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-11-16 17:45:58 INFO:  test-backend-node-wasm.js test: model load +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: models loaded 25 11 [{"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/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":"https://vladmandic.github.io/human-models/models/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human-models/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human-models/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human-models/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human-models/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/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human-models/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human-models/models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human-models/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human-models/models/antispoof.json"}] +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js test: warmup +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: create human +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js human version: 3.0.0 +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js platform: linux x64 agent: NodeJS v19.1.0 +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js tfjs version: 4.0.0 +2022-11-16 17:46:00 INFO:  test-backend-node-wasm.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["wasm"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{},"wasm":{"supported":true,"backend":true,"simd":true,"multithread":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":126} +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: set backend: wasm +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js tensors 1785 +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: load models +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js result: defined models: 25 loaded models: 11 +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: warmup: none default +2022-11-16 17:46:00 DATA:  test-backend-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-11-16 17:46:00 DATA:  test-backend-node-wasm.js result: performance: load: null total: null +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: warmup none result match +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js event: warmup +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: warmup: face default +2022-11-16 17:46:00 DATA:  test-backend-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-11-16 17:46:00 DATA:  test-backend-node-wasm.js result: performance: load: null total: 471 +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js passed: warmup face result match +2022-11-16 17:46:00 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js event: warmup +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: warmup: body default +2022-11-16 17:46:01 DATA:  test-backend-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-11-16 17:46:01 DATA:  test-backend-node-wasm.js result: performance: load: null total: 345 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: warmup body result match +2022-11-16 17:46:01 STATE: test-backend-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-11-16 17:46:01 INFO:  test-backend-node-wasm.js test: details verification +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js start default +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-11-16 17:46:01 DATA:  test-backend-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-11-16 17:46:01 DATA:  test-backend-node-wasm.js result: performance: load: null total: 328 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face length 1 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face score 1 0.93 1 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face age/gender 23.7 female 0.97 2.34 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face arrays 4 478 1024 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face anti-spoofing 0.79 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details face liveness 0.83 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details body length 1 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details body 0.92 17 6 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details hand length 1 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details hand 0.51 0.73 point +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details hand arrays 21 5 7 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details gesture length 7 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details object length 1 +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: details object 0.72 person +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264} +2022-11-16 17:46:01 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:02 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:02 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-11-16 17:46:02 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} +2022-11-16 17:46:02 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:02 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:02 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:03 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-11-16 17:46:04 INFO:  test-backend-node-wasm.js test default +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js start async +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:04 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg async +2022-11-16 17:46:05 DATA:  test-backend-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-11-16 17:46:05 DATA:  test-backend-node-wasm.js result: performance: load: null total: 342 +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: default result face match 1 female 0.97 +2022-11-16 17:46:05 INFO:  test-backend-node-wasm.js test sync +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js start sync +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sync +2022-11-16 17:46:05 DATA:  test-backend-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-11-16 17:46:05 DATA:  test-backend-node-wasm.js result: performance: load: null total: 327 +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: default sync 1 female 0.97 +2022-11-16 17:46:05 INFO:  test-backend-node-wasm.js test: image process +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: image input null [1,256,256,3] +2022-11-16 17:46:05 INFO:  test-backend-node-wasm.js test: image null +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: invalid input could not convert input to tensor +2022-11-16 17:46:05 INFO:  test-backend-node-wasm.js test face similarity +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js start face similarity +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity +2022-11-16 17:46:05 DATA:  test-backend-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-11-16 17:46:05 DATA:  test-backend-node-wasm.js result: performance: load: null total: 305 +2022-11-16 17:46:05 STATE: test-backend-node-wasm.js start face similarity +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity +2022-11-16 17:46:06 DATA:  test-backend-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-11-16 17:46:06 DATA:  test-backend-node-wasm.js result: performance: load: null total: 338 +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js start face similarity +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-11-16 17:46:06 DATA:  test-backend-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-11-16 17:46:06 DATA:  test-backend-node-wasm.js result: performance: load: null total: 296 +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js passed: face descriptor +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]} +2022-11-16 17:46:06 INFO:  test-backend-node-wasm.js test object +2022-11-16 17:46:06 STATE: test-backend-node-wasm.js start object +2022-11-16 17:46:07 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:07 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:07 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:07 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 17:46:07 DATA:  test-backend-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-11-16 17:46:07 DATA:  test-backend-node-wasm.js result: performance: load: null total: 333 +2022-11-16 17:46:07 STATE: test-backend-node-wasm.js passed: centernet +2022-11-16 17:46:07 STATE: test-backend-node-wasm.js start object +2022-11-16 17:46:07 WARN:  test-backend-node-wasm.js missing kernel ops {"title":"object","model":"nanodet","url":"https://vladmandic.github.io/human-models/models/nanodet.json","missing":["sparsetodense"],"backkend":"wasm"} +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 17:46:08 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 17:46:08 DATA:  test-backend-node-wasm.js result: performance: load: null total: 221 +2022-11-16 17:46:08 ERROR: test-backend-node-wasm.js failed: nanodet [] +2022-11-16 17:46:08 INFO:  test-backend-node-wasm.js test sensitive +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js start sensitive +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive +2022-11-16 17:46:08 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 17:46:08 DATA:  test-backend-node-wasm.js result: performance: load: null total: 245 +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: sensitive result match +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: sensitive face result match +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}] +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: sensitive body result match +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js passed: sensitive hand result match +2022-11-16 17:46:08 INFO:  test-backend-node-wasm.js test body +2022-11-16 17:46:08 STATE: test-backend-node-wasm.js start blazepose +2022-11-16 17:46:10 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:10 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:11 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:11 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose +2022-11-16 17:46:11 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.99,"keypoints":39} +2022-11-16 17:46:11 DATA:  test-backend-node-wasm.js result: performance: load: null total: 412 +2022-11-16 17:46:11 STATE: test-backend-node-wasm.js passed: blazepose +2022-11-16 17:46:11 STATE: test-backend-node-wasm.js start efficientpose +2022-11-16 17:46:11 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:11 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:12 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:12 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-11-16 17:46:12 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.75,"keypoints":13} +2022-11-16 17:46:12 DATA:  test-backend-node-wasm.js result: performance: load: null total: 675 +2022-11-16 17:46:12 STATE: test-backend-node-wasm.js passed: efficientpose +2022-11-16 17:46:12 STATE: test-backend-node-wasm.js start posenet +2022-11-16 17:46:12 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:12 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet +2022-11-16 17:46:13 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.96,"keypoints":16} +2022-11-16 17:46:13 DATA:  test-backend-node-wasm.js result: performance: load: null total: 298 +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js passed: posenet +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js start movenet +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js event: detect +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet +2022-11-16 17:46:13 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 17:46:13 DATA:  test-backend-node-wasm.js result: performance: load: null total: 247 +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js passed: movenet +2022-11-16 17:46:13 INFO:  test-backend-node-wasm.js test face matching +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js passed: face database 40 +2022-11-16 17:46:13 STATE: test-backend-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-11-16 17:46:13 INFO:  test-backend-node-wasm.js test face similarity alternative +2022-11-16 17:46:13 STATE: test-backend-node-wasm.js start face embeddings +2022-11-16 17:46:14 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-11-16 17:46:14 STATE: test-backend-node-wasm.js event: image +2022-11-16 17:46:14 ERROR: test-backend-node-wasm.js failed: testDetect face embeddings +2022-11-16 17:46:14 ERROR: test-backend-node-wasm.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-wasm.js:99:176887"," at new Promise ()"," at U5 (/home/vlado/dev/human/dist/human.node-wasm.js:99:176656)"," at w1 (/home/vlado/dev/human/dist/human.node-wasm.js:121:6792)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-wasm.js:840:9036"]} +2022-11-16 17:46:14 STATE: all tests complete +2022-11-16 17:46:14 INFO:  status {"test":"../demo/nodejs/node.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/nodejs/process-folder.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"test-node-load.js","passed":1,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"test-node-gear.js","passed":3,"failed":0} +2022-11-16 17:46:14 INFO:  status {"test":"test-backend-node.js","passed":85,"failed":1} +2022-11-16 17:46:14 INFO:  status {"test":"test-backend-node-gpu.js","passed":85,"failed":1} +2022-11-16 17:46:14 INFO:  status {"test":"test-backend-node-wasm.js","passed":85,"failed":2} +2022-11-16 17:46:14 INFO:  failures {"count":4} +2022-11-16 17:46:14 WARN:  failed {"test":"test-backend-node.js","message":["error",["failed:","testDetect face embeddings"]]} +2022-11-16 17:46:14 WARN:  failed {"test":"test-backend-node-gpu.js","message":["error",["failed:","testDetect face embeddings"]]} +2022-11-16 17:46:14 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed: nanodet",[]]]} +2022-11-16 17:46:14 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed:","testDetect face embeddings"]]}