diff --git a/README.md b/README.md
index cae925d5..17ec465d 100644
--- a/README.md
+++ b/README.md
@@ -427,7 +427,7 @@ For more info, see [**Configuration Details**](https://github.com/vladmandic/hum
-`Human` library is written in [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html) **4.8** using [TensorFlow/JS](https://www.tensorflow.org/js/) **4.0** and conforming to latest `JavaScript` [ECMAScript version 2022](https://262.ecma-international.org/) standard
+`Human` library is written in [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html) **4.9** using [TensorFlow/JS](https://www.tensorflow.org/js/) **4.0** and conforming to latest `JavaScript` [ECMAScript version 2022](https://262.ecma-international.org/) standard
Build target for distributables is `JavaScript` [EMCAScript version 2018](https://262.ecma-international.org/9.0/)
diff --git a/TODO.md b/TODO.md
index a7fcb690..41fb08d7 100644
--- a/TODO.md
+++ b/TODO.md
@@ -67,13 +67,17 @@ Features:
Which significantly increases performance and precision in poorly lit scenes
- Improved `config.filter.equalization` (*disabled by default*)
Image and video on-demand histogram equalization
+- Support selecting specific video source when multiple cameras are present
+ See `human.webcam.enumerate()`
Architecture:
- Reduce build dependencies
`Human` is now 30% smaller :)
As usual, `Human` has **zero** runtime dependencies,
all *devDependencies* are only to rebuild `Human` itself
-- Upgrade to TFJS 4.0 with **strong typing**
+- Upgrade to **TFJS 4.0** with **strong typing**
see [notes](https://github.com/vladmandic/human#typedefs) on how to use
- `TypeDef` refactoring
- Add named export for improved bundler support when using non-default imports
+- Support for `NodeJS` v19
+- Upgrade to **TypeScript 4.9**
diff --git a/demo/typescript/index.js b/demo/typescript/index.js
index d3a60185..9ea49e3e 100644
--- a/demo/typescript/index.js
+++ b/demo/typescript/index.js
@@ -4,6 +4,6 @@
author: '
*/
-import*as m from"../../dist/human.esm.js";var f=1920,g={modelBasePath:"../../models",filter:{enabled:!0,equalization:!1,flip:!1,width:f},face:{enabled:!0,detector:{rotation:!0},mesh:{enabled:!0},attention:{enabled:!1},iris:{enabled:!0},description:{enabled:!0},emotion:{enabled:!0},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!0},hand:{enabled:!0},object:{enabled:!1},segmentation:{enabled:!1},gesture:{enabled:!0}},e=new m.Human(g);e.env.perfadd=!1;e.draw.options.font='small-caps 18px "Lato"';e.draw.options.lineHeight=20;var a={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("status"),perf:document.getElementById("performance")},n={detect:0,draw:0,tensors:0,start:0},o={detectFPS:0,drawFPS:0,frames:0,averageMs:0},s=(...t)=>{a.log.innerText+=t.join(" ")+`
-`,console.log(...t)},r=t=>a.fps.innerText=t,b=t=>a.perf.innerText="tensors:"+e.tf.memory().numTensors.toString()+" | performance: "+JSON.stringify(t).replace(/"|{|}/g,"").replace(/,/g," | ");async function u(){if(!a.video.paused){n.start===0&&(n.start=e.now()),await e.detect(a.video);let t=e.tf.memory().numTensors;t-n.tensors!==0&&s("allocated tensors:",t-n.tensors),n.tensors=t,o.detectFPS=Math.round(1e3*1e3/(e.now()-n.detect))/1e3,o.frames++,o.averageMs=Math.round(1e3*(e.now()-n.start)/o.frames)/1e3,o.frames%100===0&&!a.video.paused&&s("performance",{...o,tensors:n.tensors})}n.detect=e.now(),requestAnimationFrame(u)}async function p(){var d,i,l;if(!a.video.paused){let c=e.next(e.result),w=await e.image(a.video);e.draw.canvas(w.canvas,a.canvas);let v={bodyLabels:`person confidence [score] and ${(l=(i=(d=e.result)==null?void 0:d.body)==null?void 0:i[0])==null?void 0:l.keypoints.length} keypoints`};await e.draw.all(a.canvas,c,v),b(c.performance)}let t=e.now();o.drawFPS=Math.round(1e3*1e3/(t-n.draw))/1e3,n.draw=t,r(a.video.paused?"paused":`fps: ${o.detectFPS.toFixed(1).padStart(5," ")} detect | ${o.drawFPS.toFixed(1).padStart(5," ")} draw`),setTimeout(p,30)}async function h(){await e.webcam.start({element:a.video,crop:!0,width:f}),a.canvas.width=e.webcam.width,a.canvas.height=e.webcam.height,a.canvas.onclick=async()=>{e.webcam.paused?await e.webcam.play():e.webcam.pause()}}async function y(){s("human version:",e.version,"| tfjs version:",e.tf.version["tfjs-core"]),s("platform:",e.env.platform,"| agent:",e.env.agent),r("loading..."),await e.load(),s("backend:",e.tf.getBackend(),"| available:",e.env.backends),s("models stats:",e.getModelStats()),s("models loaded:",Object.values(e.models).filter(t=>t!==null).length),s("environment",e.env),r("initializing..."),await e.warmup(),await h(),await u(),await p()}window.onload=y;
+import*as m from"../../dist/human.esm.js";var f=1920,b={modelBasePath:"../../models",filter:{enabled:!0,equalization:!1,flip:!1,width:f},face:{enabled:!0,detector:{rotation:!0},mesh:{enabled:!0},attention:{enabled:!1},iris:{enabled:!0},description:{enabled:!0},emotion:{enabled:!0},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!0},hand:{enabled:!1},object:{enabled:!1},segmentation:{enabled:!1},gesture:{enabled:!0}},e=new m.Human(b);e.env.perfadd=!1;e.draw.options.font='small-caps 18px "Lato"';e.draw.options.lineHeight=20;var a={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("status"),perf:document.getElementById("performance")},n={detect:0,draw:0,tensors:0,start:0},s={detectFPS:0,drawFPS:0,frames:0,averageMs:0},o=(...t)=>{a.log.innerText+=t.join(" ")+`
+`,console.log(...t)},r=t=>a.fps.innerText=t,g=t=>a.perf.innerText="tensors:"+e.tf.memory().numTensors.toString()+" | performance: "+JSON.stringify(t).replace(/"|{|}/g,"").replace(/,/g," | ");async function u(){if(!a.video.paused){n.start===0&&(n.start=e.now()),await e.detect(a.video);let t=e.tf.memory().numTensors;t-n.tensors!==0&&o("allocated tensors:",t-n.tensors),n.tensors=t,s.detectFPS=Math.round(1e3*1e3/(e.now()-n.detect))/1e3,s.frames++,s.averageMs=Math.round(1e3*(e.now()-n.start)/s.frames)/1e3,s.frames%100===0&&!a.video.paused&&o("performance",{...s,tensors:n.tensors})}n.detect=e.now(),requestAnimationFrame(u)}async function p(){var d,i,c;if(!a.video.paused){let l=e.next(e.result),w=await e.image(a.video);e.draw.canvas(w.canvas,a.canvas);let v={bodyLabels:`person confidence [score] and ${(c=(i=(d=e.result)==null?void 0:d.body)==null?void 0:i[0])==null?void 0:c.keypoints.length} keypoints`};await e.draw.all(a.canvas,l,v),g(l.performance)}let t=e.now();s.drawFPS=Math.round(1e3*1e3/(t-n.draw))/1e3,n.draw=t,r(a.video.paused?"paused":`fps: ${s.detectFPS.toFixed(1).padStart(5," ")} detect | ${s.drawFPS.toFixed(1).padStart(5," ")} draw`),setTimeout(p,30)}async function h(){let d=(await e.webcam.enumerate())[0].deviceId;await e.webcam.start({element:a.video,crop:!0,width:f,id:d}),a.canvas.width=e.webcam.width,a.canvas.height=e.webcam.height,a.canvas.onclick=async()=>{e.webcam.paused?await e.webcam.play():e.webcam.pause()}}async function y(){o("human version:",e.version,"| tfjs version:",e.tf.version["tfjs-core"]),o("platform:",e.env.platform,"| agent:",e.env.agent),r("loading..."),await e.load(),o("backend:",e.tf.getBackend(),"| available:",e.env.backends),o("models stats:",e.getModelStats()),o("models loaded:",Object.values(e.models).filter(t=>t!==null).length),o("environment",e.env),r("initializing..."),await e.warmup(),await h(),await u(),await p()}window.onload=y;
//# sourceMappingURL=index.js.map
diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map
index 9dc875a2..5a739be2 100644
--- a/demo/typescript/index.js.map
+++ b/demo/typescript/index.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
"sources": ["index.ts"],
- "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport * as H from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\n\nconst width = 1920; // used by webcam config as well as human maximum resultion // can be anything, but resolutions higher than 4k will disable internal optimizations\n\nconst humanConfig: Partial = { // user configuration for human, used to fine-tune behavior\n // backend: 'webgpu',\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: false, flip: false, width },\n face: { enabled: true, detector: { rotation: true }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true }, antispoof: { enabled: true }, liveness: { enabled: true } },\n body: { enabled: true },\n hand: { enabled: true },\n object: { enabled: false },\n segmentation: { enabled: false },\n gesture: { enabled: true },\n};\n\nconst human = new H.Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env.perfadd = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n// human.draw.options.fillPolygons = true;\n\nconst dom = { // grab instances of dom objects so we dont have to look them up later\n video: document.getElementById('video') as HTMLVideoElement,\n canvas: document.getElementById('canvas') as HTMLCanvasElement,\n log: document.getElementById('log') as HTMLPreElement,\n fps: document.getElementById('status') as HTMLPreElement,\n perf: document.getElementById('performance') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0, tensors: 0, start: 0 }; // holds information used to calculate performance and possible memory leaks\nconst fps = { detectFPS: 0, drawFPS: 0, frames: 0, averageMs: 0 }; // holds calculated fps information for both detect and screen refresh\n\nconst log = (...msg) => { // helper method to output messages\n dom.log.innerText += msg.join(' ') + '\\n';\n console.log(...msg); // eslint-disable-line no-console\n};\nconst status = (msg) => dom.fps.innerText = msg; // print status element\nconst perf = (msg) => dom.perf.innerText = 'tensors:' + human.tf.memory().numTensors.toString() + ' | performance: ' + JSON.stringify(msg).replace(/\"|{|}/g, '').replace(/,/g, ' | '); // print performance element\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (timestamp.start === 0) timestamp.start = human.now();\n // log('profiling data:', await human.profile(dom.video));\n await human.detect(dom.video); // actual detection; were not capturing output in a local variable as it can also be reached via human.result\n const tensors = human.tf.memory().numTensors; // check current tensor usage for memory leaks\n if (tensors - timestamp.tensors !== 0) log('allocated tensors:', tensors - timestamp.tensors); // printed on start and each time there is a tensor leak\n timestamp.tensors = tensors;\n fps.detectFPS = Math.round(1000 * 1000 / (human.now() - timestamp.detect)) / 1000;\n fps.frames++;\n fps.averageMs = Math.round(1000 * (human.now() - timestamp.start) / fps.frames) / 1000;\n if (fps.frames % 100 === 0 && !dom.video.paused) log('performance', { ...fps, tensors: timestamp.tensors });\n }\n timestamp.detect = human.now();\n requestAnimationFrame(detectionLoop); // start new frame immediately\n}\n\nasync function drawLoop() { // main screen refresh loop\n if (!dom.video.paused) {\n const interpolated = human.next(human.result); // smoothen result using last-known results\n const processed = await human.image(dom.video); // get current video frame, but enhanced with human.filters\n human.draw.canvas(processed.canvas as HTMLCanvasElement, dom.canvas);\n\n const opt: Partial = { bodyLabels: `person confidence [score] and ${human.result?.body?.[0]?.keypoints.length} keypoints` };\n await human.draw.all(dom.canvas, interpolated, opt); // draw labels, boxes, lines, etc.\n perf(interpolated.performance); // write performance data\n }\n const now = human.now();\n fps.drawFPS = Math.round(1000 * 1000 / (now - timestamp.draw)) / 1000;\n timestamp.draw = now;\n status(dom.video.paused ? 'paused' : `fps: ${fps.detectFPS.toFixed(1).padStart(5, ' ')} detect | ${fps.drawFPS.toFixed(1).padStart(5, ' ')} draw`); // write status\n setTimeout(drawLoop, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n}\n\nasync function webCam() {\n await human.webcam.start({ element: dom.video, crop: true, width }); // use human webcam helper methods and associate webcam stream with a dom element\n dom.canvas.width = human.webcam.width;\n dom.canvas.height = human.webcam.height;\n dom.canvas.onclick = async () => { // pause when clicked on screen and resume on next click\n if (human.webcam.paused) await human.webcam.play();\n else human.webcam.pause();\n };\n}\n\nasync function main() { // main entry point\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('platform:', human.env.platform, '| agent:', human.env.agent);\n status('loading...');\n await human.load(); // preload all models\n log('backend:', human.tf.getBackend(), '| available:', human.env.backends);\n log('models stats:', human.getModelStats());\n log('models loaded:', Object.values(human.models).filter((model) => model !== null).length);\n log('environment', human.env);\n status('initializing...');\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await webCam(); // start webcam\n await detectionLoop(); // start detection loop\n await drawLoop(); // start draw loop\n}\n\nwindow.onload = main;\n"],
- "mappings": ";;;;;;AASA,UAAYA,MAAO,0BAEnB,IAAMC,EAAQ,KAERC,EAAiC,CAErC,cAAe,eACf,OAAQ,CAAE,QAAS,GAAM,aAAc,GAAO,KAAM,GAAO,MAAAD,CAAM,EACjE,KAAM,CAAE,QAAS,GAAM,SAAU,CAAE,SAAU,EAAK,EAAG,KAAM,CAAE,QAAS,EAAK,EAAG,UAAW,CAAE,QAAS,EAAM,EAAG,KAAM,CAAE,QAAS,EAAK,EAAG,YAAa,CAAE,QAAS,EAAK,EAAG,QAAS,CAAE,QAAS,EAAK,EAAG,UAAW,CAAE,QAAS,EAAK,EAAG,SAAU,CAAE,QAAS,EAAK,CAAE,EAC5P,KAAM,CAAE,QAAS,EAAK,EACtB,KAAM,CAAE,QAAS,EAAK,EACtB,OAAQ,CAAE,QAAS,EAAM,EACzB,aAAc,CAAE,QAAS,EAAM,EAC/B,QAAS,CAAE,QAAS,EAAK,CAC3B,EAEME,EAAQ,IAAM,QAAMD,CAAW,EAErCC,EAAM,IAAI,QAAU,GACpBA,EAAM,KAAK,QAAQ,KAAO,yBAC1BA,EAAM,KAAK,QAAQ,WAAa,GAGhC,IAAMC,EAAM,CACV,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,IAAK,SAAS,eAAe,KAAK,EAClC,IAAK,SAAS,eAAe,QAAQ,EACrC,KAAM,SAAS,eAAe,aAAa,CAC7C,EACMC,EAAY,CAAE,OAAQ,EAAG,KAAM,EAAG,QAAS,EAAG,MAAO,CAAE,EACvDC,EAAM,CAAE,UAAW,EAAG,QAAS,EAAG,OAAQ,EAAG,UAAW,CAAE,EAE1DC,EAAM,IAAIC,IAAQ,CACtBJ,EAAI,IAAI,WAAaI,EAAI,KAAK,GAAG,EAAI;AAAA,EACrC,QAAQ,IAAI,GAAGA,CAAG,CACpB,EACMC,EAAUD,GAAQJ,EAAI,IAAI,UAAYI,EACtCE,EAAQF,GAAQJ,EAAI,KAAK,UAAY,WAAaD,EAAM,GAAG,OAAO,EAAE,WAAW,SAAS,EAAI,mBAAqB,KAAK,UAAUK,CAAG,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,KAAM,KAAK,EAEpL,eAAeG,GAAgB,CAC7B,GAAI,CAACP,EAAI,MAAM,OAAQ,CACjBC,EAAU,QAAU,IAAGA,EAAU,MAAQF,EAAM,IAAI,GAEvD,MAAMA,EAAM,OAAOC,EAAI,KAAK,EAC5B,IAAMQ,EAAUT,EAAM,GAAG,OAAO,EAAE,WAC9BS,EAAUP,EAAU,UAAY,GAAGE,EAAI,qBAAsBK,EAAUP,EAAU,OAAO,EAC5FA,EAAU,QAAUO,EACpBN,EAAI,UAAY,KAAK,MAAM,IAAO,KAAQH,EAAM,IAAI,EAAIE,EAAU,OAAO,EAAI,IAC7EC,EAAI,SACJA,EAAI,UAAY,KAAK,MAAM,KAAQH,EAAM,IAAI,EAAIE,EAAU,OAASC,EAAI,MAAM,EAAI,IAC9EA,EAAI,OAAS,MAAQ,GAAK,CAACF,EAAI,MAAM,QAAQG,EAAI,cAAe,CAAE,GAAGD,EAAK,QAASD,EAAU,OAAQ,CAAC,CAC5G,CACAA,EAAU,OAASF,EAAM,IAAI,EAC7B,sBAAsBQ,CAAa,CACrC,CAEA,eAAeE,GAAW,CAlE1B,IAAAC,EAAAC,EAAAC,EAmEE,GAAI,CAACZ,EAAI,MAAM,OAAQ,CACrB,IAAMa,EAAed,EAAM,KAAKA,EAAM,MAAM,EACtCe,EAAY,MAAMf,EAAM,MAAMC,EAAI,KAAK,EAC7CD,EAAM,KAAK,OAAOe,EAAU,OAA6Bd,EAAI,MAAM,EAEnE,IAAMe,EAA8B,CAAE,WAAY,kCAAiCH,GAAAD,GAAAD,EAAAX,EAAM,SAAN,YAAAW,EAAc,OAAd,YAAAC,EAAqB,KAArB,YAAAC,EAAyB,UAAU,kBAAmB,EACzI,MAAMb,EAAM,KAAK,IAAIC,EAAI,OAAQa,EAAcE,CAAG,EAClDT,EAAKO,EAAa,WAAW,CAC/B,CACA,IAAMG,EAAMjB,EAAM,IAAI,EACtBG,EAAI,QAAU,KAAK,MAAM,IAAO,KAAQc,EAAMf,EAAU,KAAK,EAAI,IACjEA,EAAU,KAAOe,EACjBX,EAAOL,EAAI,MAAM,OAAS,SAAW,QAAQE,EAAI,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,cAAcA,EAAI,QAAQ,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,QAAQ,EACjJ,WAAWO,EAAU,EAAE,CACzB,CAEA,eAAeQ,GAAS,CACtB,MAAMlB,EAAM,OAAO,MAAM,CAAE,QAASC,EAAI,MAAO,KAAM,GAAM,MAAAH,CAAM,CAAC,EAClEG,EAAI,OAAO,MAAQD,EAAM,OAAO,MAChCC,EAAI,OAAO,OAASD,EAAM,OAAO,OACjCC,EAAI,OAAO,QAAU,SAAY,CAC3BD,EAAM,OAAO,OAAQ,MAAMA,EAAM,OAAO,KAAK,EAC5CA,EAAM,OAAO,MAAM,CAC1B,CACF,CAEA,eAAemB,GAAO,CACpBf,EAAI,iBAAkBJ,EAAM,QAAS,kBAAmBA,EAAM,GAAG,QAAQ,YAAY,EACrFI,EAAI,YAAaJ,EAAM,IAAI,SAAU,WAAYA,EAAM,IAAI,KAAK,EAChEM,EAAO,YAAY,EACnB,MAAMN,EAAM,KAAK,EACjBI,EAAI,WAAYJ,EAAM,GAAG,WAAW,EAAG,eAAgBA,EAAM,IAAI,QAAQ,EACzEI,EAAI,gBAAiBJ,EAAM,cAAc,CAAC,EAC1CI,EAAI,iBAAkB,OAAO,OAAOJ,EAAM,MAAM,EAAE,OAAQoB,GAAUA,IAAU,IAAI,EAAE,MAAM,EAC1FhB,EAAI,cAAeJ,EAAM,GAAG,EAC5BM,EAAO,iBAAiB,EACxB,MAAMN,EAAM,OAAO,EACnB,MAAMkB,EAAO,EACb,MAAMV,EAAc,EACpB,MAAME,EAAS,CACjB,CAEA,OAAO,OAASS",
- "names": ["H", "width", "humanConfig", "human", "dom", "timestamp", "fps", "log", "msg", "status", "perf", "detectionLoop", "tensors", "drawLoop", "_a", "_b", "_c", "interpolated", "processed", "opt", "now", "webCam", "main", "model"]
+ "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport * as H from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\n\nconst width = 1920; // used by webcam config as well as human maximum resultion // can be anything, but resolutions higher than 4k will disable internal optimizations\n\nconst humanConfig: Partial = { // user configuration for human, used to fine-tune behavior\n // backend: 'webgpu',\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: false, flip: false, width },\n face: { enabled: true, detector: { rotation: true }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true }, antispoof: { enabled: true }, liveness: { enabled: true } },\n body: { enabled: true },\n // hand: { enabled: true },\n hand: { enabled: false },\n object: { enabled: false },\n segmentation: { enabled: false },\n gesture: { enabled: true },\n};\n\nconst human = new H.Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env.perfadd = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n// human.draw.options.fillPolygons = true;\n\nconst dom = { // grab instances of dom objects so we dont have to look them up later\n video: document.getElementById('video') as HTMLVideoElement,\n canvas: document.getElementById('canvas') as HTMLCanvasElement,\n log: document.getElementById('log') as HTMLPreElement,\n fps: document.getElementById('status') as HTMLPreElement,\n perf: document.getElementById('performance') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0, tensors: 0, start: 0 }; // holds information used to calculate performance and possible memory leaks\nconst fps = { detectFPS: 0, drawFPS: 0, frames: 0, averageMs: 0 }; // holds calculated fps information for both detect and screen refresh\n\nconst log = (...msg) => { // helper method to output messages\n dom.log.innerText += msg.join(' ') + '\\n';\n console.log(...msg); // eslint-disable-line no-console\n};\nconst status = (msg) => dom.fps.innerText = msg; // print status element\nconst perf = (msg) => dom.perf.innerText = 'tensors:' + human.tf.memory().numTensors.toString() + ' | performance: ' + JSON.stringify(msg).replace(/\"|{|}/g, '').replace(/,/g, ' | '); // print performance element\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (timestamp.start === 0) timestamp.start = human.now();\n // log('profiling data:', await human.profile(dom.video));\n await human.detect(dom.video); // actual detection; were not capturing output in a local variable as it can also be reached via human.result\n const tensors = human.tf.memory().numTensors; // check current tensor usage for memory leaks\n if (tensors - timestamp.tensors !== 0) log('allocated tensors:', tensors - timestamp.tensors); // printed on start and each time there is a tensor leak\n timestamp.tensors = tensors;\n fps.detectFPS = Math.round(1000 * 1000 / (human.now() - timestamp.detect)) / 1000;\n fps.frames++;\n fps.averageMs = Math.round(1000 * (human.now() - timestamp.start) / fps.frames) / 1000;\n if (fps.frames % 100 === 0 && !dom.video.paused) log('performance', { ...fps, tensors: timestamp.tensors });\n }\n timestamp.detect = human.now();\n requestAnimationFrame(detectionLoop); // start new frame immediately\n}\n\nasync function drawLoop() { // main screen refresh loop\n if (!dom.video.paused) {\n const interpolated = human.next(human.result); // smoothen result using last-known results\n const processed = await human.image(dom.video); // get current video frame, but enhanced with human.filters\n human.draw.canvas(processed.canvas as HTMLCanvasElement, dom.canvas);\n\n const opt: Partial = { bodyLabels: `person confidence [score] and ${human.result?.body?.[0]?.keypoints.length} keypoints` };\n await human.draw.all(dom.canvas, interpolated, opt); // draw labels, boxes, lines, etc.\n perf(interpolated.performance); // write performance data\n }\n const now = human.now();\n fps.drawFPS = Math.round(1000 * 1000 / (now - timestamp.draw)) / 1000;\n timestamp.draw = now;\n status(dom.video.paused ? 'paused' : `fps: ${fps.detectFPS.toFixed(1).padStart(5, ' ')} detect | ${fps.drawFPS.toFixed(1).padStart(5, ' ')} draw`); // write status\n setTimeout(drawLoop, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n}\n\nasync function webCam() {\n const devices = await human.webcam.enumerate();\n const id = devices[0].deviceId; // use first available video source\n await human.webcam.start({ element: dom.video, crop: true, width, id }); // use human webcam helper methods and associate webcam stream with a dom element\n dom.canvas.width = human.webcam.width;\n dom.canvas.height = human.webcam.height;\n dom.canvas.onclick = async () => { // pause when clicked on screen and resume on next click\n if (human.webcam.paused) await human.webcam.play();\n else human.webcam.pause();\n };\n}\n\nasync function main() { // main entry point\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('platform:', human.env.platform, '| agent:', human.env.agent);\n status('loading...');\n await human.load(); // preload all models\n log('backend:', human.tf.getBackend(), '| available:', human.env.backends);\n log('models stats:', human.getModelStats());\n log('models loaded:', Object.values(human.models).filter((model) => model !== null).length);\n log('environment', human.env);\n status('initializing...');\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await webCam(); // start webcam\n await detectionLoop(); // start detection loop\n await drawLoop(); // start draw loop\n}\n\nwindow.onload = main;\n"],
+ "mappings": ";;;;;;AASA,UAAYA,MAAO,0BAEnB,IAAMC,EAAQ,KAERC,EAAiC,CAErC,cAAe,eACf,OAAQ,CAAE,QAAS,GAAM,aAAc,GAAO,KAAM,GAAO,MAAAD,CAAM,EACjE,KAAM,CAAE,QAAS,GAAM,SAAU,CAAE,SAAU,EAAK,EAAG,KAAM,CAAE,QAAS,EAAK,EAAG,UAAW,CAAE,QAAS,EAAM,EAAG,KAAM,CAAE,QAAS,EAAK,EAAG,YAAa,CAAE,QAAS,EAAK,EAAG,QAAS,CAAE,QAAS,EAAK,EAAG,UAAW,CAAE,QAAS,EAAK,EAAG,SAAU,CAAE,QAAS,EAAK,CAAE,EAC5P,KAAM,CAAE,QAAS,EAAK,EAEtB,KAAM,CAAE,QAAS,EAAM,EACvB,OAAQ,CAAE,QAAS,EAAM,EACzB,aAAc,CAAE,QAAS,EAAM,EAC/B,QAAS,CAAE,QAAS,EAAK,CAC3B,EAEME,EAAQ,IAAM,QAAMD,CAAW,EAErCC,EAAM,IAAI,QAAU,GACpBA,EAAM,KAAK,QAAQ,KAAO,yBAC1BA,EAAM,KAAK,QAAQ,WAAa,GAGhC,IAAMC,EAAM,CACV,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,IAAK,SAAS,eAAe,KAAK,EAClC,IAAK,SAAS,eAAe,QAAQ,EACrC,KAAM,SAAS,eAAe,aAAa,CAC7C,EACMC,EAAY,CAAE,OAAQ,EAAG,KAAM,EAAG,QAAS,EAAG,MAAO,CAAE,EACvDC,EAAM,CAAE,UAAW,EAAG,QAAS,EAAG,OAAQ,EAAG,UAAW,CAAE,EAE1DC,EAAM,IAAIC,IAAQ,CACtBJ,EAAI,IAAI,WAAaI,EAAI,KAAK,GAAG,EAAI;AAAA,EACrC,QAAQ,IAAI,GAAGA,CAAG,CACpB,EACMC,EAAUD,GAAQJ,EAAI,IAAI,UAAYI,EACtCE,EAAQF,GAAQJ,EAAI,KAAK,UAAY,WAAaD,EAAM,GAAG,OAAO,EAAE,WAAW,SAAS,EAAI,mBAAqB,KAAK,UAAUK,CAAG,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,KAAM,KAAK,EAEpL,eAAeG,GAAgB,CAC7B,GAAI,CAACP,EAAI,MAAM,OAAQ,CACjBC,EAAU,QAAU,IAAGA,EAAU,MAAQF,EAAM,IAAI,GAEvD,MAAMA,EAAM,OAAOC,EAAI,KAAK,EAC5B,IAAMQ,EAAUT,EAAM,GAAG,OAAO,EAAE,WAC9BS,EAAUP,EAAU,UAAY,GAAGE,EAAI,qBAAsBK,EAAUP,EAAU,OAAO,EAC5FA,EAAU,QAAUO,EACpBN,EAAI,UAAY,KAAK,MAAM,IAAO,KAAQH,EAAM,IAAI,EAAIE,EAAU,OAAO,EAAI,IAC7EC,EAAI,SACJA,EAAI,UAAY,KAAK,MAAM,KAAQH,EAAM,IAAI,EAAIE,EAAU,OAASC,EAAI,MAAM,EAAI,IAC9EA,EAAI,OAAS,MAAQ,GAAK,CAACF,EAAI,MAAM,QAAQG,EAAI,cAAe,CAAE,GAAGD,EAAK,QAASD,EAAU,OAAQ,CAAC,CAC5G,CACAA,EAAU,OAASF,EAAM,IAAI,EAC7B,sBAAsBQ,CAAa,CACrC,CAEA,eAAeE,GAAW,CAnE1B,IAAAC,EAAAC,EAAAC,EAoEE,GAAI,CAACZ,EAAI,MAAM,OAAQ,CACrB,IAAMa,EAAed,EAAM,KAAKA,EAAM,MAAM,EACtCe,EAAY,MAAMf,EAAM,MAAMC,EAAI,KAAK,EAC7CD,EAAM,KAAK,OAAOe,EAAU,OAA6Bd,EAAI,MAAM,EAEnE,IAAMe,EAA8B,CAAE,WAAY,kCAAiCH,GAAAD,GAAAD,EAAAX,EAAM,SAAN,YAAAW,EAAc,OAAd,YAAAC,EAAqB,KAArB,YAAAC,EAAyB,UAAU,kBAAmB,EACzI,MAAMb,EAAM,KAAK,IAAIC,EAAI,OAAQa,EAAcE,CAAG,EAClDT,EAAKO,EAAa,WAAW,CAC/B,CACA,IAAMG,EAAMjB,EAAM,IAAI,EACtBG,EAAI,QAAU,KAAK,MAAM,IAAO,KAAQc,EAAMf,EAAU,KAAK,EAAI,IACjEA,EAAU,KAAOe,EACjBX,EAAOL,EAAI,MAAM,OAAS,SAAW,QAAQE,EAAI,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,cAAcA,EAAI,QAAQ,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,QAAQ,EACjJ,WAAWO,EAAU,EAAE,CACzB,CAEA,eAAeQ,GAAS,CAEtB,IAAMC,GADU,MAAMnB,EAAM,OAAO,UAAU,GAC1B,GAAG,SACtB,MAAMA,EAAM,OAAO,MAAM,CAAE,QAASC,EAAI,MAAO,KAAM,GAAM,MAAAH,EAAO,GAAAqB,CAAG,CAAC,EACtElB,EAAI,OAAO,MAAQD,EAAM,OAAO,MAChCC,EAAI,OAAO,OAASD,EAAM,OAAO,OACjCC,EAAI,OAAO,QAAU,SAAY,CAC3BD,EAAM,OAAO,OAAQ,MAAMA,EAAM,OAAO,KAAK,EAC5CA,EAAM,OAAO,MAAM,CAC1B,CACF,CAEA,eAAeoB,GAAO,CACpBhB,EAAI,iBAAkBJ,EAAM,QAAS,kBAAmBA,EAAM,GAAG,QAAQ,YAAY,EACrFI,EAAI,YAAaJ,EAAM,IAAI,SAAU,WAAYA,EAAM,IAAI,KAAK,EAChEM,EAAO,YAAY,EACnB,MAAMN,EAAM,KAAK,EACjBI,EAAI,WAAYJ,EAAM,GAAG,WAAW,EAAG,eAAgBA,EAAM,IAAI,QAAQ,EACzEI,EAAI,gBAAiBJ,EAAM,cAAc,CAAC,EAC1CI,EAAI,iBAAkB,OAAO,OAAOJ,EAAM,MAAM,EAAE,OAAQqB,GAAUA,IAAU,IAAI,EAAE,MAAM,EAC1FjB,EAAI,cAAeJ,EAAM,GAAG,EAC5BM,EAAO,iBAAiB,EACxB,MAAMN,EAAM,OAAO,EACnB,MAAMkB,EAAO,EACb,MAAMV,EAAc,EACpB,MAAME,EAAS,CACjB,CAEA,OAAO,OAASU",
+ "names": ["H", "width", "humanConfig", "human", "dom", "timestamp", "fps", "log", "msg", "status", "perf", "detectionLoop", "tensors", "drawLoop", "_a", "_b", "_c", "interpolated", "processed", "opt", "now", "webCam", "id", "main", "model"]
}
diff --git a/demo/typescript/index.ts b/demo/typescript/index.ts
index a127491d..ebf5a3f9 100644
--- a/demo/typescript/index.ts
+++ b/demo/typescript/index.ts
@@ -17,7 +17,8 @@ const humanConfig: Partial = { // user configuration for human, used t
filter: { enabled: true, equalization: false, flip: false, width },
face: { enabled: true, detector: { rotation: true }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true }, antispoof: { enabled: true }, liveness: { enabled: true } },
body: { enabled: true },
- hand: { enabled: true },
+ // hand: { enabled: true },
+ hand: { enabled: false },
object: { enabled: false },
segmentation: { enabled: false },
gesture: { enabled: true },
@@ -82,7 +83,9 @@ async function drawLoop() { // main screen refresh loop
}
async function webCam() {
- await human.webcam.start({ element: dom.video, crop: true, width }); // use human webcam helper methods and associate webcam stream with a dom element
+ const devices = await human.webcam.enumerate();
+ const id = devices[0].deviceId; // use first available video source
+ await human.webcam.start({ element: dom.video, crop: true, width, id }); // use human webcam helper methods and associate webcam stream with a dom element
dom.canvas.width = human.webcam.width;
dom.canvas.height = human.webcam.height;
dom.canvas.onclick = async () => { // pause when clicked on screen and resume on next click
diff --git a/package.json b/package.json
index 41087844..b9a815af 100644
--- a/package.json
+++ b/package.json
@@ -85,13 +85,13 @@
"@tensorflow/tfjs-node-gpu": "^4.0.0",
"@types/node": "^18.11.9",
"@types/offscreencanvas": "^2019.7.0",
- "@typescript-eslint/eslint-plugin": "^5.42.1",
- "@typescript-eslint/parser": "^5.42.1",
+ "@typescript-eslint/eslint-plugin": "^5.43.0",
+ "@typescript-eslint/parser": "^5.43.0",
"@vladmandic/build": "^0.7.14",
"@vladmandic/pilogger": "^0.4.6",
"@vladmandic/tfjs": "github:vladmandic/tfjs",
"canvas": "^2.10.2",
- "esbuild": "^0.15.13",
+ "esbuild": "^0.15.14",
"eslint": "8.27.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-html": "^7.1.0",
@@ -101,7 +101,7 @@
"eslint-plugin-promise": "^6.1.1",
"rimraf": "^3.0.2",
"tslib": "^2.4.1",
- "typedoc": "0.23.20",
- "typescript": "4.8.4"
+ "typedoc": "0.23.21",
+ "typescript": "4.9.3"
}
}
diff --git a/src/body/blazepose.ts b/src/body/blazepose.ts
index 12b2bccb..0cb9dd16 100644
--- a/src/body/blazepose.ts
+++ b/src/body/blazepose.ts
@@ -10,56 +10,38 @@ import type { BodyKeypoint, BodyResult, BodyLandmark, Box, Point, BodyAnnotation
import type { GraphModel, Tensor, Tensor4D } from '../tfjs/types';
import type { Config } from '../config';
import * as coords from './blazeposecoords';
-import * as detect from './blazeposedetector';
+import { loadDetector, detectBoxes, DetectedBox } from './blazeposedetector';
import * as box from '../util/box';
+import { env } from '../util/env';
-const env = { initial: true };
// const models: [GraphModel | null, GraphModel | null] = [null, null];
-const models: { detector: GraphModel | null, landmarks: GraphModel | null } = { detector: null, landmarks: null };
-const inputSize: { detector: [number, number], landmarks: [number, number] } = { detector: [224, 224], landmarks: [256, 256] };
+let model: GraphModel | null;
+let inputSize = 256;
let skipped = Number.MAX_SAFE_INTEGER;
const outputNodes: { detector: string[], landmarks: string[] } = {
landmarks: ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'],
detector: [],
};
-let cache: BodyResult | null = null;
-let cropBox: Box | undefined;
+const cache: BodyResult[] = [];
let padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];
let lastTime = 0;
const sigmoid = (x) => (1 - (1 / (1 + Math.exp(x))));
-export async function loadDetect(config: Config): Promise {
- if (env.initial) models.detector = null;
- if (!models.detector && config.body['detector'] && config.body['detector'].modelPath || '') {
- models.detector = await loadModel(config.body['detector'].modelPath);
- const inputs = models.detector?.['executor'] ? Object.values(models.detector.modelSignature['inputs']) : undefined;
- inputSize.detector[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
- inputSize.detector[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
- } else if (config.debug && models.detector) log('cached model:', models.detector['modelUrl']);
- detect.createAnchors();
- return models.detector as GraphModel;
-}
+export const loadDetect = (config: Config): Promise => loadDetector(config);
export async function loadPose(config: Config): Promise {
- if (env.initial) models.landmarks = null;
- if (!models.landmarks) {
- models.landmarks = await loadModel(config.body.modelPath);
- const inputs = models.landmarks?.['executor'] ? Object.values(models.landmarks.modelSignature['inputs']) : undefined;
- inputSize.landmarks[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
- inputSize.landmarks[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;
- } else if (config.debug) log('cached model:', models.landmarks['modelUrl']);
- return models.landmarks;
+ if (env.initial) model = null;
+ if (!model) {
+ model = await loadModel(config.body.modelPath);
+ const inputs = model?.['executor'] ? Object.values(model.modelSignature['inputs']) : undefined;
+ inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
+ } else if (config.debug) log('cached model:', model['modelUrl']);
+ return model;
}
-export async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {
- if (!models.detector) await loadDetect(config);
- if (!models.landmarks) await loadPose(config);
- return [models.detector, models.landmarks];
-}
-
-function prepareImage(input: Tensor4D, size: number): Tensor {
+function prepareImage(input: Tensor4D, size: number, cropBox?: Box): Tensor {
const t: Record = {};
if (!input?.shape?.[1] || !input?.shape?.[2]) return input;
let final: Tensor;
@@ -94,7 +76,7 @@ function prepareImage(input: Tensor4D, size: number): Tensor {
return final;
}
-function rescaleKeypoints(keypoints: BodyKeypoint[], outputSize: [number, number]): BodyKeypoint[] {
+function rescaleKeypoints(keypoints: BodyKeypoint[], outputSize: [number, number], cropBox?: Box): BodyKeypoint[] {
for (const kpt of keypoints) { // first rescale due to padding
kpt.position = [
Math.trunc(kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0]),
@@ -104,10 +86,12 @@ function rescaleKeypoints(keypoints: BodyKeypoint[], outputSize: [number, number
kpt.positionRaw = [kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], 2 * (kpt.position[2] as number) / (outputSize[0] + outputSize[1])];
}
if (cropBox) { // second rescale due to cropping
+ const width = cropBox[2] - cropBox[0];
+ const height = cropBox[3] - cropBox[1];
for (const kpt of keypoints) {
kpt.positionRaw = [
- kpt.positionRaw[0] + cropBox[1], // correct offset due to crop
- kpt.positionRaw[1] + cropBox[0], // correct offset due to crop
+ kpt.positionRaw[0] / height + cropBox[1], // correct offset due to crop
+ kpt.positionRaw[1] / width + cropBox[0], // correct offset due to crop
kpt.positionRaw[2] as number,
];
kpt.position = [
@@ -140,9 +124,9 @@ async function detectLandmarks(input: Tensor, config: Config, outputSize: [numbe
* t.world: 39 keypoints [x,y,z] normalized to -1..1
* t.poseflag: body score
*/
- if (!models.landmarks?.['executor']) return null;
+ if (!model?.['executor']) return null;
const t: Record = {};
- [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = models.landmarks?.execute(input, outputNodes.landmarks) as unknown as Tensor[]; // run model
+ [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = model?.execute(input, outputNodes.landmarks) as Tensor[]; // run model
const poseScore = (await t.poseflag.data())[0];
const points = await t.ld.data();
const distances = await t.world.data();
@@ -153,7 +137,7 @@ async function detectLandmarks(input: Tensor, config: Config, outputSize: [numbe
const score = sigmoid(points[depth * i + 3]);
const presence = sigmoid(points[depth * i + 4]);
const adjScore = Math.trunc(100 * score * presence * poseScore) / 100;
- const positionRaw: Point = [points[depth * i + 0] / inputSize.landmarks[0], points[depth * i + 1] / inputSize.landmarks[1], points[depth * i + 2] + 0];
+ const positionRaw: Point = [points[depth * i + 0] / inputSize, points[depth * i + 1] / inputSize, points[depth * i + 2] + 0];
const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];
const distance: Point = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0];
keypointsRelative.push({ part: coords.kpt[i] as BodyLandmark, positionRaw, position, distance, score: adjScore });
@@ -177,36 +161,6 @@ async function detectLandmarks(input: Tensor, config: Config, outputSize: [numbe
return body;
}
-/*
-interface DetectedBox { box: Box, boxRaw: Box, score: number }
-
-function rescaleBoxes(boxes: Array, outputSize: [number, number]): Array {
- for (const b of boxes) {
- b.box = [
- Math.trunc(b.box[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),
- Math.trunc(b.box[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),
- Math.trunc(b.box[2] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),
- Math.trunc(b.box[3] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),
- ];
- b.boxRaw = [b.box[0] / outputSize[0], b.box[1] / outputSize[1], b.box[2] / outputSize[0], b.box[3] / outputSize[1]];
- }
- return boxes;
-}
-
-async function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {
- const t: Record = {};
- t.res = models.detector?.execute(input, ['Identity']) as Tensor; //
- t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);
- t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);
- t.logits = tf.squeeze(t.logitsRaw);
- t.boxes = tf.squeeze(t.boxesRaw);
- const boxes = await detect.decode(t.boxes, t.logits, config, outputSize);
- rescaleBoxes(boxes, outputSize);
- Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
- return boxes;
-}
-*/
-
export async function predict(input: Tensor4D, config: Config): Promise {
const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];
const skipTime = (config.body.skipTime || 0) > (now() - lastTime);
@@ -214,15 +168,24 @@ export async function predict(input: Tensor4D, config: Config): Promise = {};
- /*
- if (config.body['detector'] && config.body['detector']['enabled']) {
- t.detector = await prepareImage(input, 224);
- const boxes = await detectBoxes(t.detector, config, outputSize);
+ let boxes: DetectedBox[] = [];
+ if (config.body?.['detector']?.['enabled']) {
+ const preparedImage = prepareImage(input, 224);
+ boxes = await detectBoxes(preparedImage, config, outputSize);
+ tf.dispose(preparedImage);
+ } else {
+ boxes = [{ box: [0, 0, 0, 0] as Box, boxRaw: [0, 0, 1, 1], score: 0 }]; // running without detector
+ }
+ for (let i = 0; i < boxes.length; i++) {
+ const preparedBox = prepareImage(input, 256, boxes[i]?.boxRaw); // padded and resized
+ cache.length = 0;
+ const bodyResult = await detectLandmarks(preparedBox, config, outputSize);
+ tf.dispose(preparedBox);
+ if (!bodyResult) continue;
+ bodyResult.id = i;
+ // bodyResult.score = 0; // TBD
+ cache.push(bodyResult);
}
- */
- t.landmarks = prepareImage(input, 256); // padded and resized
- cache = await detectLandmarks(t.landmarks, config, outputSize);
/*
cropBox = [0, 0, 1, 1]; // reset crop coordinates
if (cache?.boxRaw && config.skipAllowed) {
@@ -237,9 +200,8 @@ export async function predict(input: Tensor4D, config: Config): Promise tf.dispose(t[tensor]));
lastTime = now();
skipped = 0;
}
- return cache ? [cache] : [];
+ return cache;
}
diff --git a/src/body/blazeposedetector.ts b/src/body/blazeposedetector.ts
index 447d4ddd..910c6773 100644
--- a/src/body/blazeposedetector.ts
+++ b/src/body/blazeposedetector.ts
@@ -1,11 +1,15 @@
import * as tf from 'dist/tfjs.esm.js';
-import type { Tensor } from '../tfjs/types';
+import { log } from '../util/util';
+import { env } from '../util/env';
+import { loadModel } from '../tfjs/load';
import type { Box } from '../result';
import type { Config } from '../config';
+import type { GraphModel, Tensor, Tensor1D, Tensor2D } from '../tfjs/types';
-interface DetectedBox { box: Box, boxRaw: Box, score: number }
+export interface DetectedBox { box: Box, boxRaw: Box, score: number }
-const inputSize = 224;
+let model: GraphModel | null;
+let inputSize = 224;
let anchorTensor: { x, y };
const numLayers = 5;
const strides = [8, 16, 32, 32, 32];
@@ -35,8 +39,19 @@ export function createAnchors() {
anchorTensor = { x: tf.tensor1d(anchors.map((a) => a.x)), y: tf.tensor1d(anchors.map((a) => a.y)) };
}
+export async function loadDetector(config: Config): Promise {
+ if (env.initial) model = null;
+ if (!model && config.body['detector'] && config.body['detector'].modelPath || '') {
+ model = await loadModel(config.body['detector'].modelPath);
+ const inputs = model?.['executor'] ? Object.values(model.modelSignature['inputs']) : undefined;
+ inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;
+ } else if (config.debug && model) log('cached model:', model['modelUrl']);
+ createAnchors();
+ return model as GraphModel;
+}
+
const cropFactor = [5.0, 5.0];
-function decodeBoxes(boxesTensor, anchor): Tensor {
+export function decodeBoxes(boxesTensor, anchor) {
return tf.tidy(() => {
const split = tf.split(boxesTensor, 12, 1); // first 4 are box data [x,y,w,h] and 4 are keypoints data [x,y] for total of 12
let xCenter = tf.squeeze(split[0]);
@@ -49,39 +64,41 @@ function decodeBoxes(boxesTensor, anchor): Tensor {
height = tf.mul(tf.div(height, inputSize), cropFactor[1]);
const xMin = tf.sub(xCenter, tf.div(width, 2));
const yMin = tf.sub(yCenter, tf.div(height, 2));
- const boxes = tf.stack([xMin, yMin, width, height], 1);
+ const xMax = tf.add(xMin, width);
+ const yMax = tf.add(yMin, height);
+ const boxes = tf.stack([xMin, yMin, xMax, yMax], 1);
return boxes;
});
}
-export async function decode(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {
+async function decodeResults(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {
+ const detectedBoxes: DetectedBox[] = [];
const t: Record = {};
t.boxes = decodeBoxes(boxesTensor, anchorTensor);
t.scores = tf.sigmoid(logitsTensor);
- t.argmax = tf.argMax(t.scores);
- const i = (await t.argmax.data())[0];
+ t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes as Tensor2D, t.scores as Tensor1D, 1, config.body['detector']?.minConfidence || 0.1, config.body['detector']?.iouThreshold || 0.1);
+ const nms = await t.nms.data();
const scores = await t.scores.data();
- const detected: { box: Box, boxRaw: Box, score: number }[] = [];
- const minScore = config.body?.['detector']?.minConfidence || 0;
- if (scores[i] >= minScore) {
- const boxes = await t.boxes.array();
- const boxRaw: Box = boxes[i];
- const box: Box = [boxRaw[0] * outputSize[0], boxRaw[1] * outputSize[1], boxRaw[2] * outputSize[0], boxRaw[3] * outputSize[1]];
- // console.log(box);
- detected.push({ box, boxRaw, score: scores[i] });
- }
- /*
- t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1);
- const boxes = t.boxes.arraySync();
- const scores = t.scores.dataSync();
- const nms = t.nms.dataSync();
- const detected: Array = [];
+ const boxes = await t.boxes.array();
for (const i of Array.from(nms)) {
+ const score = scores[i];
const boxRaw: Box = boxes[i];
- const box: Box = [boxRaw[0] * outputSize[0], boxRaw[0] * outputSize[1], boxRaw[3] * outputSize[0], boxRaw[2] * outputSize[1]];
- detected.push({ box, boxRaw, score: scores[i] });
+ const box: Box = [Math.round(boxRaw[0] * outputSize[0]), Math.round(boxRaw[1] * outputSize[1]), Math.round(boxRaw[2] * outputSize[0]), Math.round(boxRaw[3] * outputSize[1])];
+ const detectedBox: DetectedBox = { score, boxRaw, box };
+ detectedBoxes.push(detectedBox);
}
- */
Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
- return detected;
+ return detectedBoxes;
+}
+
+export async function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {
+ const t: Record = {};
+ t.res = model?.execute(input, ['Identity']) as Tensor; //
+ t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);
+ t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);
+ t.logits = tf.squeeze(t.logitsRaw);
+ t.boxes = tf.squeeze(t.boxesRaw);
+ const boxes = await decodeResults(t.boxes, t.logits, config, outputSize);
+ Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));
+ return boxes;
}
diff --git a/src/face/antispoof.ts b/src/face/antispoof.ts
index 6deebfa9..1d771777 100644
--- a/src/face/antispoof.ts
+++ b/src/face/antispoof.ts
@@ -23,7 +23,7 @@ export async function load(config: Config): Promise {
}
export async function predict(image: Tensor4D, config: Config, idx: number, count: number): Promise {
- if (!model || !model?.['executor']) return 0;
+ if (!model?.['executor']) return 0;
const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);
const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);
if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {
diff --git a/src/util/webcam.ts b/src/util/webcam.ts
index c39df7b1..8edf1a7f 100644
--- a/src/util/webcam.ts
+++ b/src/util/webcam.ts
@@ -21,6 +21,8 @@ export interface WebCamConfig {
width: number,
/** desired webcam height */
height: number,
+ /** deviceId of the video device to use */
+ id?: string,
}
export class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-class
@@ -30,6 +32,8 @@ export class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-cl
element: HTMLVideoElement | undefined;
/** active webcam stream */
stream: MediaStream | undefined;
+ /** enumerated video devices */
+ devices: MediaDeviceInfo[] = [];
constructor() {
this.config = {
@@ -88,6 +92,16 @@ export class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-cl
return this.element?.videoHeight || 0;
}
+ public enumerate = async (): Promise => {
+ try {
+ const devices = await navigator.mediaDevices.enumerateDevices();
+ this.devices = devices.filter((device) => device.kind === 'videoinput');
+ } catch {
+ this.devices = [];
+ }
+ return this.devices;
+ };
+
/** start method initializizes webcam stream and associates it with a dom video element */
public start = async (webcamConfig?: Partial): Promise => {
// set config
@@ -96,6 +110,7 @@ export class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-cl
if (webcamConfig?.mode) this.config.mode = webcamConfig?.mode;
if (webcamConfig?.width) this.config.width = webcamConfig?.width;
if (webcamConfig?.height) this.config.height = webcamConfig?.height;
+ if (webcamConfig?.id) this.config.id = webcamConfig?.id;
// use or create dom element
if (webcamConfig?.element) {
@@ -128,6 +143,7 @@ export class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-cl
height: { ideal: this.config.height > 0 ? this.config.height : window.innerHeight },
},
};
+ if (this.config.id) (requestedConstraints.video as MediaTrackConstraintSet).deviceId = this.config.id;
// set default event listeners
this.element.addEventListener('play', () => { if (this.config.debug) log('webcam', 'play'); });
diff --git a/src/warmup.ts b/src/warmup.ts
index a7ad0989..914e76f4 100644
--- a/src/warmup.ts
+++ b/src/warmup.ts
@@ -123,8 +123,8 @@ export async function runCompile(instance: Human) {
const numTensorsStart = tf.engine().state.numTensors;
const compiledModels: string[] = [];
for (const [modelName, model] of Object.entries(instance.models).filter(([key, val]) => (key !== null && val !== null))) {
- const shape = (model.inputs?.[0]?.shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];
- const dtype: DataType = (model.inputs?.[0]?.dtype) ? model.inputs[0].dtype : 'float32';
+ const shape = (model?.modelSignature && model?.inputs?.[0]?.shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];
+ const dtype: DataType = (model?.modelSignature && model?.inputs?.[0]?.dtype) ? model.inputs[0].dtype : 'float32';
for (let dim = 0; dim < shape.length; dim++) {
if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions
}
diff --git a/test/build.log b/test/build.log
index 0627c208..314f8897 100644
--- a/test/build.log
+++ b/test/build.log
@@ -1,50 +1,50 @@
-2022-11-12 12:48:06 [32mDATA: [39m Build {"name":"@vladmandic/human","version":"3.0.0"}
-2022-11-12 12:48:06 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"3.0.0"}
-2022-11-12 12:48:06 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
-2022-11-12 12:48:06 [36mINFO: [39m Toolchain: {"build":"0.7.14","esbuild":"0.15.13","typescript":"4.8.4","typedoc":"0.23.20","eslint":"8.27.0"}
-2022-11-12 12:48:06 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
-2022-11-12 12:48:06 [35mSTATE:[39m Clean: {"locations":["dist/*","types/*","typedoc/*"]}
-2022-11-12 12:48:06 [35mSTATE:[39m 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-12 12:48:06 [35mSTATE:[39m 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-12 12:48:06 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":79,"inputBytes":673330,"outputBytes":316862}
-2022-11-12 12:48:07 [35mSTATE:[39m 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-12 12:48:07 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":79,"inputBytes":673334,"outputBytes":316866}
-2022-11-12 12:48:07 [35mSTATE:[39m 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-12 12:48:07 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":79,"inputBytes":674282,"outputBytes":316977}
-2022-11-12 12:48:07 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670}
-2022-11-12 12:48:07 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":79,"inputBytes":673076,"outputBytes":315471}
-2022-11-12 12:48:07 [35mSTATE:[39m 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-12 12:48:07 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":79,"inputBytes":1817306,"outputBytes":1457057}
-2022-11-12 12:48:07 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":79,"inputBytes":1817306,"outputBytes":1914726}
-2022-11-12 12:48:11 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types/lib","files":15}
-2022-11-12 12:48:13 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true}
-2022-11-12 12:48:13 [35mSTATE:[39m Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5981,"outputBytes":2862}
-2022-11-12 12:48:13 [35mSTATE:[39m 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-12 12:48:21 [35mSTATE:[39m Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":113,"errors":0,"warnings":0}
-2022-11-12 12:48:21 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
-2022-11-12 12:48:21 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"}
-2022-11-12 12:48:21 [36mINFO: [39m Done...
-2022-11-12 12:48:21 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"}
-2022-11-12 12:48:21 [35mSTATE:[39m Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"}
-2022-11-12 12:48:21 [35mSTATE:[39m Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"}
-2022-11-12 12:48:21 [35mSTATE:[39m Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"}
-2022-11-12 12:48:21 [35mSTATE:[39m Filter: {"input":"types/tfjs-core.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m API-Extractor: {"succeeeded":true,"errors":0,"warnings":195}
-2022-11-12 12:48:22 [35mSTATE:[39m Filter: {"input":"types/human.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m Write: {"output":"dist/human.esm-nobundle.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m Write: {"output":"dist/human.esm.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m Write: {"output":"dist/human.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m Write: {"output":"dist/human.node-gpu.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m Write: {"output":"dist/human.node.d.ts"}
-2022-11-12 12:48:22 [35mSTATE:[39m Write: {"output":"dist/human.node-wasm.d.ts"}
-2022-11-12 12:48:22 [36mINFO: [39m Analyze models: {"folders":8,"result":"models/models.json"}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"./models","models":12}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../human-models/models","models":43}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../blazepose/model/","models":4}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../anti-spoofing/model","models":1}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../efficientpose/models","models":3}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../insightface/models","models":5}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../movenet/models","models":3}
-2022-11-12 12:48:22 [35mSTATE:[39m Models {"folder":"../nanodet/models","models":4}
-2022-11-12 12:48:23 [35mSTATE:[39m Models: {"count":58,"totalSize":386543911}
-2022-11-12 12:48:23 [36mINFO: [39m Human Build complete... {"logFile":"test/build.log"}
+2022-11-16 11:18:02 [32mDATA: [39m Build {"name":"@vladmandic/human","version":"3.0.0"}
+2022-11-16 11:18:02 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"3.0.0"}
+2022-11-16 11:18:02 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
+2022-11-16 11:18:02 [36mINFO: [39m 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 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
+2022-11-16 11:18:02 [35mSTATE:[39m Clean: {"locations":["dist/*","types/*","typedoc/*"]}
+2022-11-16 11:18:02 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670}
+2022-11-16 11:18:02 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types/lib","files":15}
+2022-11-16 11:18:09 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true}
+2022-11-16 11:18:09 [35mSTATE:[39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":113,"errors":0,"warnings":0}
+2022-11-16 11:18:17 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
+2022-11-16 11:18:17 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"}
+2022-11-16 11:18:17 [36mINFO: [39m Done...
+2022-11-16 11:18:17 [35mSTATE:[39m Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"}
+2022-11-16 11:18:17 [35mSTATE:[39m Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"}
+2022-11-16 11:18:17 [35mSTATE:[39m Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"}
+2022-11-16 11:18:17 [35mSTATE:[39m Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"}
+2022-11-16 11:18:17 [35mSTATE:[39m Filter: {"input":"types/tfjs-core.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m API-Extractor: {"succeeeded":true,"errors":0,"warnings":195}
+2022-11-16 11:18:19 [35mSTATE:[39m Filter: {"input":"types/human.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m Write: {"output":"dist/human.esm-nobundle.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m Write: {"output":"dist/human.esm.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m Write: {"output":"dist/human.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m Write: {"output":"dist/human.node-gpu.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m Write: {"output":"dist/human.node.d.ts"}
+2022-11-16 11:18:19 [35mSTATE:[39m Write: {"output":"dist/human.node-wasm.d.ts"}
+2022-11-16 11:18:19 [36mINFO: [39m Analyze models: {"folders":8,"result":"models/models.json"}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"./models","models":12}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../human-models/models","models":43}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../blazepose/model/","models":4}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../anti-spoofing/model","models":1}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../efficientpose/models","models":3}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../insightface/models","models":5}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../movenet/models","models":3}
+2022-11-16 11:18:19 [35mSTATE:[39m Models {"folder":"../nanodet/models","models":4}
+2022-11-16 11:18:19 [35mSTATE:[39m Models: {"count":58,"totalSize":386543911}
+2022-11-16 11:18:19 [36mINFO: [39m Human Build complete... {"logFile":"test/build.log"}
diff --git a/test/test.log b/test/test.log
index 45d905ac..15248515 100644
--- a/test/test.log
+++ b/test/test.log
@@ -1,659 +1,657 @@
-2022-11-11 12:27:21 [36mINFO: [39m @vladmandic/human version 3.0.0
-2022-11-11 12:27:21 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v18.10.0
-2022-11-11 12:27:21 [36mINFO: [39m 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-11 12:27:21 [36mINFO: [39m {"cmd":"../demo/nodejs/node.js","args":[]} start
-2022-11-11 12:27:22 [36mINFO: [39m {"cmd":"../demo/nodejs/node-simple.js","args":[]} start
-2022-11-11 12:27:23 [36mINFO: [39m {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start
-2022-11-11 12:27:24 [36mINFO: [39m {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start
-2022-11-11 12:27:24 [36mINFO: [39m {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start
-2022-11-11 12:27:25 [36mINFO: [39m {"cmd":"../demo/nodejs/process-folder.js","args":["samples"]} start
-2022-11-11 12:27:27 [36mINFO: [39m {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start
-2022-11-11 12:27:40 [36mINFO: [39m {"cmd":"../demo/facematch/node-match.js","args":[]} start
-2022-11-11 12:27:42 [36mINFO: [39m 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-11 12:27:42 [36mINFO: [39m
-2022-11-11 12:27:42 [36mINFO: [39m test-node-load.js start
-2022-11-11 12:27:42 [36mINFO: [39m test-node-load.js load start {"human":"3.0.0","tf":"4.0.0","progress":0}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":0,"progress":0}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":10,"progress":0}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":22,"progress":0.05339166087267679}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":33,"progress":0.2135162934143239}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":56,"progress":0.3299591712723044}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":73,"progress":0.5125946867158943}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":83,"progress":0.7259096583739463}
-2022-11-11 12:27:42 [35mSTATE:[39m test-node-load.js passed {"progress":1}
-2022-11-11 12:27:42 [36mINFO: [39m test-node-load.js load final {"progress":1}
-2022-11-11 12:27:42 [32mDATA: [39m test-node-load.js load interval {"elapsed":500,"progress":1}
-2022-11-11 12:27:42 [36mINFO: [39m
-2022-11-11 12:27:42 [36mINFO: [39m test-node-gear.js start
-2022-11-11 12:27:43 [32mDATA: [39m test-node-gear.js input: ["samples/in/ai-face.jpg"]
-2022-11-11 12:27:43 [35mSTATE:[39m test-node-gear.js passed: gear faceres samples/in/ai-face.jpg
-2022-11-11 12:27:43 [32mDATA: [39m 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-11 12:27:44 [35mSTATE:[39m test-node-gear.js passed: gear gear samples/in/ai-face.jpg
-2022-11-11 12:27:44 [32mDATA: [39m 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-11 12:27:44 [35mSTATE:[39m test-node-gear.js passed: gear ssrnet samples/in/ai-face.jpg
-2022-11-11 12:27:44 [32mDATA: [39m 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-11 12:27:44 [36mINFO: [39m
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js start
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js test: configuration validation
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: configuration default validation []
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js test: model load
-2022-11-11 12:27:44 [35mSTATE:[39m 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-11 12:27:44 [36mINFO: [39m test-backend-node.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}}
-2022-11-11 12:27:44 [36mINFO: [39m 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-11 12:27:44 [36mINFO: [39m test-backend-node.js test: warmup
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: create human
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js human version: 3.0.0
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js platform: linux x64 agent: NodeJS v18.10.0
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js tfjs version: 4.0.0
-2022-11-11 12:27:44 [36mINFO: [39m test-backend-node.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.10.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-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: set backend: tensorflow
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js tensors 1785
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: load models
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js result: defined models: 25 loaded models: 11
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: warmup: none default
-2022-11-11 12:27:44 [32mDATA: [39m test-backend-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
-2022-11-11 12:27:44 [32mDATA: [39m test-backend-node.js result: performance: load: null total: null
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: warmup none result match
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js event: warmup
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: warmup: face default
-2022-11-11 12:27:44 [32mDATA: [39m 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-11 12:27:44 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 449
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js passed: warmup face result match
-2022-11-11 12:27:44 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js event: warmup
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: warmup: body default
-2022-11-11 12:27:45 [32mDATA: [39m 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-11 12:27:45 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 353
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: warmup body result match
-2022-11-11 12:27:45 [35mSTATE:[39m 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-11 12:27:45 [36mINFO: [39m test-backend-node.js test: details verification
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js start default
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg default
-2022-11-11 12:27:45 [32mDATA: [39m 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-11 12:27:45 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 331
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face length 1
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face score 1 0.93 1
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face age/gender 23.7 female 0.97 85.47
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face arrays 4 478 1024
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face anti-spoofing 0.79
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details face liveness 0.83
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details body length 1
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details body 0.92 17 6
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details hand length 1
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details hand 0.51 0.73 point
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details hand arrays 21 5 7
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details gesture length 7
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details gesture first {"face":0,"gesture":"facing right"}
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details object length 1
-2022-11-11 12:27:45 [35mSTATE:[39m test-backend-node.js passed: details object 0.72 person
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:46 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1200,1200,4] dtype: float32
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:47 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1200,1200,3] dtype: float32
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32
-2022-11-11 12:27:48 [36mINFO: [39m test-backend-node.js test default
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js start async
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg async
-2022-11-11 12:27:48 [32mDATA: [39m 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-11 12:27:48 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 313
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js passed: default result face match 1 female 0.97
-2022-11-11 12:27:48 [36mINFO: [39m test-backend-node.js test sync
-2022-11-11 12:27:48 [35mSTATE:[39m test-backend-node.js start sync
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg sync
-2022-11-11 12:27:49 [32mDATA: [39m 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-11 12:27:49 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 310
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: default sync 1 female 0.97
-2022-11-11 12:27:49 [36mINFO: [39m test-backend-node.js test: image process
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: image input null [1,256,256,3]
-2022-11-11 12:27:49 [36mINFO: [39m test-backend-node.js test: image null
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: invalid input could not convert input to tensor
-2022-11-11 12:27:49 [36mINFO: [39m test-backend-node.js test face similarity
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js start face similarity
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-face.jpg face similarity
-2022-11-11 12:27:49 [32mDATA: [39m 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-11 12:27:49 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 310
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js start face similarity
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:49 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg face similarity
-2022-11-11 12:27:50 [32mDATA: [39m 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-11 12:27:50 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 319
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js start face similarity
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-upper.jpg face similarity
-2022-11-11 12:27:50 [32mDATA: [39m 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-11 12:27:50 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 282
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js passed: face descriptor
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js passed: face similarity {"similarity":[1,0.44727441595492046,0.556793560189727],"descriptors":[1024,1024,1024]}
-2022-11-11 12:27:50 [36mINFO: [39m test-backend-node.js test object
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js start object
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:50 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:51 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:51 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg object
-2022-11-11 12:27:51 [32mDATA: [39m 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-11 12:27:51 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 317
-2022-11-11 12:27:51 [35mSTATE:[39m test-backend-node.js passed: centernet
-2022-11-11 12:27:51 [35mSTATE:[39m test-backend-node.js start object
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg object
-2022-11-11 12:27:52 [32mDATA: [39m 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-11 12:27:52 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 313
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js passed: nanodet
-2022-11-11 12:27:52 [36mINFO: [39m test-backend-node.js test sensitive
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js start sensitive
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:52 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg sensitive
-2022-11-11 12:27:53 [32mDATA: [39m 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-11 12:27:53 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 283
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js passed: sensitive result match
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js passed: sensitive face result match
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js passed: sensitive body result match
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js passed: sensitive hand result match
-2022-11-11 12:27:53 [36mINFO: [39m test-backend-node.js test body
-2022-11-11 12:27:53 [35mSTATE:[39m test-backend-node.js start blazepose
-2022-11-11 12:27:55 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:55 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:55 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:55 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg blazepose
-2022-11-11 12:27:55 [32mDATA: [39m 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-11 12:27:55 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 361
-2022-11-11 12:27:55 [35mSTATE:[39m test-backend-node.js passed: blazepose
-2022-11-11 12:27:55 [35mSTATE:[39m test-backend-node.js start efficientpose
-2022-11-11 12:27:56 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:56 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:56 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:56 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg efficientpose
-2022-11-11 12:27:56 [32mDATA: [39m 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-11 12:27:56 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 343
-2022-11-11 12:27:56 [35mSTATE:[39m test-backend-node.js passed: efficientpose
-2022-11-11 12:27:56 [35mSTATE:[39m test-backend-node.js start posenet
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg posenet
-2022-11-11 12:27:57 [32mDATA: [39m 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-11 12:27:57 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 269
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: posenet
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js start movenet
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js event: detect
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg movenet
-2022-11-11 12:27:57 [32mDATA: [39m 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-11 12:27:57 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 282
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: movenet
-2022-11-11 12:27:57 [36mINFO: [39m test-backend-node.js test face matching
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js passed: face database 40
-2022-11-11 12:27:57 [35mSTATE:[39m 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-11 12:27:57 [36mINFO: [39m test-backend-node.js test face similarity alternative
-2022-11-11 12:27:57 [35mSTATE:[39m test-backend-node.js start face embeddings
-2022-11-11 12:27:58 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-11-11 12:27:58 [35mSTATE:[39m test-backend-node.js event: image
-2022-11-11 12:27:58 [31mERROR:[39m test-backend-node.js failed: testDetect face embeddings
-2022-11-11 12:27:58 [31mERROR:[39m 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:11179:25"," at new Promise ()"," at predict14 (/home/vlado/dev/human/dist/human.node.js:11173:10)"," at detectFace (/home/vlado/dev/human/dist/human.node.js:13461:112)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node.js:15084:46"]}
-2022-11-11 12:27:58 [36mINFO: [39m
-2022-11-11 12:27:58 [36mINFO: [39m test-backend-node-gpu.js start
-2022-11-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js test: configuration validation
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: configuration default validation []
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
-2022-11-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js test: model load
-2022-11-11 12:27:59 [35mSTATE:[39m 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-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}}
-2022-11-11 12:27:59 [36mINFO: [39m 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-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js test: warmup
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: create human
-2022-11-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js human version: 3.0.0
-2022-11-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js platform: linux x64 agent: NodeJS v18.10.0
-2022-11-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js tfjs version: 4.0.0
-2022-11-11 12:27:59 [36mINFO: [39m test-backend-node-gpu.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.10.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-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: set backend: tensorflow
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js tensors 1785
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: load models
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js result: defined models: 25 loaded models: 11
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup: none default
-2022-11-11 12:27:59 [32mDATA: [39m test-backend-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
-2022-11-11 12:27:59 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: null
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup none result match
-2022-11-11 12:27:59 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:01 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:01 [35mSTATE:[39m test-backend-node-gpu.js event: warmup
-2022-11-11 12:28:01 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup: face default
-2022-11-11 12:28:01 [32mDATA: [39m 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-11 12:28:01 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 2170
-2022-11-11 12:28:01 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup face result match
-2022-11-11 12:28:01 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js event: warmup
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup: body default
-2022-11-11 12:28:02 [32mDATA: [39m 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-11 12:28:02 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 173
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup body result match
-2022-11-11 12:28:02 [35mSTATE:[39m 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-11 12:28:02 [36mINFO: [39m test-backend-node-gpu.js test: details verification
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js start default
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg default
-2022-11-11 12:28:02 [32mDATA: [39m 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-11 12:28:02 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 178
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face length 1
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face score 1 0.93 1
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face arrays 4 478 1024
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face anti-spoofing 0.79
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details face liveness 0.83
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details body length 1
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details body 0.92 17 6
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details hand length 1
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details hand 0.51 0.73 point
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details hand arrays 21 5 7
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details gesture length 7
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"}
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details object length 1
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: details object 0.72 person
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:02 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:03 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32
-2022-11-11 12:28:04 [36mINFO: [39m test-backend-node-gpu.js test default
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js start async
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg async
-2022-11-11 12:28:04 [32mDATA: [39m 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-11 12:28:04 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 153
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: default result face match 1 female 0.97
-2022-11-11 12:28:04 [36mINFO: [39m test-backend-node-gpu.js test sync
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js start sync
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sync
-2022-11-11 12:28:04 [32mDATA: [39m 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-11 12:28:04 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 148
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: default sync 1 female 0.97
-2022-11-11 12:28:04 [36mINFO: [39m test-backend-node-gpu.js test: image process
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: image input null [1,256,256,3]
-2022-11-11 12:28:04 [36mINFO: [39m test-backend-node-gpu.js test: image null
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: invalid input could not convert input to tensor
-2022-11-11 12:28:04 [36mINFO: [39m test-backend-node-gpu.js test face similarity
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js start face similarity
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-11-11 12:28:04 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity
-2022-11-11 12:28:05 [32mDATA: [39m 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-11 12:28:05 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 140
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js start face similarity
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity
-2022-11-11 12:28:05 [32mDATA: [39m 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-11 12:28:05 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 143
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js start face similarity
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity
-2022-11-11 12:28:05 [32mDATA: [39m 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-11 12:28:05 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 135
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: face descriptor
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: face similarity {"similarity":[1,0.4475002983522097,0.5570879556505012],"descriptors":[1024,1024,1024]}
-2022-11-11 12:28:05 [36mINFO: [39m test-backend-node-gpu.js test object
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js start object
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object
-2022-11-11 12:28:05 [32mDATA: [39m 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-11 12:28:05 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 145
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js passed: centernet
-2022-11-11 12:28:05 [35mSTATE:[39m test-backend-node-gpu.js start object
-2022-11-11 12:28:06 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:06 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object
-2022-11-11 12:28:07 [32mDATA: [39m 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-11 12:28:07 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 545
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: nanodet
-2022-11-11 12:28:07 [36mINFO: [39m test-backend-node-gpu.js test sensitive
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js start sensitive
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive
-2022-11-11 12:28:07 [32mDATA: [39m 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-11 12:28:07 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 112
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive result match
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive face result match
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive body result match
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive hand result match
-2022-11-11 12:28:07 [36mINFO: [39m test-backend-node-gpu.js test body
-2022-11-11 12:28:07 [35mSTATE:[39m test-backend-node-gpu.js start blazepose
-2022-11-11 12:28:09 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:09 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:09 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:09 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose
-2022-11-11 12:28:09 [32mDATA: [39m 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-11 12:28:09 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 258
-2022-11-11 12:28:09 [35mSTATE:[39m test-backend-node-gpu.js passed: blazepose
-2022-11-11 12:28:09 [35mSTATE:[39m test-backend-node-gpu.js start efficientpose
-2022-11-11 12:28:10 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:10 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose
-2022-11-11 12:28:11 [32mDATA: [39m 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-11 12:28:11 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 913
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js passed: efficientpose
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js start posenet
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet
-2022-11-11 12:28:11 [32mDATA: [39m 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-11 12:28:11 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 215
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js passed: posenet
-2022-11-11 12:28:11 [35mSTATE:[39m test-backend-node-gpu.js start movenet
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js event: detect
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet
-2022-11-11 12:28:12 [32mDATA: [39m 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-11 12:28:12 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 131
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js passed: movenet
-2022-11-11 12:28:12 [36mINFO: [39m test-backend-node-gpu.js test face matching
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js passed: face database 40
-2022-11-11 12:28:12 [35mSTATE:[39m 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-11 12:28:12 [36mINFO: [39m test-backend-node-gpu.js test face similarity alternative
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js start face embeddings
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-11-11 12:28:12 [35mSTATE:[39m test-backend-node-gpu.js event: image
-2022-11-11 12:28:12 [31mERROR:[39m test-backend-node-gpu.js failed: testDetect face embeddings
-2022-11-11 12:28:12 [31mERROR:[39m 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:11179:25"," at new Promise ()"," at predict14 (/home/vlado/dev/human/dist/human.node-gpu.js:11173:10)"," at detectFace (/home/vlado/dev/human/dist/human.node-gpu.js:13461:112)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-gpu.js:15084:46"]}
-2022-11-11 12:28:13 [36mINFO: [39m
-2022-11-11 12:28:13 [36mINFO: [39m test-backend-node-wasm.js start
-2022-11-11 12:28:13 [32mDATA: [39m test-backend-node-wasm.js stdout: 2022-11-11 12:28:13 [36mINFO: [39m { supported: [33mtrue[39m, backend: [33mtrue[39m, simd: [90mundefined[39m, multithread: [90mundefined[39m } https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.0.0/dist/
-2022-11-11 12:28:13 [35mSTATE:[39m test-backend-node-wasm.js passed: model server: https://vladmandic.github.io/human-models/models/
-2022-11-11 12:28:13 [36mINFO: [39m test-backend-node-wasm.js test: configuration validation
-2022-11-11 12:28:13 [35mSTATE:[39m test-backend-node-wasm.js passed: configuration default validation []
-2022-11-11 12:28:13 [35mSTATE:[39m test-backend-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
-2022-11-11 12:28:13 [36mINFO: [39m test-backend-node-wasm.js test: model load
-2022-11-11 12:28:15 [35mSTATE:[39m 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-11 12:28:15 [36mINFO: [39m test-backend-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}}
-2022-11-11 12:28:15 [36mINFO: [39m 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-11 12:28:15 [36mINFO: [39m test-backend-node-wasm.js test: warmup
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: create human
-2022-11-11 12:28:15 [36mINFO: [39m test-backend-node-wasm.js human version: 3.0.0
-2022-11-11 12:28:15 [36mINFO: [39m test-backend-node-wasm.js platform: linux x64 agent: NodeJS v18.10.0
-2022-11-11 12:28:15 [36mINFO: [39m test-backend-node-wasm.js tfjs version: 4.0.0
-2022-11-11 12:28:15 [36mINFO: [39m test-backend-node-wasm.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.10.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-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: set backend: wasm
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js tensors 1785
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: load models
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js result: defined models: 25 loaded models: 11
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup: none default
-2022-11-11 12:28:15 [32mDATA: [39m test-backend-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
-2022-11-11 12:28:15 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: null
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup none result match
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js event: warmup
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup: face default
-2022-11-11 12:28:15 [32mDATA: [39m 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-11 12:28:15 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 534
-2022-11-11 12:28:15 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup face result match
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js event: warmup
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup: body default
-2022-11-11 12:28:16 [32mDATA: [39m 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-11 12:28:16 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 377
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup body result match
-2022-11-11 12:28:16 [35mSTATE:[39m 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-11 12:28:16 [36mINFO: [39m test-backend-node-wasm.js test: details verification
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js start default
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:16 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg default
-2022-11-11 12:28:17 [32mDATA: [39m 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-11 12:28:17 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 343
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face length 1
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face score 1 0.93 1
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face arrays 4 478 1024
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face anti-spoofing 0.79
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details face liveness 0.83
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details body length 1
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details body 0.92 17 6
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details hand length 1
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details hand 0.51 0.73 point
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details hand arrays 21 5 7
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details gesture length 7
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"}
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details object length 1
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: details object 0.72 person
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264}
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264}
-2022-11-11 12:28:17 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:18 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32
-2022-11-11 12:28:19 [36mINFO: [39m test-backend-node-wasm.js test default
-2022-11-11 12:28:19 [35mSTATE:[39m test-backend-node-wasm.js start async
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg async
-2022-11-11 12:28:20 [32mDATA: [39m 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-11 12:28:20 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 340
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: default result face match 1 female 0.97
-2022-11-11 12:28:20 [36mINFO: [39m test-backend-node-wasm.js test sync
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js start sync
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sync
-2022-11-11 12:28:20 [32mDATA: [39m 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-11 12:28:20 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 333
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: default sync 1 female 0.97
-2022-11-11 12:28:20 [36mINFO: [39m test-backend-node-wasm.js test: image process
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: image input null [1,256,256,3]
-2022-11-11 12:28:20 [36mINFO: [39m test-backend-node-wasm.js test: image null
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: invalid input could not convert input to tensor
-2022-11-11 12:28:20 [36mINFO: [39m test-backend-node-wasm.js test face similarity
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js start face similarity
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-11-11 12:28:20 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity
-2022-11-11 12:28:21 [32mDATA: [39m 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-11 12:28:21 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 309
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js start face similarity
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity
-2022-11-11 12:28:21 [32mDATA: [39m 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-11 12:28:21 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 327
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js start face similarity
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-11-11 12:28:21 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity
-2022-11-11 12:28:22 [32mDATA: [39m 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-11 12:28:22 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 297
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js passed: face descriptor
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]}
-2022-11-11 12:28:22 [36mINFO: [39m test-backend-node-wasm.js test object
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js start object
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object
-2022-11-11 12:28:22 [32mDATA: [39m 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-11 12:28:22 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 329
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js passed: centernet
-2022-11-11 12:28:22 [35mSTATE:[39m test-backend-node-wasm.js start object
-2022-11-11 12:28:23 [33mWARN: [39m 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-11 12:28:23 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:23 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object
-2022-11-11 12:28:24 [32mDATA: [39m 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-11 12:28:24 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 216
-2022-11-11 12:28:24 [31mERROR:[39m test-backend-node-wasm.js failed: nanodet []
-2022-11-11 12:28:24 [36mINFO: [39m test-backend-node-wasm.js test sensitive
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js start sensitive
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive
-2022-11-11 12:28:24 [32mDATA: [39m 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-11 12:28:24 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 239
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive result match
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive face result match
-2022-11-11 12:28:24 [35mSTATE:[39m 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-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive body result match
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive hand result match
-2022-11-11 12:28:24 [36mINFO: [39m test-backend-node-wasm.js test body
-2022-11-11 12:28:24 [35mSTATE:[39m test-backend-node-wasm.js start blazepose
-2022-11-11 12:28:26 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:26 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:26 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:26 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose
-2022-11-11 12:28:26 [32mDATA: [39m 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-11 12:28:26 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 396
-2022-11-11 12:28:26 [35mSTATE:[39m test-backend-node-wasm.js passed: blazepose
-2022-11-11 12:28:26 [35mSTATE:[39m test-backend-node-wasm.js start efficientpose
-2022-11-11 12:28:27 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:27 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:27 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:27 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose
-2022-11-11 12:28:27 [32mDATA: [39m 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-11 12:28:27 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 654
-2022-11-11 12:28:27 [35mSTATE:[39m test-backend-node-wasm.js passed: efficientpose
-2022-11-11 12:28:27 [35mSTATE:[39m test-backend-node-wasm.js start posenet
-2022-11-11 12:28:28 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:28 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:28 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:28 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet
-2022-11-11 12:28:28 [32mDATA: [39m 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-11 12:28:28 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 287
-2022-11-11 12:28:28 [35mSTATE:[39m test-backend-node-wasm.js passed: posenet
-2022-11-11 12:28:28 [35mSTATE:[39m test-backend-node-wasm.js start movenet
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js event: detect
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet
-2022-11-11 12:28:29 [32mDATA: [39m 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-11 12:28:29 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 248
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js passed: movenet
-2022-11-11 12:28:29 [36mINFO: [39m test-backend-node-wasm.js test face matching
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js passed: face database 40
-2022-11-11 12:28:29 [35mSTATE:[39m 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-11 12:28:29 [36mINFO: [39m test-backend-node-wasm.js test face similarity alternative
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js start face embeddings
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-11-11 12:28:29 [35mSTATE:[39m test-backend-node-wasm.js event: image
-2022-11-11 12:28:29 [31mERROR:[39m test-backend-node-wasm.js failed: testDetect face embeddings
-2022-11-11 12:28:29 [31mERROR:[39m 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:11181:25"," at new Promise ()"," at predict14 (/home/vlado/dev/human/dist/human.node-wasm.js:11175:10)"," at detectFace (/home/vlado/dev/human/dist/human.node-wasm.js:13463:112)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-wasm.js:15086:46"]}
-2022-11-11 12:28:29 [35mSTATE:[39m all tests complete
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/nodejs/node.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/nodejs/process-folder.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"test-node-load.js","passed":1,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"test-node-gear.js","passed":3,"failed":0}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"test-backend-node.js","passed":85,"failed":1}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"test-backend-node-gpu.js","passed":85,"failed":1}
-2022-11-11 12:28:29 [36mINFO: [39m status {"test":"test-backend-node-wasm.js","passed":85,"failed":2}
-2022-11-11 12:28:29 [36mINFO: [39m failures {"count":4}
-2022-11-11 12:28:29 [33mWARN: [39m failed {"test":"test-backend-node.js","message":["error",["failed:","testDetect face embeddings"]]}
-2022-11-11 12:28:29 [33mWARN: [39m failed {"test":"test-backend-node-gpu.js","message":["error",["failed:","testDetect face embeddings"]]}
-2022-11-11 12:28:29 [33mWARN: [39m failed {"test":"test-backend-node-wasm.js","message":["error",["failed: nanodet",[]]]}
-2022-11-11 12:28:29 [33mWARN: [39m failed {"test":"test-backend-node-wasm.js","message":["error",["failed:","testDetect face embeddings"]]}
+2022-11-16 11:24:32 [36mINFO: [39m @vladmandic/human version 3.0.0
+2022-11-16 11:24:32 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v19.1.0
+2022-11-16 11:24:32 [36mINFO: [39m 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 [36mINFO: [39m {"cmd":"../demo/nodejs/node.js","args":[]} start
+2022-11-16 11:24:33 [36mINFO: [39m {"cmd":"../demo/nodejs/node-simple.js","args":[]} start
+2022-11-16 11:24:34 [36mINFO: [39m {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start
+2022-11-16 11:24:34 [36mINFO: [39m {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start
+2022-11-16 11:24:35 [36mINFO: [39m {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start
+2022-11-16 11:24:36 [36mINFO: [39m {"cmd":"../demo/nodejs/process-folder.js","args":["samples"]} start
+2022-11-16 11:24:38 [36mINFO: [39m {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start
+2022-11-16 11:24:51 [36mINFO: [39m {"cmd":"../demo/facematch/node-match.js","args":[]} start
+2022-11-16 11:24:52 [36mINFO: [39m 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 [36mINFO: [39m
+2022-11-16 11:24:52 [36mINFO: [39m test-node-load.js start
+2022-11-16 11:24:52 [36mINFO: [39m test-node-load.js load start {"human":"3.0.0","tf":"4.0.0","progress":0}
+2022-11-16 11:24:52 [32mDATA: [39m test-node-load.js load interval {"elapsed":1,"progress":0}
+2022-11-16 11:24:52 [32mDATA: [39m test-node-load.js load interval {"elapsed":11,"progress":0}
+2022-11-16 11:24:52 [32mDATA: [39m test-node-load.js load interval {"elapsed":30,"progress":0.11143791531203556}
+2022-11-16 11:24:52 [32mDATA: [39m test-node-load.js load interval {"elapsed":58,"progress":0.3299591712723044}
+2022-11-16 11:24:52 [32mDATA: [39m test-node-load.js load interval {"elapsed":79,"progress":0.7259096583739463}
+2022-11-16 11:24:52 [35mSTATE:[39m test-node-load.js passed {"progress":1}
+2022-11-16 11:24:52 [36mINFO: [39m test-node-load.js load final {"progress":1}
+2022-11-16 11:24:52 [32mDATA: [39m test-node-load.js load interval {"elapsed":465,"progress":1}
+2022-11-16 11:24:52 [36mINFO: [39m
+2022-11-16 11:24:52 [36mINFO: [39m test-node-gear.js start
+2022-11-16 11:24:53 [32mDATA: [39m test-node-gear.js input: ["samples/in/ai-face.jpg"]
+2022-11-16 11:24:54 [35mSTATE:[39m test-node-gear.js passed: gear faceres samples/in/ai-face.jpg
+2022-11-16 11:24:54 [32mDATA: [39m 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 [35mSTATE:[39m test-node-gear.js passed: gear gear samples/in/ai-face.jpg
+2022-11-16 11:24:54 [32mDATA: [39m 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 [35mSTATE:[39m test-node-gear.js passed: gear ssrnet samples/in/ai-face.jpg
+2022-11-16 11:24:54 [32mDATA: [39m 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 [36mINFO: [39m
+2022-11-16 11:24:54 [36mINFO: [39m test-backend-node.js start
+2022-11-16 11:24:54 [36mINFO: [39m test-backend-node.js test: configuration validation
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js passed: configuration default validation []
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
+2022-11-16 11:24:54 [36mINFO: [39m test-backend-node.js test: model load
+2022-11-16 11:24:54 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}}
+2022-11-16 11:24:54 [36mINFO: [39m 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 [36mINFO: [39m test-backend-node.js test: warmup
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js passed: create human
+2022-11-16 11:24:54 [36mINFO: [39m test-backend-node.js human version: 3.0.0
+2022-11-16 11:24:54 [36mINFO: [39m test-backend-node.js platform: linux x64 agent: NodeJS v19.1.0
+2022-11-16 11:24:54 [36mINFO: [39m test-backend-node.js tfjs version: 4.0.0
+2022-11-16 11:24:54 [36mINFO: [39m 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 [35mSTATE:[39m test-backend-node.js passed: set backend: tensorflow
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js tensors 1785
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js passed: load models
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js result: defined models: 25 loaded models: 11
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js passed: warmup: none default
+2022-11-16 11:24:54 [32mDATA: [39m test-backend-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
+2022-11-16 11:24:54 [32mDATA: [39m test-backend-node.js result: performance: load: null total: null
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js passed: warmup none result match
+2022-11-16 11:24:54 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: warmup
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: warmup: face default
+2022-11-16 11:24:55 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 439
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: warmup face result match
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: warmup
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: warmup: body default
+2022-11-16 11:24:55 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 350
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: warmup body result match
+2022-11-16 11:24:55 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node.js test: details verification
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js start default
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg default
+2022-11-16 11:24:55 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 314
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face length 1
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face score 1 0.93 1
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face age/gender 23.7 female 0.97 85.47
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face arrays 4 478 1024
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face anti-spoofing 0.79
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details face liveness 0.83
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details body length 1
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details body 0.92 17 6
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details hand length 1
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details hand 0.51 0.73 point
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details hand arrays 21 5 7
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details gesture length 7
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details gesture first {"face":0,"gesture":"facing right"}
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details object length 1
+2022-11-16 11:24:55 [35mSTATE:[39m test-backend-node.js passed: details object 0.72 person
+2022-11-16 11:24:56 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
+2022-11-16 11:24:56 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:56 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:56 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32
+2022-11-16 11:24:56 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
+2022-11-16 11:24:56 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1200,1200,4] dtype: float32
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:24:57 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1200,1200,3] dtype: float32
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32
+2022-11-16 11:24:58 [36mINFO: [39m test-backend-node.js test default
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js start async
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:24:58 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg async
+2022-11-16 11:24:59 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 298
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: default result face match 1 female 0.97
+2022-11-16 11:24:59 [36mINFO: [39m test-backend-node.js test sync
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js start sync
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg sync
+2022-11-16 11:24:59 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 298
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: default sync 1 female 0.97
+2022-11-16 11:24:59 [36mINFO: [39m test-backend-node.js test: image process
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: image input null [1,256,256,3]
+2022-11-16 11:24:59 [36mINFO: [39m test-backend-node.js test: image null
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: invalid input could not convert input to tensor
+2022-11-16 11:24:59 [36mINFO: [39m test-backend-node.js test face similarity
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js start face similarity
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-face.jpg face similarity
+2022-11-16 11:24:59 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 292
+2022-11-16 11:24:59 [35mSTATE:[39m test-backend-node.js start face similarity
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg face similarity
+2022-11-16 11:25:00 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 303
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js start face similarity
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-upper.jpg face similarity
+2022-11-16 11:25:00 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 271
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: face descriptor
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: face similarity {"similarity":[1,0.44727441595492046,0.556793560189727],"descriptors":[1024,1024,1024]}
+2022-11-16 11:25:00 [36mINFO: [39m test-backend-node.js test object
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js start object
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:00 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:01 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:01 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg object
+2022-11-16 11:25:01 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 297
+2022-11-16 11:25:01 [35mSTATE:[39m test-backend-node.js passed: centernet
+2022-11-16 11:25:01 [35mSTATE:[39m test-backend-node.js start object
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg object
+2022-11-16 11:25:03 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 296
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js passed: nanodet
+2022-11-16 11:25:03 [36mINFO: [39m test-backend-node.js test sensitive
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js start sensitive
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:03 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:04 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:04 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg sensitive
+2022-11-16 11:25:04 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 256
+2022-11-16 11:25:04 [35mSTATE:[39m test-backend-node.js passed: sensitive result match
+2022-11-16 11:25:04 [35mSTATE:[39m test-backend-node.js passed: sensitive face result match
+2022-11-16 11:25:04 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node.js passed: sensitive body result match
+2022-11-16 11:25:04 [35mSTATE:[39m test-backend-node.js passed: sensitive hand result match
+2022-11-16 11:25:04 [36mINFO: [39m test-backend-node.js test body
+2022-11-16 11:25:04 [35mSTATE:[39m test-backend-node.js start blazepose
+2022-11-16 11:25:06 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:06 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:06 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:06 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg blazepose
+2022-11-16 11:25:06 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 346
+2022-11-16 11:25:06 [35mSTATE:[39m test-backend-node.js passed: blazepose
+2022-11-16 11:25:06 [35mSTATE:[39m test-backend-node.js start efficientpose
+2022-11-16 11:25:08 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:08 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:08 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:08 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg efficientpose
+2022-11-16 11:25:08 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 318
+2022-11-16 11:25:08 [35mSTATE:[39m test-backend-node.js passed: efficientpose
+2022-11-16 11:25:08 [35mSTATE:[39m test-backend-node.js start posenet
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg posenet
+2022-11-16 11:25:09 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 252
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js passed: posenet
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js start movenet
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-11-16 11:25:09 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js event: detect
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js passed: detect: samples/in/ai-body.jpg movenet
+2022-11-16 11:25:10 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node.js result: performance: load: null total: 256
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js passed: movenet
+2022-11-16 11:25:10 [36mINFO: [39m test-backend-node.js test face matching
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js passed: face database 40
+2022-11-16 11:25:10 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node.js test face similarity alternative
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js start face embeddings
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-11-16 11:25:10 [35mSTATE:[39m test-backend-node.js event: image
+2022-11-16 11:25:10 [31mERROR:[39m test-backend-node.js failed: testDetect face embeddings
+2022-11-16 11:25:10 [31mERROR:[39m 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 [36mINFO: [39m
+2022-11-16 11:25:10 [36mINFO: [39m test-backend-node-gpu.js start
+2022-11-16 11:25:11 [36mINFO: [39m test-backend-node-gpu.js test: configuration validation
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js passed: configuration default validation []
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
+2022-11-16 11:25:11 [36mINFO: [39m test-backend-node-gpu.js test: model load
+2022-11-16 11:25:11 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}}
+2022-11-16 11:25:11 [36mINFO: [39m 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 [36mINFO: [39m test-backend-node-gpu.js test: warmup
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js passed: create human
+2022-11-16 11:25:11 [36mINFO: [39m test-backend-node-gpu.js human version: 3.0.0
+2022-11-16 11:25:11 [36mINFO: [39m test-backend-node-gpu.js platform: linux x64 agent: NodeJS v19.1.0
+2022-11-16 11:25:11 [36mINFO: [39m test-backend-node-gpu.js tfjs version: 4.0.0
+2022-11-16 11:25:11 [36mINFO: [39m 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 [35mSTATE:[39m test-backend-node-gpu.js passed: set backend: tensorflow
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js tensors 1785
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js passed: load models
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js result: defined models: 25 loaded models: 11
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup: none default
+2022-11-16 11:25:11 [32mDATA: [39m test-backend-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
+2022-11-16 11:25:11 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: null
+2022-11-16 11:25:11 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup none result match
+2022-11-16 11:25:12 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js event: warmup
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup: face default
+2022-11-16 11:25:15 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 3118
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup face result match
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js event: warmup
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup: body default
+2022-11-16 11:25:15 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 152
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: warmup body result match
+2022-11-16 11:25:15 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node-gpu.js test: details verification
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js start default
+2022-11-16 11:25:15 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg default
+2022-11-16 11:25:15 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 135
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face length 1
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face score 1 0.93 1
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face arrays 4 478 1024
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face anti-spoofing 0.79
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details face liveness 0.83
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details body length 1
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details body 0.92 17 6
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details hand length 1
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details hand 0.51 0.73 point
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details hand arrays 21 5 7
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details gesture length 7
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"}
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details object length 1
+2022-11-16 11:25:15 [35mSTATE:[39m test-backend-node-gpu.js passed: details object 0.72 person
+2022-11-16 11:25:15 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32
+2022-11-16 11:25:16 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:16 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928}
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32
+2022-11-16 11:25:17 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32
+2022-11-16 11:25:17 [36mINFO: [39m test-backend-node-gpu.js test default
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js start async
+2022-11-16 11:25:17 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg async
+2022-11-16 11:25:17 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 127
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js passed: default result face match 1 female 0.97
+2022-11-16 11:25:17 [36mINFO: [39m test-backend-node-gpu.js test sync
+2022-11-16 11:25:17 [35mSTATE:[39m test-backend-node-gpu.js start sync
+2022-11-16 11:25:18 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sync
+2022-11-16 11:25:18 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 153
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js passed: default sync 1 female 0.97
+2022-11-16 11:25:18 [36mINFO: [39m test-backend-node-gpu.js test: image process
+2022-11-16 11:25:18 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js passed: image input null [1,256,256,3]
+2022-11-16 11:25:18 [36mINFO: [39m test-backend-node-gpu.js test: image null
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js passed: invalid input could not convert input to tensor
+2022-11-16 11:25:18 [36mINFO: [39m test-backend-node-gpu.js test face similarity
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js start face similarity
+2022-11-16 11:25:18 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity
+2022-11-16 11:25:18 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 133
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js start face similarity
+2022-11-16 11:25:18 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity
+2022-11-16 11:25:18 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 148
+2022-11-16 11:25:18 [35mSTATE:[39m test-backend-node-gpu.js start face similarity
+2022-11-16 11:25:18 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity
+2022-11-16 11:25:19 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 139
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js passed: face descriptor
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js passed: face similarity {"similarity":[1,0.4475002983522097,0.5570879556505012],"descriptors":[1024,1024,1024]}
+2022-11-16 11:25:19 [36mINFO: [39m test-backend-node-gpu.js test object
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js start object
+2022-11-16 11:25:19 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object
+2022-11-16 11:25:19 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 165
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js passed: centernet
+2022-11-16 11:25:19 [35mSTATE:[39m test-backend-node-gpu.js start object
+2022-11-16 11:25:20 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:20 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:20 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object
+2022-11-16 11:25:20 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 522
+2022-11-16 11:25:20 [35mSTATE:[39m test-backend-node-gpu.js passed: nanodet
+2022-11-16 11:25:20 [36mINFO: [39m test-backend-node-gpu.js test sensitive
+2022-11-16 11:25:20 [35mSTATE:[39m test-backend-node-gpu.js start sensitive
+2022-11-16 11:25:21 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:21 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:21 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive
+2022-11-16 11:25:21 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 115
+2022-11-16 11:25:21 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive result match
+2022-11-16 11:25:21 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive face result match
+2022-11-16 11:25:21 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive body result match
+2022-11-16 11:25:21 [35mSTATE:[39m test-backend-node-gpu.js passed: sensitive hand result match
+2022-11-16 11:25:21 [36mINFO: [39m test-backend-node-gpu.js test body
+2022-11-16 11:25:21 [35mSTATE:[39m test-backend-node-gpu.js start blazepose
+2022-11-16 11:25:23 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:23 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:23 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose
+2022-11-16 11:25:23 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 259
+2022-11-16 11:25:23 [35mSTATE:[39m test-backend-node-gpu.js passed: blazepose
+2022-11-16 11:25:23 [35mSTATE:[39m test-backend-node-gpu.js start efficientpose
+2022-11-16 11:25:24 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose
+2022-11-16 11:25:25 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 1067
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js passed: efficientpose
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js start posenet
+2022-11-16 11:25:25 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet
+2022-11-16 11:25:25 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 209
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js passed: posenet
+2022-11-16 11:25:25 [35mSTATE:[39m test-backend-node-gpu.js start movenet
+2022-11-16 11:25:26 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:26 [35mSTATE:[39m test-backend-node-gpu.js event: detect
+2022-11-16 11:25:26 [35mSTATE:[39m test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet
+2022-11-16 11:25:26 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-gpu.js result: performance: load: null total: 112
+2022-11-16 11:25:26 [35mSTATE:[39m test-backend-node-gpu.js passed: movenet
+2022-11-16 11:25:26 [36mINFO: [39m test-backend-node-gpu.js test face matching
+2022-11-16 11:25:26 [35mSTATE:[39m test-backend-node-gpu.js passed: face database 40
+2022-11-16 11:25:26 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node-gpu.js test face similarity alternative
+2022-11-16 11:25:26 [35mSTATE:[39m test-backend-node-gpu.js start face embeddings
+2022-11-16 11:25:26 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-gpu.js event: image
+2022-11-16 11:25:26 [31mERROR:[39m test-backend-node-gpu.js failed: testDetect face embeddings
+2022-11-16 11:25:26 [31mERROR:[39m 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 [36mINFO: [39m
+2022-11-16 11:25:27 [36mINFO: [39m test-backend-node-wasm.js start
+2022-11-16 11:25:27 [32mDATA: [39m test-backend-node-wasm.js stdout: 2022-11-16 11:25:27 [36mINFO: [39m { supported: [33mtrue[39m, backend: [33mtrue[39m, simd: [90mundefined[39m, multithread: [90mundefined[39m } https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.0.0/dist/
+2022-11-16 11:25:27 [35mSTATE:[39m test-backend-node-wasm.js passed: model server: https://vladmandic.github.io/human-models/models/
+2022-11-16 11:25:27 [36mINFO: [39m test-backend-node-wasm.js test: configuration validation
+2022-11-16 11:25:27 [35mSTATE:[39m test-backend-node-wasm.js passed: configuration default validation []
+2022-11-16 11:25:27 [35mSTATE:[39m test-backend-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
+2022-11-16 11:25:27 [36mINFO: [39m test-backend-node-wasm.js test: model load
+2022-11-16 11:25:30 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}}
+2022-11-16 11:25:30 [36mINFO: [39m 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 [36mINFO: [39m test-backend-node-wasm.js test: warmup
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js passed: create human
+2022-11-16 11:25:30 [36mINFO: [39m test-backend-node-wasm.js human version: 3.0.0
+2022-11-16 11:25:30 [36mINFO: [39m test-backend-node-wasm.js platform: linux x64 agent: NodeJS v19.1.0
+2022-11-16 11:25:30 [36mINFO: [39m test-backend-node-wasm.js tfjs version: 4.0.0
+2022-11-16 11:25:30 [36mINFO: [39m 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 [35mSTATE:[39m test-backend-node-wasm.js passed: set backend: wasm
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js tensors 1785
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js passed: load models
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js result: defined models: 25 loaded models: 11
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup: none default
+2022-11-16 11:25:30 [32mDATA: [39m test-backend-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
+2022-11-16 11:25:30 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: null
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup none result match
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js event: warmup
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup: face default
+2022-11-16 11:25:30 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 518
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup face result match
+2022-11-16 11:25:30 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js event: warmup
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup: body default
+2022-11-16 11:25:31 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 350
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: warmup body result match
+2022-11-16 11:25:31 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node-wasm.js test: details verification
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js start default
+2022-11-16 11:25:31 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg default
+2022-11-16 11:25:31 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 339
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face length 1
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face score 1 0.93 1
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face arrays 4 478 1024
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face anti-spoofing 0.79
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details face liveness 0.83
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details body length 1
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details body 0.92 17 6
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details hand length 1
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details hand 0.51 0.73 point
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details hand arrays 21 5 7
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details gesture length 7
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"}
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details object length 1
+2022-11-16 11:25:31 [35mSTATE:[39m test-backend-node-wasm.js passed: details object 0.72 person
+2022-11-16 11:25:31 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:32 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:32 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32
+2022-11-16 11:25:32 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264}
+2022-11-16 11:25:32 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:32 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:32 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32
+2022-11-16 11:25:33 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:33 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:33 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32
+2022-11-16 11:25:33 [35mSTATE:[39m test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856}
+2022-11-16 11:25:33 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:33 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:33 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32
+2022-11-16 11:25:34 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:34 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:34 [35mSTATE:[39m test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32
+2022-11-16 11:25:34 [36mINFO: [39m test-backend-node-wasm.js test default
+2022-11-16 11:25:34 [35mSTATE:[39m test-backend-node-wasm.js start async
+2022-11-16 11:25:34 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg async
+2022-11-16 11:25:35 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 326
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js passed: default result face match 1 female 0.97
+2022-11-16 11:25:35 [36mINFO: [39m test-backend-node-wasm.js test sync
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js start sync
+2022-11-16 11:25:35 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sync
+2022-11-16 11:25:35 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 322
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js passed: default sync 1 female 0.97
+2022-11-16 11:25:35 [36mINFO: [39m test-backend-node-wasm.js test: image process
+2022-11-16 11:25:35 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js passed: image input null [1,256,256,3]
+2022-11-16 11:25:35 [36mINFO: [39m test-backend-node-wasm.js test: image null
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js passed: invalid input could not convert input to tensor
+2022-11-16 11:25:35 [36mINFO: [39m test-backend-node-wasm.js test face similarity
+2022-11-16 11:25:35 [35mSTATE:[39m test-backend-node-wasm.js start face similarity
+2022-11-16 11:25:35 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:36 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:36 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity
+2022-11-16 11:25:36 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 333
+2022-11-16 11:25:36 [35mSTATE:[39m test-backend-node-wasm.js start face similarity
+2022-11-16 11:25:36 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:36 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:36 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity
+2022-11-16 11:25:36 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 387
+2022-11-16 11:25:36 [35mSTATE:[39m test-backend-node-wasm.js start face similarity
+2022-11-16 11:25:36 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity
+2022-11-16 11:25:37 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 300
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js passed: face descriptor
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]}
+2022-11-16 11:25:37 [36mINFO: [39m test-backend-node-wasm.js test object
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js start object
+2022-11-16 11:25:37 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object
+2022-11-16 11:25:37 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 317
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js passed: centernet
+2022-11-16 11:25:37 [35mSTATE:[39m test-backend-node-wasm.js start object
+2022-11-16 11:25:38 [33mWARN: [39m 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 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:38 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:38 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object
+2022-11-16 11:25:38 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 224
+2022-11-16 11:25:38 [31mERROR:[39m test-backend-node-wasm.js failed: nanodet []
+2022-11-16 11:25:38 [36mINFO: [39m test-backend-node-wasm.js test sensitive
+2022-11-16 11:25:38 [35mSTATE:[39m test-backend-node-wasm.js start sensitive
+2022-11-16 11:25:39 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:39 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:39 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive
+2022-11-16 11:25:39 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 262
+2022-11-16 11:25:39 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive result match
+2022-11-16 11:25:39 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive face result match
+2022-11-16 11:25:39 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive body result match
+2022-11-16 11:25:39 [35mSTATE:[39m test-backend-node-wasm.js passed: sensitive hand result match
+2022-11-16 11:25:39 [36mINFO: [39m test-backend-node-wasm.js test body
+2022-11-16 11:25:39 [35mSTATE:[39m test-backend-node-wasm.js start blazepose
+2022-11-16 11:25:42 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:42 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:42 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose
+2022-11-16 11:25:42 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 458
+2022-11-16 11:25:42 [35mSTATE:[39m test-backend-node-wasm.js passed: blazepose
+2022-11-16 11:25:42 [35mSTATE:[39m test-backend-node-wasm.js start efficientpose
+2022-11-16 11:25:43 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:44 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:44 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose
+2022-11-16 11:25:44 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 687
+2022-11-16 11:25:44 [35mSTATE:[39m test-backend-node-wasm.js passed: efficientpose
+2022-11-16 11:25:44 [35mSTATE:[39m test-backend-node-wasm.js start posenet
+2022-11-16 11:25:45 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:45 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:45 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet
+2022-11-16 11:25:45 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 305
+2022-11-16 11:25:45 [35mSTATE:[39m test-backend-node-wasm.js passed: posenet
+2022-11-16 11:25:45 [35mSTATE:[39m test-backend-node-wasm.js start movenet
+2022-11-16 11:25:46 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:46 [35mSTATE:[39m test-backend-node-wasm.js event: detect
+2022-11-16 11:25:46 [35mSTATE:[39m test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet
+2022-11-16 11:25:46 [32mDATA: [39m 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 [32mDATA: [39m test-backend-node-wasm.js result: performance: load: null total: 253
+2022-11-16 11:25:46 [35mSTATE:[39m test-backend-node-wasm.js passed: movenet
+2022-11-16 11:25:46 [36mINFO: [39m test-backend-node-wasm.js test face matching
+2022-11-16 11:25:46 [35mSTATE:[39m test-backend-node-wasm.js passed: face database 40
+2022-11-16 11:25:46 [35mSTATE:[39m 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 [36mINFO: [39m test-backend-node-wasm.js test face similarity alternative
+2022-11-16 11:25:46 [35mSTATE:[39m test-backend-node-wasm.js start face embeddings
+2022-11-16 11:25:46 [35mSTATE:[39m 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 [35mSTATE:[39m test-backend-node-wasm.js event: image
+2022-11-16 11:25:46 [31mERROR:[39m test-backend-node-wasm.js failed: testDetect face embeddings
+2022-11-16 11:25:46 [31mERROR:[39m 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 [35mSTATE:[39m all tests complete
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/nodejs/node.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/nodejs/process-folder.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"test-node-load.js","passed":1,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"test-node-gear.js","passed":3,"failed":0}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"test-backend-node.js","passed":85,"failed":1}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"test-backend-node-gpu.js","passed":85,"failed":1}
+2022-11-16 11:25:46 [36mINFO: [39m status {"test":"test-backend-node-wasm.js","passed":85,"failed":2}
+2022-11-16 11:25:46 [36mINFO: [39m failures {"count":4}
+2022-11-16 11:25:46 [33mWARN: [39m failed {"test":"test-backend-node.js","message":["error",["failed:","testDetect face embeddings"]]}
+2022-11-16 11:25:46 [33mWARN: [39m failed {"test":"test-backend-node-gpu.js","message":["error",["failed:","testDetect face embeddings"]]}
+2022-11-16 11:25:46 [33mWARN: [39m failed {"test":"test-backend-node-wasm.js","message":["error",["failed: nanodet",[]]]}
+2022-11-16 11:25:46 [33mWARN: [39m failed {"test":"test-backend-node-wasm.js","message":["error",["failed:","testDetect face embeddings"]]}