diff --git a/CHANGELOG.md b/CHANGELOG.md
index e6ef1bbd..5ef16290 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,7 @@
## Changelog
-### **HEAD -> main** 2022/08/21 mandic00@live.com
+### **HEAD -> main** 2022/08/24 mandic00@live.com
- expand type safety
- full eslint rule rewrite
diff --git a/demo/faceid/index.js b/demo/faceid/index.js
index b9807b6b..35441db1 100644
--- a/demo/faceid/index.js
+++ b/demo/faceid/index.js
@@ -4,6 +4,6 @@
author: '
*/
-import*as B from"../../dist/human.esm.js";var l,R="human",g="person",p=(...t)=>console.log("indexdb",...t);async function v(){return l?!0:new Promise(t=>{let a=indexedDB.open(R,1);a.onerror=s=>p("error:",s),a.onupgradeneeded=s=>{p("create:",s.target),l=s.target.result,l.createObjectStore(g,{keyPath:"id",autoIncrement:!0})},a.onsuccess=s=>{l=s.target.result,p("open:",l),t(!0)}})}async function x(){let t=[];return l||await v(),new Promise(a=>{let s=l.transaction([g],"readwrite").objectStore(g).openCursor(null,"next");s.onerror=i=>p("load error:",i),s.onsuccess=i=>{i.target.result?(t.push(i.target.result.value),i.target.result.continue()):a(t)}})}async function y(){return l||await v(),new Promise(t=>{let a=l.transaction([g],"readwrite").objectStore(g).count();a.onerror=s=>p("count error:",s),a.onsuccess=()=>t(a.result)})}async function C(t){l||await v();let a={name:t.name,descriptor:t.descriptor,image:t.image};l.transaction([g],"readwrite").objectStore(g).put(a),p("save:",a)}async function D(t){l||await v(),l.transaction([g],"readwrite").objectStore(g).delete(t.id),p("delete:",t)}var b={modelBasePath:"../../models",filter:{equalization:!0},face:{enabled:!0,detector:{rotation:!0,return:!0,cropFactor:1.6,mask:!1},description:{enabled:!0},iris:{enabled:!0},emotion:{enabled:!1},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!1},hand:{enabled:!1},object:{enabled:!1},gesture:{enabled:!0}},E={order:2,multiplier:25,min:.2,max:.8},c={minConfidence:.6,minSize:224,maxTime:1e4,blinkMin:10,blinkMax:800,threshold:.5,mask:b.face.detector.mask,rotation:b.face.detector.rotation,cropFactor:b.face.detector.cropFactor,...E},o={faceCount:!1,faceConfidence:!1,facingCenter:!1,lookingCenter:!1,blinkDetected:!1,faceSize:!1,antispoofCheck:!1,livenessCheck:!1,elapsedMs:0},I=()=>o.faceCount&&o.faceSize&&o.blinkDetected&&o.facingCenter&&o.lookingCenter&&o.faceConfidence&&o.antispoofCheck&&o.livenessCheck,r={face:null,record:null},u={start:0,end:0,time:0},n=new B.Human(b);n.env.perfadd=!1;n.draw.options.font='small-caps 18px "Lato"';n.draw.options.lineHeight=20;var e={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("fps"),match:document.getElementById("match"),name:document.getElementById("name"),save:document.getElementById("save"),delete:document.getElementById("delete"),retry:document.getElementById("retry"),source:document.getElementById("source"),ok:document.getElementById("ok")},w={detect:0,draw:0},h={detect:0,draw:0},S=0,f=(...t)=>{e.log.innerText+=t.join(" ")+`
-`,console.log(...t)},k=t=>e.fps.innerText=t;async function H(){k("starting webcam...");let t={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},a=await navigator.mediaDevices.getUserMedia(t),s=new Promise(i=>{e.video.onloadeddata=()=>i(!0)});e.video.srcObject=a,e.video.play(),await s,e.canvas.width=e.video.videoWidth,e.canvas.height=e.video.videoHeight,n.env.initial&&f("video:",e.video.videoWidth,e.video.videoHeight,"|",a.getVideoTracks()[0].label),e.canvas.onclick=()=>{e.video.paused?e.video.play():e.video.pause()}}async function T(){var t;if(!e.video.paused){(t=r.face)!=null&&t.tensor&&n.tf.dispose(r.face.tensor),await n.detect(e.video);let a=n.now();h.detect=1e3/(a-w.detect),w.detect=a,requestAnimationFrame(T)}}async function L(){let t=n.next(n.result);n.draw.canvas(e.video,e.canvas),await n.draw.all(e.canvas,t);let a=n.now();if(h.draw=1e3/(a-w.draw),w.draw=a,k(`fps: ${h.detect.toFixed(1).padStart(5," ")} detect | ${h.draw.toFixed(1).padStart(5," ")} draw`),o.faceCount=n.result.face.length===1,o.faceCount){let i=Object.values(n.result.gesture).map(m=>m.gesture);(i.includes("blink left eye")||i.includes("blink right eye"))&&(u.start=n.now()),u.start>0&&!i.includes("blink left eye")&&!i.includes("blink right eye")&&(u.end=n.now()),o.blinkDetected=o.blinkDetected||Math.abs(u.end-u.start)>c.blinkMin&&Math.abs(u.end-u.start)c.minConfidence&&(n.result.face[0].faceScore||0)>c.minConfidence,o.antispoofCheck=(n.result.face[0].real||0)>c.minConfidence,o.livenessCheck=(n.result.face[0].live||0)>c.minConfidence,o.faceSize=n.result.face[0].box[2]>=c.minSize&&n.result.face[0].box[3]>=c.minSize}let s=32;for(let[i,m]of Object.entries(o)){let d=document.getElementById(`ok-${i}`);d||(d=document.createElement("div"),d.innerText=i,d.className="ok",d.style.top=`${s}px`,e.ok.appendChild(d)),typeof m=="boolean"?d.style.backgroundColor=m?"lightgreen":"lightcoral":d.innerText=`${i}:${m}`,s+=28}return I()||o.elapsedMs>c.maxTime?(e.video.pause(),n.result.face[0]):(o.elapsedMs=Math.trunc(n.now()-S),new Promise(i=>{setTimeout(async()=>{await L(),i(n.result.face[0])},30)}))}async function z(){var t,a,s,i;if(e.name.value.length>0){let m=(t=e.canvas.getContext("2d"))==null?void 0:t.getImageData(0,0,e.canvas.width,e.canvas.height),d={id:0,name:e.name.value,descriptor:(a=r.face)==null?void 0:a.embedding,image:m};await C(d),f("saved face record:",d.name,"descriptor length:",(i=(s=r.face)==null?void 0:s.embedding)==null?void 0:i.length),f("known face records:",await y())}else f("invalid name")}async function P(){r.record&&r.record.id>0&&await D(r.record)}async function j(){var i,m;if((i=e.canvas.getContext("2d"))==null||i.clearRect(0,0,c.minSize,c.minSize),!r.face||!r.face.tensor||!r.face.embedding)return!1;if(console.log("face record:",r.face),n.tf.browser.toPixels(r.face.tensor,e.canvas),await y()===0)return f("face database is empty"),document.body.style.background="black",e.delete.style.display="none",!1;let t=await x(),a=t.map(d=>d.descriptor).filter(d=>d.length>0),s=n.match(r.face.embedding,a,E);return r.record=t[s.index]||null,r.record&&(f(`best match: ${r.record.name} | id: ${r.record.id} | similarity: ${Math.round(1e3*s.similarity)/10}%`),e.name.value=r.record.name,e.source.style.display="",(m=e.source.getContext("2d"))==null||m.putImageData(r.record.image,0,0)),document.body.style.background=s.similarity>c.threshold?"darkgreen":"maroon",s.similarity>c.threshold}async function M(){var t,a;return o.faceCount=!1,o.faceConfidence=!1,o.facingCenter=!1,o.blinkDetected=!1,o.faceSize=!1,o.antispoofCheck=!1,o.livenessCheck=!1,o.elapsedMs=0,e.match.style.display="none",e.retry.style.display="none",e.source.style.display="none",document.body.style.background="black",await H(),await T(),S=n.now(),r.face=await L(),e.canvas.width=((t=r.face.tensor)==null?void 0:t.shape[1])||c.minSize,e.canvas.height=((a=r.face.tensor)==null?void 0:a.shape[0])||c.minSize,e.source.width=e.canvas.width,e.source.height=e.canvas.height,e.canvas.style.width="",e.match.style.display="flex",e.save.style.display="flex",e.delete.style.display="flex",e.retry.style.display="block",I()?j():(f("did not find valid face"),!1)}async function q(){var t,a;f("human version:",n.version,"| tfjs version:",n.tf.version["tfjs-core"]),f("face embedding model:",b.face.description.enabled?"faceres":"",(t=b.face.mobilefacenet)!=null&&t.enabled?"mobilefacenet":"",(a=b.face.insightface)!=null&&a.enabled?"insightface":""),f("options:",JSON.stringify(c).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),k("loading..."),f("known face records:",await y()),await H(),await n.load(),k("initializing..."),e.retry.addEventListener("click",M),e.save.addEventListener("click",z),e.delete.addEventListener("click",P),await n.warmup(),await M()}window.onload=q;
+import*as I from"../../dist/human.esm.js";var l,z="human",g="person",p=(...t)=>console.log("indexdb",...t);async function v(){return l?!0:new Promise(t=>{let n=indexedDB.open(z,1);n.onerror=r=>p("error:",r),n.onupgradeneeded=r=>{p("create:",r.target),l=r.target.result,l.createObjectStore(g,{keyPath:"id",autoIncrement:!0})},n.onsuccess=r=>{l=r.target.result,p("open:",l),t(!0)}})}async function D(){let t=[];return l||await v(),new Promise(n=>{let r=l.transaction([g],"readwrite").objectStore(g).openCursor(null,"next");r.onerror=i=>p("load error:",i),r.onsuccess=i=>{i.target.result?(t.push(i.target.result.value),i.target.result.continue()):n(t)}})}async function y(){return l||await v(),new Promise(t=>{let n=l.transaction([g],"readwrite").objectStore(g).count();n.onerror=r=>p("count error:",r),n.onsuccess=()=>t(n.result)})}async function M(t){l||await v();let n={name:t.name,descriptor:t.descriptor,image:t.image};l.transaction([g],"readwrite").objectStore(g).put(n),p("save:",n)}async function B(t){l||await v(),l.transaction([g],"readwrite").objectStore(g).delete(t.id),p("delete:",t)}var b={modelBasePath:"../../models",filter:{equalization:!0},face:{enabled:!0,detector:{rotation:!0,return:!0,cropFactor:1.6,mask:!1},description:{enabled:!0},iris:{enabled:!0},emotion:{enabled:!1},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!1},hand:{enabled:!1},object:{enabled:!1},gesture:{enabled:!0}},S={order:2,multiplier:25,min:.2,max:.8},c={minConfidence:.6,minSize:224,maxTime:1e4,blinkMin:10,blinkMax:800,threshold:.5,mask:b.face.detector.mask,rotation:b.face.detector.rotation,cropFactor:b.face.detector.cropFactor,...S},o={faceCount:!1,faceConfidence:!1,facingCenter:!1,lookingCenter:!1,blinkDetected:!1,faceSize:!1,antispoofCheck:!1,livenessCheck:!1,elapsedMs:0},H=()=>o.faceCount&&o.faceSize&&o.blinkDetected&&o.facingCenter&&o.lookingCenter&&o.faceConfidence&&o.antispoofCheck&&o.livenessCheck,s={face:null,record:null},f={start:0,end:0,time:0},a=new I.Human(b);a.env.perfadd=!1;a.draw.options.font='small-caps 18px "Lato"';a.draw.options.lineHeight=20;var e={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("fps"),match:document.getElementById("match"),name:document.getElementById("name"),save:document.getElementById("save"),delete:document.getElementById("delete"),retry:document.getElementById("retry"),source:document.getElementById("source"),ok:document.getElementById("ok")},w={detect:0,draw:0},h={detect:0,draw:0},T=0,u=(...t)=>{e.log.innerText+=t.join(" ")+`
+`,console.log(...t)},k=t=>e.fps.innerText=t;async function L(){k("starting webcam...");let t={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},n=await navigator.mediaDevices.getUserMedia(t),r=new Promise(i=>{e.video.onloadeddata=()=>i(!0)});e.video.srcObject=n,e.video.play(),await r,e.canvas.width=e.video.videoWidth,e.canvas.height=e.video.videoHeight,a.env.initial&&u("video:",e.video.videoWidth,e.video.videoHeight,"|",n.getVideoTracks()[0].label),e.canvas.onclick=()=>{e.video.paused?e.video.play():e.video.pause()}}async function R(){var t;if(!e.video.paused){(t=s.face)!=null&&t.tensor&&a.tf.dispose(s.face.tensor),await a.detect(e.video);let n=a.now();h.detect=1e3/(n-w.detect),w.detect=n,requestAnimationFrame(R)}}async function F(){let t=a.next(a.result);a.draw.canvas(e.video,e.canvas),await a.draw.all(e.canvas,t);let n=a.now();if(h.draw=1e3/(n-w.draw),w.draw=n,k(`fps: ${h.detect.toFixed(1).padStart(5," ")} detect | ${h.draw.toFixed(1).padStart(5," ")} draw`),o.faceCount=a.result.face.length===1,o.faceCount){let i=Object.values(a.result.gesture).map(m=>m.gesture);(i.includes("blink left eye")||i.includes("blink right eye"))&&(f.start=a.now()),f.start>0&&!i.includes("blink left eye")&&!i.includes("blink right eye")&&(f.end=a.now()),o.blinkDetected=o.blinkDetected||Math.abs(f.end-f.start)>c.blinkMin&&Math.abs(f.end-f.start)c.minConfidence&&(a.result.face[0].faceScore||0)>c.minConfidence,o.antispoofCheck=(a.result.face[0].real||0)>c.minConfidence,o.livenessCheck=(a.result.face[0].live||0)>c.minConfidence,o.faceSize=a.result.face[0].box[2]>=c.minSize&&a.result.face[0].box[3]>=c.minSize}let r=32;for(let[i,m]of Object.entries(o)){let d=document.getElementById(`ok-${i}`);d||(d=document.createElement("div"),d.innerText=i,d.className="ok",d.style.top=`${r}px`,e.ok.appendChild(d)),typeof m=="boolean"?d.style.backgroundColor=m?"lightgreen":"lightcoral":d.innerText=`${i}:${m}`,r+=28}return H()||o.elapsedMs>c.maxTime?(e.video.pause(),a.result.face[0]):(o.elapsedMs=Math.trunc(a.now()-T),new Promise(i=>{setTimeout(async()=>{await F(),i(a.result.face[0])},30)}))}async function j(){var t,n,r,i;if(e.name.value.length>0){let m=(t=e.canvas.getContext("2d"))==null?void 0:t.getImageData(0,0,e.canvas.width,e.canvas.height),d={id:0,name:e.name.value,descriptor:(n=s.face)==null?void 0:n.embedding,image:m};await M(d),u("saved face record:",d.name,"descriptor length:",(i=(r=s.face)==null?void 0:r.embedding)==null?void 0:i.length),u("known face records:",await y())}else u("invalid name")}async function q(){s.record&&s.record.id>0&&await B(s.record)}async function O(){var i,m,d,C;if((i=e.canvas.getContext("2d"))==null||i.clearRect(0,0,c.minSize,c.minSize),!((m=s==null?void 0:s.face)!=null&&m.tensor)||!((d=s==null?void 0:s.face)!=null&&d.embedding))return!1;if(console.log("face record:",s.face),a.tf.browser.toPixels(s.face.tensor,e.canvas),await y()===0)return u("face database is empty"),document.body.style.background="black",e.delete.style.display="none",!1;let t=await D(),n=t.map(x=>x.descriptor).filter(x=>x.length>0),r=a.match(s.face.embedding,n,S);return s.record=t[r.index]||null,s.record&&(u(`best match: ${s.record.name} | id: ${s.record.id} | similarity: ${Math.round(1e3*r.similarity)/10}%`),e.name.value=s.record.name,e.source.style.display="",(C=e.source.getContext("2d"))==null||C.putImageData(s.record.image,0,0)),document.body.style.background=r.similarity>c.threshold?"darkgreen":"maroon",r.similarity>c.threshold}async function E(){var t,n;return o.faceCount=!1,o.faceConfidence=!1,o.facingCenter=!1,o.blinkDetected=!1,o.faceSize=!1,o.antispoofCheck=!1,o.livenessCheck=!1,o.elapsedMs=0,e.match.style.display="none",e.retry.style.display="none",e.source.style.display="none",document.body.style.background="black",await L(),await R(),T=a.now(),s.face=await F(),e.canvas.width=((t=s.face.tensor)==null?void 0:t.shape[1])||c.minSize,e.canvas.height=((n=s.face.tensor)==null?void 0:n.shape[0])||c.minSize,e.source.width=e.canvas.width,e.source.height=e.canvas.height,e.canvas.style.width="",e.match.style.display="flex",e.save.style.display="flex",e.delete.style.display="flex",e.retry.style.display="block",H()?O():(u("did not find valid face"),!1)}async function $(){var t,n;u("human version:",a.version,"| tfjs version:",a.tf.version["tfjs-core"]),u("face embedding model:",b.face.description.enabled?"faceres":"",(t=b.face.mobilefacenet)!=null&&t.enabled?"mobilefacenet":"",(n=b.face.insightface)!=null&&n.enabled?"insightface":""),u("options:",JSON.stringify(c).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),k("loading..."),u("known face records:",await y()),await L(),await a.load(),k("initializing..."),e.retry.addEventListener("click",E),e.save.addEventListener("click",j),e.delete.addEventListener("click",q),await a.warmup(),await E()}window.onload=$;
//# sourceMappingURL=index.js.map
diff --git a/demo/faceid/index.js.map b/demo/faceid/index.js.map
index c448e0ee..d9e1c020 100644
--- a/demo/faceid/index.js.map
+++ b/demo/faceid/index.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
"sources": ["index.ts", "indexdb.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\nimport * as indexDb from './indexdb'; // methods to deal with indexdb\n\nconst humanConfig = { // user configuration for human, used to fine-tune behavior\n modelBasePath: '../../models',\n filter: { equalization: true }, // lets run with histogram equilizer\n face: {\n enabled: true,\n detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image\n description: { enabled: true }, // default model for face descriptor extraction is faceres\n // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model\n // insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model\n iris: { enabled: true }, // needed to determine gaze direction\n emotion: { enabled: false }, // not needed\n antispoof: { enabled: true }, // enable optional antispoof module\n liveness: { enabled: true }, // enable optional liveness module\n },\n body: { enabled: false },\n hand: { enabled: false },\n object: { enabled: false },\n gesture: { enabled: true }, // parses face and iris gestures\n};\n\n// const matchOptions = { order: 2, multiplier: 1000, min: 0.0, max: 1.0 }; // for embedding model\nconst matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; // for faceres model\n\nconst options = {\n minConfidence: 0.6, // overal face confidence for box, face, gender, real, live\n minSize: 224, // min input to face descriptor model before degradation\n maxTime: 10000, // max time before giving up\n blinkMin: 10, // minimum duration of a valid blink\n blinkMax: 800, // maximum duration of a valid blink\n threshold: 0.5, // minimum similarity\n mask: humanConfig.face.detector.mask,\n rotation: humanConfig.face.detector.rotation,\n cropFactor: humanConfig.face.detector.cropFactor,\n ...matchOptions,\n};\n\nconst ok = { // must meet all rules\n faceCount: false,\n faceConfidence: false,\n facingCenter: false,\n lookingCenter: false,\n blinkDetected: false,\n faceSize: false,\n antispoofCheck: false,\n livenessCheck: false,\n elapsedMs: 0, // total time while waiting for valid face\n};\nconst allOk = () => ok.faceCount && ok.faceSize && ok.blinkDetected && ok.facingCenter && ok.lookingCenter && ok.faceConfidence && ok.antispoofCheck && ok.livenessCheck;\nconst current: { face: H.FaceResult | null, record: indexDb.FaceRecord | null } = { face: null, record: null }; // current face record and matched database record\n\nconst blink = { // internal timers for blink start/end/duration\n start: 0,\n end: 0,\n time: 0,\n};\n\n// let db: Array<{ name: string, source: string, embedding: number[] }> = []; // holds loaded face descriptor database\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\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('fps') as HTMLPreElement,\n match: document.getElementById('match') as HTMLDivElement,\n name: document.getElementById('name') as HTMLInputElement,\n save: document.getElementById('save') as HTMLSpanElement,\n delete: document.getElementById('delete') as HTMLSpanElement,\n retry: document.getElementById('retry') as HTMLDivElement,\n source: document.getElementById('source') as HTMLCanvasElement,\n ok: document.getElementById('ok') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0 }; // holds information used to calculate performance and possible memory leaks\nconst fps = { detect: 0, draw: 0 }; // holds calculated fps information for both detect and screen refresh\nlet startTime = 0;\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 printFPS = (msg) => dom.fps.innerText = msg; // print status element\n\nasync function webCam() { // initialize webcam\n printFPS('starting webcam...');\n // @ts-ignore resizeMode is not yet defined in tslib\n const cameraOptions: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(cameraOptions);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n void dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n if (human.env.initial) log('video:', dom.video.videoWidth, dom.video.videoHeight, '|', stream.getVideoTracks()[0].label);\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) void dom.video.play();\n else dom.video.pause();\n };\n}\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (current.face?.tensor) human.tf.dispose(current.face.tensor); // dispose previous tensor\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 now = human.now();\n fps.detect = 1000 / (now - timestamp.detect);\n timestamp.detect = now;\n requestAnimationFrame(detectionLoop); // start new frame immediately\n }\n}\n\nasync function validationLoop(): Promise { // main screen refresh loop\n const interpolated = human.next(human.result); // smoothen result using last-known results\n human.draw.canvas(dom.video, dom.canvas); // draw canvas to screen\n await human.draw.all(dom.canvas, interpolated); // draw labels, boxes, lines, etc.\n const now = human.now();\n fps.draw = 1000 / (now - timestamp.draw);\n timestamp.draw = now;\n printFPS(`fps: ${fps.detect.toFixed(1).padStart(5, ' ')} detect | ${fps.draw.toFixed(1).padStart(5, ' ')} draw`); // write status\n ok.faceCount = human.result.face.length === 1; // must be exactly detected face\n if (ok.faceCount) { // skip the rest if no face\n const gestures: string[] = Object.values(human.result.gesture).map((gesture: H.GestureResult) => gesture.gesture); // flatten all gestures\n if (gestures.includes('blink left eye') || gestures.includes('blink right eye')) blink.start = human.now(); // blink starts when eyes get closed\n if (blink.start > 0 && !gestures.includes('blink left eye') && !gestures.includes('blink right eye')) blink.end = human.now(); // if blink started how long until eyes are back open\n ok.blinkDetected = ok.blinkDetected || (Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax);\n if (ok.blinkDetected && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start);\n ok.facingCenter = gestures.includes('facing center');\n ok.lookingCenter = gestures.includes('looking center'); // must face camera and look at camera\n ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence;\n ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence;\n ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence;\n ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize;\n }\n let y = 32;\n for (const [key, val] of Object.entries(ok)) {\n let el = document.getElementById(`ok-${key}`);\n if (!el) {\n el = document.createElement('div');\n el.innerText = key;\n el.className = 'ok';\n el.style.top = `${y}px`;\n dom.ok.appendChild(el);\n }\n if (typeof val === 'boolean') el.style.backgroundColor = val ? 'lightgreen' : 'lightcoral';\n else el.innerText = `${key}:${val}`;\n y += 28;\n }\n if (allOk()) { // all criteria met\n dom.video.pause();\n return human.result.face[0];\n }\n if (ok.elapsedMs > options.maxTime) { // give up\n dom.video.pause();\n return human.result.face[0];\n }\n // run again\n ok.elapsedMs = Math.trunc(human.now() - startTime);\n return new Promise((resolve) => {\n setTimeout(async () => {\n await validationLoop(); // run validation loop until conditions are met\n resolve(human.result.face[0]); // recursive promise resolve\n }, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n });\n}\n\nasync function saveRecords() {\n if (dom.name.value.length > 0) {\n const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData;\n const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image };\n await indexDb.save(rec);\n log('saved face record:', rec.name, 'descriptor length:', current.face?.embedding?.length);\n log('known face records:', await indexDb.count());\n } else {\n log('invalid name');\n }\n}\n\nasync function deleteRecord() {\n if (current.record && current.record.id > 0) {\n await indexDb.remove(current.record);\n }\n}\n\nasync function detectFace() {\n dom.canvas.getContext('2d')?.clearRect(0, 0, options.minSize, options.minSize);\n if (!current.face || !current.face.tensor || !current.face.embedding) return false;\n console.log('face record:', current.face); // eslint-disable-line no-console\n human.tf.browser.toPixels(current.face.tensor as unknown as H.TensorLike, dom.canvas);\n if (await indexDb.count() === 0) {\n log('face database is empty');\n document.body.style.background = 'black';\n dom.delete.style.display = 'none';\n return false;\n }\n const db = await indexDb.load();\n const descriptors = db.map((rec) => rec.descriptor).filter((desc) => desc.length > 0);\n const res = human.match(current.face.embedding, descriptors, matchOptions);\n current.record = db[res.index] || null;\n if (current.record) {\n log(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1000 * res.similarity) / 10}%`);\n dom.name.value = current.record.name;\n dom.source.style.display = '';\n dom.source.getContext('2d')?.putImageData(current.record.image, 0, 0);\n }\n document.body.style.background = res.similarity > options.threshold ? 'darkgreen' : 'maroon';\n return res.similarity > options.threshold;\n}\n\nasync function main() { // main entry point\n ok.faceCount = false;\n ok.faceConfidence = false;\n ok.facingCenter = false;\n ok.blinkDetected = false;\n ok.faceSize = false;\n ok.antispoofCheck = false;\n ok.livenessCheck = false;\n ok.elapsedMs = 0;\n dom.match.style.display = 'none';\n dom.retry.style.display = 'none';\n dom.source.style.display = 'none';\n document.body.style.background = 'black';\n await webCam();\n await detectionLoop(); // start detection loop\n startTime = human.now();\n current.face = await validationLoop(); // start validation loop\n dom.canvas.width = current.face.tensor?.shape[1] || options.minSize;\n dom.canvas.height = current.face.tensor?.shape[0] || options.minSize;\n dom.source.width = dom.canvas.width;\n dom.source.height = dom.canvas.height;\n dom.canvas.style.width = '';\n dom.match.style.display = 'flex';\n dom.save.style.display = 'flex';\n dom.delete.style.display = 'flex';\n dom.retry.style.display = 'block';\n if (!allOk()) { // is all criteria met?\n log('did not find valid face');\n return false;\n }\n return detectFace();\n}\n\nasync function init() {\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('face embedding model:', humanConfig.face.description.enabled ? 'faceres' : '', humanConfig.face['mobilefacenet']?.enabled ? 'mobilefacenet' : '', humanConfig.face['insightface']?.enabled ? 'insightface' : '');\n log('options:', JSON.stringify(options).replace(/{|}|\"|\\[|\\]/g, '').replace(/,/g, ' '));\n printFPS('loading...');\n log('known face records:', await indexDb.count());\n await webCam(); // start webcam\n await human.load(); // preload all models\n printFPS('initializing...');\n dom.retry.addEventListener('click', main);\n dom.save.addEventListener('click', saveRecords);\n dom.delete.addEventListener('click', deleteRecord);\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await main();\n}\n\nwindow.onload = init;\n", "let db: IDBDatabase; // instance of indexdb\n\nconst database = 'human';\nconst table = 'person';\n\nexport interface FaceRecord { id: number, name: string, descriptor: number[], image: ImageData }\n\nconst log = (...msg) => console.log('indexdb', ...msg); // eslint-disable-line no-console\n\nexport async function open() {\n if (db) return true;\n return new Promise((resolve) => {\n const request: IDBOpenDBRequest = indexedDB.open(database, 1);\n request.onerror = (evt) => log('error:', evt);\n request.onupgradeneeded = (evt: IDBVersionChangeEvent) => { // create if doesnt exist\n log('create:', evt.target);\n db = (evt.target as IDBOpenDBRequest).result;\n db.createObjectStore(table, { keyPath: 'id', autoIncrement: true });\n };\n request.onsuccess = (evt) => { // open\n db = (evt.target as IDBOpenDBRequest).result;\n log('open:', db);\n resolve(true);\n };\n });\n}\n\nexport async function load(): Promise {\n const faceDB: FaceRecord[] = [];\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const cursor: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).openCursor(null, 'next');\n cursor.onerror = (evt) => log('load error:', evt);\n cursor.onsuccess = (evt) => {\n if ((evt.target as IDBRequest).result) {\n faceDB.push((evt.target as IDBRequest).result.value);\n (evt.target as IDBRequest).result.continue();\n } else {\n resolve(faceDB);\n }\n };\n });\n}\n\nexport async function count(): Promise {\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const store: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).count();\n store.onerror = (evt) => log('count error:', evt);\n store.onsuccess = () => resolve(store.result);\n });\n}\n\nexport async function save(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; // omit id as its autoincrement\n db.transaction([table], 'readwrite').objectStore(table).put(newRecord);\n log('save:', newRecord);\n}\n\nexport async function remove(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n db.transaction([table], 'readwrite').objectStore(table).delete(faceRecord.id); // delete based on id\n log('delete:', faceRecord);\n}\n"],
- "mappings": "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",
+ "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\nimport * as indexDb from './indexdb'; // methods to deal with indexdb\n\nconst humanConfig = { // user configuration for human, used to fine-tune behavior\n modelBasePath: '../../models',\n filter: { equalization: true }, // lets run with histogram equilizer\n face: {\n enabled: true,\n detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image\n description: { enabled: true }, // default model for face descriptor extraction is faceres\n // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model\n // insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model\n iris: { enabled: true }, // needed to determine gaze direction\n emotion: { enabled: false }, // not needed\n antispoof: { enabled: true }, // enable optional antispoof module\n liveness: { enabled: true }, // enable optional liveness module\n },\n body: { enabled: false },\n hand: { enabled: false },\n object: { enabled: false },\n gesture: { enabled: true }, // parses face and iris gestures\n};\n\n// const matchOptions = { order: 2, multiplier: 1000, min: 0.0, max: 1.0 }; // for embedding model\nconst matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; // for faceres model\n\nconst options = {\n minConfidence: 0.6, // overal face confidence for box, face, gender, real, live\n minSize: 224, // min input to face descriptor model before degradation\n maxTime: 10000, // max time before giving up\n blinkMin: 10, // minimum duration of a valid blink\n blinkMax: 800, // maximum duration of a valid blink\n threshold: 0.5, // minimum similarity\n mask: humanConfig.face.detector.mask,\n rotation: humanConfig.face.detector.rotation,\n cropFactor: humanConfig.face.detector.cropFactor,\n ...matchOptions,\n};\n\nconst ok = { // must meet all rules\n faceCount: false,\n faceConfidence: false,\n facingCenter: false,\n lookingCenter: false,\n blinkDetected: false,\n faceSize: false,\n antispoofCheck: false,\n livenessCheck: false,\n elapsedMs: 0, // total time while waiting for valid face\n};\nconst allOk = () => ok.faceCount && ok.faceSize && ok.blinkDetected && ok.facingCenter && ok.lookingCenter && ok.faceConfidence && ok.antispoofCheck && ok.livenessCheck;\nconst current: { face: H.FaceResult | null, record: indexDb.FaceRecord | null } = { face: null, record: null }; // current face record and matched database record\n\nconst blink = { // internal timers for blink start/end/duration\n start: 0,\n end: 0,\n time: 0,\n};\n\n// let db: Array<{ name: string, source: string, embedding: number[] }> = []; // holds loaded face descriptor database\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\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('fps') as HTMLPreElement,\n match: document.getElementById('match') as HTMLDivElement,\n name: document.getElementById('name') as HTMLInputElement,\n save: document.getElementById('save') as HTMLSpanElement,\n delete: document.getElementById('delete') as HTMLSpanElement,\n retry: document.getElementById('retry') as HTMLDivElement,\n source: document.getElementById('source') as HTMLCanvasElement,\n ok: document.getElementById('ok') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0 }; // holds information used to calculate performance and possible memory leaks\nconst fps = { detect: 0, draw: 0 }; // holds calculated fps information for both detect and screen refresh\nlet startTime = 0;\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 printFPS = (msg) => dom.fps.innerText = msg; // print status element\n\nasync function webCam() { // initialize webcam\n printFPS('starting webcam...');\n // @ts-ignore resizeMode is not yet defined in tslib\n const cameraOptions: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(cameraOptions);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n void dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n if (human.env.initial) log('video:', dom.video.videoWidth, dom.video.videoHeight, '|', stream.getVideoTracks()[0].label);\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) void dom.video.play();\n else dom.video.pause();\n };\n}\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (current.face?.tensor) human.tf.dispose(current.face.tensor); // dispose previous tensor\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 now = human.now();\n fps.detect = 1000 / (now - timestamp.detect);\n timestamp.detect = now;\n requestAnimationFrame(detectionLoop); // start new frame immediately\n }\n}\n\nasync function validationLoop(): Promise { // main screen refresh loop\n const interpolated = human.next(human.result); // smoothen result using last-known results\n human.draw.canvas(dom.video, dom.canvas); // draw canvas to screen\n await human.draw.all(dom.canvas, interpolated); // draw labels, boxes, lines, etc.\n const now = human.now();\n fps.draw = 1000 / (now - timestamp.draw);\n timestamp.draw = now;\n printFPS(`fps: ${fps.detect.toFixed(1).padStart(5, ' ')} detect | ${fps.draw.toFixed(1).padStart(5, ' ')} draw`); // write status\n ok.faceCount = human.result.face.length === 1; // must be exactly detected face\n if (ok.faceCount) { // skip the rest if no face\n const gestures: string[] = Object.values(human.result.gesture).map((gesture: H.GestureResult) => gesture.gesture); // flatten all gestures\n if (gestures.includes('blink left eye') || gestures.includes('blink right eye')) blink.start = human.now(); // blink starts when eyes get closed\n if (blink.start > 0 && !gestures.includes('blink left eye') && !gestures.includes('blink right eye')) blink.end = human.now(); // if blink started how long until eyes are back open\n ok.blinkDetected = ok.blinkDetected || (Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax);\n if (ok.blinkDetected && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start);\n ok.facingCenter = gestures.includes('facing center');\n ok.lookingCenter = gestures.includes('looking center'); // must face camera and look at camera\n ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence;\n ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence;\n ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence;\n ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize;\n }\n let y = 32;\n for (const [key, val] of Object.entries(ok)) {\n let el = document.getElementById(`ok-${key}`);\n if (!el) {\n el = document.createElement('div');\n el.innerText = key;\n el.className = 'ok';\n el.style.top = `${y}px`;\n dom.ok.appendChild(el);\n }\n if (typeof val === 'boolean') el.style.backgroundColor = val ? 'lightgreen' : 'lightcoral';\n else el.innerText = `${key}:${val}`;\n y += 28;\n }\n if (allOk()) { // all criteria met\n dom.video.pause();\n return human.result.face[0];\n }\n if (ok.elapsedMs > options.maxTime) { // give up\n dom.video.pause();\n return human.result.face[0];\n }\n // run again\n ok.elapsedMs = Math.trunc(human.now() - startTime);\n return new Promise((resolve) => {\n setTimeout(async () => {\n await validationLoop(); // run validation loop until conditions are met\n resolve(human.result.face[0]); // recursive promise resolve\n }, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n });\n}\n\nasync function saveRecords() {\n if (dom.name.value.length > 0) {\n const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData;\n const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image };\n await indexDb.save(rec);\n log('saved face record:', rec.name, 'descriptor length:', current.face?.embedding?.length);\n log('known face records:', await indexDb.count());\n } else {\n log('invalid name');\n }\n}\n\nasync function deleteRecord() {\n if (current.record && current.record.id > 0) {\n await indexDb.remove(current.record);\n }\n}\n\nasync function detectFace() {\n dom.canvas.getContext('2d')?.clearRect(0, 0, options.minSize, options.minSize);\n if (!current?.face?.tensor || !current?.face?.embedding) return false;\n console.log('face record:', current.face); // eslint-disable-line no-console\n human.tf.browser.toPixels(current.face.tensor as unknown as H.TensorLike, dom.canvas);\n if (await indexDb.count() === 0) {\n log('face database is empty');\n document.body.style.background = 'black';\n dom.delete.style.display = 'none';\n return false;\n }\n const db = await indexDb.load();\n const descriptors = db.map((rec) => rec.descriptor).filter((desc) => desc.length > 0);\n const res = human.match(current.face.embedding, descriptors, matchOptions);\n current.record = db[res.index] || null;\n if (current.record) {\n log(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1000 * res.similarity) / 10}%`);\n dom.name.value = current.record.name;\n dom.source.style.display = '';\n dom.source.getContext('2d')?.putImageData(current.record.image, 0, 0);\n }\n document.body.style.background = res.similarity > options.threshold ? 'darkgreen' : 'maroon';\n return res.similarity > options.threshold;\n}\n\nasync function main() { // main entry point\n ok.faceCount = false;\n ok.faceConfidence = false;\n ok.facingCenter = false;\n ok.blinkDetected = false;\n ok.faceSize = false;\n ok.antispoofCheck = false;\n ok.livenessCheck = false;\n ok.elapsedMs = 0;\n dom.match.style.display = 'none';\n dom.retry.style.display = 'none';\n dom.source.style.display = 'none';\n document.body.style.background = 'black';\n await webCam();\n await detectionLoop(); // start detection loop\n startTime = human.now();\n current.face = await validationLoop(); // start validation loop\n dom.canvas.width = current.face.tensor?.shape[1] || options.minSize;\n dom.canvas.height = current.face.tensor?.shape[0] || options.minSize;\n dom.source.width = dom.canvas.width;\n dom.source.height = dom.canvas.height;\n dom.canvas.style.width = '';\n dom.match.style.display = 'flex';\n dom.save.style.display = 'flex';\n dom.delete.style.display = 'flex';\n dom.retry.style.display = 'block';\n if (!allOk()) { // is all criteria met?\n log('did not find valid face');\n return false;\n }\n return detectFace();\n}\n\nasync function init() {\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('face embedding model:', humanConfig.face.description.enabled ? 'faceres' : '', humanConfig.face['mobilefacenet']?.enabled ? 'mobilefacenet' : '', humanConfig.face['insightface']?.enabled ? 'insightface' : '');\n log('options:', JSON.stringify(options).replace(/{|}|\"|\\[|\\]/g, '').replace(/,/g, ' '));\n printFPS('loading...');\n log('known face records:', await indexDb.count());\n await webCam(); // start webcam\n await human.load(); // preload all models\n printFPS('initializing...');\n dom.retry.addEventListener('click', main);\n dom.save.addEventListener('click', saveRecords);\n dom.delete.addEventListener('click', deleteRecord);\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await main();\n}\n\nwindow.onload = init;\n", "let db: IDBDatabase; // instance of indexdb\n\nconst database = 'human';\nconst table = 'person';\n\nexport interface FaceRecord { id: number, name: string, descriptor: number[], image: ImageData }\n\nconst log = (...msg) => console.log('indexdb', ...msg); // eslint-disable-line no-console\n\nexport async function open() {\n if (db) return true;\n return new Promise((resolve) => {\n const request: IDBOpenDBRequest = indexedDB.open(database, 1);\n request.onerror = (evt) => log('error:', evt);\n request.onupgradeneeded = (evt: IDBVersionChangeEvent) => { // create if doesnt exist\n log('create:', evt.target);\n db = (evt.target as IDBOpenDBRequest).result;\n db.createObjectStore(table, { keyPath: 'id', autoIncrement: true });\n };\n request.onsuccess = (evt) => { // open\n db = (evt.target as IDBOpenDBRequest).result;\n log('open:', db);\n resolve(true);\n };\n });\n}\n\nexport async function load(): Promise {\n const faceDB: FaceRecord[] = [];\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const cursor: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).openCursor(null, 'next');\n cursor.onerror = (evt) => log('load error:', evt);\n cursor.onsuccess = (evt) => {\n if ((evt.target as IDBRequest).result) {\n faceDB.push((evt.target as IDBRequest).result.value);\n (evt.target as IDBRequest).result.continue();\n } else {\n resolve(faceDB);\n }\n };\n });\n}\n\nexport async function count(): Promise {\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const store: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).count();\n store.onerror = (evt) => log('count error:', evt);\n store.onsuccess = () => resolve(store.result);\n });\n}\n\nexport async function save(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; // omit id as its autoincrement\n db.transaction([table], 'readwrite').objectStore(table).put(newRecord);\n log('save:', newRecord);\n}\n\nexport async function remove(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n db.transaction([table], 'readwrite').objectStore(table).delete(faceRecord.id); // delete based on id\n log('delete:', faceRecord);\n}\n"],
+ "mappings": ";;;;;;AASA,UAAYA,MAAO,0BCTnB,IAAIC,EAEEC,EAAW,QACXC,EAAQ,SAIRC,EAAM,IAAIC,IAAQ,QAAQ,IAAI,UAAW,GAAGA,CAAG,EAErD,eAAsBC,GAAO,CAC3B,OAAIL,EAAW,GACR,IAAI,QAASM,GAAY,CAC9B,IAAMC,EAA4B,UAAU,KAAKN,EAAU,CAAC,EAC5DM,EAAQ,QAAWC,GAAQL,EAAI,SAAUK,CAAG,EAC5CD,EAAQ,gBAAmBC,GAA+B,CACxDL,EAAI,UAAWK,EAAI,MAAM,EACzBR,EAAMQ,EAAI,OAA4B,OACtCR,EAAG,kBAAkBE,EAAO,CAAE,QAAS,KAAM,cAAe,EAAK,CAAC,CACpE,EACAK,EAAQ,UAAaC,GAAQ,CAC3BR,EAAMQ,EAAI,OAA4B,OACtCL,EAAI,QAASH,CAAE,EACfM,EAAQ,EAAI,CACd,CACF,CAAC,CACH,CAEA,eAAsBG,GAA8B,CAClD,IAAMC,EAAuB,CAAC,EAC9B,OAAKV,GAAI,MAAMK,EAAK,EACb,IAAI,QAASC,GAAY,CAC9B,IAAMK,EAAqBX,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,WAAW,KAAM,MAAM,EAC1GS,EAAO,QAAWH,GAAQL,EAAI,cAAeK,CAAG,EAChDG,EAAO,UAAaH,GAAQ,CACrBA,EAAI,OAAsB,QAC7BE,EAAO,KAAMF,EAAI,OAAsB,OAAO,KAAK,EAClDA,EAAI,OAAsB,OAAO,SAAS,GAE3CF,EAAQI,CAAM,CAElB,CACF,CAAC,CACH,CAEA,eAAsBE,GAAyB,CAC7C,OAAKZ,GAAI,MAAMK,EAAK,EACb,IAAI,QAASC,GAAY,CAC9B,IAAMO,EAAoBb,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,MAAM,EACxFW,EAAM,QAAWL,GAAQL,EAAI,eAAgBK,CAAG,EAChDK,EAAM,UAAY,IAAMP,EAAQO,EAAM,MAAM,CAC9C,CAAC,CACH,CAEA,eAAsBC,EAAKC,EAAwB,CAC5Cf,GAAI,MAAMK,EAAK,EACpB,IAAMW,EAAY,CAAE,KAAMD,EAAW,KAAM,WAAYA,EAAW,WAAY,MAAOA,EAAW,KAAM,EACtGf,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,IAAIc,CAAS,EACrEb,EAAI,QAASa,CAAS,CACxB,CAEA,eAAsBC,EAAOF,EAAwB,CAC9Cf,GAAI,MAAMK,EAAK,EACpBL,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,OAAOa,EAAW,EAAE,EAC5EZ,EAAI,UAAWY,CAAU,CAC3B,CDpDA,IAAMG,EAAc,CAClB,cAAe,eACf,OAAQ,CAAE,aAAc,EAAK,EAC7B,KAAM,CACJ,QAAS,GACT,SAAU,CAAE,SAAU,GAAM,OAAQ,GAAM,WAAY,IAAK,KAAM,EAAM,EACvE,YAAa,CAAE,QAAS,EAAK,EAG7B,KAAM,CAAE,QAAS,EAAK,EACtB,QAAS,CAAE,QAAS,EAAM,EAC1B,UAAW,CAAE,QAAS,EAAK,EAC3B,SAAU,CAAE,QAAS,EAAK,CAC5B,EACA,KAAM,CAAE,QAAS,EAAM,EACvB,KAAM,CAAE,QAAS,EAAM,EACvB,OAAQ,CAAE,QAAS,EAAM,EACzB,QAAS,CAAE,QAAS,EAAK,CAC3B,EAGMC,EAAe,CAAE,MAAO,EAAG,WAAY,GAAI,IAAK,GAAK,IAAK,EAAI,EAE9DC,EAAU,CACd,cAAe,GACf,QAAS,IACT,QAAS,IACT,SAAU,GACV,SAAU,IACV,UAAW,GACX,KAAMF,EAAY,KAAK,SAAS,KAChC,SAAUA,EAAY,KAAK,SAAS,SACpC,WAAYA,EAAY,KAAK,SAAS,WACtC,GAAGC,CACL,EAEME,EAAK,CACT,UAAW,GACX,eAAgB,GAChB,aAAc,GACd,cAAe,GACf,cAAe,GACf,SAAU,GACV,eAAgB,GAChB,cAAe,GACf,UAAW,CACb,EACMC,EAAQ,IAAMD,EAAG,WAAaA,EAAG,UAAYA,EAAG,eAAiBA,EAAG,cAAgBA,EAAG,eAAiBA,EAAG,gBAAkBA,EAAG,gBAAkBA,EAAG,cACrJE,EAA4E,CAAE,KAAM,KAAM,OAAQ,IAAK,EAEvGC,EAAQ,CACZ,MAAO,EACP,IAAK,EACL,KAAM,CACR,EAGMC,EAAQ,IAAM,QAAMP,CAAW,EAErCO,EAAM,IAAI,QAAU,GACpBA,EAAM,KAAK,QAAQ,KAAO,yBAC1BA,EAAM,KAAK,QAAQ,WAAa,GAEhC,IAAMC,EAAM,CACV,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,IAAK,SAAS,eAAe,KAAK,EAClC,IAAK,SAAS,eAAe,KAAK,EAClC,MAAO,SAAS,eAAe,OAAO,EACtC,KAAM,SAAS,eAAe,MAAM,EACpC,KAAM,SAAS,eAAe,MAAM,EACpC,OAAQ,SAAS,eAAe,QAAQ,EACxC,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,GAAI,SAAS,eAAe,IAAI,CAClC,EACMC,EAAY,CAAE,OAAQ,EAAG,KAAM,CAAE,EACjCC,EAAM,CAAE,OAAQ,EAAG,KAAM,CAAE,EAC7BC,EAAY,EAEVC,EAAM,IAAIC,IAAQ,CACtBL,EAAI,IAAI,WAAaK,EAAI,KAAK,GAAG,EAAI;AAAA,EACrC,QAAQ,IAAI,GAAGA,CAAG,CACpB,EACMC,EAAYD,GAAQL,EAAI,IAAI,UAAYK,EAE9C,eAAeE,GAAS,CACtBD,EAAS,oBAAoB,EAE7B,IAAME,EAAwC,CAAE,MAAO,GAAO,MAAO,CAAE,WAAY,OAAQ,WAAY,OAAQ,MAAO,CAAE,MAAO,SAAS,KAAK,WAAY,CAAE,CAAE,EACvJC,EAAsB,MAAM,UAAU,aAAa,aAAaD,CAAa,EAC7EE,EAAQ,IAAI,QAASC,GAAY,CAAEX,EAAI,MAAM,aAAe,IAAMW,EAAQ,EAAI,CAAG,CAAC,EACxFX,EAAI,MAAM,UAAYS,EACjBT,EAAI,MAAM,KAAK,EACpB,MAAMU,EACNV,EAAI,OAAO,MAAQA,EAAI,MAAM,WAC7BA,EAAI,OAAO,OAASA,EAAI,MAAM,YAC1BD,EAAM,IAAI,SAASK,EAAI,SAAUJ,EAAI,MAAM,WAAYA,EAAI,MAAM,YAAa,IAAKS,EAAO,eAAe,EAAE,GAAG,KAAK,EACvHT,EAAI,OAAO,QAAU,IAAM,CACrBA,EAAI,MAAM,OAAaA,EAAI,MAAM,KAAK,EACrCA,EAAI,MAAM,MAAM,CACvB,CACF,CAEA,eAAeY,GAAgB,CApH/B,IAAAC,EAqHE,GAAI,CAACb,EAAI,MAAM,OAAQ,EACjBa,EAAAhB,EAAQ,OAAR,MAAAgB,EAAc,QAAQd,EAAM,GAAG,QAAQF,EAAQ,KAAK,MAAM,EAC9D,MAAME,EAAM,OAAOC,EAAI,KAAK,EAC5B,IAAMc,EAAMf,EAAM,IAAI,EACtBG,EAAI,OAAS,KAAQY,EAAMb,EAAU,QACrCA,EAAU,OAASa,EACnB,sBAAsBF,CAAa,CACrC,CACF,CAEA,eAAeG,GAAwC,CACrD,IAAMC,EAAejB,EAAM,KAAKA,EAAM,MAAM,EAC5CA,EAAM,KAAK,OAAOC,EAAI,MAAOA,EAAI,MAAM,EACvC,MAAMD,EAAM,KAAK,IAAIC,EAAI,OAAQgB,CAAY,EAC7C,IAAMF,EAAMf,EAAM,IAAI,EAKtB,GAJAG,EAAI,KAAO,KAAQY,EAAMb,EAAU,MACnCA,EAAU,KAAOa,EACjBR,EAAS,QAAQJ,EAAI,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,cAAcA,EAAI,KAAK,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,QAAQ,EAC/GP,EAAG,UAAYI,EAAM,OAAO,KAAK,SAAW,EACxCJ,EAAG,UAAW,CAChB,IAAMsB,EAAqB,OAAO,OAAOlB,EAAM,OAAO,OAAO,EAAE,IAAKmB,GAA6BA,EAAQ,OAAO,GAC5GD,EAAS,SAAS,gBAAgB,GAAKA,EAAS,SAAS,iBAAiB,KAAGnB,EAAM,MAAQC,EAAM,IAAI,GACrGD,EAAM,MAAQ,GAAK,CAACmB,EAAS,SAAS,gBAAgB,GAAK,CAACA,EAAS,SAAS,iBAAiB,IAAGnB,EAAM,IAAMC,EAAM,IAAI,GAC5HJ,EAAG,cAAgBA,EAAG,eAAkB,KAAK,IAAIG,EAAM,IAAMA,EAAM,KAAK,EAAIJ,EAAQ,UAAY,KAAK,IAAII,EAAM,IAAMA,EAAM,KAAK,EAAIJ,EAAQ,SACxIC,EAAG,eAAiBG,EAAM,OAAS,IAAGA,EAAM,KAAO,KAAK,MAAMA,EAAM,IAAMA,EAAM,KAAK,GACzFH,EAAG,aAAesB,EAAS,SAAS,eAAe,EACnDtB,EAAG,cAAgBsB,EAAS,SAAS,gBAAgB,EACrDtB,EAAG,gBAAkBI,EAAM,OAAO,KAAK,GAAG,UAAY,GAAKL,EAAQ,gBAAkBK,EAAM,OAAO,KAAK,GAAG,WAAa,GAAKL,EAAQ,cACpIC,EAAG,gBAAkBI,EAAM,OAAO,KAAK,GAAG,MAAQ,GAAKL,EAAQ,cAC/DC,EAAG,eAAiBI,EAAM,OAAO,KAAK,GAAG,MAAQ,GAAKL,EAAQ,cAC9DC,EAAG,SAAWI,EAAM,OAAO,KAAK,GAAG,IAAI,IAAML,EAAQ,SAAWK,EAAM,OAAO,KAAK,GAAG,IAAI,IAAML,EAAQ,OACzG,CACA,IAAIyB,EAAI,GACR,OAAW,CAACC,EAAKC,CAAG,IAAK,OAAO,QAAQ1B,CAAE,EAAG,CAC3C,IAAI2B,EAAK,SAAS,eAAe,MAAMF,GAAK,EACvCE,IACHA,EAAK,SAAS,cAAc,KAAK,EACjCA,EAAG,UAAYF,EACfE,EAAG,UAAY,KACfA,EAAG,MAAM,IAAM,GAAGH,MAClBnB,EAAI,GAAG,YAAYsB,CAAE,GAEnB,OAAOD,GAAQ,UAAWC,EAAG,MAAM,gBAAkBD,EAAM,aAAe,aACzEC,EAAG,UAAY,GAAGF,KAAOC,IAC9BF,GAAK,EACP,CAKA,OAJIvB,EAAM,GAIND,EAAG,UAAYD,EAAQ,SACzBM,EAAI,MAAM,MAAM,EACTD,EAAM,OAAO,KAAK,KAG3BJ,EAAG,UAAY,KAAK,MAAMI,EAAM,IAAI,EAAII,CAAS,EAC1C,IAAI,QAASQ,GAAY,CAC9B,WAAW,SAAY,CACrB,MAAMI,EAAe,EACrBJ,EAAQZ,EAAM,OAAO,KAAK,EAAE,CAC9B,EAAG,EAAE,CACP,CAAC,EACH,CAEA,eAAewB,GAAc,CArL7B,IAAAV,EAAAW,EAAAC,EAAAC,EAsLE,GAAI1B,EAAI,KAAK,MAAM,OAAS,EAAG,CAC7B,IAAM2B,GAAQd,EAAAb,EAAI,OAAO,WAAW,IAAI,IAA1B,YAAAa,EAA6B,aAAa,EAAG,EAAGb,EAAI,OAAO,MAAOA,EAAI,OAAO,QACrF4B,EAAM,CAAE,GAAI,EAAG,KAAM5B,EAAI,KAAK,MAAO,YAAYwB,EAAA3B,EAAQ,OAAR,YAAA2B,EAAc,UAAuB,MAAAG,CAAM,EAClG,MAAcE,EAAKD,CAAG,EACtBxB,EAAI,qBAAsBwB,EAAI,KAAM,sBAAsBF,GAAAD,EAAA5B,EAAQ,OAAR,YAAA4B,EAAc,YAAd,YAAAC,EAAyB,MAAM,EACzFtB,EAAI,sBAAuB,MAAc0B,EAAM,CAAC,CAClD,MACE1B,EAAI,cAAc,CAEtB,CAEA,eAAe2B,GAAe,CACxBlC,EAAQ,QAAUA,EAAQ,OAAO,GAAK,GACxC,MAAcmC,EAAOnC,EAAQ,MAAM,CAEvC,CAEA,eAAeoC,GAAa,CAvM5B,IAAApB,EAAAW,EAAAC,EAAAC,EAyME,IADAb,EAAAb,EAAI,OAAO,WAAW,IAAI,IAA1B,MAAAa,EAA6B,UAAU,EAAG,EAAGnB,EAAQ,QAASA,EAAQ,SAClE,GAAC8B,EAAA3B,GAAA,YAAAA,EAAS,OAAT,MAAA2B,EAAe,SAAU,GAACC,EAAA5B,GAAA,YAAAA,EAAS,OAAT,MAAA4B,EAAe,WAAW,MAAO,GAGhE,GAFA,QAAQ,IAAI,eAAgB5B,EAAQ,IAAI,EACxCE,EAAM,GAAG,QAAQ,SAASF,EAAQ,KAAK,OAAmCG,EAAI,MAAM,EAChF,MAAc8B,EAAM,IAAM,EAC5B,OAAA1B,EAAI,wBAAwB,EAC5B,SAAS,KAAK,MAAM,WAAa,QACjCJ,EAAI,OAAO,MAAM,QAAU,OACpB,GAET,IAAMkC,EAAK,MAAcC,EAAK,EACxBC,EAAcF,EAAG,IAAKN,GAAQA,EAAI,UAAU,EAAE,OAAQS,GAASA,EAAK,OAAS,CAAC,EAC9EC,EAAMvC,EAAM,MAAMF,EAAQ,KAAK,UAAWuC,EAAa3C,CAAY,EACzE,OAAAI,EAAQ,OAASqC,EAAGI,EAAI,QAAU,KAC9BzC,EAAQ,SACVO,EAAI,eAAeP,EAAQ,OAAO,cAAcA,EAAQ,OAAO,oBAAoB,KAAK,MAAM,IAAOyC,EAAI,UAAU,EAAI,KAAK,EAC5HtC,EAAI,KAAK,MAAQH,EAAQ,OAAO,KAChCG,EAAI,OAAO,MAAM,QAAU,IAC3B0B,EAAA1B,EAAI,OAAO,WAAW,IAAI,IAA1B,MAAA0B,EAA6B,aAAa7B,EAAQ,OAAO,MAAO,EAAG,IAErE,SAAS,KAAK,MAAM,WAAayC,EAAI,WAAa5C,EAAQ,UAAY,YAAc,SAC7E4C,EAAI,WAAa5C,EAAQ,SAClC,CAEA,eAAe6C,GAAO,CAhOtB,IAAA1B,EAAAW,EA0PE,OAzBA7B,EAAG,UAAY,GACfA,EAAG,eAAiB,GACpBA,EAAG,aAAe,GAClBA,EAAG,cAAgB,GACnBA,EAAG,SAAW,GACdA,EAAG,eAAiB,GACpBA,EAAG,cAAgB,GACnBA,EAAG,UAAY,EACfK,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,OAAO,MAAM,QAAU,OAC3B,SAAS,KAAK,MAAM,WAAa,QACjC,MAAMO,EAAO,EACb,MAAMK,EAAc,EACpBT,EAAYJ,EAAM,IAAI,EACtBF,EAAQ,KAAO,MAAMkB,EAAe,EACpCf,EAAI,OAAO,QAAQa,EAAAhB,EAAQ,KAAK,SAAb,YAAAgB,EAAqB,MAAM,KAAMnB,EAAQ,QAC5DM,EAAI,OAAO,SAASwB,EAAA3B,EAAQ,KAAK,SAAb,YAAA2B,EAAqB,MAAM,KAAM9B,EAAQ,QAC7DM,EAAI,OAAO,MAAQA,EAAI,OAAO,MAC9BA,EAAI,OAAO,OAASA,EAAI,OAAO,OAC/BA,EAAI,OAAO,MAAM,MAAQ,GACzBA,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,KAAK,MAAM,QAAU,OACzBA,EAAI,OAAO,MAAM,QAAU,OAC3BA,EAAI,MAAM,MAAM,QAAU,QACrBJ,EAAM,EAIJqC,EAAW,GAHhB7B,EAAI,yBAAyB,EACtB,GAGX,CAEA,eAAeoC,GAAO,CAjQtB,IAAA3B,EAAAW,EAkQEpB,EAAI,iBAAkBL,EAAM,QAAS,kBAAmBA,EAAM,GAAG,QAAQ,YAAY,EACrFK,EAAI,wBAAyBZ,EAAY,KAAK,YAAY,QAAU,UAAY,IAAIqB,EAAArB,EAAY,KAAK,gBAAjB,MAAAqB,EAAmC,QAAU,gBAAkB,IAAIW,EAAAhC,EAAY,KAAK,cAAjB,MAAAgC,EAAiC,QAAU,cAAgB,EAAE,EACpNpB,EAAI,WAAY,KAAK,UAAUV,CAAO,EAAE,QAAQ,eAAgB,EAAE,EAAE,QAAQ,KAAM,GAAG,CAAC,EACtFY,EAAS,YAAY,EACrBF,EAAI,sBAAuB,MAAc0B,EAAM,CAAC,EAChD,MAAMvB,EAAO,EACb,MAAMR,EAAM,KAAK,EACjBO,EAAS,iBAAiB,EAC1BN,EAAI,MAAM,iBAAiB,QAASuC,CAAI,EACxCvC,EAAI,KAAK,iBAAiB,QAASuB,CAAW,EAC9CvB,EAAI,OAAO,iBAAiB,QAAS+B,CAAY,EACjD,MAAMhC,EAAM,OAAO,EACnB,MAAMwC,EAAK,CACb,CAEA,OAAO,OAASC",
"names": ["H", "db", "database", "table", "log", "msg", "open", "resolve", "request", "evt", "load", "faceDB", "cursor", "count", "store", "save", "faceRecord", "newRecord", "remove", "humanConfig", "matchOptions", "options", "ok", "allOk", "current", "blink", "human", "dom", "timestamp", "fps", "startTime", "log", "msg", "printFPS", "webCam", "cameraOptions", "stream", "ready", "resolve", "detectionLoop", "_a", "now", "validationLoop", "interpolated", "gestures", "gesture", "y", "key", "val", "el", "saveRecords", "_b", "_c", "_d", "image", "rec", "save", "count", "deleteRecord", "remove", "detectFace", "db", "load", "descriptors", "desc", "res", "main", "init"]
}
diff --git a/demo/faceid/index.ts b/demo/faceid/index.ts
index eaecb971..aea5028f 100644
--- a/demo/faceid/index.ts
+++ b/demo/faceid/index.ts
@@ -199,7 +199,7 @@ async function deleteRecord() {
async function detectFace() {
dom.canvas.getContext('2d')?.clearRect(0, 0, options.minSize, options.minSize);
- if (!current.face || !current.face.tensor || !current.face.embedding) return false;
+ if (!current?.face?.tensor || !current?.face?.embedding) return false;
console.log('face record:', current.face); // eslint-disable-line no-console
human.tf.browser.toPixels(current.face.tensor as unknown as H.TensorLike, dom.canvas);
if (await indexDb.count() === 0) {
diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map
index c395667a..ca92fb46 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 humanConfig: Partial = { // user configuration for human, used to fine-tune behavior\n // backend: 'wasm' as const,\n // wasmPath: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.18.0/dist/',\n // cacheSensitivity: 0,\n async: false,\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: false, flip: false },\n face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } },\n body: { enabled: true },\n hand: { enabled: true },\n object: { 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 as number).toString() + ' | performance: ' + JSON.stringify(msg).replace(/\"|{|}/g, '').replace(/,/g, ' | '); // print performance element\n\nasync function webCam() { // initialize webcam\n status('starting webcam...');\n // @ts-ignore resizeMode is not yet defined in tslib\n const options: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth }, height: { ideal: document.body.clientHeight } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(options);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n void dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n const track: MediaStreamTrack = stream.getVideoTracks()[0];\n const capabilities: MediaTrackCapabilities | string = track.getCapabilities ? track.getCapabilities() : '';\n const settings: MediaTrackSettings | string = track.getSettings ? track.getSettings() : '';\n const constraints: MediaTrackConstraints | string = track.getConstraints ? track.getConstraints() : '';\n log('video:', dom.video.videoWidth, dom.video.videoHeight, track.label, { stream, track, settings, constraints, capabilities });\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) void dom.video.play();\n else dom.video.pause();\n };\n}\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 if (human.config.filter.flip) human.draw.canvas(interpolated.canvas as HTMLCanvasElement, dom.canvas); // draw processed image to screen canvas\n else human.draw.canvas(dom.video, dom.canvas); // draw original video to screen canvas // better than using procesed image as this loop happens faster than processing loop\n await human.draw.all(dom.canvas, interpolated); // 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 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 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"],
+ "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 humanConfig: Partial = { // user configuration for human, used to fine-tune behavior\n // backend: 'wasm' as const,\n // wasmPath: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.20.0/dist/',\n // cacheSensitivity: 0,\n async: false,\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: false, flip: false },\n face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } },\n body: { enabled: true },\n hand: { enabled: true },\n object: { 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 as number).toString() + ' | performance: ' + JSON.stringify(msg).replace(/\"|{|}/g, '').replace(/,/g, ' | '); // print performance element\n\nasync function webCam() { // initialize webcam\n status('starting webcam...');\n // @ts-ignore resizeMode is not yet defined in tslib\n const options: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth }, height: { ideal: document.body.clientHeight } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(options);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n void dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n const track: MediaStreamTrack = stream.getVideoTracks()[0];\n const capabilities: MediaTrackCapabilities | string = track.getCapabilities ? track.getCapabilities() : '';\n const settings: MediaTrackSettings | string = track.getSettings ? track.getSettings() : '';\n const constraints: MediaTrackConstraints | string = track.getConstraints ? track.getConstraints() : '';\n log('video:', dom.video.videoWidth, dom.video.videoHeight, track.label, { stream, track, settings, constraints, capabilities });\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) void dom.video.play();\n else dom.video.pause();\n };\n}\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 if (human.config.filter.flip) human.draw.canvas(interpolated.canvas as HTMLCanvasElement, dom.canvas); // draw processed image to screen canvas\n else human.draw.canvas(dom.video, dom.canvas); // draw original video to screen canvas // better than using procesed image as this loop happens faster than processing loop\n await human.draw.all(dom.canvas, interpolated); // 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 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 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,EAAiC,CAIrC,MAAO,GACP,cAAe,eACf,OAAQ,CAAE,QAAS,GAAM,aAAc,GAAO,KAAM,EAAM,EAC1D,KAAM,CAAE,QAAS,GAAM,SAAU,CAAE,SAAU,EAAM,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,CAAE,EAClM,KAAM,CAAE,QAAS,EAAK,EACtB,KAAM,CAAE,QAAS,EAAK,EACtB,OAAQ,CAAE,QAAS,EAAM,EACzB,QAAS,CAAE,QAAS,EAAK,CAC3B,EAEMC,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,WAAcD,EAAM,GAAG,OAAO,EAAE,WAAsB,SAAS,EAAI,mBAAqB,KAAK,UAAUK,CAAG,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,KAAM,KAAK,EAEhM,eAAeG,GAAS,CACtBF,EAAO,oBAAoB,EAE3B,IAAMG,EAAkC,CAAE,MAAO,GAAO,MAAO,CAAE,WAAY,OAAQ,WAAY,OAAQ,MAAO,CAAE,MAAO,SAAS,KAAK,WAAY,EAAG,OAAQ,CAAE,MAAO,SAAS,KAAK,YAAa,CAAE,CAAE,EAChMC,EAAsB,MAAM,UAAU,aAAa,aAAaD,CAAO,EACvEE,EAAQ,IAAI,QAASC,GAAY,CAAEX,EAAI,MAAM,aAAe,IAAMW,EAAQ,EAAI,CAAG,CAAC,EACxFX,EAAI,MAAM,UAAYS,EACjBT,EAAI,MAAM,KAAK,EACpB,MAAMU,EACNV,EAAI,OAAO,MAAQA,EAAI,MAAM,WAC7BA,EAAI,OAAO,OAASA,EAAI,MAAM,YAC9B,IAAMY,EAA0BH,EAAO,eAAe,EAAE,GAClDI,EAAgDD,EAAM,gBAAkBA,EAAM,gBAAgB,EAAI,GAClGE,EAAwCF,EAAM,YAAcA,EAAM,YAAY,EAAI,GAClFG,EAA8CH,EAAM,eAAiBA,EAAM,eAAe,EAAI,GACpGT,EAAI,SAAUH,EAAI,MAAM,WAAYA,EAAI,MAAM,YAAaY,EAAM,MAAO,CAAE,OAAAH,EAAQ,MAAAG,EAAO,SAAAE,EAAU,YAAAC,EAAa,aAAAF,CAAa,CAAC,EAC9Hb,EAAI,OAAO,QAAU,IAAM,CACrBA,EAAI,MAAM,OAAaA,EAAI,MAAM,KAAK,EACrCA,EAAI,MAAM,MAAM,CACvB,CACF,CAEA,eAAegB,GAAgB,CAC7B,GAAI,CAAChB,EAAI,MAAM,OAAQ,CACjBC,EAAU,QAAU,IAAGA,EAAU,MAAQF,EAAM,IAAI,GAEvD,MAAMA,EAAM,OAAOC,EAAI,KAAK,EAC5B,IAAMiB,EAAUlB,EAAM,GAAG,OAAO,EAAE,WAC9BkB,EAAUhB,EAAU,UAAY,GAAGE,EAAI,qBAAsBc,EAAUhB,EAAU,OAAO,EAC5FA,EAAU,QAAUgB,EACpBf,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,sBAAsBiB,CAAa,CACrC,CAEA,eAAeE,GAAW,CACxB,GAAI,CAAClB,EAAI,MAAM,OAAQ,CACrB,IAAMmB,EAAepB,EAAM,KAAKA,EAAM,MAAM,EACxCA,EAAM,OAAO,OAAO,KAAMA,EAAM,KAAK,OAAOoB,EAAa,OAA6BnB,EAAI,MAAM,EAC/FD,EAAM,KAAK,OAAOC,EAAI,MAAOA,EAAI,MAAM,EAC5C,MAAMD,EAAM,KAAK,IAAIC,EAAI,OAAQmB,CAAY,EAC7Cb,EAAKa,EAAa,WAAW,CAC/B,CACA,IAAMC,EAAMrB,EAAM,IAAI,EACtBG,EAAI,QAAU,KAAK,MAAM,IAAO,KAAQkB,EAAMnB,EAAU,KAAK,EAAI,IACjEA,EAAU,KAAOmB,EACjBf,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,WAAWgB,EAAU,EAAE,CACzB,CAEA,eAAeG,GAAO,CACpBlB,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,OAAQuB,GAAUA,IAAU,IAAI,EAAE,MAAM,EAC1FjB,EAAO,iBAAiB,EACxB,MAAMN,EAAM,OAAO,EACnB,MAAMQ,EAAO,EACb,MAAMS,EAAc,EACpB,MAAME,EAAS,CACjB,CAEA,OAAO,OAASG",
"names": ["H", "humanConfig", "human", "dom", "timestamp", "fps", "log", "msg", "status", "perf", "webCam", "options", "stream", "ready", "resolve", "track", "capabilities", "settings", "constraints", "detectionLoop", "tensors", "drawLoop", "interpolated", "now", "main", "model"]
}
diff --git a/package.json b/package.json
index 7ff1f240..d49f6d6a 100644
--- a/package.json
+++ b/package.json
@@ -78,26 +78,26 @@
"@tensorflow/tfjs-tflite": "0.0.1-alpha.8",
"@types/node": "^18.7.13",
"@types/offscreencanvas": "^2019.7.0",
- "@typescript-eslint/eslint-plugin": "^5.34.0",
- "@typescript-eslint/parser": "^5.34.0",
- "@vladmandic/build": "^0.7.10",
+ "@typescript-eslint/eslint-plugin": "^5.35.1",
+ "@typescript-eslint/parser": "^5.35.1",
+ "@vladmandic/build": "^0.7.11",
"@vladmandic/pilogger": "^0.4.6",
"@vladmandic/tfjs": "github:vladmandic/tfjs",
"@webgpu/types": "^0.1.21",
"canvas": "^2.9.3",
"esbuild": "^0.15.5",
- "eslint": "8.22.0",
+ "eslint": "8.23.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-html": "^7.1.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-json": "^3.1.0",
"eslint-plugin-node": "^11.1.0",
- "eslint-plugin-promise": "^6.0.0",
+ "eslint-plugin-promise": "^6.0.1",
"node-fetch": "^3.2.10",
"rimraf": "^3.0.2",
"seedrandom": "^3.0.5",
"tslib": "^2.4.0",
- "typedoc": "0.23.10",
- "typescript": "4.7.4"
+ "typedoc": "0.23.11",
+ "typescript": "4.8.2"
}
}
diff --git a/test/build.log b/test/build.log
index 4a2ab08f..9922205f 100644
--- a/test/build.log
+++ b/test/build.log
@@ -1,39 +1,39 @@
-2022-08-24 08:07:27 [32mDATA: [39m Build {"name":"@vladmandic/human","version":"2.9.4"}
-2022-08-24 08:07:27 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"2.9.4"}
-2022-08-24 08:07:27 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
-2022-08-24 08:07:27 [36mINFO: [39m Toolchain: {"build":"0.7.10","esbuild":"0.15.5","typescript":"4.7.4","typedoc":"0.23.10","eslint":"8.22.0"}
-2022-08-24 08:07:27 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
-2022-08-24 08:07:27 [35mSTATE:[39m Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":159,"outputBytes":608}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653111,"outputBytes":306819}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":167,"outputBytes":612}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653115,"outputBytes":306823}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":206,"outputBytes":664}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653167,"outputBytes":306873}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1125,"outputBytes":358}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1088,"outputBytes":583}
-2022-08-24 08:07:27 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653086,"outputBytes":305692}
-2022-08-24 08:07:28 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":1344,"outputBytes":2879073}
-2022-08-24 08:07:28 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3531576,"outputBytes":1706402}
-2022-08-24 08:07:28 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3531576,"outputBytes":3154419}
-2022-08-24 08:07:33 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types/lib","files":30}
-2022-08-24 08:07:35 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true}
-2022-08-24 08:07:35 [35mSTATE:[39m Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6714,"outputBytes":3134}
-2022-08-24 08:07:35 [35mSTATE:[39m Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15501,"outputBytes":7733}
-2022-08-24 08:07:46 [35mSTATE:[39m Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":111,"errors":0,"warnings":0}
-2022-08-24 08:07:47 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
-2022-08-24 08:07:47 [35mSTATE:[39m Copy: {"input":"tfjs/tfjs.esm.d.ts"}
-2022-08-24 08:07:47 [36mINFO: [39m Done...
-2022-08-24 08:07:47 [35mSTATE:[39m API-Extractor: {"succeeeded":true,"errors":0,"warnings":198}
-2022-08-24 08:07:47 [35mSTATE:[39m Copy: {"input":"types/human.d.ts"}
-2022-08-24 08:07:47 [36mINFO: [39m Analyze models: {"folders":8,"result":"models/models.json"}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"./models","models":13}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../human-models/models","models":42}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../blazepose/model/","models":4}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../anti-spoofing/model","models":1}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../efficientpose/models","models":3}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../insightface/models","models":5}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../movenet/models","models":3}
-2022-08-24 08:07:47 [35mSTATE:[39m Models {"folder":"../nanodet/models","models":4}
-2022-08-24 08:07:48 [35mSTATE:[39m Models: {"count":57,"totalSize":383017442}
-2022-08-24 08:07:48 [36mINFO: [39m Human Build complete... {"logFile":"test/build.log"}
+2022-08-28 13:08:21 [32mDATA: [39m Build {"name":"@vladmandic/human","version":"2.9.4"}
+2022-08-28 13:08:21 [36mINFO: [39m Application: {"name":"@vladmandic/human","version":"2.9.4"}
+2022-08-28 13:08:21 [36mINFO: [39m Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
+2022-08-28 13:08:21 [36mINFO: [39m Toolchain: {"build":"0.7.11","esbuild":"0.15.5","typescript":"4.8.2","typedoc":"0.23.11","eslint":"8.23.0"}
+2022-08-28 13:08:21 [36mINFO: [39m Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
+2022-08-28 13:08:21 [35mSTATE:[39m Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":159,"outputBytes":608}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653111,"outputBytes":306819}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":167,"outputBytes":612}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653115,"outputBytes":306823}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":206,"outputBytes":664}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653167,"outputBytes":306873}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1125,"outputBytes":358}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1088,"outputBytes":583}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653086,"outputBytes":305692}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":1344,"outputBytes":2879073}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3531576,"outputBytes":1706402}
+2022-08-28 13:08:21 [35mSTATE:[39m Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3531576,"outputBytes":3154419}
+2022-08-28 13:08:26 [35mSTATE:[39m Typings: {"input":"src/human.ts","output":"types/lib","files":30}
+2022-08-28 13:08:27 [35mSTATE:[39m TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true}
+2022-08-28 13:08:27 [35mSTATE:[39m Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6714,"outputBytes":3134}
+2022-08-28 13:08:27 [35mSTATE:[39m Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15488,"outputBytes":7788}
+2022-08-28 13:08:38 [35mSTATE:[39m Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":111,"errors":0,"warnings":0}
+2022-08-28 13:08:38 [35mSTATE:[39m ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
+2022-08-28 13:08:38 [35mSTATE:[39m Copy: {"input":"tfjs/tfjs.esm.d.ts"}
+2022-08-28 13:08:38 [36mINFO: [39m Done...
+2022-08-28 13:08:39 [35mSTATE:[39m API-Extractor: {"succeeeded":true,"errors":0,"warnings":198}
+2022-08-28 13:08:39 [35mSTATE:[39m Copy: {"input":"types/human.d.ts"}
+2022-08-28 13:08:39 [36mINFO: [39m Analyze models: {"folders":8,"result":"models/models.json"}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"./models","models":13}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../human-models/models","models":42}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../blazepose/model/","models":4}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../anti-spoofing/model","models":1}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../efficientpose/models","models":3}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../insightface/models","models":5}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../movenet/models","models":3}
+2022-08-28 13:08:39 [35mSTATE:[39m Models {"folder":"../nanodet/models","models":4}
+2022-08-28 13:08:40 [35mSTATE:[39m Models: {"count":57,"totalSize":383017442}
+2022-08-28 13:08:40 [36mINFO: [39m Human Build complete... {"logFile":"test/build.log"}
diff --git a/test/test.log b/test/test.log
index d328348a..7913cbbd 100644
--- a/test/test.log
+++ b/test/test.log
@@ -1,976 +1,976 @@
-2022-08-24 08:09:14 [36mINFO: [39m @vladmandic/human version 2.9.4
-2022-08-24 08:09:14 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v18.1.0
-2022-08-24 08:09:14 [36mINFO: [39m demos: [{"cmd":"../demo/nodejs/node.js","args":[]},{"cmd":"../demo/nodejs/node-simple.js","args":[]},{"cmd":"../demo/nodejs/node-fetch.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/multithread/node-multiprocess.js","args":[]},{"cmd":"../demo/facematch/node-match.js","args":[]}]
-2022-08-24 08:09:14 [36mINFO: [39m {"cmd":"../demo/nodejs/node.js","args":[]} start
-2022-08-24 08:09:15 [36mINFO: [39m {"cmd":"../demo/nodejs/node-simple.js","args":[]} start
-2022-08-24 08:09:15 [36mINFO: [39m {"cmd":"../demo/nodejs/node-fetch.js","args":[]} start
-2022-08-24 08:09:18 [36mINFO: [39m {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start
-2022-08-24 08:09:18 [36mINFO: [39m {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start
-2022-08-24 08:09:19 [36mINFO: [39m {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start
-2022-08-24 08:09:19 [36mINFO: [39m {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start
-2022-08-24 08:09:20 [36mINFO: [39m {"cmd":"../demo/facematch/node-match.js","args":[]} start
-2022-08-24 08:09:22 [36mINFO: [39m tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"]
-2022-08-24 08:09:22 [36mINFO: [39m
-2022-08-24 08:09:22 [36mINFO: [39m test-node.js start
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js test: configuration validation
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: configuration default validation []
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js test: model load
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}]
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js memory: {"memory":{"unreliable":true,"numTensors":1921,"numDataBuffers":1921,"numBytes":63673064}}
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63673064,"numTensors":1921,"numStringTensors":0,"numDataBuffers":1921,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}}
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js test: warmup
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: create human
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js human version: 2.9.4
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js platform: linux x64 agent: NodeJS v18.1.0
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js tfjs version: 3.20.0
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"3.20.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.7.3-dev20220521","gpu":false},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169}
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: set backend: tensorflow
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js tensors 1921
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: load models
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js result: defined models: 23 loaded models: 12
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: warmup: none default
-2022-08-24 08:09:23 [32mDATA: [39m test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
-2022-08-24 08:09:23 [32mDATA: [39m test-node.js result: performance: load: null total: null
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: warmup none result match
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: warmup
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: warmup: face default
-2022-08-24 08:09:23 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
-2022-08-24 08:09:23 [32mDATA: [39m test-node.js result: performance: load: null total: 364
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: warmup face result match
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: warmup
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: warmup: body default
-2022-08-24 08:09:23 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:23 [32mDATA: [39m test-node.js result: performance: load: null total: 243
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: warmup body result match
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
-2022-08-24 08:09:23 [36mINFO: [39m test-node.js test: details verification
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js start default
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:23 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg default
-2022-08-24 08:09:24 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:24 [32mDATA: [39m test-node.js result: performance: load: null total: 232
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face length 1
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face score 1 0.93 1
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face age/gender 23.7 female 0.97 85.47
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face arrays 4 478 1024
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face anti-spoofing 0.79
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details face liveness 0.83
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details body length 1
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details body 0.92 17 6
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details hand length 1
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details hand 0.51 0.73 point
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details hand arrays 21 5 7
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details gesture length 7
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details gesture first {"face":0,"gesture":"facing right"}
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details object length 1
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: details object 0.72 person
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:24 [35mSTATE:[39m test-node.js passed: tensor shape: [1200,1200,4] dtype: float32
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js passed: tensor shape: [1200,1200,3] dtype: float32
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
-2022-08-24 08:09:25 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32
-2022-08-24 08:09:26 [36mINFO: [39m test-node.js test default
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js start async
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg async
-2022-08-24 08:09:26 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:26 [32mDATA: [39m test-node.js result: performance: load: null total: 212
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: default result face match 1 female 0.97
-2022-08-24 08:09:26 [36mINFO: [39m test-node.js test sync
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js start sync
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg sync
-2022-08-24 08:09:26 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:26 [32mDATA: [39m test-node.js result: performance: load: null total: 203
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: default sync 1 female 0.97
-2022-08-24 08:09:26 [36mINFO: [39m test-node.js test: image process
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: image input null [1,256,256,3]
-2022-08-24 08:09:26 [36mINFO: [39m test-node.js test: image null
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: invalid input could not convert input to tensor
-2022-08-24 08:09:26 [36mINFO: [39m test-node.js test face similarity
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js start face similarity
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:26 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face similarity
-2022-08-24 08:09:27 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:27 [32mDATA: [39m test-node.js result: performance: load: null total: 203
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js start face similarity
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg face similarity
-2022-08-24 08:09:27 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:27 [32mDATA: [39m test-node.js result: performance: load: null total: 213
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js start face similarity
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg face similarity
-2022-08-24 08:09:27 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:27 [32mDATA: [39m test-node.js result: performance: load: null total: 185
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: face descriptor
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: face similarity {"similarity":[1,0.44727452329649126,0.5567935850640406],"descriptors":[1024,1024,1024]}
-2022-08-24 08:09:27 [36mINFO: [39m test-node.js test object
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js start object
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:27 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:28 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:28 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg object
-2022-08-24 08:09:28 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:28 [32mDATA: [39m test-node.js result: performance: load: null total: 210
-2022-08-24 08:09:28 [35mSTATE:[39m test-node.js passed: centernet
-2022-08-24 08:09:28 [35mSTATE:[39m test-node.js start object
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg object
-2022-08-24 08:09:30 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:30 [32mDATA: [39m test-node.js result: performance: load: null total: 213
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: nanodet
-2022-08-24 08:09:30 [36mINFO: [39m test-node.js test sensitive
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js start sensitive
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg sensitive
-2022-08-24 08:09:30 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:30 [32mDATA: [39m test-node.js result: performance: load: null total: 167
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: sensitive result match
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: sensitive face result match
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: sensitive body result match
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js passed: sensitive hand result match
-2022-08-24 08:09:30 [36mINFO: [39m test-node.js test body
-2022-08-24 08:09:30 [35mSTATE:[39m test-node.js start blazepose
-2022-08-24 08:09:34 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:34 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:35 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:35 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg blazepose
-2022-08-24 08:09:35 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39}
-2022-08-24 08:09:35 [32mDATA: [39m test-node.js result: performance: load: null total: 218
-2022-08-24 08:09:35 [35mSTATE:[39m test-node.js passed: blazepose
-2022-08-24 08:09:35 [35mSTATE:[39m test-node.js start efficientpose
-2022-08-24 08:09:36 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:36 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:36 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:36 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg efficientpose
-2022-08-24 08:09:36 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13}
-2022-08-24 08:09:36 [32mDATA: [39m test-node.js result: performance: load: null total: 242
-2022-08-24 08:09:36 [35mSTATE:[39m test-node.js passed: efficientpose
-2022-08-24 08:09:36 [35mSTATE:[39m test-node.js start posenet
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg posenet
-2022-08-24 08:09:37 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16}
-2022-08-24 08:09:37 [32mDATA: [39m test-node.js result: performance: load: null total: 172
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js passed: posenet
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js start movenet
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:37 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg movenet
-2022-08-24 08:09:38 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:38 [32mDATA: [39m test-node.js result: performance: load: null total: 179
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js passed: movenet
-2022-08-24 08:09:38 [36mINFO: [39m test-node.js test face matching
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js passed: face database 40
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js passed: face match {"first":{"index":4,"similarity":0.7827852615252829}} {"second":{"index":4,"similarity":0.5002052633015844}} {"third":{"index":4,"similarity":0.5401587887998899}}
-2022-08-24 08:09:38 [36mINFO: [39m test-node.js test face similarity alternative
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js start face embeddings
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:38 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:39 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:39 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face embeddings
-2022-08-24 08:09:39 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:39 [32mDATA: [39m test-node.js result: performance: load: null total: 186
-2022-08-24 08:09:39 [35mSTATE:[39m test-node.js passed: mobilefacenet {"embedding":192}
-2022-08-24 08:09:39 [35mSTATE:[39m test-node.js start face embeddings
-2022-08-24 08:09:40 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:40 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:40 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:40 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face embeddings
-2022-08-24 08:09:40 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:40 [32mDATA: [39m test-node.js result: performance: load: null total: 192
-2022-08-24 08:09:40 [35mSTATE:[39m test-node.js passed: insightface {"embedding":512}
-2022-08-24 08:09:40 [36mINFO: [39m test-node.js test face attention
-2022-08-24 08:09:40 [35mSTATE:[39m test-node.js start face attention
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face attention
-2022-08-24 08:09:41 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:41 [32mDATA: [39m test-node.js result: performance: load: null total: 175
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: face attention
-2022-08-24 08:09:41 [36mINFO: [39m test-node.js test detectors
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js start detectors
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg detectors
-2022-08-24 08:09:41 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:41 [32mDATA: [39m test-node.js result: performance: load: null total: 83
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: detector result face match
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js passed: detector result hand match
-2022-08-24 08:09:41 [36mINFO: [39m test-node.js test: multi-instance
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js start multi instance
-2022-08-24 08:09:41 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: detect: random multi instance
-2022-08-24 08:09:42 [32mDATA: [39m test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
-2022-08-24 08:09:42 [32mDATA: [39m test-node.js result: performance: load: null total: 80
-2022-08-24 08:09:42 [36mINFO: [39m test-node.js test: first instance
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start multi instance
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg multi instance
-2022-08-24 08:09:42 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:42 [32mDATA: [39m test-node.js result: performance: load: null total: 85
-2022-08-24 08:09:42 [36mINFO: [39m test-node.js test: second instance
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start multi instance
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg multi instance
-2022-08-24 08:09:42 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:42 [32mDATA: [39m test-node.js result: performance: load: null total: 85
-2022-08-24 08:09:42 [36mINFO: [39m test-node.js test: concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js start concurrent
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:42 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 963
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 963
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 963
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 963
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 963
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 963
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 698
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 698
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:43 [32mDATA: [39m test-node.js result: performance: load: null total: 698
-2022-08-24 08:09:43 [36mINFO: [39m test-node.js test: monkey-patch
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: image
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js event: detect
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: monkey patch
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: segmentation [65536]
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passeed: equal usage
-2022-08-24 08:09:43 [36mINFO: [39m test-node.js test: input compare
-2022-08-24 08:09:43 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:44 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
-2022-08-24 08:09:44 [35mSTATE:[39m test-node.js passed: image compare 0 23.275441687091504
-2022-08-24 08:09:44 [36mINFO: [39m test-node.js events: {"image":29,"detect":29,"warmup":2}
-2022-08-24 08:09:44 [36mINFO: [39m test-node.js tensors 4105
-2022-08-24 08:09:44 [36mINFO: [39m test-node.js test complete: 21025 ms
-2022-08-24 08:09:44 [36mINFO: [39m
-2022-08-24 08:09:44 [36mINFO: [39m test-node-gpu.js start
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js test: configuration validation
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: configuration default validation []
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js test: model load
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}]
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1921,"numDataBuffers":1921,"numBytes":63673064}}
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63673064,"numTensors":1921,"numStringTensors":0,"numDataBuffers":1921,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}}
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js test: warmup
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: create human
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js human version: 2.9.4
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js platform: linux x64 agent: NodeJS v18.1.0
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js tfjs version: 3.20.0
-2022-08-24 08:09:45 [36mINFO: [39m test-node-gpu.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"3.20.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.7.3-dev20220521","gpu":true},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169}
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: set backend: tensorflow
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js tensors 1921
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: load models
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js result: defined models: 23 loaded models: 12
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: warmup: none default
-2022-08-24 08:09:45 [32mDATA: [39m test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
-2022-08-24 08:09:45 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: null
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js passed: warmup none result match
-2022-08-24 08:09:45 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js event: warmup
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js passed: warmup: face default
-2022-08-24 08:09:49 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
-2022-08-24 08:09:49 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 4201
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js passed: warmup face result match
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js event: warmup
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js passed: warmup: body default
-2022-08-24 08:09:49 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:49 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 144
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js passed: warmup body result match
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
-2022-08-24 08:09:49 [36mINFO: [39m test-node-gpu.js test: details verification
-2022-08-24 08:09:49 [35mSTATE:[39m test-node-gpu.js start default
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
-2022-08-24 08:09:50 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:50 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 138
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face length 1
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face score 1 0.93 1
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face arrays 4 478 1024
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face anti-spoofing 0.79
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details face liveness 0.83
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details body length 1
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details body 0.92 17 6
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details hand length 1
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details hand 0.51 0.73 point
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details hand arrays 21 5 7
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details gesture length 7
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"}
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details object length 1
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: details object 0.72 person
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
-2022-08-24 08:09:50 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32
-2022-08-24 08:09:51 [36mINFO: [39m test-node-gpu.js test default
-2022-08-24 08:09:51 [35mSTATE:[39m test-node-gpu.js start async
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg async
-2022-08-24 08:09:52 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:52 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 135
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: default result face match 1 female 0.97
-2022-08-24 08:09:52 [36mINFO: [39m test-node-gpu.js test sync
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js start sync
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg sync
-2022-08-24 08:09:52 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:52 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 140
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: default sync 1 female 0.97
-2022-08-24 08:09:52 [36mINFO: [39m test-node-gpu.js test: image process
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: image input null [1,256,256,3]
-2022-08-24 08:09:52 [36mINFO: [39m test-node-gpu.js test: image null
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: invalid input could not convert input to tensor
-2022-08-24 08:09:52 [36mINFO: [39m test-node-gpu.js test face similarity
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js start face similarity
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity
-2022-08-24 08:09:52 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:52 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 131
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js start face similarity
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:52 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity
-2022-08-24 08:09:53 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:53 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 148
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js start face similarity
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity
-2022-08-24 08:09:53 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
-2022-08-24 08:09:53 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 161
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: face descriptor
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: face similarity {"similarity":[1,0.447238756461232,0.556914029877052],"descriptors":[1024,1024,1024]}
-2022-08-24 08:09:53 [36mINFO: [39m test-node-gpu.js test object
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js start object
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg object
-2022-08-24 08:09:53 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:09:53 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 154
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js passed: centernet
-2022-08-24 08:09:53 [35mSTATE:[39m test-node-gpu.js start object
-2022-08-24 08:09:54 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:54 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg object
-2022-08-24 08:09:55 [32mDATA: [39m test-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-08-24 08:09:55 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 582
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: nanodet
-2022-08-24 08:09:55 [36mINFO: [39m test-node-gpu.js test sensitive
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js start sensitive
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive
-2022-08-24 08:09:55 [32mDATA: [39m test-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-08-24 08:09:55 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 100
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: sensitive result match
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: sensitive face result match
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: sensitive body result match
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js passed: sensitive hand result match
-2022-08-24 08:09:55 [36mINFO: [39m test-node-gpu.js test body
-2022-08-24 08:09:55 [35mSTATE:[39m test-node-gpu.js start blazepose
-2022-08-24 08:09:56 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:56 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:56 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:56 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose
-2022-08-24 08:09:56 [32mDATA: [39m test-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-08-24 08:09:56 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 233
-2022-08-24 08:09:56 [35mSTATE:[39m test-node-gpu.js passed: blazepose
-2022-08-24 08:09:56 [35mSTATE:[39m test-node-gpu.js start efficientpose
-2022-08-24 08:09:57 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:57 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose
-2022-08-24 08:09:58 [32mDATA: [39m test-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-08-24 08:09:58 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 780
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js passed: efficientpose
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js start posenet
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet
-2022-08-24 08:09:58 [32mDATA: [39m test-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-08-24 08:09:58 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 120
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js passed: posenet
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js start movenet
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:09:58 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet
-2022-08-24 08:09:59 [32mDATA: [39m test-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-08-24 08:09:59 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 92
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: movenet
-2022-08-24 08:09:59 [36mINFO: [39m test-node-gpu.js test face matching
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: face database 40
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7828184453007331}} {"second":{"index":4,"similarity":0.5001334216773398}} {"third":{"index":4,"similarity":0.5403054967489764}}
-2022-08-24 08:09:59 [36mINFO: [39m test-node-gpu.js test face similarity alternative
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js start face embeddings
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face embeddings
-2022-08-24 08:09:59 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:09:59 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 149
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: mobilefacenet {"embedding":192}
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js start face embeddings
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:09:59 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face embeddings
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 165
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: insightface {"embedding":512}
-2022-08-24 08:10:00 [36mINFO: [39m test-node-gpu.js test face attention
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js start face attention
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face attention
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 243
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: face attention
-2022-08-24 08:10:00 [36mINFO: [39m test-node-gpu.js test detectors
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js start detectors
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg detectors
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 53
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detector result face match
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detector result hand match
-2022-08-24 08:10:00 [36mINFO: [39m test-node-gpu.js test: multi-instance
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js start multi instance
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detect: random multi instance
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 57
-2022-08-24 08:10:00 [36mINFO: [39m test-node-gpu.js test: first instance
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js start multi instance
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg multi instance
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:00 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 45
-2022-08-24 08:10:00 [36mINFO: [39m test-node-gpu.js test: second instance
-2022-08-24 08:10:00 [35mSTATE:[39m test-node-gpu.js start multi instance
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg multi instance
-2022-08-24 08:10:01 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:01 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 48
-2022-08-24 08:10:01 [36mINFO: [39m test-node-gpu.js test: concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js start concurrent
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:01 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 688
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 688
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 689
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 689
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 689
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 689
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 427
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 427
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:02 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 427
-2022-08-24 08:10:02 [36mINFO: [39m test-node-gpu.js test: monkey-patch
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js event: image
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js event: detect
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: monkey patch
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: segmentation [65536]
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passeed: equal usage
-2022-08-24 08:10:02 [36mINFO: [39m test-node-gpu.js test: input compare
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
-2022-08-24 08:10:02 [35mSTATE:[39m test-node-gpu.js passed: image compare 0 23.275441687091504
-2022-08-24 08:10:02 [36mINFO: [39m test-node-gpu.js events: {"image":29,"detect":29,"warmup":2}
-2022-08-24 08:10:02 [36mINFO: [39m test-node-gpu.js tensors 4105
-2022-08-24 08:10:02 [36mINFO: [39m test-node-gpu.js test complete: 17370 ms
-2022-08-24 08:10:03 [36mINFO: [39m
-2022-08-24 08:10:03 [36mINFO: [39m test-node-wasm.js start
-2022-08-24 08:10:04 [32mDATA: [39m test-node-wasm.js stdout: 2022-08-24 08:10:04 [36mINFO: [39m { supported: [33mtrue[39m, backend: [33mtrue[39m, simd: [33mtrue[39m, multithread: [33mfalse[39m }
-2022-08-24 08:10:04 [35mSTATE:[39m test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/
-2022-08-24 08:10:04 [36mINFO: [39m test-node-wasm.js test: configuration validation
-2022-08-24 08:10:04 [35mSTATE:[39m test-node-wasm.js passed: configuration default validation []
-2022-08-24 08:10:04 [35mSTATE:[39m test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
-2022-08-24 08:10:04 [36mINFO: [39m test-node-wasm.js test: model load
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"https://vladmandic.github.io/human/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/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human/models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"https://vladmandic.github.io/human/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human/models/liveness.json"},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"https://vladmandic.github.io/human/models/selfie.json"},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human/models/antispoof.json"}]
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1921,"numDataBuffers":1921,"numBytes":63673064}}
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63673064,"numTensors":1921,"numStringTensors":0,"numDataBuffers":1921,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}}
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js test: warmup
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: create human
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js human version: 2.9.4
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js platform: linux x64 agent: NodeJS v18.1.0
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js tfjs version: 3.20.0
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.1.0","backends":["cpu","wasm"],"initial":false,"tfjs":{"version":"3.20.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-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: set backend: wasm
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js tensors 1921
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: load models
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js result: defined models: 23 loaded models: 12
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: warmup: none default
-2022-08-24 08:10:06 [32mDATA: [39m test-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
-2022-08-24 08:10:06 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: null
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: warmup none result match
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js event: warmup
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: warmup: face default
-2022-08-24 08:10:06 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:06 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 503
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: warmup face result match
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js event: warmup
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: warmup: body default
-2022-08-24 08:10:06 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:06 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 353
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js passed: warmup body result match
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 21% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
-2022-08-24 08:10:06 [36mINFO: [39m test-node-wasm.js test: details verification
-2022-08-24 08:10:06 [35mSTATE:[39m test-node-wasm.js start default
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
-2022-08-24 08:10:07 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:07 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 331
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face length 1
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face score 1 0.93 1
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face arrays 4 478 1024
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face anti-spoofing 0.79
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details face liveness 0.83
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details body length 1
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details body 0.92 17 6
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details hand length 1
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details hand 0.51 0.73 point
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details hand arrays 21 5 7
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details gesture length 7
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"}
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details object length 1
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: details object 0.72 person
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264}
-2022-08-24 08:10:07 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264}
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:08 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
-2022-08-24 08:10:09 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32
-2022-08-24 08:10:10 [36mINFO: [39m test-node-wasm.js test default
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js start async
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg async
-2022-08-24 08:10:10 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:10 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 304
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js passed: default result face match 1 female 0.97
-2022-08-24 08:10:10 [36mINFO: [39m test-node-wasm.js test sync
-2022-08-24 08:10:10 [35mSTATE:[39m test-node-wasm.js start sync
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg sync
-2022-08-24 08:10:11 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:11 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 321
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: default sync 1 female 0.97
-2022-08-24 08:10:11 [36mINFO: [39m test-node-wasm.js test: image process
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: image input null [1,256,256,3]
-2022-08-24 08:10:11 [36mINFO: [39m test-node-wasm.js test: image null
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: invalid input could not convert input to tensor
-2022-08-24 08:10:11 [36mINFO: [39m test-node-wasm.js test face similarity
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js start face similarity
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity
-2022-08-24 08:10:11 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:11 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 297
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js start face similarity
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:11 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity
-2022-08-24 08:10:12 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:12 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 316
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js start face similarity
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity
-2022-08-24 08:10:12 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:12 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 314
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js passed: face descriptor
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]}
-2022-08-24 08:10:12 [36mINFO: [39m test-node-wasm.js test object
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js start object
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:12 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:13 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:13 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg object
-2022-08-24 08:10:13 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:13 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 314
-2022-08-24 08:10:13 [35mSTATE:[39m test-node-wasm.js passed: centernet
-2022-08-24 08:10:13 [35mSTATE:[39m test-node-wasm.js start object
-2022-08-24 08:10:13 [33mWARN: [39m test-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-08-24 08:10:13 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:13 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg object
-2022-08-24 08:10:14 [32mDATA: [39m test-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-08-24 08:10:14 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 207
-2022-08-24 08:10:14 [31mERROR:[39m test-node-wasm.js failed: nanodet []
-2022-08-24 08:10:14 [36mINFO: [39m test-node-wasm.js test sensitive
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js start sensitive
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive
-2022-08-24 08:10:14 [32mDATA: [39m test-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-08-24 08:10:14 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 230
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: sensitive result match
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: sensitive face result match
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}]
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: sensitive body result match
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js passed: sensitive hand result match
-2022-08-24 08:10:14 [36mINFO: [39m test-node-wasm.js test body
-2022-08-24 08:10:14 [35mSTATE:[39m test-node-wasm.js start blazepose
-2022-08-24 08:10:16 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:16 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:17 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:17 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose
-2022-08-24 08:10:17 [32mDATA: [39m test-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-08-24 08:10:17 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 388
-2022-08-24 08:10:17 [35mSTATE:[39m test-node-wasm.js passed: blazepose
-2022-08-24 08:10:17 [35mSTATE:[39m test-node-wasm.js start efficientpose
-2022-08-24 08:10:18 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:18 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:18 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:18 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose
-2022-08-24 08:10:18 [32mDATA: [39m test-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-08-24 08:10:18 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 639
-2022-08-24 08:10:18 [35mSTATE:[39m test-node-wasm.js passed: efficientpose
-2022-08-24 08:10:18 [35mSTATE:[39m test-node-wasm.js start posenet
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet
-2022-08-24 08:10:19 [32mDATA: [39m test-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-08-24 08:10:19 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 271
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js passed: posenet
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js start movenet
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:19 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet
-2022-08-24 08:10:20 [32mDATA: [39m test-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-08-24 08:10:20 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 242
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: movenet
-2022-08-24 08:10:20 [36mINFO: [39m test-node-wasm.js test face matching
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: face database 40
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.7827852754786533}} {"second":{"index":4,"similarity":0.5660821189104794}} {"third":{"index":4,"similarity":0.45074189882665594}}
-2022-08-24 08:10:20 [36mINFO: [39m test-node-wasm.js test face similarity alternative
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js start face embeddings
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face embeddings
-2022-08-24 08:10:20 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:20 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 234
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js passed: mobilefacenet {"embedding":192}
-2022-08-24 08:10:20 [35mSTATE:[39m test-node-wasm.js start face embeddings
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face embeddings
-2022-08-24 08:10:21 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:21 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 270
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js passed: insightface {"embedding":512}
-2022-08-24 08:10:21 [36mINFO: [39m test-node-wasm.js test face attention
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js start face attention
-2022-08-24 08:10:21 [33mWARN: [39m test-node-wasm.js missing kernel ops {"title":"face attention","model":"facemesh","url":"https://vladmandic.github.io/human-models/models/facemesh-attention.json","missing":["atan2"],"backkend":"wasm"}
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face attention
-2022-08-24 08:10:21 [32mDATA: [39m test-node-wasm.js result: face: 0 body: 1 hand: 1 gesture: 2 object: 0 person: 0 {} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:21 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 117
-2022-08-24 08:10:21 [31mERROR:[39m test-node-wasm.js failed: face attention {"annotations":0}
-2022-08-24 08:10:21 [36mINFO: [39m test-node-wasm.js test detectors
-2022-08-24 08:10:21 [35mSTATE:[39m test-node-wasm.js start detectors
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg detectors
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 114
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: detector result face match
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: detector result hand match
-2022-08-24 08:10:22 [36mINFO: [39m test-node-wasm.js test: multi-instance
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start multi instance
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: detect: random multi instance
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 96
-2022-08-24 08:10:22 [36mINFO: [39m test-node-wasm.js test: first instance
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start multi instance
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg multi instance
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 109
-2022-08-24 08:10:22 [36mINFO: [39m test-node-wasm.js test: second instance
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start multi instance
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg multi instance
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:22 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 107
-2022-08-24 08:10:22 [36mINFO: [39m test-node-wasm.js test: concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js start concurrent
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:22 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:23 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1290
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1290
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1290
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1290
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1290
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1290
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 971
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 971
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg concurrent
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
-2022-08-24 08:10:24 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 971
-2022-08-24 08:10:24 [36mINFO: [39m test-node-wasm.js test: monkey-patch
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js event: image
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js event: detect
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: monkey patch
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: segmentation [65536]
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passeed: equal usage
-2022-08-24 08:10:24 [36mINFO: [39m test-node-wasm.js test: input compare
-2022-08-24 08:10:24 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
-2022-08-24 08:10:25 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
-2022-08-24 08:10:25 [35mSTATE:[39m test-node-wasm.js passed: image compare 0 23.280073018790848
-2022-08-24 08:10:25 [36mINFO: [39m test-node-wasm.js events: {"image":29,"detect":29,"warmup":2}
-2022-08-24 08:10:25 [36mINFO: [39m test-node-wasm.js tensors 4107
-2022-08-24 08:10:25 [36mINFO: [39m test-node-wasm.js test complete: 20477 ms
-2022-08-24 08:10:25 [35mSTATE:[39m all tests complete
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/nodejs/node.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/nodejs/node-fetch.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"test-node.js","passed":125,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"test-node-gpu.js","passed":125,"failed":0}
-2022-08-24 08:10:25 [36mINFO: [39m status {"test":"test-node-wasm.js","passed":124,"failed":2}
-2022-08-24 08:10:25 [36mINFO: [39m failures {"count":2}
-2022-08-24 08:10:25 [33mWARN: [39m failed {"test":"test-node-wasm.js","message":["error",["failed: nanodet",[]]]}
-2022-08-24 08:10:25 [33mWARN: [39m failed {"test":"test-node-wasm.js","message":["error",["failed: face attention",{"annotations":0}]]}
+2022-08-28 13:09:53 [36mINFO: [39m @vladmandic/human version 2.9.4
+2022-08-28 13:09:53 [36mINFO: [39m User: vlado Platform: linux Arch: x64 Node: v18.1.0
+2022-08-28 13:09:53 [36mINFO: [39m demos: [{"cmd":"../demo/nodejs/node.js","args":[]},{"cmd":"../demo/nodejs/node-simple.js","args":[]},{"cmd":"../demo/nodejs/node-fetch.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/multithread/node-multiprocess.js","args":[]},{"cmd":"../demo/facematch/node-match.js","args":[]}]
+2022-08-28 13:09:53 [36mINFO: [39m {"cmd":"../demo/nodejs/node.js","args":[]} start
+2022-08-28 13:09:54 [36mINFO: [39m {"cmd":"../demo/nodejs/node-simple.js","args":[]} start
+2022-08-28 13:09:55 [36mINFO: [39m {"cmd":"../demo/nodejs/node-fetch.js","args":[]} start
+2022-08-28 13:09:58 [36mINFO: [39m {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start
+2022-08-28 13:09:58 [36mINFO: [39m {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start
+2022-08-28 13:09:59 [36mINFO: [39m {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start
+2022-08-28 13:09:59 [36mINFO: [39m {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start
+2022-08-28 13:10:00 [36mINFO: [39m {"cmd":"../demo/facematch/node-match.js","args":[]} start
+2022-08-28 13:10:02 [36mINFO: [39m tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"]
+2022-08-28 13:10:02 [36mINFO: [39m
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js start
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js test: configuration validation
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: configuration default validation []
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js test: model load
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}]
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js memory: {"memory":{"unreliable":true,"numTensors":1921,"numDataBuffers":1921,"numBytes":63673064}}
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63673064,"numTensors":1921,"numStringTensors":0,"numDataBuffers":1921,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}}
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js test: warmup
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: create human
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js human version: 2.9.4
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js platform: linux x64 agent: NodeJS v18.1.0
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js tfjs version: 3.20.0
+2022-08-28 13:10:02 [36mINFO: [39m test-node.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"3.20.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.7.3-dev20220521","gpu":false},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169}
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: set backend: tensorflow
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js tensors 1921
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: load models
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js result: defined models: 23 loaded models: 12
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: warmup: none default
+2022-08-28 13:10:02 [32mDATA: [39m test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
+2022-08-28 13:10:02 [32mDATA: [39m test-node.js result: performance: load: null total: null
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js passed: warmup none result match
+2022-08-28 13:10:02 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: warmup
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: warmup: face default
+2022-08-28 13:10:03 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
+2022-08-28 13:10:03 [32mDATA: [39m test-node.js result: performance: load: null total: 315
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: warmup face result match
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: warmup
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: warmup: body default
+2022-08-28 13:10:03 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:03 [32mDATA: [39m test-node.js result: performance: load: null total: 223
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: warmup body result match
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
+2022-08-28 13:10:03 [36mINFO: [39m test-node.js test: details verification
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js start default
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg default
+2022-08-28 13:10:03 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:03 [32mDATA: [39m test-node.js result: performance: load: null total: 206
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face length 1
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face score 1 0.93 1
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face age/gender 23.7 female 0.97 85.47
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face arrays 4 478 1024
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face anti-spoofing 0.79
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details face liveness 0.83
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details body length 1
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details body 0.92 17 6
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details hand length 1
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details hand 0.51 0.73 point
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details hand arrays 21 5 7
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details gesture length 7
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details gesture first {"face":0,"gesture":"facing right"}
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details object length 1
+2022-08-28 13:10:03 [35mSTATE:[39m test-node.js passed: details object 0.72 person
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js passed: tensor shape: [1200,1200,4] dtype: float32
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:04 [35mSTATE:[39m test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js passed: tensor shape: [1200,1200,3] dtype: float32
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32
+2022-08-28 13:10:05 [36mINFO: [39m test-node.js test default
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js start async
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:05 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg async
+2022-08-28 13:10:06 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:06 [32mDATA: [39m test-node.js result: performance: load: null total: 194
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: default result face match 1 female 0.97
+2022-08-28 13:10:06 [36mINFO: [39m test-node.js test sync
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js start sync
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg sync
+2022-08-28 13:10:06 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:06 [32mDATA: [39m test-node.js result: performance: load: null total: 190
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: default sync 1 female 0.97
+2022-08-28 13:10:06 [36mINFO: [39m test-node.js test: image process
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: image input null [1,256,256,3]
+2022-08-28 13:10:06 [36mINFO: [39m test-node.js test: image null
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: invalid input could not convert input to tensor
+2022-08-28 13:10:06 [36mINFO: [39m test-node.js test face similarity
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js start face similarity
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face similarity
+2022-08-28 13:10:06 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:06 [32mDATA: [39m test-node.js result: performance: load: null total: 182
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js start face similarity
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:06 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg face similarity
+2022-08-28 13:10:07 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:07 [32mDATA: [39m test-node.js result: performance: load: null total: 194
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js start face similarity
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg face similarity
+2022-08-28 13:10:07 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:07 [32mDATA: [39m test-node.js result: performance: load: null total: 169
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: face descriptor
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: face similarity {"similarity":[1,0.44727452329649126,0.5567935850640406],"descriptors":[1024,1024,1024]}
+2022-08-28 13:10:07 [36mINFO: [39m test-node.js test object
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js start object
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg object
+2022-08-28 13:10:07 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:07 [32mDATA: [39m test-node.js result: performance: load: null total: 186
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js passed: centernet
+2022-08-28 13:10:07 [35mSTATE:[39m test-node.js start object
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg object
+2022-08-28 13:10:08 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:08 [32mDATA: [39m test-node.js result: performance: load: null total: 196
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js passed: nanodet
+2022-08-28 13:10:08 [36mINFO: [39m test-node.js test sensitive
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js start sensitive
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:08 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg sensitive
+2022-08-28 13:10:09 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:09 [32mDATA: [39m test-node.js result: performance: load: null total: 151
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js passed: sensitive result match
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js passed: sensitive face result match
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js passed: sensitive body result match
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js passed: sensitive hand result match
+2022-08-28 13:10:09 [36mINFO: [39m test-node.js test body
+2022-08-28 13:10:09 [35mSTATE:[39m test-node.js start blazepose
+2022-08-28 13:10:11 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:11 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:11 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:11 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg blazepose
+2022-08-28 13:10:11 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39}
+2022-08-28 13:10:11 [32mDATA: [39m test-node.js result: performance: load: null total: 202
+2022-08-28 13:10:11 [35mSTATE:[39m test-node.js passed: blazepose
+2022-08-28 13:10:11 [35mSTATE:[39m test-node.js start efficientpose
+2022-08-28 13:10:12 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:12 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:12 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:12 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg efficientpose
+2022-08-28 13:10:12 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13}
+2022-08-28 13:10:12 [32mDATA: [39m test-node.js result: performance: load: null total: 229
+2022-08-28 13:10:12 [35mSTATE:[39m test-node.js passed: efficientpose
+2022-08-28 13:10:12 [35mSTATE:[39m test-node.js start posenet
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg posenet
+2022-08-28 13:10:13 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16}
+2022-08-28 13:10:13 [32mDATA: [39m test-node.js result: performance: load: null total: 171
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: posenet
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js start movenet
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg movenet
+2022-08-28 13:10:13 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:13 [32mDATA: [39m test-node.js result: performance: load: null total: 154
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: movenet
+2022-08-28 13:10:13 [36mINFO: [39m test-node.js test face matching
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: face database 40
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js passed: face match {"first":{"index":4,"similarity":0.7827852615252829}} {"second":{"index":4,"similarity":0.5002052633015844}} {"third":{"index":4,"similarity":0.5401587887998899}}
+2022-08-28 13:10:13 [36mINFO: [39m test-node.js test face similarity alternative
+2022-08-28 13:10:13 [35mSTATE:[39m test-node.js start face embeddings
+2022-08-28 13:10:14 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:14 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:14 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:14 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face embeddings
+2022-08-28 13:10:14 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:14 [32mDATA: [39m test-node.js result: performance: load: null total: 167
+2022-08-28 13:10:14 [35mSTATE:[39m test-node.js passed: mobilefacenet {"embedding":192}
+2022-08-28 13:10:14 [35mSTATE:[39m test-node.js start face embeddings
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face embeddings
+2022-08-28 13:10:15 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:15 [32mDATA: [39m test-node.js result: performance: load: null total: 174
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js passed: insightface {"embedding":512}
+2022-08-28 13:10:15 [36mINFO: [39m test-node.js test face attention
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js start face attention
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg face attention
+2022-08-28 13:10:15 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:15 [32mDATA: [39m test-node.js result: performance: load: null total: 154
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js passed: face attention
+2022-08-28 13:10:15 [36mINFO: [39m test-node.js test detectors
+2022-08-28 13:10:15 [35mSTATE:[39m test-node.js start detectors
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg detectors
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: performance: load: null total: 75
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: detector result face match
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: detector result hand match
+2022-08-28 13:10:16 [36mINFO: [39m test-node.js test: multi-instance
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start multi instance
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: detect: random multi instance
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: performance: load: null total: 82
+2022-08-28 13:10:16 [36mINFO: [39m test-node.js test: first instance
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start multi instance
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg multi instance
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: performance: load: null total: 80
+2022-08-28 13:10:16 [36mINFO: [39m test-node.js test: second instance
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start multi instance
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg multi instance
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:16 [32mDATA: [39m test-node.js result: performance: load: null total: 79
+2022-08-28 13:10:16 [36mINFO: [39m test-node.js test: concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js start concurrent
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:16 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024}
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:17 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 924
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 924
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 924
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 924
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 924
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 924
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 678
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 678
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:18 [32mDATA: [39m test-node.js result: performance: load: null total: 678
+2022-08-28 13:10:18 [36mINFO: [39m test-node.js test: monkey-patch
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js event: image
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js event: detect
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: monkey patch
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: segmentation [65536]
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passeed: equal usage
+2022-08-28 13:10:18 [36mINFO: [39m test-node.js test: input compare
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864}
+2022-08-28 13:10:18 [35mSTATE:[39m test-node.js passed: image compare 0 23.275441687091504
+2022-08-28 13:10:18 [36mINFO: [39m test-node.js events: {"image":29,"detect":29,"warmup":2}
+2022-08-28 13:10:18 [36mINFO: [39m test-node.js tensors 4105
+2022-08-28 13:10:18 [36mINFO: [39m test-node.js test complete: 15623 ms
+2022-08-28 13:10:18 [36mINFO: [39m
+2022-08-28 13:10:18 [36mINFO: [39m test-node-gpu.js start
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js test: configuration validation
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: configuration default validation []
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js test: model load
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}]
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js memory: {"memory":{"unreliable":true,"numTensors":1921,"numDataBuffers":1921,"numBytes":63673064}}
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63673064,"numTensors":1921,"numStringTensors":0,"numDataBuffers":1921,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}}
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js test: warmup
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: create human
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js human version: 2.9.4
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js platform: linux x64 agent: NodeJS v18.1.0
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js tfjs version: 3.20.0
+2022-08-28 13:10:19 [36mINFO: [39m test-node-gpu.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.1.0","backends":["cpu","tensorflow"],"initial":false,"tfjs":{"version":"3.20.0"},"offscreen":false,"perfadd":false,"tensorflow":{"version":"2.7.3-dev20220521","gpu":true},"wasm":{"supported":true,"backend":false},"webgl":{"supported":false,"backend":false},"webgpu":{"supported":false,"backend":false},"cpu":{"flags":[]},"kernels":169}
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: set backend: tensorflow
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js tensors 1921
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: load models
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js result: defined models: 23 loaded models: 12
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: warmup: none default
+2022-08-28 13:10:19 [32mDATA: [39m test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
+2022-08-28 13:10:19 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: null
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js passed: warmup none result match
+2022-08-28 13:10:19 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: warmup
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: warmup: face default
+2022-08-28 13:10:24 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4}
+2022-08-28 13:10:24 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 4115
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: warmup face result match
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: warmup
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: warmup: body default
+2022-08-28 13:10:24 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:24 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 133
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: warmup body result match
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
+2022-08-28 13:10:24 [36mINFO: [39m test-node-gpu.js test: details verification
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js start default
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg default
+2022-08-28 13:10:24 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:24 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 129
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face length 1
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face score 1 0.93 1
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face arrays 4 478 1024
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face anti-spoofing 0.79
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details face liveness 0.83
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details body length 1
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details body 0.92 17 6
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details hand length 1
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details hand 0.51 0.73 point
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details hand arrays 21 5 7
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details gesture length 7
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"}
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details object length 1
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: details object 0.72 person
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928}
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:24 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928}
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:25 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32
+2022-08-28 13:10:26 [36mINFO: [39m test-node-gpu.js test default
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js start async
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg async
+2022-08-28 13:10:26 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:26 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 141
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js passed: default result face match 1 female 0.97
+2022-08-28 13:10:26 [36mINFO: [39m test-node-gpu.js test sync
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js start sync
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:26 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg sync
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 162
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: default sync 1 female 0.97
+2022-08-28 13:10:27 [36mINFO: [39m test-node-gpu.js test: image process
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: image input null [1,256,256,3]
+2022-08-28 13:10:27 [36mINFO: [39m test-node-gpu.js test: image null
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: invalid input could not convert input to tensor
+2022-08-28 13:10:27 [36mINFO: [39m test-node-gpu.js test face similarity
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js start face similarity
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 158
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js start face similarity
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 163
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js start face similarity
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:27 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 134
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: face descriptor
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js passed: face similarity {"similarity":[1,0.447238756461232,0.556914029877052],"descriptors":[1024,1024,1024]}
+2022-08-28 13:10:27 [36mINFO: [39m test-node-gpu.js test object
+2022-08-28 13:10:27 [35mSTATE:[39m test-node-gpu.js start object
+2022-08-28 13:10:28 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:28 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:28 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:28 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg object
+2022-08-28 13:10:28 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:28 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 205
+2022-08-28 13:10:28 [35mSTATE:[39m test-node-gpu.js passed: centernet
+2022-08-28 13:10:28 [35mSTATE:[39m test-node-gpu.js start object
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg object
+2022-08-28 13:10:29 [32mDATA: [39m test-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-08-28 13:10:29 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 481
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: nanodet
+2022-08-28 13:10:29 [36mINFO: [39m test-node-gpu.js test sensitive
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js start sensitive
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg sensitive
+2022-08-28 13:10:29 [32mDATA: [39m test-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-08-28 13:10:29 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 109
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: sensitive result match
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: sensitive face result match
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}]
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: sensitive body result match
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js passed: sensitive hand result match
+2022-08-28 13:10:29 [36mINFO: [39m test-node-gpu.js test body
+2022-08-28 13:10:29 [35mSTATE:[39m test-node-gpu.js start blazepose
+2022-08-28 13:10:31 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:31 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:31 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:31 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg blazepose
+2022-08-28 13:10:31 [32mDATA: [39m test-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-08-28 13:10:31 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 231
+2022-08-28 13:10:31 [35mSTATE:[39m test-node-gpu.js passed: blazepose
+2022-08-28 13:10:31 [35mSTATE:[39m test-node-gpu.js start efficientpose
+2022-08-28 13:10:32 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:32 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg efficientpose
+2022-08-28 13:10:33 [32mDATA: [39m test-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-08-28 13:10:33 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 845
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: efficientpose
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js start posenet
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg posenet
+2022-08-28 13:10:33 [32mDATA: [39m test-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-08-28 13:10:33 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 116
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: posenet
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js start movenet
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg movenet
+2022-08-28 13:10:33 [32mDATA: [39m test-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-08-28 13:10:33 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 94
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: movenet
+2022-08-28 13:10:33 [36mINFO: [39m test-node-gpu.js test face matching
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: face database 40
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.7828184453007331}} {"second":{"index":4,"similarity":0.5001334216773398}} {"third":{"index":4,"similarity":0.5403054967489764}}
+2022-08-28 13:10:33 [36mINFO: [39m test-node-gpu.js test face similarity alternative
+2022-08-28 13:10:33 [35mSTATE:[39m test-node-gpu.js start face embeddings
+2022-08-28 13:10:34 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:34 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:34 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:34 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face embeddings
+2022-08-28 13:10:34 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:34 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 143
+2022-08-28 13:10:34 [35mSTATE:[39m test-node-gpu.js passed: mobilefacenet {"embedding":192}
+2022-08-28 13:10:34 [35mSTATE:[39m test-node-gpu.js start face embeddings
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face embeddings
+2022-08-28 13:10:35 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:35 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 158
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: insightface {"embedding":512}
+2022-08-28 13:10:35 [36mINFO: [39m test-node-gpu.js test face attention
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js start face attention
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg face attention
+2022-08-28 13:10:35 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:35 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 198
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: face attention
+2022-08-28 13:10:35 [36mINFO: [39m test-node-gpu.js test detectors
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js start detectors
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg detectors
+2022-08-28 13:10:35 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:35 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 49
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: detector result face match
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js passed: detector result hand match
+2022-08-28 13:10:35 [36mINFO: [39m test-node-gpu.js test: multi-instance
+2022-08-28 13:10:35 [35mSTATE:[39m test-node-gpu.js start multi instance
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: detect: random multi instance
+2022-08-28 13:10:36 [32mDATA: [39m test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
+2022-08-28 13:10:36 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 50
+2022-08-28 13:10:36 [36mINFO: [39m test-node-gpu.js test: first instance
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start multi instance
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg multi instance
+2022-08-28 13:10:36 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:36 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 44
+2022-08-28 13:10:36 [36mINFO: [39m test-node-gpu.js test: second instance
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start multi instance
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg multi instance
+2022-08-28 13:10:36 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:36 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 52
+2022-08-28 13:10:36 [36mINFO: [39m test-node-gpu.js test: concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js start concurrent
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
+2022-08-28 13:10:36 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056}
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 674
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 674
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 675
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 675
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 675
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 675
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 412
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 412
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:37 [32mDATA: [39m test-node-gpu.js result: performance: load: null total: 412
+2022-08-28 13:10:37 [36mINFO: [39m test-node-gpu.js test: monkey-patch
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: image
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js event: detect
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: monkey patch
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: segmentation [65536]
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passeed: equal usage
+2022-08-28 13:10:37 [36mINFO: [39m test-node-gpu.js test: input compare
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120}
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928}
+2022-08-28 13:10:37 [35mSTATE:[39m test-node-gpu.js passed: image compare 0 23.275441687091504
+2022-08-28 13:10:37 [36mINFO: [39m test-node-gpu.js events: {"image":29,"detect":29,"warmup":2}
+2022-08-28 13:10:37 [36mINFO: [39m test-node-gpu.js tensors 4105
+2022-08-28 13:10:37 [36mINFO: [39m test-node-gpu.js test complete: 18316 ms
+2022-08-28 13:10:39 [36mINFO: [39m
+2022-08-28 13:10:39 [36mINFO: [39m test-node-wasm.js start
+2022-08-28 13:10:39 [32mDATA: [39m test-node-wasm.js stdout: 2022-08-28 13:10:39 [36mINFO: [39m { supported: [33mtrue[39m, backend: [33mtrue[39m, simd: [33mtrue[39m, multithread: [33mfalse[39m }
+2022-08-28 13:10:39 [35mSTATE:[39m test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/
+2022-08-28 13:10:39 [36mINFO: [39m test-node-wasm.js test: configuration validation
+2022-08-28 13:10:39 [35mSTATE:[39m test-node-wasm.js passed: configuration default validation []
+2022-08-28 13:10:39 [35mSTATE:[39m test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}]
+2022-08-28 13:10:39 [36mINFO: [39m test-node-wasm.js test: model load
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"https://vladmandic.github.io/human/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/emotion.json"},{"name":"facedetect","loaded":true,"url":"https://vladmandic.github.io/human/models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"https://vladmandic.github.io/human/models/iris.json"},{"name":"facemesh","loaded":true,"url":"https://vladmandic.github.io/human/models/facemesh.json"},{"name":"faceres","loaded":true,"url":"https://vladmandic.github.io/human/models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"https://vladmandic.github.io/human/models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"https://vladmandic.github.io/human/models/handtrack.json"},{"name":"liveness","loaded":true,"url":"https://vladmandic.github.io/human/models/liveness.json"},{"name":"movenet","loaded":true,"url":"https://vladmandic.github.io/human/models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"https://vladmandic.github.io/human/models/selfie.json"},{"name":"antispoof","loaded":true,"url":"https://vladmandic.github.io/human/models/antispoof.json"}]
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js memory: {"memory":{"unreliable":false,"numTensors":1921,"numDataBuffers":1921,"numBytes":63673064}}
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js state: {"state":{"registeredVariables":{},"nextTapeNodeId":0,"numBytes":63673064,"numTensors":1921,"numStringTensors":0,"numDataBuffers":1921,"gradientDepth":0,"kernelDepth":0,"scopeStack":[],"numDataMovesStack":[],"nextScopeId":0,"tensorInfo":{},"profiling":false,"activeProfile":{"newBytes":0,"newTensors":0,"peakBytes":0,"kernels":[],"result":null,"kernelNames":[]}}}
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js test: warmup
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js passed: create human
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js human version: 2.9.4
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js platform: linux x64 agent: NodeJS v18.1.0
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js tfjs version: 3.20.0
+2022-08-28 13:10:41 [36mINFO: [39m test-node-wasm.js env: {"browser":false,"node":true,"platform":"linux x64","agent":"NodeJS v18.1.0","backends":["cpu","wasm"],"initial":false,"tfjs":{"version":"3.20.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-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js passed: set backend: wasm
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js tensors 1921
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js passed: load models
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js result: defined models: 23 loaded models: 12
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js passed: warmup: none default
+2022-08-28 13:10:41 [32mDATA: [39m test-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {}
+2022-08-28 13:10:41 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: null
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js passed: warmup none result match
+2022-08-28 13:10:41 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js event: warmup
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js passed: warmup: face default
+2022-08-28 13:10:42 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:42 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 483
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js passed: warmup face result match
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js event: warmup
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js passed: warmup: body default
+2022-08-28 13:10:42 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:42 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 354
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js passed: warmup body result match
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 21% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]}
+2022-08-28 13:10:42 [36mINFO: [39m test-node-wasm.js test: details verification
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js start default
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:42 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg default
+2022-08-28 13:10:43 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:43 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 359
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face length 1
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face score 1 0.93 1
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face age/gender 23.7 female 0.97 85.47
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face arrays 4 478 1024
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"}
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face anti-spoofing 0.79
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details face liveness 0.83
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details body length 1
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details body 0.92 17 6
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details hand length 1
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details hand 0.51 0.73 point
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details hand arrays 21 5 7
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details gesture length 7
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"}
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details object length 1
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: details object 0.72 person
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264}
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264}
+2022-08-28 13:10:43 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:44 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871}
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32
+2022-08-28 13:10:45 [36mINFO: [39m test-node-wasm.js test default
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js start async
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:45 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg async
+2022-08-28 13:10:46 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:46 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 323
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: default result face match 1 female 0.97
+2022-08-28 13:10:46 [36mINFO: [39m test-node-wasm.js test sync
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js start sync
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg sync
+2022-08-28 13:10:46 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:46 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 328
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: default sync 1 female 0.97
+2022-08-28 13:10:46 [36mINFO: [39m test-node-wasm.js test: image process
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: image input null [1,256,256,3]
+2022-08-28 13:10:46 [36mINFO: [39m test-node-wasm.js test: image null
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: invalid input could not convert input to tensor
+2022-08-28 13:10:46 [36mINFO: [39m test-node-wasm.js test face similarity
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js start face similarity
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:46 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face similarity
+2022-08-28 13:10:47 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:47 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 300
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js start face similarity
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg face similarity
+2022-08-28 13:10:47 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:47 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 336
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js start face similarity
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
+2022-08-28 13:10:47 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg face similarity
+2022-08-28 13:10:48 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:48 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 305
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js passed: face descriptor
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js passed: face similarity {"similarity":[1,0.5266119940661309,0.4858842904087851],"descriptors":[1024,1024,1024]}
+2022-08-28 13:10:48 [36mINFO: [39m test-node-wasm.js test object
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js start object
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg object
+2022-08-28 13:10:48 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:48 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 331
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js passed: centernet
+2022-08-28 13:10:48 [35mSTATE:[39m test-node-wasm.js start object
+2022-08-28 13:10:49 [33mWARN: [39m test-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-08-28 13:10:49 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:49 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg object
+2022-08-28 13:10:50 [32mDATA: [39m test-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-08-28 13:10:50 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 213
+2022-08-28 13:10:50 [31mERROR:[39m test-node-wasm.js failed: nanodet []
+2022-08-28 13:10:50 [36mINFO: [39m test-node-wasm.js test sensitive
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js start sensitive
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg sensitive
+2022-08-28 13:10:50 [32mDATA: [39m test-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-08-28 13:10:50 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 250
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: sensitive result match
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: sensitive face result match
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: sensitive face emotion result [{"score":0.46,"emotion":"neutral"},{"score":0.24,"emotion":"fear"},{"score":0.17,"emotion":"sad"}]
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: sensitive body result match
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js passed: sensitive hand result match
+2022-08-28 13:10:50 [36mINFO: [39m test-node-wasm.js test body
+2022-08-28 13:10:50 [35mSTATE:[39m test-node-wasm.js start blazepose
+2022-08-28 13:10:52 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:52 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:52 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:52 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg blazepose
+2022-08-28 13:10:52 [32mDATA: [39m test-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-08-28 13:10:52 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 404
+2022-08-28 13:10:52 [35mSTATE:[39m test-node-wasm.js passed: blazepose
+2022-08-28 13:10:52 [35mSTATE:[39m test-node-wasm.js start efficientpose
+2022-08-28 13:10:53 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:53 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:54 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:54 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg efficientpose
+2022-08-28 13:10:54 [32mDATA: [39m test-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-08-28 13:10:54 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 656
+2022-08-28 13:10:54 [35mSTATE:[39m test-node-wasm.js passed: efficientpose
+2022-08-28 13:10:54 [35mSTATE:[39m test-node-wasm.js start posenet
+2022-08-28 13:10:54 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:54 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg posenet
+2022-08-28 13:10:55 [32mDATA: [39m test-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-08-28 13:10:55 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 282
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: posenet
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js start movenet
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg movenet
+2022-08-28 13:10:55 [32mDATA: [39m test-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-08-28 13:10:55 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 248
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: movenet
+2022-08-28 13:10:55 [36mINFO: [39m test-node-wasm.js test face matching
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: face database 40
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.7827852754786533}} {"second":{"index":4,"similarity":0.5660821189104794}} {"third":{"index":4,"similarity":0.45074189882665594}}
+2022-08-28 13:10:55 [36mINFO: [39m test-node-wasm.js test face similarity alternative
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js start face embeddings
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:55 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:56 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:56 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face embeddings
+2022-08-28 13:10:56 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:56 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 257
+2022-08-28 13:10:56 [35mSTATE:[39m test-node-wasm.js passed: mobilefacenet {"embedding":192}
+2022-08-28 13:10:56 [35mSTATE:[39m test-node-wasm.js start face embeddings
+2022-08-28 13:10:56 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:56 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face embeddings
+2022-08-28 13:10:57 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 0 person: 1 {"score":1,"age":23.5,"gender":"female"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:57 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 281
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js passed: insightface {"embedding":512}
+2022-08-28 13:10:57 [36mINFO: [39m test-node-wasm.js test face attention
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js start face attention
+2022-08-28 13:10:57 [33mWARN: [39m test-node-wasm.js missing kernel ops {"title":"face attention","model":"facemesh","url":"https://vladmandic.github.io/human-models/models/facemesh-attention.json","missing":["atan2"],"backkend":"wasm"}
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg face attention
+2022-08-28 13:10:57 [32mDATA: [39m test-node-wasm.js result: face: 0 body: 1 hand: 1 gesture: 2 object: 0 person: 0 {} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:10:57 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 114
+2022-08-28 13:10:57 [31mERROR:[39m test-node-wasm.js failed: face attention {"annotations":0}
+2022-08-28 13:10:57 [36mINFO: [39m test-node-wasm.js test detectors
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js start detectors
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:57 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg detectors
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 115
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: detector result face match
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: detector result hand match
+2022-08-28 13:10:58 [36mINFO: [39m test-node-wasm.js test: multi-instance
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start multi instance
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: detect: random multi instance
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0}
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 92
+2022-08-28 13:10:58 [36mINFO: [39m test-node-wasm.js test: first instance
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start multi instance
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg multi instance
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 104
+2022-08-28 13:10:58 [36mINFO: [39m test-node-wasm.js test: second instance
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start multi instance
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg multi instance
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:10:58 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 105
+2022-08-28 13:10:58 [36mINFO: [39m test-node-wasm.js test: concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js start concurrent
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:58 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104}
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:10:59 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1269
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1269
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1269
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1269
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1269
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 1269
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-upper.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 967
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-face.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 967
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: detect: samples/in/ai-body.jpg concurrent
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17}
+2022-08-28 13:11:00 [32mDATA: [39m test-node-wasm.js result: performance: load: null total: 967
+2022-08-28 13:11:00 [36mINFO: [39m test-node-wasm.js test: monkey-patch
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js event: image
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js event: detect
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: monkey patch
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: segmentation [65536]
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passeed: equal usage
+2022-08-28 13:11:00 [36mINFO: [39m test-node-wasm.js test: input compare
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856}
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856}
+2022-08-28 13:11:00 [35mSTATE:[39m test-node-wasm.js passed: image compare 0 23.280073018790848
+2022-08-28 13:11:00 [36mINFO: [39m test-node-wasm.js events: {"image":29,"detect":29,"warmup":2}
+2022-08-28 13:11:00 [36mINFO: [39m test-node-wasm.js tensors 4107
+2022-08-28 13:11:00 [36mINFO: [39m test-node-wasm.js test complete: 21212 ms
+2022-08-28 13:11:00 [35mSTATE:[39m all tests complete
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/nodejs/node.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/nodejs/node-simple.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/nodejs/node-fetch.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/nodejs/node-event.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/nodejs/node-similarity.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/nodejs/node-canvas.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/multithread/node-multiprocess.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"../demo/facematch/node-match.js","passed":1,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"test-node.js","passed":125,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"test-node-gpu.js","passed":125,"failed":0}
+2022-08-28 13:11:00 [36mINFO: [39m status {"test":"test-node-wasm.js","passed":124,"failed":2}
+2022-08-28 13:11:00 [36mINFO: [39m failures {"count":2}
+2022-08-28 13:11:00 [33mWARN: [39m failed {"test":"test-node-wasm.js","message":["error",["failed: nanodet",[]]]}
+2022-08-28 13:11:00 [33mWARN: [39m failed {"test":"test-node-wasm.js","message":["error",["failed: face attention",{"annotations":0}]]}
diff --git a/typedoc/assets/main.js b/typedoc/assets/main.js
index c815b334..abd0485a 100644
--- a/typedoc/assets/main.js
+++ b/typedoc/assets/main.js
@@ -1,5 +1,5 @@
"use strict";
-(()=>{var Qe=Object.create;var ae=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var _e=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ce(e))!Re.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Qe(Oe(t)):{},Me(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var de=_e((ce,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var h=t.utils.clone(n)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(r.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index.
+"use strict";(()=>{var Qe=Object.create;var ae=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var _e=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ce(e))!Re.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Qe(Oe(t)):{},Me(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var de=_e((ce,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var h=t.utils.clone(n)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(r.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index.
`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(n+=r[l+1]*i[h+1],l+=2,h+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),m=s.str.charAt(1),v;m in s.node.edges?v=s.node.edges[m]:(v=new t.TokenSet,s.node.edges[m]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ce=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});var le=[];function j(t,e){le.push({selector:e,constructor:t})}var Y=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r}),r.dataset.hasInstance=String(!0))})})}};var k=class{constructor(e){this.el=e.el}};var J=class{constructor(){this.listeners={}}addEventListener(e,n){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(n)}removeEventListener(e,n){if(!(e in this.listeners))return;let r=this.listeners[e];for(let i=0,s=r.length;i{let n=Date.now();return(...r)=>{n+e-Date.now()<0&&(t(...r),n=Date.now())}};var re=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.navigation=document.querySelector(".col-menu"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.searchInput=document.querySelector("#tsd-search input"),this.searchInput&&this.searchInput.addEventListener("focus",()=>{this.hideShowToolbar()}),this.onResize(),this.onScroll()}triggerResize(){let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onScroll(){this.scrollTop=window.scrollY||0;let n=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(n),this.hideShowToolbar()}hideShowToolbar(){let n=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0||!!this.searchInput&&this.searchInput===document.activeElement,n!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.navigation?.classList.toggle("col-menu--hide")),this.lastY=this.scrollTop}},R=re;R.instance=new re;var X=class extends k{constructor(n){super(n);this.anchors=[];this.index=-1;R.instance.addEventListener("resize",()=>this.onResize()),R.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substring(0,n.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let i=r.href;if(i.indexOf("#")==-1||i.substring(0,n.length)!=n)return;let s=i.substring(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=r.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let n;for(let i=0,s=this.anchors.length;ii.position-s.position);let r=new CustomEvent("scroll",{detail:{scrollTop:R.instance.scrollTop}});this.onScroll(r)}onScroll(n){let r=n.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>r;)o-=1;for(;o-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ue=(t,e=100)=>{let n;return(...r)=>{clearTimeout(n),n=setTimeout(()=>t(r),e)}};var me=De(de());function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let n=document.querySelector("#tsd-search input"),r=document.querySelector("#tsd-search .results");if(!n||!r)throw new Error("The input field or the result list wrapper was not found");let i=!1;r.addEventListener("mousedown",()=>i=!0),r.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),n.addEventListener("focus",()=>t.classList.add("has-focus")),n.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Fe(t,r,n,s)}function Fe(t,e,n,r){n.addEventListener("input",ue(()=>{Ae(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?fe(e,-1):s.key==="ArrowDown"?fe(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=me.Index.load(window.searchData.index))}function Ae(t,e,n,r){if(He(r,t),!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s=i?r.index.search(`*${i}*`):[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o${pe(u.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=u.classes??"";let m=document.createElement("a");m.href=r.base+u.url,m.innerHTML=l,h.append(m),e.appendChild(h)}}function fe(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function pe(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ie(t.substring(s,o)),`${ie(t.substring(o,o+r.length))} `),s=o+r.length,o=n.indexOf(r,s);return i.push(ie(t.substring(s))),i.join("")}var Ne={"&":"&","<":"<",">":">","'":"'",'"':"""};function ie(t){return t.replace(/[&<>"'"]/g,e=>Ne[e])}var F="mousedown",ye="mousemove",B="mouseup",Z={x:0,y:0},ge=!1,se=!1,je=!1,H=!1,xe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(xe?"is-mobile":"not-mobile");xe&&"ontouchstart"in document.documentElement&&(je=!0,F="touchstart",ye="touchmove",B="touchend");document.addEventListener(F,t=>{se=!0,H=!1;let e=F=="touchstart"?t.targetTouches[0]:t;Z.y=e.pageY||0,Z.x=e.pageX||0});document.addEventListener(ye,t=>{if(!!se&&!H){let e=F=="touchstart"?t.targetTouches[0]:t,n=Z.x-(e.pageX||0),r=Z.y-(e.pageY||0);H=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{se=!1});document.addEventListener("click",t=>{ge&&(t.preventDefault(),t.stopImmediatePropagation(),ge=!1)});var K=class extends k{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(B,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){H||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!H&&this.active&&n.target.closest(".col-menu")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var oe;try{oe=localStorage}catch{oe={getItem(){return null},setItem(){}}}var Q=oe;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var ee=class extends k{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; }
`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var te=class extends k{constructor(n){super(n);this.calculateHeights(),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.textContent.replace(/\s+/g,"-").toLowerCase()}`,this.setLocalStorage(this.fromLocalStorage(),!0),this.summary.addEventListener("click",r=>this.toggleVisibility(r)),this.icon.style.transform=this.getIconRotation()}getIconRotation(n=this.el.open){return`rotate(${n?0:-90}deg)`}calculateHeights(){let n=this.el.open,{position:r,left:i}=this.el.style;this.el.style.position="fixed",this.el.style.left="-9999px",this.el.open=!0,this.expandedHeight=this.el.offsetHeight+"px",this.el.open=!1,this.collapsedHeight=this.el.offsetHeight+"px",this.el.open=n,this.el.style.height=n?this.expandedHeight:this.collapsedHeight,this.el.style.position=r,this.el.style.left=i}toggleVisibility(n){n.preventDefault(),this.el.style.overflow="hidden",this.el.open?this.collapse():this.expand()}expand(n=!0){this.el.open=!0,this.animate(this.collapsedHeight,this.expandedHeight,{opening:!0,duration:n?300:0})}collapse(n=!0){this.animate(this.expandedHeight,this.collapsedHeight,{opening:!1,duration:n?300:0})}animate(n,r,{opening:i,duration:s=300}){if(this.animation)return;let o={duration:s,easing:"ease"};this.animation=this.el.animate({height:[n,r]},o),this.icon.animate({transform:[this.icon.style.transform||this.getIconRotation(!i),this.getIconRotation(i)]},o).addEventListener("finish",()=>{this.icon.style.transform=this.getIconRotation(i)}),this.animation.addEventListener("finish",()=>this.animationEnd(i))}animationEnd(n){this.el.open=n,this.animation=void 0,this.el.style.height="auto",this.el.style.overflow="visible",this.setLocalStorage(n)}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.open}setLocalStorage(n,r=!1){this.fromLocalStorage()===n&&!r||(Q.setItem(this.key,n.toString()),this.el.open=n,this.handleValueChange(r))}handleValueChange(n=!1){this.fromLocalStorage()===this.el.open&&!n||(this.fromLocalStorage()?this.expand(!1):this.collapse(!1))}};function be(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,Ee(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),Ee(t.value)})}function Ee(t){document.documentElement.dataset.theme=t}ve();j(X,".menu-highlight");j(K,"a[data-toggle]");j(te,".tsd-index-accordion");j(ee,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("theme");Se&&be(Se);var Be=new Y;Object.defineProperty(window,"app",{value:Be});})();
/*!
diff --git a/typedoc/classes/GraphModel.html b/typedoc/classes/GraphModel.html
index bb771c65..7276e1e1 100644
--- a/typedoc/classes/GraphModel.html
+++ b/typedoc/classes/GraphModel.html
@@ -20,12 +20,12 @@ SavedModel GraphDef and allows inference execution.
a TensorFlow SavedModel using
the command line converter tool and loaded via tf.loadGraphModel
.
-Doc
+Doc
Type Parameters
-ModelURL extends Url = string | io.IOHandler
+ModelURL extends Url = string | io.IOHandler
Hierarchy
@@ -78,9 +78,11 @@ the command line converter tool and loaded via tf.loadGraphModel
.
Type Parameters
+
+Type Parameters
-ModelURL extends Url = string | IOHandler
+ModelURL extends Url = string | IOHandler
+Doc
+
Hierarchy
@@ -359,9 +359,11 @@ changing the input data or create a copy with copy = tf.add(yourTensor, 0)
+
Parameters
@@ -463,9 +465,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -481,9 +485,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -499,9 +505,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -517,9 +525,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -535,9 +545,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -557,9 +569,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -579,9 +593,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -597,9 +613,11 @@ numpy.ndarray.strides.html
+
Parameters
@@ -639,9 +657,11 @@ synchronously.
+
Returns Tensor1D
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as1d.d.ts:21
@@ -652,9 +672,11 @@ synchronously.
+
Parameters
@@ -672,9 +694,11 @@ synchronously.
+
Parameters
@@ -694,9 +718,11 @@ synchronously.
+
Parameters
@@ -718,9 +744,11 @@ synchronously.
+
Parameters
@@ -744,9 +772,11 @@ synchronously.
+
Returns Scalar
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as_scalar.d.ts:21
@@ -757,9 +787,11 @@ synchronously.
+
Parameters
@@ -777,9 +809,11 @@ synchronously.
+
Parameters
@@ -795,9 +829,11 @@ synchronously.
+
Parameters
@@ -813,9 +849,11 @@ synchronously.
+
Parameters
@@ -831,9 +869,11 @@ synchronously.
+
Parameters
@@ -849,9 +889,11 @@ synchronously.
+
Parameters
@@ -867,9 +909,11 @@ synchronously.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -891,9 +935,11 @@ synchronously.
+
Parameters
@@ -917,9 +963,11 @@ synchronously.
+R extends Rank
Parameters
@@ -937,9 +985,11 @@ synchronously.
+R extends Rank
Parameters
@@ -958,9 +1008,11 @@ synchronously.
Doc
Type Parameters
+
+Type Parameters
-D extends keyof DataTypeMap = "float32"
+D extends keyof DataTypeMap = "float32"
Returns Promise < TensorBuffer < R , D > >
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/tensor.d.ts:172
@@ -974,9 +1026,11 @@ synchronously.
Doc
Type Parameters
+
+Type Parameters
-D extends keyof DataTypeMap = "float32"
+D extends keyof DataTypeMap = "float32"
Returns TensorBuffer < R , D >
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/tensor.d.ts:177
@@ -997,9 +1051,11 @@ synchronously.
+
Parameters
@@ -1015,9 +1071,11 @@ synchronously.
+
Parameters
@@ -1033,9 +1091,11 @@ synchronously.
+
Parameters
@@ -1056,9 +1116,11 @@ synchronously.
Doc
+
Parameters
@@ -1074,9 +1136,11 @@ synchronously.
+
Parameters
@@ -1094,9 +1158,11 @@ synchronously.
Type Parameters
+
+Type Parameters
-T extends Tensor2D | Tensor3D
+T extends Tensor2D | Tensor3D
Parameters
@@ -1122,9 +1188,11 @@ synchronously.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -1150,9 +1218,11 @@ synchronously.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -1176,9 +1246,11 @@ synchronously.
+
Parameters
@@ -1194,9 +1266,11 @@ synchronously.
+
Parameters
@@ -1212,9 +1286,11 @@ synchronously.
+R extends Rank
Parameters
@@ -1234,9 +1310,11 @@ synchronously.
+R extends Rank
Parameters
@@ -1260,9 +1338,11 @@ promise of TypedArray
that resolves when the computation has finish
Doc
Type Parameters
+
+Type Parameters
-D extends keyof DataTypeMap = NumericDataType
+D extends keyof DataTypeMap = NumericDataType
Returns Promise < DataTypeMap [ D ] >
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/tensor.d.ts:198
@@ -1277,9 +1357,11 @@ UI thread until the values are ready, which can cause performance issues.
Doc
Type Parameters
+
+Type Parameters
-D extends keyof DataTypeMap = NumericDataType
+D extends keyof DataTypeMap = NumericDataType
Returns DataTypeMap [ D ]
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/tensor.d.ts:242
@@ -1321,9 +1403,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1341,9 +1425,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -1369,9 +1455,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -1406,9 +1494,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1424,9 +1514,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1442,9 +1534,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1460,9 +1554,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Returns T
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/elu.d.ts:5
@@ -1473,9 +1569,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1491,9 +1589,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1509,9 +1609,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1531,9 +1633,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1549,9 +1653,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1567,9 +1673,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1585,9 +1693,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1603,9 +1713,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Returns Tensor1D
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/flatten.d.ts:21
@@ -1616,9 +1728,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1634,9 +1748,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1652,9 +1768,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1674,9 +1792,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1692,9 +1812,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1710,9 +1832,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1728,9 +1852,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1746,9 +1872,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1764,9 +1892,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1782,9 +1912,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1800,9 +1932,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1818,9 +1952,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1836,9 +1972,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1854,9 +1992,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1878,9 +2018,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1896,9 +2038,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1914,9 +2058,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1932,9 +2078,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1952,9 +2100,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1974,9 +2124,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -1992,9 +2144,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Returns T
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_not.d.ts:5
@@ -2005,9 +2159,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2023,9 +2179,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2041,9 +2199,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2063,9 +2223,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2083,9 +2245,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -2107,9 +2271,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2125,9 +2291,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2145,9 +2313,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2165,9 +2335,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2183,9 +2355,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2203,9 +2377,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2221,9 +2397,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2239,9 +2417,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2257,9 +2437,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2279,9 +2461,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2314,9 +2498,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2332,9 +2518,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2352,9 +2540,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -2380,9 +2570,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2398,9 +2590,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2435,9 +2629,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2457,9 +2653,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2475,9 +2673,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Returns T
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/relu.d.ts:5
@@ -2488,9 +2688,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Returns T
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/relu6.d.ts:5
@@ -2501,9 +2703,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2519,9 +2723,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2537,9 +2743,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -2559,9 +2767,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -2581,9 +2791,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2601,9 +2813,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2619,9 +2833,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2637,9 +2853,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2655,9 +2873,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Returns T
Defined in node_modules/.pnpm/@tensorflow+tfjs-core@3.20.0/node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/selu.d.ts:5
@@ -2668,9 +2888,11 @@ parameter, so can not use an user defined size to create the buffer.
Type Parameters
+
+Type Parameters
-T extends Tensor3D | Tensor4D
+T extends Tensor3D | Tensor4D
Parameters
@@ -2696,9 +2918,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2714,9 +2938,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2732,9 +2958,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2750,9 +2978,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2768,9 +2998,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2790,9 +3022,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2810,9 +3044,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2828,9 +3064,11 @@ parameter, so can not use an user defined size to create the buffer.
+R extends Rank
Parameters
@@ -2848,9 +3086,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2868,9 +3108,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2886,9 +3128,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2904,9 +3148,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2922,9 +3168,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2940,9 +3188,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2960,9 +3210,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -2980,9 +3232,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3014,9 +3268,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3032,9 +3288,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3052,9 +3310,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3070,9 +3330,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3096,9 +3358,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3114,9 +3378,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3132,9 +3398,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3150,9 +3418,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3184,9 +3454,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3211,9 +3483,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3229,9 +3503,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3254,9 +3530,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3276,9 +3554,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3311,9 +3591,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
@@ -3331,9 +3613,11 @@ parameter, so can not use an user defined size to create the buffer.
+
Parameters
diff --git a/typedoc/interfaces/BodyConfig.html b/typedoc/interfaces/BodyConfig.html
index db3c3244..502df274 100644
--- a/typedoc/interfaces/BodyConfig.html
+++ b/typedoc/interfaces/BodyConfig.html
@@ -20,8 +20,10 @@
Hierarchy
diff --git a/typedoc/interfaces/FaceAntiSpoofConfig.html b/typedoc/interfaces/FaceAntiSpoofConfig.html
index c950f88e..27857d67 100644
--- a/typedoc/interfaces/FaceAntiSpoofConfig.html
+++ b/typedoc/interfaces/FaceAntiSpoofConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceAntiSpoofConfig
diff --git a/typedoc/interfaces/FaceAttentionConfig.html b/typedoc/interfaces/FaceAttentionConfig.html
index f133f6bf..775b17ab 100644
--- a/typedoc/interfaces/FaceAttentionConfig.html
+++ b/typedoc/interfaces/FaceAttentionConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceAttentionConfig
diff --git a/typedoc/interfaces/FaceConfig.html b/typedoc/interfaces/FaceConfig.html
index 7af740d4..cb8e4444 100644
--- a/typedoc/interfaces/FaceConfig.html
+++ b/typedoc/interfaces/FaceConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceConfig
diff --git a/typedoc/interfaces/FaceDescriptionConfig.html b/typedoc/interfaces/FaceDescriptionConfig.html
index 2c16338a..4fe2d0f0 100644
--- a/typedoc/interfaces/FaceDescriptionConfig.html
+++ b/typedoc/interfaces/FaceDescriptionConfig.html
@@ -23,8 +23,10 @@
Hierarchy
+FaceDescriptionConfig
diff --git a/typedoc/interfaces/FaceDetectorConfig.html b/typedoc/interfaces/FaceDetectorConfig.html
index 9955ec73..6811d2a2 100644
--- a/typedoc/interfaces/FaceDetectorConfig.html
+++ b/typedoc/interfaces/FaceDetectorConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceDetectorConfig
diff --git a/typedoc/interfaces/FaceEmotionConfig.html b/typedoc/interfaces/FaceEmotionConfig.html
index d0495e96..3ae0a1aa 100644
--- a/typedoc/interfaces/FaceEmotionConfig.html
+++ b/typedoc/interfaces/FaceEmotionConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceEmotionConfig
diff --git a/typedoc/interfaces/FaceGearConfig.html b/typedoc/interfaces/FaceGearConfig.html
index d0e66591..dc0f5926 100644
--- a/typedoc/interfaces/FaceGearConfig.html
+++ b/typedoc/interfaces/FaceGearConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceGearConfig
diff --git a/typedoc/interfaces/FaceIrisConfig.html b/typedoc/interfaces/FaceIrisConfig.html
index 4c982521..5a59491c 100644
--- a/typedoc/interfaces/FaceIrisConfig.html
+++ b/typedoc/interfaces/FaceIrisConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceIrisConfig
diff --git a/typedoc/interfaces/FaceLivenessConfig.html b/typedoc/interfaces/FaceLivenessConfig.html
index 1e6c578f..2b847e42 100644
--- a/typedoc/interfaces/FaceLivenessConfig.html
+++ b/typedoc/interfaces/FaceLivenessConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceLivenessConfig
diff --git a/typedoc/interfaces/FaceMeshConfig.html b/typedoc/interfaces/FaceMeshConfig.html
index 48243232..6f53d038 100644
--- a/typedoc/interfaces/FaceMeshConfig.html
+++ b/typedoc/interfaces/FaceMeshConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+FaceMeshConfig
diff --git a/typedoc/interfaces/GenericConfig.html b/typedoc/interfaces/GenericConfig.html
index a09a11b3..98017d5d 100644
--- a/typedoc/interfaces/GenericConfig.html
+++ b/typedoc/interfaces/GenericConfig.html
@@ -20,6 +20,8 @@
Hierarchy
+SegmentationConfig
diff --git a/typedoc/interfaces/HandConfig.html b/typedoc/interfaces/HandConfig.html
index 769c0247..b78585fc 100644
--- a/typedoc/interfaces/HandConfig.html
+++ b/typedoc/interfaces/HandConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+HandConfig
diff --git a/typedoc/interfaces/ObjectConfig.html b/typedoc/interfaces/ObjectConfig.html
index f5755143..657a5e32 100644
--- a/typedoc/interfaces/ObjectConfig.html
+++ b/typedoc/interfaces/ObjectConfig.html
@@ -20,8 +20,10 @@
Hierarchy
+ObjectConfig
diff --git a/typedoc/interfaces/SegmentationConfig.html b/typedoc/interfaces/SegmentationConfig.html
index 5b8515f9..344e80db 100644
--- a/typedoc/interfaces/SegmentationConfig.html
+++ b/typedoc/interfaces/SegmentationConfig.html
@@ -24,8 +24,10 @@ remove background or replace it with user-provided background
Hierarchy