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 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} -2022-11-12 12:48:06 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} -2022-11-12 12:48:06 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-11-12 12:48:06 INFO:  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 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-11-12 12:48:06 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} -2022-11-12 12:48:06 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} -2022-11-12 12:48:06 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} -2022-11-12 12:48:06 STATE: 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 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} -2022-11-12 12:48:07 STATE: 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 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} -2022-11-12 12:48:07 STATE: 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 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} -2022-11-12 12:48:07 STATE: 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 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} -2022-11-12 12:48:07 STATE: 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 STATE: 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 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} -2022-11-12 12:48:13 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} -2022-11-12 12:48:13 STATE: 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 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17166,"outputBytes":9243} -2022-11-12 12:48:21 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":113,"errors":0,"warnings":0} -2022-11-12 12:48:21 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-11-12 12:48:21 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} -2022-11-12 12:48:21 INFO:  Done... -2022-11-12 12:48:21 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} -2022-11-12 12:48:21 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} -2022-11-12 12:48:21 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} -2022-11-12 12:48:21 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} -2022-11-12 12:48:21 STATE: Filter: {"input":"types/tfjs-core.d.ts"} -2022-11-12 12:48:22 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} -2022-11-12 12:48:22 STATE: Filter: {"input":"types/human.d.ts"} -2022-11-12 12:48:22 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} -2022-11-12 12:48:22 STATE: Write: {"output":"dist/human.esm.d.ts"} -2022-11-12 12:48:22 STATE: Write: {"output":"dist/human.d.ts"} -2022-11-12 12:48:22 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} -2022-11-12 12:48:22 STATE: Write: {"output":"dist/human.node.d.ts"} -2022-11-12 12:48:22 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} -2022-11-12 12:48:22 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} -2022-11-12 12:48:22 STATE: Models {"folder":"./models","models":12} -2022-11-12 12:48:22 STATE: Models {"folder":"../human-models/models","models":43} -2022-11-12 12:48:22 STATE: Models {"folder":"../blazepose/model/","models":4} -2022-11-12 12:48:22 STATE: Models {"folder":"../anti-spoofing/model","models":1} -2022-11-12 12:48:22 STATE: Models {"folder":"../efficientpose/models","models":3} -2022-11-12 12:48:22 STATE: Models {"folder":"../insightface/models","models":5} -2022-11-12 12:48:22 STATE: Models {"folder":"../movenet/models","models":3} -2022-11-12 12:48:22 STATE: Models {"folder":"../nanodet/models","models":4} -2022-11-12 12:48:23 STATE: Models: {"count":58,"totalSize":386543911} -2022-11-12 12:48:23 INFO:  Human Build complete... {"logFile":"test/build.log"} +2022-11-16 11:18:02 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-16 11:18:02 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-16 11:18:02 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-11-16 11:18:02 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.14","typescript":"4.9.3","typedoc":"0.23.21","eslint":"8.27.0"} +2022-11-16 11:18:02 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-11-16 11:18:02 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} +2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} +2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} +2022-11-16 11:18:02 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":79,"inputBytes":672671,"outputBytes":318315} +2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} +2022-11-16 11:18:02 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":79,"inputBytes":672675,"outputBytes":318319} +2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} +2022-11-16 11:18:02 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":79,"inputBytes":673623,"outputBytes":318430} +2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} +2022-11-16 11:18:02 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":79,"inputBytes":672417,"outputBytes":316894} +2022-11-16 11:18:02 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} +2022-11-16 11:18:02 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":79,"inputBytes":1816647,"outputBytes":1458374} +2022-11-16 11:18:02 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":79,"inputBytes":1816647,"outputBytes":1917806} +2022-11-16 11:18:06 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} +2022-11-16 11:18:09 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} +2022-11-16 11:18:09 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6136,"outputBytes":2914} +2022-11-16 11:18:09 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17166,"outputBytes":9243} +2022-11-16 11:18:17 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":113,"errors":0,"warnings":0} +2022-11-16 11:18:17 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-11-16 11:18:17 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} +2022-11-16 11:18:17 INFO:  Done... +2022-11-16 11:18:17 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} +2022-11-16 11:18:17 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} +2022-11-16 11:18:17 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} +2022-11-16 11:18:17 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} +2022-11-16 11:18:17 STATE: Filter: {"input":"types/tfjs-core.d.ts"} +2022-11-16 11:18:19 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} +2022-11-16 11:18:19 STATE: Filter: {"input":"types/human.d.ts"} +2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} +2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.esm.d.ts"} +2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.d.ts"} +2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} +2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.node.d.ts"} +2022-11-16 11:18:19 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} +2022-11-16 11:18:19 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} +2022-11-16 11:18:19 STATE: Models {"folder":"./models","models":12} +2022-11-16 11:18:19 STATE: Models {"folder":"../human-models/models","models":43} +2022-11-16 11:18:19 STATE: Models {"folder":"../blazepose/model/","models":4} +2022-11-16 11:18:19 STATE: Models {"folder":"../anti-spoofing/model","models":1} +2022-11-16 11:18:19 STATE: Models {"folder":"../efficientpose/models","models":3} +2022-11-16 11:18:19 STATE: Models {"folder":"../insightface/models","models":5} +2022-11-16 11:18:19 STATE: Models {"folder":"../movenet/models","models":3} +2022-11-16 11:18:19 STATE: Models {"folder":"../nanodet/models","models":4} +2022-11-16 11:18:19 STATE: Models: {"count":58,"totalSize":386543911} +2022-11-16 11:18:19 INFO:  Human Build complete... {"logFile":"test/build.log"} 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 INFO:  @vladmandic/human version 3.0.0 -2022-11-11 12:27:21 INFO:  User: vlado Platform: linux Arch: x64 Node: v18.10.0 -2022-11-11 12:27:21 INFO:  demos: [{"cmd":"../demo/nodejs/node.js","args":[]},{"cmd":"../demo/nodejs/node-simple.js","args":[]},{"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]},{"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]},{"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]},{"cmd":"../demo/nodejs/process-folder.js","args":["samples"]},{"cmd":"../demo/multithread/node-multiprocess.js","args":[]},{"cmd":"../demo/facematch/node-match.js","args":[]}] -2022-11-11 12:27:21 INFO:  {"cmd":"../demo/nodejs/node.js","args":[]} start -2022-11-11 12:27:22 INFO:  {"cmd":"../demo/nodejs/node-simple.js","args":[]} start -2022-11-11 12:27:23 INFO:  {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start -2022-11-11 12:27:24 INFO:  {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start -2022-11-11 12:27:24 INFO:  {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start -2022-11-11 12:27:25 INFO:  {"cmd":"../demo/nodejs/process-folder.js","args":["samples"]} start -2022-11-11 12:27:27 INFO:  {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start -2022-11-11 12:27:40 INFO:  {"cmd":"../demo/facematch/node-match.js","args":[]} start -2022-11-11 12:27:42 INFO:  tests: ["test-node-load.js","test-node-gear.js","test-backend-node.js","test-backend-node-gpu.js","test-backend-node-wasm.js"] -2022-11-11 12:27:42 INFO:  -2022-11-11 12:27:42 INFO:  test-node-load.js start -2022-11-11 12:27:42 INFO:  test-node-load.js load start {"human":"3.0.0","tf":"4.0.0","progress":0} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":0,"progress":0} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":10,"progress":0} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":22,"progress":0.05339166087267679} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":33,"progress":0.2135162934143239} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":56,"progress":0.3299591712723044} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":73,"progress":0.5125946867158943} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":83,"progress":0.7259096583739463} -2022-11-11 12:27:42 STATE: test-node-load.js passed {"progress":1} -2022-11-11 12:27:42 INFO:  test-node-load.js load final {"progress":1} -2022-11-11 12:27:42 DATA:  test-node-load.js load interval {"elapsed":500,"progress":1} -2022-11-11 12:27:42 INFO:  -2022-11-11 12:27:42 INFO:  test-node-gear.js start -2022-11-11 12:27:43 DATA:  test-node-gear.js input: ["samples/in/ai-face.jpg"] -2022-11-11 12:27:43 STATE: test-node-gear.js passed: gear faceres samples/in/ai-face.jpg -2022-11-11 12:27:43 DATA:  test-node-gear.js results {"face":0,"model":"faceres","image":"samples/in/ai-face.jpg","age":23.5,"gender":"female","genderScore":0.92} -2022-11-11 12:27:44 STATE: test-node-gear.js passed: gear gear samples/in/ai-face.jpg -2022-11-11 12:27:44 DATA:  test-node-gear.js results {"face":0,"model":"gear","image":"samples/in/ai-face.jpg","age":23.3,"gender":"female","genderScore":0.51,"race":[{"score":0.93,"race":"white"}]} -2022-11-11 12:27:44 STATE: test-node-gear.js passed: gear ssrnet samples/in/ai-face.jpg -2022-11-11 12:27:44 DATA:  test-node-gear.js results {"face":0,"model":"ssrnet","image":"samples/in/ai-face.jpg","age":23.4,"gender":"female","genderScore":0.99} -2022-11-11 12:27:44 INFO:  -2022-11-11 12:27:44 INFO:  test-backend-node.js start -2022-11-11 12:27:44 INFO:  test-backend-node.js test: configuration validation -2022-11-11 12:27:44 STATE: test-backend-node.js passed: configuration default validation [] -2022-11-11 12:27:44 STATE: test-backend-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-11-11 12:27:44 INFO:  test-backend-node.js test: model load -2022-11-11 12:27:44 STATE: test-backend-node.js passed: models loaded 25 11 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] -2022-11-11 12:27:44 INFO:  test-backend-node.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} -2022-11-11 12:27:44 INFO:  test-backend-node.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} -2022-11-11 12:27:44 INFO:  test-backend-node.js test: warmup -2022-11-11 12:27:44 STATE: test-backend-node.js passed: create human -2022-11-11 12:27:44 INFO:  test-backend-node.js human version: 3.0.0 -2022-11-11 12:27:44 INFO:  test-backend-node.js platform: linux x64 agent: NodeJS v18.10.0 -2022-11-11 12:27:44 INFO:  test-backend-node.js tfjs version: 4.0.0 -2022-11-11 12:27:44 INFO:  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 STATE: test-backend-node.js passed: set backend: tensorflow -2022-11-11 12:27:44 STATE: test-backend-node.js tensors 1785 -2022-11-11 12:27:44 STATE: test-backend-node.js passed: load models -2022-11-11 12:27:44 STATE: test-backend-node.js result: defined models: 25 loaded models: 11 -2022-11-11 12:27:44 STATE: test-backend-node.js passed: warmup: none default -2022-11-11 12:27:44 DATA:  test-backend-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-11-11 12:27:44 DATA:  test-backend-node.js result: performance: load: null total: null -2022-11-11 12:27:44 STATE: test-backend-node.js passed: warmup none result match -2022-11-11 12:27:44 STATE: test-backend-node.js event: image -2022-11-11 12:27:44 STATE: test-backend-node.js event: detect -2022-11-11 12:27:44 STATE: test-backend-node.js event: warmup -2022-11-11 12:27:44 STATE: test-backend-node.js passed: warmup: face default -2022-11-11 12:27:44 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} -2022-11-11 12:27:44 DATA:  test-backend-node.js result: performance: load: null total: 449 -2022-11-11 12:27:44 STATE: test-backend-node.js passed: warmup face result match -2022-11-11 12:27:44 STATE: test-backend-node.js event: image -2022-11-11 12:27:45 STATE: test-backend-node.js event: detect -2022-11-11 12:27:45 STATE: test-backend-node.js event: warmup -2022-11-11 12:27:45 STATE: test-backend-node.js passed: warmup: body default -2022-11-11 12:27:45 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:45 DATA:  test-backend-node.js result: performance: load: null total: 353 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: warmup body result match -2022-11-11 12:27:45 STATE: test-backend-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} -2022-11-11 12:27:45 INFO:  test-backend-node.js test: details verification -2022-11-11 12:27:45 STATE: test-backend-node.js start default -2022-11-11 12:27:45 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:45 STATE: test-backend-node.js event: image -2022-11-11 12:27:45 STATE: test-backend-node.js event: detect -2022-11-11 12:27:45 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg default -2022-11-11 12:27:45 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:45 DATA:  test-backend-node.js result: performance: load: null total: 331 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face length 1 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face score 1 0.93 1 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face arrays 4 478 1024 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face anti-spoofing 0.79 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details face liveness 0.83 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details body length 1 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details body 0.92 17 6 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details hand length 1 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details hand 0.51 0.73 point -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details hand arrays 21 5 7 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details gesture length 7 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details object length 1 -2022-11-11 12:27:45 STATE: test-backend-node.js passed: details object 0.72 person -2022-11-11 12:27:46 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} -2022-11-11 12:27:46 STATE: test-backend-node.js event: image -2022-11-11 12:27:46 STATE: test-backend-node.js event: detect -2022-11-11 12:27:46 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-11-11 12:27:46 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-11-11 12:27:46 STATE: test-backend-node.js event: image -2022-11-11 12:27:46 STATE: test-backend-node.js event: detect -2022-11-11 12:27:46 STATE: test-backend-node.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-11-11 12:27:47 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:47 STATE: test-backend-node.js event: image -2022-11-11 12:27:47 STATE: test-backend-node.js event: detect -2022-11-11 12:27:47 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-11-11 12:27:47 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:47 STATE: test-backend-node.js event: image -2022-11-11 12:27:47 STATE: test-backend-node.js event: detect -2022-11-11 12:27:47 STATE: test-backend-node.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-11-11 12:27:48 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-11-11 12:27:48 STATE: test-backend-node.js event: image -2022-11-11 12:27:48 STATE: test-backend-node.js event: detect -2022-11-11 12:27:48 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-11-11 12:27:48 INFO:  test-backend-node.js test default -2022-11-11 12:27:48 STATE: test-backend-node.js start async -2022-11-11 12:27:48 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:48 STATE: test-backend-node.js event: image -2022-11-11 12:27:48 STATE: test-backend-node.js event: detect -2022-11-11 12:27:48 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg async -2022-11-11 12:27:48 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:48 DATA:  test-backend-node.js result: performance: load: null total: 313 -2022-11-11 12:27:48 STATE: test-backend-node.js passed: default result face match 1 female 0.97 -2022-11-11 12:27:48 INFO:  test-backend-node.js test sync -2022-11-11 12:27:48 STATE: test-backend-node.js start sync -2022-11-11 12:27:49 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:49 STATE: test-backend-node.js event: image -2022-11-11 12:27:49 STATE: test-backend-node.js event: detect -2022-11-11 12:27:49 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sync -2022-11-11 12:27:49 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:49 DATA:  test-backend-node.js result: performance: load: null total: 310 -2022-11-11 12:27:49 STATE: test-backend-node.js passed: default sync 1 female 0.97 -2022-11-11 12:27:49 INFO:  test-backend-node.js test: image process -2022-11-11 12:27:49 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-11 12:27:49 STATE: test-backend-node.js passed: image input null [1,256,256,3] -2022-11-11 12:27:49 INFO:  test-backend-node.js test: image null -2022-11-11 12:27:49 STATE: test-backend-node.js passed: invalid input could not convert input to tensor -2022-11-11 12:27:49 INFO:  test-backend-node.js test face similarity -2022-11-11 12:27:49 STATE: test-backend-node.js start face similarity -2022-11-11 12:27:49 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-11 12:27:49 STATE: test-backend-node.js event: image -2022-11-11 12:27:49 STATE: test-backend-node.js event: detect -2022-11-11 12:27:49 STATE: test-backend-node.js passed: detect: samples/in/ai-face.jpg face similarity -2022-11-11 12:27:49 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-11-11 12:27:49 DATA:  test-backend-node.js result: performance: load: null total: 310 -2022-11-11 12:27:49 STATE: test-backend-node.js start face similarity -2022-11-11 12:27:49 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:49 STATE: test-backend-node.js event: image -2022-11-11 12:27:50 STATE: test-backend-node.js event: detect -2022-11-11 12:27:50 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg face similarity -2022-11-11 12:27:50 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:50 DATA:  test-backend-node.js result: performance: load: null total: 319 -2022-11-11 12:27:50 STATE: test-backend-node.js start face similarity -2022-11-11 12:27:50 STATE: test-backend-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-11-11 12:27:50 STATE: test-backend-node.js event: image -2022-11-11 12:27:50 STATE: test-backend-node.js event: detect -2022-11-11 12:27:50 STATE: test-backend-node.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-11-11 12:27:50 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-11-11 12:27:50 DATA:  test-backend-node.js result: performance: load: null total: 282 -2022-11-11 12:27:50 STATE: test-backend-node.js passed: face descriptor -2022-11-11 12:27:50 STATE: test-backend-node.js passed: face similarity {"similarity":[1,0.44727441595492046,0.556793560189727],"descriptors":[1024,1024,1024]} -2022-11-11 12:27:50 INFO:  test-backend-node.js test object -2022-11-11 12:27:50 STATE: test-backend-node.js start object -2022-11-11 12:27:50 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:50 STATE: test-backend-node.js event: image -2022-11-11 12:27:51 STATE: test-backend-node.js event: detect -2022-11-11 12:27:51 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object -2022-11-11 12:27:51 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:51 DATA:  test-backend-node.js result: performance: load: null total: 317 -2022-11-11 12:27:51 STATE: test-backend-node.js passed: centernet -2022-11-11 12:27:51 STATE: test-backend-node.js start object -2022-11-11 12:27:52 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:52 STATE: test-backend-node.js event: image -2022-11-11 12:27:52 STATE: test-backend-node.js event: detect -2022-11-11 12:27:52 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object -2022-11-11 12:27:52 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:27:52 DATA:  test-backend-node.js result: performance: load: null total: 313 -2022-11-11 12:27:52 STATE: test-backend-node.js passed: nanodet -2022-11-11 12:27:52 INFO:  test-backend-node.js test sensitive -2022-11-11 12:27:52 STATE: test-backend-node.js start sensitive -2022-11-11 12:27:52 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:52 STATE: test-backend-node.js event: image -2022-11-11 12:27:53 STATE: test-backend-node.js event: detect -2022-11-11 12:27:53 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sensitive -2022-11-11 12:27:53 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:27:53 DATA:  test-backend-node.js result: performance: load: null total: 283 -2022-11-11 12:27:53 STATE: test-backend-node.js passed: sensitive result match -2022-11-11 12:27:53 STATE: test-backend-node.js passed: sensitive face result match -2022-11-11 12:27:53 STATE: 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 STATE: test-backend-node.js passed: sensitive body result match -2022-11-11 12:27:53 STATE: test-backend-node.js passed: sensitive hand result match -2022-11-11 12:27:53 INFO:  test-backend-node.js test body -2022-11-11 12:27:53 STATE: test-backend-node.js start blazepose -2022-11-11 12:27:55 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:55 STATE: test-backend-node.js event: image -2022-11-11 12:27:55 STATE: test-backend-node.js event: detect -2022-11-11 12:27:55 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg blazepose -2022-11-11 12:27:55 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39} -2022-11-11 12:27:55 DATA:  test-backend-node.js result: performance: load: null total: 361 -2022-11-11 12:27:55 STATE: test-backend-node.js passed: blazepose -2022-11-11 12:27:55 STATE: test-backend-node.js start efficientpose -2022-11-11 12:27:56 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:56 STATE: test-backend-node.js event: image -2022-11-11 12:27:56 STATE: test-backend-node.js event: detect -2022-11-11 12:27:56 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-11-11 12:27:56 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13} -2022-11-11 12:27:56 DATA:  test-backend-node.js result: performance: load: null total: 343 -2022-11-11 12:27:56 STATE: test-backend-node.js passed: efficientpose -2022-11-11 12:27:56 STATE: test-backend-node.js start posenet -2022-11-11 12:27:57 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:57 STATE: test-backend-node.js event: image -2022-11-11 12:27:57 STATE: test-backend-node.js event: detect -2022-11-11 12:27:57 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg posenet -2022-11-11 12:27:57 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16} -2022-11-11 12:27:57 DATA:  test-backend-node.js result: performance: load: null total: 269 -2022-11-11 12:27:57 STATE: test-backend-node.js passed: posenet -2022-11-11 12:27:57 STATE: test-backend-node.js start movenet -2022-11-11 12:27:57 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-11-11 12:27:57 STATE: test-backend-node.js event: image -2022-11-11 12:27:57 STATE: test-backend-node.js event: detect -2022-11-11 12:27:57 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg movenet -2022-11-11 12:27:57 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:27:57 DATA:  test-backend-node.js result: performance: load: null total: 282 -2022-11-11 12:27:57 STATE: test-backend-node.js passed: movenet -2022-11-11 12:27:57 INFO:  test-backend-node.js test face matching -2022-11-11 12:27:57 STATE: test-backend-node.js passed: face database 40 -2022-11-11 12:27:57 STATE: test-backend-node.js passed: face match {"first":{"index":4,"similarity":0.7827852251220577}} {"second":{"index":4,"similarity":0.5002052057057577}} {"third":{"index":4,"similarity":0.5401588464054732}} -2022-11-11 12:27:57 INFO:  test-backend-node.js test face similarity alternative -2022-11-11 12:27:57 STATE: test-backend-node.js start face embeddings -2022-11-11 12:27:58 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-11-11 12:27:58 STATE: test-backend-node.js event: image -2022-11-11 12:27:58 ERROR: test-backend-node.js failed: testDetect face embeddings -2022-11-11 12:27:58 ERROR: test-backend-node.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node.js: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 INFO:  -2022-11-11 12:27:58 INFO:  test-backend-node-gpu.js start -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js test: configuration validation -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: configuration default validation [] -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js test: model load -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: models loaded 25 11 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js test: warmup -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: create human -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js human version: 3.0.0 -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js platform: linux x64 agent: NodeJS v18.10.0 -2022-11-11 12:27:59 INFO:  test-backend-node-gpu.js tfjs version: 4.0.0 -2022-11-11 12:27:59 INFO:  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 STATE: test-backend-node-gpu.js passed: set backend: tensorflow -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js tensors 1785 -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: load models -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js result: defined models: 25 loaded models: 11 -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: warmup: none default -2022-11-11 12:27:59 DATA:  test-backend-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-11-11 12:27:59 DATA:  test-backend-node-gpu.js result: performance: load: null total: null -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js passed: warmup none result match -2022-11-11 12:27:59 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:01 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:01 STATE: test-backend-node-gpu.js event: warmup -2022-11-11 12:28:01 STATE: test-backend-node-gpu.js passed: warmup: face default -2022-11-11 12:28:01 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} -2022-11-11 12:28:01 DATA:  test-backend-node-gpu.js result: performance: load: null total: 2170 -2022-11-11 12:28:01 STATE: test-backend-node-gpu.js passed: warmup face result match -2022-11-11 12:28:01 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js event: warmup -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: warmup: body default -2022-11-11 12:28:02 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:02 DATA:  test-backend-node-gpu.js result: performance: load: null total: 173 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: warmup body result match -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} -2022-11-11 12:28:02 INFO:  test-backend-node-gpu.js test: details verification -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js start default -2022-11-11 12:28:02 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-11-11 12:28:02 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:02 DATA:  test-backend-node-gpu.js result: performance: load: null total: 178 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face length 1 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face score 1 0.93 1 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face arrays 4 478 1024 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face anti-spoofing 0.79 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details face liveness 0.83 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details body length 1 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details body 0.92 17 6 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details hand length 1 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details hand 0.51 0.73 point -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details hand arrays 21 5 7 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details gesture length 7 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details object length 1 -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: details object 0.72 person -2022-11-11 12:28:02 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:02 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-11-11 12:28:03 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:03 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-11-11 12:28:04 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-11-11 12:28:04 INFO:  test-backend-node-gpu.js test default -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js start async -2022-11-11 12:28:04 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg async -2022-11-11 12:28:04 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:04 DATA:  test-backend-node-gpu.js result: performance: load: null total: 153 -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js passed: default result face match 1 female 0.97 -2022-11-11 12:28:04 INFO:  test-backend-node-gpu.js test sync -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js start sync -2022-11-11 12:28:04 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sync -2022-11-11 12:28:04 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:04 DATA:  test-backend-node-gpu.js result: performance: load: null total: 148 -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js passed: default sync 1 female 0.97 -2022-11-11 12:28:04 INFO:  test-backend-node-gpu.js test: image process -2022-11-11 12:28:04 STATE: 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 STATE: test-backend-node-gpu.js passed: image input null [1,256,256,3] -2022-11-11 12:28:04 INFO:  test-backend-node-gpu.js test: image null -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js passed: invalid input could not convert input to tensor -2022-11-11 12:28:04 INFO:  test-backend-node-gpu.js test face similarity -2022-11-11 12:28:04 STATE: test-backend-node-gpu.js start face similarity -2022-11-11 12:28:04 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: performance: load: null total: 140 -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js start face similarity -2022-11-11 12:28:05 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: performance: load: null total: 143 -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js start face similarity -2022-11-11 12:28:05 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: performance: load: null total: 135 -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: face descriptor -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: face similarity {"similarity":[1,0.4475002983522097,0.5570879556505012],"descriptors":[1024,1024,1024]} -2022-11-11 12:28:05 INFO:  test-backend-node-gpu.js test object -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js start object -2022-11-11 12:28:05 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:05 DATA:  test-backend-node-gpu.js result: performance: load: null total: 145 -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js passed: centernet -2022-11-11 12:28:05 STATE: test-backend-node-gpu.js start object -2022-11-11 12:28:06 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object -2022-11-11 12:28:07 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:07 DATA:  test-backend-node-gpu.js result: performance: load: null total: 545 -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js passed: nanodet -2022-11-11 12:28:07 INFO:  test-backend-node-gpu.js test sensitive -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js start sensitive -2022-11-11 12:28:07 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive -2022-11-11 12:28:07 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:28:07 DATA:  test-backend-node-gpu.js result: performance: load: null total: 112 -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js passed: sensitive result match -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js passed: sensitive face result match -2022-11-11 12:28:07 STATE: 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 STATE: test-backend-node-gpu.js passed: sensitive body result match -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js passed: sensitive hand result match -2022-11-11 12:28:07 INFO:  test-backend-node-gpu.js test body -2022-11-11 12:28:07 STATE: test-backend-node-gpu.js start blazepose -2022-11-11 12:28:09 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:09 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:09 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose -2022-11-11 12:28:09 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39} -2022-11-11 12:28:09 DATA:  test-backend-node-gpu.js result: performance: load: null total: 258 -2022-11-11 12:28:09 STATE: test-backend-node-gpu.js passed: blazepose -2022-11-11 12:28:09 STATE: test-backend-node-gpu.js start efficientpose -2022-11-11 12:28:10 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-11-11 12:28:11 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13} -2022-11-11 12:28:11 DATA:  test-backend-node-gpu.js result: performance: load: null total: 913 -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js passed: efficientpose -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js start posenet -2022-11-11 12:28:11 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet -2022-11-11 12:28:11 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16} -2022-11-11 12:28:11 DATA:  test-backend-node-gpu.js result: performance: load: null total: 215 -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js passed: posenet -2022-11-11 12:28:11 STATE: test-backend-node-gpu.js start movenet -2022-11-11 12:28:12 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:12 STATE: test-backend-node-gpu.js event: detect -2022-11-11 12:28:12 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet -2022-11-11 12:28:12 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:28:12 DATA:  test-backend-node-gpu.js result: performance: load: null total: 131 -2022-11-11 12:28:12 STATE: test-backend-node-gpu.js passed: movenet -2022-11-11 12:28:12 INFO:  test-backend-node-gpu.js test face matching -2022-11-11 12:28:12 STATE: test-backend-node-gpu.js passed: face database 40 -2022-11-11 12:28:12 STATE: test-backend-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7829338043932047}} {"second":{"index":4,"similarity":0.5002928781584631}} {"third":{"index":4,"similarity":0.5402934771672516}} -2022-11-11 12:28:12 INFO:  test-backend-node-gpu.js test face similarity alternative -2022-11-11 12:28:12 STATE: test-backend-node-gpu.js start face embeddings -2022-11-11 12:28:12 STATE: 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 STATE: test-backend-node-gpu.js event: image -2022-11-11 12:28:12 ERROR: test-backend-node-gpu.js failed: testDetect face embeddings -2022-11-11 12:28:12 ERROR: test-backend-node-gpu.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-gpu.js: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 INFO:  -2022-11-11 12:28:13 INFO:  test-backend-node-wasm.js start -2022-11-11 12:28:13 DATA:  test-backend-node-wasm.js stdout: 2022-11-11 12:28:13 INFO:  { supported: true, backend: true, simd: undefined, multithread: undefined } https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.0.0/dist/ -2022-11-11 12:28:13 STATE: test-backend-node-wasm.js passed: model server: https://vladmandic.github.io/human-models/models/ -2022-11-11 12:28:13 INFO:  test-backend-node-wasm.js test: configuration validation -2022-11-11 12:28:13 STATE: test-backend-node-wasm.js passed: configuration default validation [] -2022-11-11 12:28:13 STATE: test-backend-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-11-11 12:28:13 INFO:  test-backend-node-wasm.js test: model load -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: models loaded 25 11 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"https://vladmandic.github.io/human-models/models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"https://vladmandic.github.io/human-models/models/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human-models/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human-models/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human-models/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human-models/models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"https://vladmandic.github.io/human-models/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human-models/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human-models/models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human-models/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human-models/models/antispoof.json"}] -2022-11-11 12:28:15 INFO:  test-backend-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} -2022-11-11 12:28:15 INFO:  test-backend-node-wasm.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} -2022-11-11 12:28:15 INFO:  test-backend-node-wasm.js test: warmup -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: create human -2022-11-11 12:28:15 INFO:  test-backend-node-wasm.js human version: 3.0.0 -2022-11-11 12:28:15 INFO:  test-backend-node-wasm.js platform: linux x64 agent: NodeJS v18.10.0 -2022-11-11 12:28:15 INFO:  test-backend-node-wasm.js tfjs version: 4.0.0 -2022-11-11 12:28:15 INFO:  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 STATE: test-backend-node-wasm.js passed: set backend: wasm -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js tensors 1785 -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: load models -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js result: defined models: 25 loaded models: 11 -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: warmup: none default -2022-11-11 12:28:15 DATA:  test-backend-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-11-11 12:28:15 DATA:  test-backend-node-wasm.js result: performance: load: null total: null -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: warmup none result match -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js event: warmup -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: warmup: face default -2022-11-11 12:28:15 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-11-11 12:28:15 DATA:  test-backend-node-wasm.js result: performance: load: null total: 534 -2022-11-11 12:28:15 STATE: test-backend-node-wasm.js passed: warmup face result match -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js event: warmup -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js passed: warmup: body default -2022-11-11 12:28:16 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:16 DATA:  test-backend-node-wasm.js result: performance: load: null total: 377 -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js passed: warmup body result match -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 21% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} -2022-11-11 12:28:16 INFO:  test-backend-node-wasm.js test: details verification -2022-11-11 12:28:16 STATE: test-backend-node-wasm.js start default -2022-11-11 12:28:16 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-11-11 12:28:17 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:17 DATA:  test-backend-node-wasm.js result: performance: load: null total: 343 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face length 1 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face score 1 0.93 1 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face arrays 4 478 1024 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face anti-spoofing 0.79 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details face liveness 0.83 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details body length 1 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details body 0.92 17 6 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details hand length 1 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details hand 0.51 0.73 point -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details hand arrays 21 5 7 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details gesture length 7 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details object length 1 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: details object 0.72 person -2022-11-11 12:28:17 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} -2022-11-11 12:28:17 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:18 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:18 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-11-11 12:28:18 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:18 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:18 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-11-11 12:28:18 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} -2022-11-11 12:28:18 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:19 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:19 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-11-11 12:28:19 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:19 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:19 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-11-11 12:28:19 INFO:  test-backend-node-wasm.js test default -2022-11-11 12:28:19 STATE: test-backend-node-wasm.js start async -2022-11-11 12:28:20 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg async -2022-11-11 12:28:20 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:20 DATA:  test-backend-node-wasm.js result: performance: load: null total: 340 -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js passed: default result face match 1 female 0.97 -2022-11-11 12:28:20 INFO:  test-backend-node-wasm.js test sync -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js start sync -2022-11-11 12:28:20 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sync -2022-11-11 12:28:20 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:20 DATA:  test-backend-node-wasm.js result: performance: load: null total: 333 -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js passed: default sync 1 female 0.97 -2022-11-11 12:28:20 INFO:  test-backend-node-wasm.js test: image process -2022-11-11 12:28:20 STATE: 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 STATE: test-backend-node-wasm.js passed: image input null [1,256,256,3] -2022-11-11 12:28:20 INFO:  test-backend-node-wasm.js test: image null -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js passed: invalid input could not convert input to tensor -2022-11-11 12:28:20 INFO:  test-backend-node-wasm.js test face similarity -2022-11-11 12:28:20 STATE: test-backend-node-wasm.js start face similarity -2022-11-11 12:28:20 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:21 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:21 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity -2022-11-11 12:28:21 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-11-11 12:28:21 DATA:  test-backend-node-wasm.js result: performance: load: null total: 309 -2022-11-11 12:28:21 STATE: test-backend-node-wasm.js start face similarity -2022-11-11 12:28:21 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:21 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:21 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity -2022-11-11 12:28:21 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:21 DATA:  test-backend-node-wasm.js result: performance: load: null total: 327 -2022-11-11 12:28:21 STATE: test-backend-node-wasm.js start face similarity -2022-11-11 12:28:21 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-11-11 12:28:22 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-11-11 12:28:22 DATA:  test-backend-node-wasm.js result: performance: load: null total: 297 -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js passed: face descriptor -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]} -2022-11-11 12:28:22 INFO:  test-backend-node-wasm.js test object -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js start object -2022-11-11 12:28:22 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object -2022-11-11 12:28:22 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-11-11 12:28:22 DATA:  test-backend-node-wasm.js result: performance: load: null total: 329 -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js passed: centernet -2022-11-11 12:28:22 STATE: test-backend-node-wasm.js start object -2022-11-11 12:28:23 WARN:  test-backend-node-wasm.js missing kernel ops {"title":"object","model":"nanodet","url":"https://vladmandic.github.io/human-models/models/nanodet.json","missing":["sparsetodense"],"backkend":"wasm"} -2022-11-11 12:28:23 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object -2022-11-11 12:28:24 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:28:24 DATA:  test-backend-node-wasm.js result: performance: load: null total: 216 -2022-11-11 12:28:24 ERROR: test-backend-node-wasm.js failed: nanodet [] -2022-11-11 12:28:24 INFO:  test-backend-node-wasm.js test sensitive -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js start sensitive -2022-11-11 12:28:24 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive -2022-11-11 12:28:24 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:28:24 DATA:  test-backend-node-wasm.js result: performance: load: null total: 239 -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: sensitive result match -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: sensitive face result match -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}] -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: sensitive body result match -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js passed: sensitive hand result match -2022-11-11 12:28:24 INFO:  test-backend-node-wasm.js test body -2022-11-11 12:28:24 STATE: test-backend-node-wasm.js start blazepose -2022-11-11 12:28:26 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:26 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:26 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose -2022-11-11 12:28:26 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.99,"keypoints":39} -2022-11-11 12:28:26 DATA:  test-backend-node-wasm.js result: performance: load: null total: 396 -2022-11-11 12:28:26 STATE: test-backend-node-wasm.js passed: blazepose -2022-11-11 12:28:26 STATE: test-backend-node-wasm.js start efficientpose -2022-11-11 12:28:27 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:27 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:27 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-11-11 12:28:27 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.75,"keypoints":13} -2022-11-11 12:28:27 DATA:  test-backend-node-wasm.js result: performance: load: null total: 654 -2022-11-11 12:28:27 STATE: test-backend-node-wasm.js passed: efficientpose -2022-11-11 12:28:27 STATE: test-backend-node-wasm.js start posenet -2022-11-11 12:28:28 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:28 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:28 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet -2022-11-11 12:28:28 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.96,"keypoints":16} -2022-11-11 12:28:28 DATA:  test-backend-node-wasm.js result: performance: load: null total: 287 -2022-11-11 12:28:28 STATE: test-backend-node-wasm.js passed: posenet -2022-11-11 12:28:28 STATE: test-backend-node-wasm.js start movenet -2022-11-11 12:28:29 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:29 STATE: test-backend-node-wasm.js event: detect -2022-11-11 12:28:29 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet -2022-11-11 12:28:29 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-11-11 12:28:29 DATA:  test-backend-node-wasm.js result: performance: load: null total: 248 -2022-11-11 12:28:29 STATE: test-backend-node-wasm.js passed: movenet -2022-11-11 12:28:29 INFO:  test-backend-node-wasm.js test face matching -2022-11-11 12:28:29 STATE: test-backend-node-wasm.js passed: face database 40 -2022-11-11 12:28:29 STATE: test-backend-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.7827852754786533}} {"second":{"index":4,"similarity":0.5660821189104794}} {"third":{"index":4,"similarity":0.45074189882665594}} -2022-11-11 12:28:29 INFO:  test-backend-node-wasm.js test face similarity alternative -2022-11-11 12:28:29 STATE: test-backend-node-wasm.js start face embeddings -2022-11-11 12:28:29 STATE: 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 STATE: test-backend-node-wasm.js event: image -2022-11-11 12:28:29 ERROR: test-backend-node-wasm.js failed: testDetect face embeddings -2022-11-11 12:28:29 ERROR: test-backend-node-wasm.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-wasm.js: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 STATE: all tests complete -2022-11-11 12:28:29 INFO:  status {"test":"../demo/nodejs/node.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/nodejs/process-folder.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"test-node-load.js","passed":1,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"test-node-gear.js","passed":3,"failed":0} -2022-11-11 12:28:29 INFO:  status {"test":"test-backend-node.js","passed":85,"failed":1} -2022-11-11 12:28:29 INFO:  status {"test":"test-backend-node-gpu.js","passed":85,"failed":1} -2022-11-11 12:28:29 INFO:  status {"test":"test-backend-node-wasm.js","passed":85,"failed":2} -2022-11-11 12:28:29 INFO:  failures {"count":4} -2022-11-11 12:28:29 WARN:  failed {"test":"test-backend-node.js","message":["error",["failed:","testDetect face embeddings"]]} -2022-11-11 12:28:29 WARN:  failed {"test":"test-backend-node-gpu.js","message":["error",["failed:","testDetect face embeddings"]]} -2022-11-11 12:28:29 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed: nanodet",[]]]} -2022-11-11 12:28:29 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed:","testDetect face embeddings"]]} +2022-11-16 11:24:32 INFO:  @vladmandic/human version 3.0.0 +2022-11-16 11:24:32 INFO:  User: vlado Platform: linux Arch: x64 Node: v19.1.0 +2022-11-16 11:24:32 INFO:  demos: [{"cmd":"../demo/nodejs/node.js","args":[]},{"cmd":"../demo/nodejs/node-simple.js","args":[]},{"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]},{"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]},{"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]},{"cmd":"../demo/nodejs/process-folder.js","args":["samples"]},{"cmd":"../demo/multithread/node-multiprocess.js","args":[]},{"cmd":"../demo/facematch/node-match.js","args":[]}] +2022-11-16 11:24:32 INFO:  {"cmd":"../demo/nodejs/node.js","args":[]} start +2022-11-16 11:24:33 INFO:  {"cmd":"../demo/nodejs/node-simple.js","args":[]} start +2022-11-16 11:24:34 INFO:  {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start +2022-11-16 11:24:34 INFO:  {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start +2022-11-16 11:24:35 INFO:  {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start +2022-11-16 11:24:36 INFO:  {"cmd":"../demo/nodejs/process-folder.js","args":["samples"]} start +2022-11-16 11:24:38 INFO:  {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start +2022-11-16 11:24:51 INFO:  {"cmd":"../demo/facematch/node-match.js","args":[]} start +2022-11-16 11:24:52 INFO:  tests: ["test-node-load.js","test-node-gear.js","test-backend-node.js","test-backend-node-gpu.js","test-backend-node-wasm.js"] +2022-11-16 11:24:52 INFO:  +2022-11-16 11:24:52 INFO:  test-node-load.js start +2022-11-16 11:24:52 INFO:  test-node-load.js load start {"human":"3.0.0","tf":"4.0.0","progress":0} +2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":1,"progress":0} +2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":11,"progress":0} +2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":30,"progress":0.11143791531203556} +2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":58,"progress":0.3299591712723044} +2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":79,"progress":0.7259096583739463} +2022-11-16 11:24:52 STATE: test-node-load.js passed {"progress":1} +2022-11-16 11:24:52 INFO:  test-node-load.js load final {"progress":1} +2022-11-16 11:24:52 DATA:  test-node-load.js load interval {"elapsed":465,"progress":1} +2022-11-16 11:24:52 INFO:  +2022-11-16 11:24:52 INFO:  test-node-gear.js start +2022-11-16 11:24:53 DATA:  test-node-gear.js input: ["samples/in/ai-face.jpg"] +2022-11-16 11:24:54 STATE: test-node-gear.js passed: gear faceres samples/in/ai-face.jpg +2022-11-16 11:24:54 DATA:  test-node-gear.js results {"face":0,"model":"faceres","image":"samples/in/ai-face.jpg","age":23.5,"gender":"female","genderScore":0.92} +2022-11-16 11:24:54 STATE: test-node-gear.js passed: gear gear samples/in/ai-face.jpg +2022-11-16 11:24:54 DATA:  test-node-gear.js results {"face":0,"model":"gear","image":"samples/in/ai-face.jpg","age":23.3,"gender":"female","genderScore":0.51,"race":[{"score":0.93,"race":"white"}]} +2022-11-16 11:24:54 STATE: test-node-gear.js passed: gear ssrnet samples/in/ai-face.jpg +2022-11-16 11:24:54 DATA:  test-node-gear.js results {"face":0,"model":"ssrnet","image":"samples/in/ai-face.jpg","age":23.4,"gender":"female","genderScore":0.99} +2022-11-16 11:24:54 INFO:  +2022-11-16 11:24:54 INFO:  test-backend-node.js start +2022-11-16 11:24:54 INFO:  test-backend-node.js test: configuration validation +2022-11-16 11:24:54 STATE: test-backend-node.js passed: configuration default validation [] +2022-11-16 11:24:54 STATE: test-backend-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-11-16 11:24:54 INFO:  test-backend-node.js test: model load +2022-11-16 11:24:54 STATE: test-backend-node.js passed: models loaded 25 11 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] +2022-11-16 11:24:54 INFO:  test-backend-node.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} +2022-11-16 11:24:54 INFO:  test-backend-node.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} +2022-11-16 11:24:54 INFO:  test-backend-node.js test: warmup +2022-11-16 11:24:54 STATE: test-backend-node.js passed: create human +2022-11-16 11:24:54 INFO:  test-backend-node.js human version: 3.0.0 +2022-11-16 11:24:54 INFO:  test-backend-node.js platform: linux x64 agent: NodeJS v19.1.0 +2022-11-16 11:24:54 INFO:  test-backend-node.js tfjs version: 4.0.0 +2022-11-16 11:24:54 INFO:  test-backend-node.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.9.1","gpu":false},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169} +2022-11-16 11:24:54 STATE: test-backend-node.js passed: set backend: tensorflow +2022-11-16 11:24:54 STATE: test-backend-node.js tensors 1785 +2022-11-16 11:24:54 STATE: test-backend-node.js passed: load models +2022-11-16 11:24:54 STATE: test-backend-node.js result: defined models: 25 loaded models: 11 +2022-11-16 11:24:54 STATE: test-backend-node.js passed: warmup: none default +2022-11-16 11:24:54 DATA:  test-backend-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-11-16 11:24:54 DATA:  test-backend-node.js result: performance: load: null total: null +2022-11-16 11:24:54 STATE: test-backend-node.js passed: warmup none result match +2022-11-16 11:24:54 STATE: test-backend-node.js event: image +2022-11-16 11:24:55 STATE: test-backend-node.js event: detect +2022-11-16 11:24:55 STATE: test-backend-node.js event: warmup +2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup: face default +2022-11-16 11:24:55 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2022-11-16 11:24:55 DATA:  test-backend-node.js result: performance: load: null total: 439 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup face result match +2022-11-16 11:24:55 STATE: test-backend-node.js event: image +2022-11-16 11:24:55 STATE: test-backend-node.js event: detect +2022-11-16 11:24:55 STATE: test-backend-node.js event: warmup +2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup: body default +2022-11-16 11:24:55 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:24:55 DATA:  test-backend-node.js result: performance: load: null total: 350 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: warmup body result match +2022-11-16 11:24:55 STATE: test-backend-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} +2022-11-16 11:24:55 INFO:  test-backend-node.js test: details verification +2022-11-16 11:24:55 STATE: test-backend-node.js start default +2022-11-16 11:24:55 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:24:55 STATE: test-backend-node.js event: image +2022-11-16 11:24:55 STATE: test-backend-node.js event: detect +2022-11-16 11:24:55 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg default +2022-11-16 11:24:55 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:24:55 DATA:  test-backend-node.js result: performance: load: null total: 314 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face length 1 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face score 1 0.93 1 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face age/gender 23.7 female 0.97 85.47 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face arrays 4 478 1024 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face anti-spoofing 0.79 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details face liveness 0.83 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details body length 1 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details body 0.92 17 6 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details hand length 1 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details hand 0.51 0.73 point +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details hand arrays 21 5 7 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details gesture length 7 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details object length 1 +2022-11-16 11:24:55 STATE: test-backend-node.js passed: details object 0.72 person +2022-11-16 11:24:56 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-11-16 11:24:56 STATE: test-backend-node.js event: image +2022-11-16 11:24:56 STATE: test-backend-node.js event: detect +2022-11-16 11:24:56 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-11-16 11:24:56 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-11-16 11:24:56 STATE: test-backend-node.js event: image +2022-11-16 11:24:57 STATE: test-backend-node.js event: detect +2022-11-16 11:24:57 STATE: test-backend-node.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-11-16 11:24:57 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:24:57 STATE: test-backend-node.js event: image +2022-11-16 11:24:57 STATE: test-backend-node.js event: detect +2022-11-16 11:24:57 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-11-16 11:24:57 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} +2022-11-16 11:24:57 STATE: test-backend-node.js event: image +2022-11-16 11:24:58 STATE: test-backend-node.js event: detect +2022-11-16 11:24:58 STATE: test-backend-node.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-11-16 11:24:58 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-11-16 11:24:58 STATE: test-backend-node.js event: image +2022-11-16 11:24:58 STATE: test-backend-node.js event: detect +2022-11-16 11:24:58 STATE: test-backend-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-11-16 11:24:58 INFO:  test-backend-node.js test default +2022-11-16 11:24:58 STATE: test-backend-node.js start async +2022-11-16 11:24:58 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:24:58 STATE: test-backend-node.js event: image +2022-11-16 11:24:59 STATE: test-backend-node.js event: detect +2022-11-16 11:24:59 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg async +2022-11-16 11:24:59 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:24:59 DATA:  test-backend-node.js result: performance: load: null total: 298 +2022-11-16 11:24:59 STATE: test-backend-node.js passed: default result face match 1 female 0.97 +2022-11-16 11:24:59 INFO:  test-backend-node.js test sync +2022-11-16 11:24:59 STATE: test-backend-node.js start sync +2022-11-16 11:24:59 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:24:59 STATE: test-backend-node.js event: image +2022-11-16 11:24:59 STATE: test-backend-node.js event: detect +2022-11-16 11:24:59 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sync +2022-11-16 11:24:59 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:24:59 DATA:  test-backend-node.js result: performance: load: null total: 298 +2022-11-16 11:24:59 STATE: test-backend-node.js passed: default sync 1 female 0.97 +2022-11-16 11:24:59 INFO:  test-backend-node.js test: image process +2022-11-16 11:24:59 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 11:24:59 STATE: test-backend-node.js passed: image input null [1,256,256,3] +2022-11-16 11:24:59 INFO:  test-backend-node.js test: image null +2022-11-16 11:24:59 STATE: test-backend-node.js passed: invalid input could not convert input to tensor +2022-11-16 11:24:59 INFO:  test-backend-node.js test face similarity +2022-11-16 11:24:59 STATE: test-backend-node.js start face similarity +2022-11-16 11:24:59 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 11:24:59 STATE: test-backend-node.js event: image +2022-11-16 11:24:59 STATE: test-backend-node.js event: detect +2022-11-16 11:24:59 STATE: test-backend-node.js passed: detect: samples/in/ai-face.jpg face similarity +2022-11-16 11:24:59 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-11-16 11:24:59 DATA:  test-backend-node.js result: performance: load: null total: 292 +2022-11-16 11:24:59 STATE: test-backend-node.js start face similarity +2022-11-16 11:25:00 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:00 STATE: test-backend-node.js event: image +2022-11-16 11:25:00 STATE: test-backend-node.js event: detect +2022-11-16 11:25:00 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg face similarity +2022-11-16 11:25:00 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:00 DATA:  test-backend-node.js result: performance: load: null total: 303 +2022-11-16 11:25:00 STATE: test-backend-node.js start face similarity +2022-11-16 11:25:00 STATE: test-backend-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-11-16 11:25:00 STATE: test-backend-node.js event: image +2022-11-16 11:25:00 STATE: test-backend-node.js event: detect +2022-11-16 11:25:00 STATE: test-backend-node.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-11-16 11:25:00 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-11-16 11:25:00 DATA:  test-backend-node.js result: performance: load: null total: 271 +2022-11-16 11:25:00 STATE: test-backend-node.js passed: face descriptor +2022-11-16 11:25:00 STATE: test-backend-node.js passed: face similarity {"similarity":[1,0.44727441595492046,0.556793560189727],"descriptors":[1024,1024,1024]} +2022-11-16 11:25:00 INFO:  test-backend-node.js test object +2022-11-16 11:25:00 STATE: test-backend-node.js start object +2022-11-16 11:25:00 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:00 STATE: test-backend-node.js event: image +2022-11-16 11:25:01 STATE: test-backend-node.js event: detect +2022-11-16 11:25:01 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 11:25:01 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:01 DATA:  test-backend-node.js result: performance: load: null total: 297 +2022-11-16 11:25:01 STATE: test-backend-node.js passed: centernet +2022-11-16 11:25:01 STATE: test-backend-node.js start object +2022-11-16 11:25:03 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:03 STATE: test-backend-node.js event: image +2022-11-16 11:25:03 STATE: test-backend-node.js event: detect +2022-11-16 11:25:03 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 11:25:03 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:03 DATA:  test-backend-node.js result: performance: load: null total: 296 +2022-11-16 11:25:03 STATE: test-backend-node.js passed: nanodet +2022-11-16 11:25:03 INFO:  test-backend-node.js test sensitive +2022-11-16 11:25:03 STATE: test-backend-node.js start sensitive +2022-11-16 11:25:03 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:03 STATE: test-backend-node.js event: image +2022-11-16 11:25:04 STATE: test-backend-node.js event: detect +2022-11-16 11:25:04 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg sensitive +2022-11-16 11:25:04 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:04 DATA:  test-backend-node.js result: performance: load: null total: 256 +2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive result match +2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive face result match +2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] +2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive body result match +2022-11-16 11:25:04 STATE: test-backend-node.js passed: sensitive hand result match +2022-11-16 11:25:04 INFO:  test-backend-node.js test body +2022-11-16 11:25:04 STATE: test-backend-node.js start blazepose +2022-11-16 11:25:06 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:06 STATE: test-backend-node.js event: image +2022-11-16 11:25:06 STATE: test-backend-node.js event: detect +2022-11-16 11:25:06 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg blazepose +2022-11-16 11:25:06 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39} +2022-11-16 11:25:06 DATA:  test-backend-node.js result: performance: load: null total: 346 +2022-11-16 11:25:06 STATE: test-backend-node.js passed: blazepose +2022-11-16 11:25:06 STATE: test-backend-node.js start efficientpose +2022-11-16 11:25:08 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:08 STATE: test-backend-node.js event: image +2022-11-16 11:25:08 STATE: test-backend-node.js event: detect +2022-11-16 11:25:08 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-11-16 11:25:08 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13} +2022-11-16 11:25:08 DATA:  test-backend-node.js result: performance: load: null total: 318 +2022-11-16 11:25:08 STATE: test-backend-node.js passed: efficientpose +2022-11-16 11:25:08 STATE: test-backend-node.js start posenet +2022-11-16 11:25:09 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:09 STATE: test-backend-node.js event: image +2022-11-16 11:25:09 STATE: test-backend-node.js event: detect +2022-11-16 11:25:09 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg posenet +2022-11-16 11:25:09 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16} +2022-11-16 11:25:09 DATA:  test-backend-node.js result: performance: load: null total: 252 +2022-11-16 11:25:09 STATE: test-backend-node.js passed: posenet +2022-11-16 11:25:09 STATE: test-backend-node.js start movenet +2022-11-16 11:25:09 STATE: test-backend-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-11-16 11:25:09 STATE: test-backend-node.js event: image +2022-11-16 11:25:10 STATE: test-backend-node.js event: detect +2022-11-16 11:25:10 STATE: test-backend-node.js passed: detect: samples/in/ai-body.jpg movenet +2022-11-16 11:25:10 DATA:  test-backend-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:10 DATA:  test-backend-node.js result: performance: load: null total: 256 +2022-11-16 11:25:10 STATE: test-backend-node.js passed: movenet +2022-11-16 11:25:10 INFO:  test-backend-node.js test face matching +2022-11-16 11:25:10 STATE: test-backend-node.js passed: face database 40 +2022-11-16 11:25:10 STATE: test-backend-node.js passed: face match {"first":{"index":4,"similarity":0.7827852251220577}} {"second":{"index":4,"similarity":0.5002052057057577}} {"third":{"index":4,"similarity":0.5401588464054732}} +2022-11-16 11:25:10 INFO:  test-backend-node.js test face similarity alternative +2022-11-16 11:25:10 STATE: test-backend-node.js start face embeddings +2022-11-16 11:25:10 STATE: test-backend-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 11:25:10 STATE: test-backend-node.js event: image +2022-11-16 11:25:10 ERROR: test-backend-node.js failed: testDetect face embeddings +2022-11-16 11:25:10 ERROR: test-backend-node.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node.js:99:176887"," at new Promise ()"," at J5 (/home/vlado/dev/human/dist/human.node.js:99:176656)"," at S1 (/home/vlado/dev/human/dist/human.node.js:121:6622)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node.js:840:9036"]} +2022-11-16 11:25:10 INFO:  +2022-11-16 11:25:10 INFO:  test-backend-node-gpu.js start +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js test: configuration validation +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: configuration default validation [] +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js test: model load +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: models loaded 25 11 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js test: warmup +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: create human +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js human version: 3.0.0 +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js platform: linux x64 agent: NodeJS v19.1.0 +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js tfjs version: 4.0.0 +2022-11-16 11:25:11 INFO:  test-backend-node-gpu.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.9.1","gpu":true},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169} +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: set backend: tensorflow +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js tensors 1785 +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: load models +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js result: defined models: 25 loaded models: 11 +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: warmup: none default +2022-11-16 11:25:11 DATA:  test-backend-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-11-16 11:25:11 DATA:  test-backend-node-gpu.js result: performance: load: null total: null +2022-11-16 11:25:11 STATE: test-backend-node-gpu.js passed: warmup none result match +2022-11-16 11:25:12 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: warmup +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup: face default +2022-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2022-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: performance: load: null total: 3118 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup face result match +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: warmup +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup: body default +2022-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: performance: load: null total: 152 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: warmup body result match +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} +2022-11-16 11:25:15 INFO:  test-backend-node-gpu.js test: details verification +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js start default +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:15 DATA:  test-backend-node-gpu.js result: performance: load: null total: 135 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face length 1 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face score 1 0.93 1 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face arrays 4 478 1024 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face anti-spoofing 0.79 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details face liveness 0.83 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details body length 1 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details body 0.92 17 6 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details hand length 1 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details hand 0.51 0.73 point +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details hand arrays 21 5 7 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details gesture length 7 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details object length 1 +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: details object 0.72 person +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-11-16 11:25:15 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:16 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-11-16 11:25:17 INFO:  test-backend-node-gpu.js test default +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js start async +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg async +2022-11-16 11:25:17 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:17 DATA:  test-backend-node-gpu.js result: performance: load: null total: 127 +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js passed: default result face match 1 female 0.97 +2022-11-16 11:25:17 INFO:  test-backend-node-gpu.js test sync +2022-11-16 11:25:17 STATE: test-backend-node-gpu.js start sync +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sync +2022-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: performance: load: null total: 153 +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: default sync 1 female 0.97 +2022-11-16 11:25:18 INFO:  test-backend-node-gpu.js test: image process +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: image input null [1,256,256,3] +2022-11-16 11:25:18 INFO:  test-backend-node-gpu.js test: image null +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: invalid input could not convert input to tensor +2022-11-16 11:25:18 INFO:  test-backend-node-gpu.js test face similarity +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js start face similarity +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity +2022-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: performance: load: null total: 133 +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js start face similarity +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity +2022-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:18 DATA:  test-backend-node-gpu.js result: performance: load: null total: 148 +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js start face similarity +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-11-16 11:25:18 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-11-16 11:25:19 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-11-16 11:25:19 DATA:  test-backend-node-gpu.js result: performance: load: null total: 139 +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: face descriptor +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: face similarity {"similarity":[1,0.4475002983522097,0.5570879556505012],"descriptors":[1024,1024,1024]} +2022-11-16 11:25:19 INFO:  test-backend-node-gpu.js test object +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js start object +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 11:25:19 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:19 DATA:  test-backend-node-gpu.js result: performance: load: null total: 165 +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js passed: centernet +2022-11-16 11:25:19 STATE: test-backend-node-gpu.js start object +2022-11-16 11:25:20 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:20 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:20 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:20 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 11:25:20 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:20 DATA:  test-backend-node-gpu.js result: performance: load: null total: 522 +2022-11-16 11:25:20 STATE: test-backend-node-gpu.js passed: nanodet +2022-11-16 11:25:20 INFO:  test-backend-node-gpu.js test sensitive +2022-11-16 11:25:20 STATE: test-backend-node-gpu.js start sensitive +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive +2022-11-16 11:25:21 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:21 DATA:  test-backend-node-gpu.js result: performance: load: null total: 115 +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive result match +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive face result match +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive body result match +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js passed: sensitive hand result match +2022-11-16 11:25:21 INFO:  test-backend-node-gpu.js test body +2022-11-16 11:25:21 STATE: test-backend-node-gpu.js start blazepose +2022-11-16 11:25:23 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:23 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:23 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:23 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose +2022-11-16 11:25:23 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39} +2022-11-16 11:25:23 DATA:  test-backend-node-gpu.js result: performance: load: null total: 259 +2022-11-16 11:25:23 STATE: test-backend-node-gpu.js passed: blazepose +2022-11-16 11:25:23 STATE: test-backend-node-gpu.js start efficientpose +2022-11-16 11:25:24 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:24 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-11-16 11:25:25 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13} +2022-11-16 11:25:25 DATA:  test-backend-node-gpu.js result: performance: load: null total: 1067 +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: efficientpose +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js start posenet +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet +2022-11-16 11:25:25 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16} +2022-11-16 11:25:25 DATA:  test-backend-node-gpu.js result: performance: load: null total: 209 +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js passed: posenet +2022-11-16 11:25:25 STATE: test-backend-node-gpu.js start movenet +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js event: detect +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet +2022-11-16 11:25:26 DATA:  test-backend-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:26 DATA:  test-backend-node-gpu.js result: performance: load: null total: 112 +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: movenet +2022-11-16 11:25:26 INFO:  test-backend-node-gpu.js test face matching +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: face database 40 +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7829338043932047}} {"second":{"index":4,"similarity":0.5002928781584631}} {"third":{"index":4,"similarity":0.5402934771672516}} +2022-11-16 11:25:26 INFO:  test-backend-node-gpu.js test face similarity alternative +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js start face embeddings +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-11-16 11:25:26 STATE: test-backend-node-gpu.js event: image +2022-11-16 11:25:26 ERROR: test-backend-node-gpu.js failed: testDetect face embeddings +2022-11-16 11:25:26 ERROR: test-backend-node-gpu.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-gpu.js:99:176887"," at new Promise ()"," at J5 (/home/vlado/dev/human/dist/human.node-gpu.js:99:176656)"," at S1 (/home/vlado/dev/human/dist/human.node-gpu.js:121:6622)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-gpu.js:840:9036"]} +2022-11-16 11:25:27 INFO:  +2022-11-16 11:25:27 INFO:  test-backend-node-wasm.js start +2022-11-16 11:25:27 DATA:  test-backend-node-wasm.js stdout: 2022-11-16 11:25:27 INFO:  { supported: true, backend: true, simd: undefined, multithread: undefined } https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.0.0/dist/ +2022-11-16 11:25:27 STATE: test-backend-node-wasm.js passed: model server: https://vladmandic.github.io/human-models/models/ +2022-11-16 11:25:27 INFO:  test-backend-node-wasm.js test: configuration validation +2022-11-16 11:25:27 STATE: test-backend-node-wasm.js passed: configuration default validation [] +2022-11-16 11:25:27 STATE: test-backend-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-11-16 11:25:27 INFO:  test-backend-node-wasm.js test: model load +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: models loaded 25 11 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"https://vladmandic.github.io/human-models/models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"https://vladmandic.github.io/human-models/models/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human-models/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human-models/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human-models/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human-models/models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"https://vladmandic.github.io/human-models/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human-models/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human-models/models/liveness.json"},{"name":"meet","loaded":false,"url":null},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human-models/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"selfie","loaded":false,"url":null},{"name":"rvm","loaded":false,"url":null},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human-models/models/antispoof.json"}] +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1785,"numDataBuffers":1785,"numBytes":63247332}} +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63247332,"numTensors":1785,"numStringTensors":0,"numDataBuffers":1785,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}} +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js test: warmup +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: create human +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js human version: 3.0.0 +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js platform: linux x64 agent: NodeJS v19.1.0 +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js tfjs version: 4.0.0 +2022-11-16 11:25:30 INFO:  test-backend-node-wasm.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v19.1.0","backends":["wasm"],"initial":false,"tfjs":{"version":"4.0.0"},"offscreen":false,"perfadd":false,"tensorflow":{},"wasm":{"supported":true,"backend":true,"simd":true,"multithread":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":126} +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: set backend: wasm +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js tensors 1785 +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: load models +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js result: defined models: 25 loaded models: 11 +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup: none default +2022-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: performance: load: null total: null +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup none result match +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: warmup +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup: face default +2022-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-11-16 11:25:30 DATA:  test-backend-node-wasm.js result: performance: load: null total: 518 +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js passed: warmup face result match +2022-11-16 11:25:30 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: warmup +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: warmup: body default +2022-11-16 11:25:31 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:31 DATA:  test-backend-node-wasm.js result: performance: load: null total: 350 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: warmup body result match +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 21% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} +2022-11-16 11:25:31 INFO:  test-backend-node-wasm.js test: details verification +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js start default +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-11-16 11:25:31 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:31 DATA:  test-backend-node-wasm.js result: performance: load: null total: 339 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face length 1 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face score 1 0.93 1 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face arrays 4 478 1024 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face anti-spoofing 0.79 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details face liveness 0.83 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details body length 1 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details body 0.92 17 6 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details hand length 1 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details hand 0.51 0.73 point +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details hand arrays 21 5 7 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details gesture length 7 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details object length 1 +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: details object 0.72 person +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264} +2022-11-16 11:25:31 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:32 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:32 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-11-16 11:25:32 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} +2022-11-16 11:25:32 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:32 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:32 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:33 STATE: test-backend-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-11-16 11:25:34 INFO:  test-backend-node-wasm.js test default +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js start async +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:34 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg async +2022-11-16 11:25:35 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:35 DATA:  test-backend-node-wasm.js result: performance: load: null total: 326 +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: default result face match 1 female 0.97 +2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test sync +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js start sync +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sync +2022-11-16 11:25:35 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:35 DATA:  test-backend-node-wasm.js result: performance: load: null total: 322 +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: default sync 1 female 0.97 +2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test: image process +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: image input null [1,256,256,3] +2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test: image null +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: invalid input could not convert input to tensor +2022-11-16 11:25:35 INFO:  test-backend-node-wasm.js test face similarity +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js start face similarity +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-11-16 11:25:35 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity +2022-11-16 11:25:36 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-11-16 11:25:36 DATA:  test-backend-node-wasm.js result: performance: load: null total: 333 +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js start face similarity +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity +2022-11-16 11:25:36 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:36 DATA:  test-backend-node-wasm.js result: performance: load: null total: 387 +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js start face similarity +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-11-16 11:25:36 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-11-16 11:25:37 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-11-16 11:25:37 DATA:  test-backend-node-wasm.js result: performance: load: null total: 300 +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: face descriptor +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]} +2022-11-16 11:25:37 INFO:  test-backend-node-wasm.js test object +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js start object +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 11:25:37 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-11-16 11:25:37 DATA:  test-backend-node-wasm.js result: performance: load: null total: 317 +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js passed: centernet +2022-11-16 11:25:37 STATE: test-backend-node-wasm.js start object +2022-11-16 11:25:38 WARN:  test-backend-node-wasm.js missing kernel ops {"title":"object","model":"nanodet","url":"https://vladmandic.github.io/human-models/models/nanodet.json","missing":["sparsetodense"],"backkend":"wasm"} +2022-11-16 11:25:38 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:38 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:38 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:38 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg object +2022-11-16 11:25:38 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:38 DATA:  test-backend-node-wasm.js result: performance: load: null total: 224 +2022-11-16 11:25:38 ERROR: test-backend-node-wasm.js failed: nanodet [] +2022-11-16 11:25:38 INFO:  test-backend-node-wasm.js test sensitive +2022-11-16 11:25:38 STATE: test-backend-node-wasm.js start sensitive +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive +2022-11-16 11:25:39 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:39 DATA:  test-backend-node-wasm.js result: performance: load: null total: 262 +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive result match +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive face result match +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}] +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive body result match +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js passed: sensitive hand result match +2022-11-16 11:25:39 INFO:  test-backend-node-wasm.js test body +2022-11-16 11:25:39 STATE: test-backend-node-wasm.js start blazepose +2022-11-16 11:25:42 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:42 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:42 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:42 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose +2022-11-16 11:25:42 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.99,"keypoints":39} +2022-11-16 11:25:42 DATA:  test-backend-node-wasm.js result: performance: load: null total: 458 +2022-11-16 11:25:42 STATE: test-backend-node-wasm.js passed: blazepose +2022-11-16 11:25:42 STATE: test-backend-node-wasm.js start efficientpose +2022-11-16 11:25:43 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:43 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:44 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:44 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-11-16 11:25:44 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.75,"keypoints":13} +2022-11-16 11:25:44 DATA:  test-backend-node-wasm.js result: performance: load: null total: 687 +2022-11-16 11:25:44 STATE: test-backend-node-wasm.js passed: efficientpose +2022-11-16 11:25:44 STATE: test-backend-node-wasm.js start posenet +2022-11-16 11:25:45 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:45 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:45 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:45 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet +2022-11-16 11:25:45 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.96,"keypoints":16} +2022-11-16 11:25:45 DATA:  test-backend-node-wasm.js result: performance: load: null total: 305 +2022-11-16 11:25:45 STATE: test-backend-node-wasm.js passed: posenet +2022-11-16 11:25:45 STATE: test-backend-node-wasm.js start movenet +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js event: detect +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet +2022-11-16 11:25:46 DATA:  test-backend-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 10 object: 0 person: 1 {"score":1,"age":29.6,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-11-16 11:25:46 DATA:  test-backend-node-wasm.js result: performance: load: null total: 253 +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: movenet +2022-11-16 11:25:46 INFO:  test-backend-node-wasm.js test face matching +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: face database 40 +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.7827852754786533}} {"second":{"index":4,"similarity":0.5660821189104794}} {"third":{"index":4,"similarity":0.45074189882665594}} +2022-11-16 11:25:46 INFO:  test-backend-node-wasm.js test face similarity alternative +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js start face embeddings +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-11-16 11:25:46 STATE: test-backend-node-wasm.js event: image +2022-11-16 11:25:46 ERROR: test-backend-node-wasm.js failed: testDetect face embeddings +2022-11-16 11:25:46 ERROR: test-backend-node-wasm.js uncaughtException {"name":"TypeError","message":"Cannot read properties of undefined (reading 'img_inputs')","stack":["TypeError: Cannot read properties of undefined (reading 'img_inputs')"," at /home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30706:69"," at Array.reduce ()"," at GraphModel.normalizeInputs (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30705:32)"," at GraphModel.execute (/home/vlado/dev/human/node_modules/.pnpm/@tensorflow+tfjs-converter@4.0.0_hdmpc5coifabqk2ogondqkcwg4/node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:30777:23)"," at /home/vlado/dev/human/dist/human.node-wasm.js:99:176887"," at new Promise ()"," at Q5 (/home/vlado/dev/human/dist/human.node-wasm.js:99:176656)"," at j1 (/home/vlado/dev/human/dist/human.node-wasm.js:121:6622)"," at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"," at async /home/vlado/dev/human/dist/human.node-wasm.js:840:9036"]} +2022-11-16 11:25:46 STATE: all tests complete +2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/nodejs/process-folder.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"test-node-load.js","passed":1,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"test-node-gear.js","passed":3,"failed":0} +2022-11-16 11:25:46 INFO:  status {"test":"test-backend-node.js","passed":85,"failed":1} +2022-11-16 11:25:46 INFO:  status {"test":"test-backend-node-gpu.js","passed":85,"failed":1} +2022-11-16 11:25:46 INFO:  status {"test":"test-backend-node-wasm.js","passed":85,"failed":2} +2022-11-16 11:25:46 INFO:  failures {"count":4} +2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node.js","message":["error",["failed:","testDetect face embeddings"]]} +2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node-gpu.js","message":["error",["failed:","testDetect face embeddings"]]} +2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed: nanodet",[]]]} +2022-11-16 11:25:46 WARN:  failed {"test":"test-backend-node-wasm.js","message":["error",["failed:","testDetect face embeddings"]]}