From ad90d3fc3e0616e943dcd9f2aac8f47685b4f1ef Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 10 Aug 2022 13:44:38 -0400 Subject: [PATCH] rehault testing framework --- CHANGELOG.md | 7 +- TODO.md | 4 + demo/faceid/index.js | 327 ++++++++++- demo/faceid/index.js.map | 4 +- demo/multithread/node-multiprocess.js | 2 +- demo/typescript/index.js | 106 +++- demo/typescript/index.js.map | 6 +- demo/typescript/index.ts | 3 +- samples/out/ai-body.jpg | Bin 48975 -> 50958 bytes src/body/blazeposedetector.ts | 2 +- src/config.ts | 7 + src/draw/primitives.ts | 5 +- src/face/blazeface.ts | 2 +- src/face/facemesh.ts | 4 + src/face/match.ts | 1 + src/hand/handposedetector.ts | 2 +- src/hand/handtrack.ts | 2 +- src/human.ts | 7 + src/models.ts | 69 ++- src/object/centernet.ts | 2 +- src/object/nanodet.ts | 2 +- src/tfjs/backend.ts | 2 +- src/tfjs/load.ts | 2 + src/util/env.ts | 6 +- src/util/profile.ts | 6 +- src/warmup.ts | 3 +- test/build.log | 815 +++++++++++++++++++++++++- test/node.js | 57 +- test/test-main.js | 160 +++-- test/test-node-cpu.js | 28 + test/test.log | 766 ++++++++++++++---------- 31 files changed, 1948 insertions(+), 461 deletions(-) create mode 100644 test/test-node-cpu.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 9617cb21..969c023f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,13 @@ ## Changelog +### **HEAD -> main** 2022/08/08 mandic00@live.com + +- add insightface + ### **2.9.2** 2022/08/08 mandic00@live.com -### **origin/main** 2022/08/04 mandic00@live.com - - ### **release: 2.9.1** 2022/07/25 mandic00@live.com diff --git a/TODO.md b/TODO.md index 94aa8c67..35328b74 100644 --- a/TODO.md +++ b/TODO.md @@ -54,12 +54,16 @@ Feature is automatically disabled in **NodeJS** without user impact configurable using `config.face.insightface` config section see `demo/faceid/index.ts` for usage models can be downloaded from +- Add `human.check()` which validates all kernel ops for currently loaded models with currently selected backend + Example: `console.error(human.check());` - Fix **MobileFaceNet** model as alternative for face embedding/descriptor detection configurable using `config.face.mobilefacenet` config section - Fix **EfficientPose** module as alternative body detection - Fix **NanoDet** module as alternative object detection +- Fix `demo/multithread/node-multiprocess.js` demo - Fix `human.match` when using mixed descriptor lengths - Increased test coverage run using `npm run test` +- Update **NMS** methods resulting in some performance improvements - Update profiling methods in `human.profile()` - Update project dependencies diff --git a/demo/faceid/index.js b/demo/faceid/index.js index efe3d385..f898fb1e 100644 --- a/demo/faceid/index.js +++ b/demo/faceid/index.js @@ -4,6 +4,329 @@ author: ' */ -import{Human as H}from"../../dist/human.esm.js";var l,R="human",p="person",g=(...t)=>console.log("indexdb",...t);async function v(){return l?!0:new Promise(t=>{let i=indexedDB.open(R,1);i.onerror=n=>g("error:",n),i.onupgradeneeded=n=>{g("create:",n.target),l=n.target.result,l.createObjectStore(p,{keyPath:"id",autoIncrement:!0})},i.onsuccess=n=>{l=n.target.result,g("open:",l),t(!0)}})}async function x(){let t=[];return l||await v(),new Promise(i=>{let n=l.transaction([p],"readwrite").objectStore(p).openCursor(null,"next");n.onerror=s=>g("load error:",s),n.onsuccess=s=>{s.target.result?(t.push(s.target.result.value),s.target.result.continue()):i(t)}})}async function y(){return l||await v(),new Promise(t=>{let i=l.transaction([p],"readwrite").objectStore(p).count();i.onerror=n=>g("count error:",n),i.onsuccess=()=>t(i.result)})}async function C(t){l||await v();let i={name:t.name,descriptor:t.descriptor,image:t.image};l.transaction([p],"readwrite").objectStore(p).put(i),g("save:",i)}async function D(t){l||await v(),l.transaction([p],"readwrite").objectStore(p).delete(t.id),g("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}},I={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,...I},o={faceCount:!1,faceConfidence:!1,facingCenter:!1,lookingCenter:!1,blinkDetected:!1,faceSize:!1,antispoofCheck:!1,livenessCheck:!1,elapsedMs:0},M=()=>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},a=new H(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},E=0,m=(...t)=>{e.log.innerText+=t.join(" ")+` -`,console.log(...t)},k=t=>e.fps.innerText=t;async function S(){k("starting webcam...");let t={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},i=await navigator.mediaDevices.getUserMedia(t),n=new Promise(s=>{e.video.onloadeddata=()=>s(!0)});e.video.srcObject=i,e.video.play(),await n,e.canvas.width=e.video.videoWidth,e.canvas.height=e.video.videoHeight,a.env.initial&&m("video:",e.video.videoWidth,e.video.videoHeight,"|",i.getVideoTracks()[0].label),e.canvas.onclick=()=>{e.video.paused?e.video.play():e.video.pause()}}async function T(){if(!e.video.paused){r.face&&r.face.tensor&&a.tf.dispose(r.face.tensor),await a.detect(e.video);let t=a.now();h.detect=1e3/(t-w.detect),w.detect=t,requestAnimationFrame(T)}}async function L(){let t=await a.next(a.result);await a.draw.canvas(e.video,e.canvas),await a.draw.all(e.canvas,t);let i=a.now();if(h.draw=1e3/(i-w.draw),w.draw=i,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 s=Object.values(a.result.gesture).map(f=>f.gesture);(s.includes("blink left eye")||s.includes("blink right eye"))&&(u.start=a.now()),u.start>0&&!s.includes("blink left eye")&&!s.includes("blink right eye")&&(u.end=a.now()),o.blinkDetected=o.blinkDetected||Math.abs(u.end-u.start)>c.blinkMin&&Math.abs(u.end-u.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 n=32;for(let[s,f]of Object.entries(o)){let d=document.getElementById(`ok-${s}`);d||(d=document.createElement("div"),d.innerText=s,d.className="ok",d.style.top=`${n}px`,e.ok.appendChild(d)),typeof f=="boolean"?d.style.backgroundColor=f?"lightgreen":"lightcoral":d.innerText=`${s}:${f}`,n+=28}return M()||o.elapsedMs>c.maxTime?(e.video.pause(),a.result.face[0]):(o.elapsedMs=Math.trunc(a.now()-E),new Promise(s=>{setTimeout(async()=>{await L()&&s(a.result.face[0])},30)}))}async function z(){var t,i,n,s;if(e.name.value.length>0){let f=(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:(i=r.face)==null?void 0:i.embedding,image:f};await C(d),m("saved face record:",d.name,"descriptor length:",(s=(n=r.face)==null?void 0:n.embedding)==null?void 0:s.length),m("known face records:",await y())}else m("invalid name")}async function P(){r.record&&r.record.id>0&&await D(r.record)}async function j(){var s,f;if((s=e.canvas.getContext("2d"))==null||s.clearRect(0,0,c.minSize,c.minSize),!r.face||!r.face.tensor||!r.face.embedding)return!1;if(console.log("face record:",r.face),a.tf.browser.toPixels(r.face.tensor,e.canvas),await y()===0)return m("face database is empty"),document.body.style.background="black",e.delete.style.display="none",!1;let t=await x(),i=t.map(d=>d.descriptor).filter(d=>d.length>0),n=await a.match(r.face.embedding,i,I);return r.record=t[n.index]||null,r.record&&(m(`best match: ${r.record.name} | id: ${r.record.id} | similarity: ${Math.round(1e3*n.similarity)/10}%`),e.name.value=r.record.name,e.source.style.display="",(f=e.source.getContext("2d"))==null||f.putImageData(r.record.image,0,0)),document.body.style.background=n.similarity>c.threshold?"darkgreen":"maroon",n.similarity>c.threshold}async function B(){var t,i,n,s;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 S(),await T(),E=a.now(),r.face=await L(),e.canvas.width=((i=(t=r.face)==null?void 0:t.tensor)==null?void 0:i.shape[1])||c.minSize,e.canvas.height=((s=(n=r.face)==null?void 0:n.tensor)==null?void 0:s.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",M()?j():(m("did not find valid face"),!1)}async function q(){var t,i,n;m("human version:",a.version,"| tfjs version:",a.tf.version["tfjs-core"]),m("face embedding model:",(t=b.face.description)!=null&&t.enabled?"faceres":"",(i=b.face.mobilefacenet)!=null&&i.enabled?"mobilefacenet":"",(n=b.face.insightface)!=null&&n.enabled?"insightface":""),m("options:",JSON.stringify(c).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),k("loading..."),m("known face records:",await y()),await S(),await a.load(),k("initializing..."),e.retry.addEventListener("click",B),e.save.addEventListener("click",z),e.delete.addEventListener("click",P),await a.warmup(),await B()}window.onload=q; +// demo/faceid/index.ts +import { Human } from "../../dist/human.esm.js"; + +// demo/faceid/indexdb.ts +var db; +var database = "human"; +var table = "person"; +var log = (...msg) => console.log("indexdb", ...msg); +async function open() { + if (db) + return true; + return new Promise((resolve) => { + const request = indexedDB.open(database, 1); + request.onerror = (evt) => log("error:", evt); + request.onupgradeneeded = (evt) => { + log("create:", evt.target); + db = evt.target.result; + db.createObjectStore(table, { keyPath: "id", autoIncrement: true }); + }; + request.onsuccess = (evt) => { + db = evt.target.result; + log("open:", db); + resolve(true); + }; + }); +} +async function load() { + const faceDB = []; + if (!db) + await open(); + return new Promise((resolve) => { + const cursor = db.transaction([table], "readwrite").objectStore(table).openCursor(null, "next"); + cursor.onerror = (evt) => log("load error:", evt); + cursor.onsuccess = (evt) => { + if (evt.target.result) { + faceDB.push(evt.target.result.value); + evt.target.result.continue(); + } else { + resolve(faceDB); + } + }; + }); +} +async function count() { + if (!db) + await open(); + return new Promise((resolve) => { + const store = db.transaction([table], "readwrite").objectStore(table).count(); + store.onerror = (evt) => log("count error:", evt); + store.onsuccess = () => resolve(store.result); + }); +} +async function save(faceRecord) { + if (!db) + await open(); + const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; + db.transaction([table], "readwrite").objectStore(table).put(newRecord); + log("save:", newRecord); +} +async function remove(faceRecord) { + if (!db) + await open(); + db.transaction([table], "readwrite").objectStore(table).delete(faceRecord.id); + log("delete:", faceRecord); +} + +// demo/faceid/index.ts +var humanConfig = { + modelBasePath: "../../models", + filter: { equalization: true }, + face: { + enabled: true, + detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, + description: { enabled: true }, + iris: { enabled: true }, + emotion: { enabled: false }, + antispoof: { enabled: true }, + liveness: { enabled: true } + }, + body: { enabled: false }, + hand: { enabled: false }, + object: { enabled: false }, + gesture: { enabled: true } +}; +var matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; +var options = { + minConfidence: 0.6, + minSize: 224, + maxTime: 1e4, + blinkMin: 10, + blinkMax: 800, + threshold: 0.5, + mask: humanConfig.face.detector.mask, + rotation: humanConfig.face.detector.rotation, + cropFactor: humanConfig.face.detector.cropFactor, + ...matchOptions +}; +var ok = { + faceCount: false, + faceConfidence: false, + facingCenter: false, + lookingCenter: false, + blinkDetected: false, + faceSize: false, + antispoofCheck: false, + livenessCheck: false, + elapsedMs: 0 +}; +var allOk = () => ok.faceCount && ok.faceSize && ok.blinkDetected && ok.facingCenter && ok.lookingCenter && ok.faceConfidence && ok.antispoofCheck && ok.livenessCheck; +var current = { face: null, record: null }; +var blink = { + start: 0, + end: 0, + time: 0 +}; +var human = new Human(humanConfig); +human.env["perfadd"] = false; +human.draw.options.font = 'small-caps 18px "Lato"'; +human.draw.options.lineHeight = 20; +var dom = { + 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") +}; +var timestamp = { detect: 0, draw: 0 }; +var fps = { detect: 0, draw: 0 }; +var startTime = 0; +var log2 = (...msg) => { + dom.log.innerText += msg.join(" ") + "\n"; + console.log(...msg); +}; +var printFPS = (msg) => dom.fps.innerText = msg; +async function webCam() { + printFPS("starting webcam..."); + const cameraOptions = { audio: false, video: { facingMode: "user", resizeMode: "none", width: { ideal: document.body.clientWidth } } }; + const stream = await navigator.mediaDevices.getUserMedia(cameraOptions); + const ready = new Promise((resolve) => { + dom.video.onloadeddata = () => resolve(true); + }); + dom.video.srcObject = stream; + dom.video.play(); + await ready; + dom.canvas.width = dom.video.videoWidth; + dom.canvas.height = dom.video.videoHeight; + if (human.env.initial) + log2("video:", dom.video.videoWidth, dom.video.videoHeight, "|", stream.getVideoTracks()[0].label); + dom.canvas.onclick = () => { + if (dom.video.paused) + dom.video.play(); + else + dom.video.pause(); + }; +} +async function detectionLoop() { + if (!dom.video.paused) { + if (current.face && current.face.tensor) + human.tf.dispose(current.face.tensor); + await human.detect(dom.video); + const now = human.now(); + fps.detect = 1e3 / (now - timestamp.detect); + timestamp.detect = now; + requestAnimationFrame(detectionLoop); + } +} +async function validationLoop() { + const interpolated = await human.next(human.result); + await human.draw.canvas(dom.video, dom.canvas); + await human.draw.all(dom.canvas, interpolated); + const now = human.now(); + fps.draw = 1e3 / (now - timestamp.draw); + timestamp.draw = now; + printFPS(`fps: ${fps.detect.toFixed(1).padStart(5, " ")} detect | ${fps.draw.toFixed(1).padStart(5, " ")} draw`); + ok.faceCount = human.result.face.length === 1; + if (ok.faceCount) { + const gestures = Object.values(human.result.gesture).map((gesture) => gesture.gesture); + if (gestures.includes("blink left eye") || gestures.includes("blink right eye")) + blink.start = human.now(); + if (blink.start > 0 && !gestures.includes("blink left eye") && !gestures.includes("blink right eye")) + blink.end = human.now(); + ok.blinkDetected = ok.blinkDetected || Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax; + if (ok.blinkDetected && blink.time === 0) + blink.time = Math.trunc(blink.end - blink.start); + ok.facingCenter = gestures.includes("facing center"); + ok.lookingCenter = gestures.includes("looking center"); + ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence; + ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence; + ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence; + ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize; + } + let y = 32; + for (const [key, val] of Object.entries(ok)) { + let el = document.getElementById(`ok-${key}`); + if (!el) { + el = document.createElement("div"); + el.innerText = key; + el.className = "ok"; + el.style.top = `${y}px`; + dom.ok.appendChild(el); + } + if (typeof val === "boolean") + el.style.backgroundColor = val ? "lightgreen" : "lightcoral"; + else + el.innerText = `${key}:${val}`; + y += 28; + } + if (allOk()) { + dom.video.pause(); + return human.result.face[0]; + } + if (ok.elapsedMs > options.maxTime) { + dom.video.pause(); + return human.result.face[0]; + } else { + ok.elapsedMs = Math.trunc(human.now() - startTime); + return new Promise((resolve) => { + setTimeout(async () => { + const res = await validationLoop(); + if (res) + resolve(human.result.face[0]); + }, 30); + }); + } +} +async function saveRecords() { + var _a, _b, _c, _d; + if (dom.name.value.length > 0) { + const image = (_a = dom.canvas.getContext("2d")) == null ? void 0 : _a.getImageData(0, 0, dom.canvas.width, dom.canvas.height); + const rec = { id: 0, name: dom.name.value, descriptor: (_b = current.face) == null ? void 0 : _b.embedding, image }; + await save(rec); + log2("saved face record:", rec.name, "descriptor length:", (_d = (_c = current.face) == null ? void 0 : _c.embedding) == null ? void 0 : _d.length); + log2("known face records:", await count()); + } else { + log2("invalid name"); + } +} +async function deleteRecord() { + if (current.record && current.record.id > 0) { + await remove(current.record); + } +} +async function detectFace() { + var _a, _b; + (_a = dom.canvas.getContext("2d")) == null ? void 0 : _a.clearRect(0, 0, options.minSize, options.minSize); + if (!current.face || !current.face.tensor || !current.face.embedding) + return false; + console.log("face record:", current.face); + human.tf.browser.toPixels(current.face.tensor, dom.canvas); + if (await count() === 0) { + log2("face database is empty"); + document.body.style.background = "black"; + dom.delete.style.display = "none"; + return false; + } + const db2 = await load(); + const descriptors = db2.map((rec) => rec.descriptor).filter((desc) => desc.length > 0); + const res = await human.match(current.face.embedding, descriptors, matchOptions); + current.record = db2[res.index] || null; + if (current.record) { + log2(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1e3 * res.similarity) / 10}%`); + dom.name.value = current.record.name; + dom.source.style.display = ""; + (_b = dom.source.getContext("2d")) == null ? void 0 : _b.putImageData(current.record.image, 0, 0); + } + document.body.style.background = res.similarity > options.threshold ? "darkgreen" : "maroon"; + return res.similarity > options.threshold; +} +async function main() { + var _a, _b, _c, _d; + ok.faceCount = false; + ok.faceConfidence = false; + ok.facingCenter = false; + ok.blinkDetected = false; + ok.faceSize = false; + ok.antispoofCheck = false; + ok.livenessCheck = false; + ok.elapsedMs = 0; + dom.match.style.display = "none"; + dom.retry.style.display = "none"; + dom.source.style.display = "none"; + document.body.style.background = "black"; + await webCam(); + await detectionLoop(); + startTime = human.now(); + current.face = await validationLoop(); + dom.canvas.width = ((_b = (_a = current.face) == null ? void 0 : _a.tensor) == null ? void 0 : _b.shape[1]) || options.minSize; + dom.canvas.height = ((_d = (_c = current.face) == null ? void 0 : _c.tensor) == null ? void 0 : _d.shape[0]) || options.minSize; + dom.source.width = dom.canvas.width; + dom.source.height = dom.canvas.height; + dom.canvas.style.width = ""; + dom.match.style.display = "flex"; + dom.save.style.display = "flex"; + dom.delete.style.display = "flex"; + dom.retry.style.display = "block"; + if (!allOk()) { + log2("did not find valid face"); + return false; + } else { + return detectFace(); + } +} +async function init() { + var _a, _b, _c; + log2("human version:", human.version, "| tfjs version:", human.tf.version["tfjs-core"]); + log2("face embedding model:", ((_a = humanConfig.face["description"]) == null ? void 0 : _a.enabled) ? "faceres" : "", ((_b = humanConfig.face["mobilefacenet"]) == null ? void 0 : _b.enabled) ? "mobilefacenet" : "", ((_c = humanConfig.face["insightface"]) == null ? void 0 : _c.enabled) ? "insightface" : ""); + log2("options:", JSON.stringify(options).replace(/{|}|"|\[|\]/g, "").replace(/,/g, " ")); + printFPS("loading..."); + log2("known face records:", await count()); + await webCam(); + await human.load(); + printFPS("initializing..."); + dom.retry.addEventListener("click", main); + dom.save.addEventListener("click", saveRecords); + dom.delete.addEventListener("click", deleteRecord); + await human.warmup(); + await main(); +} +window.onload = init; //# sourceMappingURL=index.js.map diff --git a/demo/faceid/index.js.map b/demo/faceid/index.js.map index 708d5f43..0f0832c2 100644 --- a/demo/faceid/index.js.map +++ b/demo/faceid/index.js.map @@ -2,6 +2,6 @@ "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 { Human, TensorLike, FaceResult } 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: 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 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 // eslint-disable-next-line no-console\n console.log(...msg);\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 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) 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 && 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 = await human.next(human.result); // smoothen result using last-known results\n await 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) => 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 } else { // run again\n ok.elapsedMs = Math.trunc(human.now() - startTime);\n return new Promise((resolve) => {\n setTimeout(async () => {\n const res = await validationLoop(); // run validation loop until conditions are met\n if (res) 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}\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 // eslint-disable-next-line no-console\n console.log('face record:', current.face);\n human.tf.browser.toPixels(current.face.tensor as unknown as 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 = await 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 } else {\n return detectFace();\n }\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 type FaceRecord = { id: number, name: string, descriptor: number[], image: ImageData };\n\n// eslint-disable-next-line no-console\nconst log = (...msg) => console.log('indexdb', ...msg);\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 as IDBDatabase;\n log('open:', db);\n resolve(true);\n };\n });\n}\n\nexport async function load(): Promise {\n const faceDB: Array = [];\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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", - "names": ["Human", "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", "Human", "dom", "timestamp", "fps", "startTime", "log", "msg", "printFPS", "webCam", "cameraOptions", "stream", "ready", "resolve", "detectionLoop", "now", "validationLoop", "interpolated", "gestures", "gesture", "y", "key", "val", "el", "saveRecords", "_a", "_b", "_c", "_d", "image", "rec", "save", "count", "deleteRecord", "remove", "detectFace", "db", "load", "descriptors", "desc", "res", "main", "init"] + "mappings": "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", + "names": ["log", "db"] } diff --git a/demo/multithread/node-multiprocess.js b/demo/multithread/node-multiprocess.js index 3dc6cdea..fb01aec8 100644 --- a/demo/multithread/node-multiprocess.js +++ b/demo/multithread/node-multiprocess.js @@ -13,7 +13,7 @@ const log = require('@vladmandic/pilogger'); // this is my simple logger with fe const child_process = require('child_process'); // note that main process does not import human or tfjs at all, it's all done from worker process -const workerFile = 'demo/nodejs/node-multiprocess-worker.js'; +const workerFile = 'demo/multithread/node-multiprocess-worker.js'; const imgPathRoot = './assets'; // modify to include your sample images const numWorkers = 4; // how many workers will be started const workers = []; // this holds worker processes diff --git a/demo/typescript/index.js b/demo/typescript/index.js index 042f59ee..2c86c503 100644 --- a/demo/typescript/index.js +++ b/demo/typescript/index.js @@ -4,6 +4,108 @@ author: ' */ -import{Human as p}from"../../dist/human.esm.js";var w={async:!0,modelBasePath:"../../models",filter:{enabled:!0,equalization:!1,flip:!1},face:{enabled:!0,detector:{rotation:!1},mesh:{enabled:!0},attention:{enabled:!1},iris:{enabled:!0},description:{enabled:!0},emotion:{enabled:!0}},body:{enabled:!0},hand:{enabled:!0},object:{enabled:!1},gesture:{enabled:!0}},e=new p(w);e.env.perfadd=!1;e.draw.options.font='small-caps 18px "Lato"';e.draw.options.lineHeight=20;var t={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("status"),perf:document.getElementById("performance")},n={detect:0,draw:0,tensors:0,start:0},o={detectFPS:0,drawFPS:0,frames:0,averageMs:0},i=(...a)=>{t.log.innerText+=a.join(" ")+` -`,console.log(...a)},r=a=>t.fps.innerText=a,b=a=>t.perf.innerText="tensors:"+e.tf.memory().numTensors+" | performance: "+JSON.stringify(a).replace(/"|{|}/g,"").replace(/,/g," | ");async function h(){r("starting webcam...");let a={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth},height:{ideal:document.body.clientHeight}}},d=await navigator.mediaDevices.getUserMedia(a),m=new Promise(u=>{t.video.onloadeddata=()=>u(!0)});t.video.srcObject=d,t.video.play(),await m,t.canvas.width=t.video.videoWidth,t.canvas.height=t.video.videoHeight;let s=d.getVideoTracks()[0],f=s.getCapabilities?s.getCapabilities():"",v=s.getSettings?s.getSettings():"",g=s.getConstraints?s.getConstraints():"";i("video:",t.video.videoWidth,t.video.videoHeight,s.label,{stream:d,track:s,settings:v,constraints:g,capabilities:f}),t.canvas.onclick=()=>{t.video.paused?t.video.play():t.video.pause()}}async function c(){if(!t.video.paused){n.start===0&&(n.start=e.now()),await e.detect(t.video);let a=e.tf.memory().numTensors;a-n.tensors!==0&&i("allocated tensors:",a-n.tensors),n.tensors=a,o.detectFPS=Math.round(1e3*1e3/(e.now()-n.detect))/1e3,o.frames++,o.averageMs=Math.round(1e3*(e.now()-n.start)/o.frames)/1e3,o.frames%100===0&&!t.video.paused&&i("performance",{...o,tensors:n.tensors})}n.detect=e.now(),requestAnimationFrame(c)}async function l(){if(!t.video.paused){let d=await e.next(e.result);e.config.filter.flip?await e.draw.canvas(d.canvas,t.canvas):await e.draw.canvas(t.video,t.canvas),await e.draw.all(t.canvas,d),b(d.performance)}let a=e.now();o.drawFPS=Math.round(1e3*1e3/(a-n.draw))/1e3,n.draw=a,r(t.video.paused?"paused":`fps: ${o.detectFPS.toFixed(1).padStart(5," ")} detect | ${o.drawFPS.toFixed(1).padStart(5," ")} draw`),setTimeout(l,30)}async function M(){i("human version:",e.version,"| tfjs version:",e.tf.version["tfjs-core"]),i("platform:",e.env.platform,"| agent:",e.env.agent),r("loading..."),await e.load(),i("backend:",e.tf.getBackend(),"| available:",e.env.backends),i("models stats:",e.getModelStats()),i("models loaded:",Object.values(e.models).filter(a=>a!==null).length),r("initializing..."),await e.warmup(),await h(),await c(),await l()}window.onload=M; +// demo/typescript/index.ts +import { Human } from "../../dist/human.esm.js"; +var humanConfig = { + async: false, + modelBasePath: "../../models", + filter: { enabled: true, equalization: false, flip: false }, + face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } }, + body: { enabled: true }, + hand: { enabled: true }, + object: { enabled: false }, + gesture: { enabled: true } +}; +var human = new Human(humanConfig); +human.env["perfadd"] = false; +human.draw.options.font = 'small-caps 18px "Lato"'; +human.draw.options.lineHeight = 20; +var dom = { + video: document.getElementById("video"), + canvas: document.getElementById("canvas"), + log: document.getElementById("log"), + fps: document.getElementById("status"), + perf: document.getElementById("performance") +}; +var timestamp = { detect: 0, draw: 0, tensors: 0, start: 0 }; +var fps = { detectFPS: 0, drawFPS: 0, frames: 0, averageMs: 0 }; +var log = (...msg) => { + dom.log.innerText += msg.join(" ") + "\n"; + console.log(...msg); +}; +var status = (msg) => dom.fps.innerText = msg; +var perf = (msg) => dom.perf.innerText = "tensors:" + human.tf.memory().numTensors + " | performance: " + JSON.stringify(msg).replace(/"|{|}/g, "").replace(/,/g, " | "); +async function webCam() { + status("starting webcam..."); + const options = { audio: false, video: { facingMode: "user", resizeMode: "none", width: { ideal: document.body.clientWidth }, height: { ideal: document.body.clientHeight } } }; + const stream = await navigator.mediaDevices.getUserMedia(options); + const ready = new Promise((resolve) => { + dom.video.onloadeddata = () => resolve(true); + }); + dom.video.srcObject = stream; + dom.video.play(); + await ready; + dom.canvas.width = dom.video.videoWidth; + dom.canvas.height = dom.video.videoHeight; + const track = stream.getVideoTracks()[0]; + const capabilities = track.getCapabilities ? track.getCapabilities() : ""; + const settings = track.getSettings ? track.getSettings() : ""; + const constraints = track.getConstraints ? track.getConstraints() : ""; + log("video:", dom.video.videoWidth, dom.video.videoHeight, track.label, { stream, track, settings, constraints, capabilities }); + dom.canvas.onclick = () => { + if (dom.video.paused) + dom.video.play(); + else + dom.video.pause(); + }; +} +async function detectionLoop() { + if (!dom.video.paused) { + if (timestamp.start === 0) + timestamp.start = human.now(); + await human.detect(dom.video); + const tensors = human.tf.memory().numTensors; + if (tensors - timestamp.tensors !== 0) + log("allocated tensors:", tensors - timestamp.tensors); + timestamp.tensors = tensors; + fps.detectFPS = Math.round(1e3 * 1e3 / (human.now() - timestamp.detect)) / 1e3; + fps.frames++; + fps.averageMs = Math.round(1e3 * (human.now() - timestamp.start) / fps.frames) / 1e3; + if (fps.frames % 100 === 0 && !dom.video.paused) + log("performance", { ...fps, tensors: timestamp.tensors }); + } + timestamp.detect = human.now(); + requestAnimationFrame(detectionLoop); +} +async function drawLoop() { + if (!dom.video.paused) { + const interpolated = await human.next(human.result); + if (human.config.filter.flip) + await human.draw.canvas(interpolated.canvas, dom.canvas); + else + await human.draw.canvas(dom.video, dom.canvas); + await human.draw.all(dom.canvas, interpolated); + perf(interpolated.performance); + } + const now = human.now(); + fps.drawFPS = Math.round(1e3 * 1e3 / (now - timestamp.draw)) / 1e3; + timestamp.draw = now; + status(dom.video.paused ? "paused" : `fps: ${fps.detectFPS.toFixed(1).padStart(5, " ")} detect | ${fps.drawFPS.toFixed(1).padStart(5, " ")} draw`); + setTimeout(drawLoop, 30); +} +async function main() { + log("human version:", human.version, "| tfjs version:", human.tf.version["tfjs-core"]); + log("platform:", human.env.platform, "| agent:", human.env.agent); + status("loading..."); + await human.load(); + log("backend:", human.tf.getBackend(), "| available:", human.env.backends); + log("models stats:", human.getModelStats()); + log("models loaded:", Object.values(human.models).filter((model) => model !== null).length); + status("initializing..."); + await human.warmup(); + await webCam(); + await detectionLoop(); + await drawLoop(); +} +window.onload = main; //# sourceMappingURL=index.js.map diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map index f410639d..c2554622 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 { Human, Config } 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: true,\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 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 // eslint-disable-next-line no-console\n console.log(...msg);\n};\nconst status = (msg) => dom.fps.innerText = msg; // print status element\nconst perf = (msg) => dom.perf.innerText = 'tensors:' + human.tf.memory().numTensors + ' | 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 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) 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 = await human.next(human.result); // smoothen result using last-known results\n if (human.config.filter.flip) await human.draw.canvas(interpolated.canvas as HTMLCanvasElement, dom.canvas); // draw processed image to screen canvas\n else await 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 // requestAnimationFrame(drawLoop); // refresh at screen refresh rate\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": "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", - "names": ["Human", "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"] + "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport { Human, Config } 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 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 // eslint-disable-next-line no-console\n console.log(...msg);\n};\nconst status = (msg) => dom.fps.innerText = msg; // print status element\nconst perf = (msg) => dom.perf.innerText = 'tensors:' + human.tf.memory().numTensors + ' | 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 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) 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 = await human.next(human.result); // smoothen result using last-known results\n if (human.config.filter.flip) await human.draw.canvas(interpolated.canvas as HTMLCanvasElement, dom.canvas); // draw processed image to screen canvas\n else await 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": "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", + "names": [] } diff --git a/demo/typescript/index.ts b/demo/typescript/index.ts index 4107cd10..d487be9e 100644 --- a/demo/typescript/index.ts +++ b/demo/typescript/index.ts @@ -13,7 +13,7 @@ const humanConfig: Partial = { // user configuration for human, used to // backend: 'wasm' as const, // wasmPath: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.18.0/dist/', // cacheSensitivity: 0, - async: true, + async: false, modelBasePath: '../../models', filter: { enabled: true, equalization: false, flip: false }, face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } }, @@ -99,7 +99,6 @@ async function drawLoop() { // main screen refresh loop fps.drawFPS = Math.round(1000 * 1000 / (now - timestamp.draw)) / 1000; timestamp.draw = now; status(dom.video.paused ? 'paused' : `fps: ${fps.detectFPS.toFixed(1).padStart(5, ' ')} detect | ${fps.drawFPS.toFixed(1).padStart(5, ' ')} draw`); // write status - // requestAnimationFrame(drawLoop); // refresh at screen refresh rate setTimeout(drawLoop, 30); // use to slow down refresh from max refresh rate to target of 30 fps } diff --git a/samples/out/ai-body.jpg b/samples/out/ai-body.jpg index c74253b0adb3083116ffe0fab63bfd3d0109b3d5..7de0ed2ba33092ef48831c1e4ec8627886b79857 100644 GIT binary patch literal 50958 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 z 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 Y#Vm`?{&WCZ!LFK-RF-vX8h?NJFSp)4YybcN diff --git a/src/body/blazeposedetector.ts b/src/body/blazeposedetector.ts index 50fac822..70967536 100644 --- a/src/body/blazeposedetector.ts +++ b/src/body/blazeposedetector.ts @@ -71,7 +71,7 @@ export async function decode(boxesTensor: Tensor, logitsTensor: Tensor, config: detected.push({ box, boxRaw, score: scores[i] }); } /* - t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1); + t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1); const boxes = t.boxes.arraySync(); const scores = t.scores.dataSync(); const nms = t.nms.dataSync(); diff --git a/src/config.ts b/src/config.ts index d0415cf3..ea9c3238 100644 --- a/src/config.ts +++ b/src/config.ts @@ -273,6 +273,12 @@ export interface Config { */ cacheModels: boolean, + /** Validate kernel ops used in model during model load + * default: true + * any errors will be printed on console but will be treated as non-fatal + */ + validateModels: boolean, + /** Cache sensitivity * - values 0..1 where 0.01 means reset cache if input changed more than 1% * - set to 0 to disable caching @@ -314,6 +320,7 @@ const config: Config = { backend: '', modelBasePath: '', cacheModels: true, + validateModels: true, wasmPath: '', wasmPlatformFetch: false, debug: false, diff --git a/src/draw/primitives.ts b/src/draw/primitives.ts index 9d29c9ee..7238199a 100644 --- a/src/draw/primitives.ts +++ b/src/draw/primitives.ts @@ -16,11 +16,10 @@ export const getCanvasContext = (input: AnyCanvas) => { export const rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI); -export const colorDepth = (z: number | undefined, opt: DrawOptions): string => { +export const colorDepth = (z: number | undefined, opt: DrawOptions): string => { // performance optimization needed if (!opt.useDepth || typeof z === 'undefined') return opt.color; const rgb = Uint8ClampedArray.from([127 + (2 * z), 127 - (2 * z), 255]); - const color = `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${opt.alpha})`; - return color; + return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${opt.alpha})`; }; export function point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) { diff --git a/src/face/blazeface.ts b/src/face/blazeface.ts index 00f97d76..222d409a 100644 --- a/src/face/blazeface.ts +++ b/src/face/blazeface.ts @@ -75,7 +75,7 @@ export async function getBoxes(inputImage: Tensor, config: Config) { t.logits = tf.slice(t.batch, [0, 0], [-1, 1]); t.sigmoid = tf.sigmoid(t.logits); t.scores = tf.squeeze(t.sigmoid); - t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0)); + t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0)); const nms = await t.nms.array() as number[]; const boxes: Array = []; const scores = await t.scores.data(); diff --git a/src/face/facemesh.ts b/src/face/facemesh.ts index 5a03c665..d4fc1230 100644 --- a/src/face/facemesh.ts +++ b/src/face/facemesh.ts @@ -87,6 +87,10 @@ export async function predict(input: Tensor, config: Config): Promise; const confidenceT = results.find((t) => t.shape[t.shape.length - 1] === 1) as Tensor; const faceConfidence = await confidenceT.data(); diff --git a/src/face/match.ts b/src/face/match.ts index 42a22f06..a773ffb7 100644 --- a/src/face/match.ts +++ b/src/face/match.ts @@ -11,6 +11,7 @@ export type MatchOptions = { order?: number, threshold?: number, multiplier?: nu */ export function distance(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25 }) { // general minkowski distance, euclidean distance is limited case where order is 2 + if (!descriptor1 || !descriptor1) return Number.MAX_SAFE_INTEGER; let sum = 0; for (let i = 0; i < descriptor1.length; i++) { const diff = (!options.order || options.order === 2) ? (descriptor1[i] - descriptor2[i]) : (Math.abs(descriptor1[i] - descriptor2[i])); diff --git a/src/hand/handposedetector.ts b/src/hand/handposedetector.ts index 81a11597..bcf762a6 100644 --- a/src/hand/handposedetector.ts +++ b/src/hand/handposedetector.ts @@ -67,7 +67,7 @@ export class HandDetector { t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]); t.norm = this.normalizeBoxes(t.boxes); // box detection is flaky so we look for 3x boxes than we need results - t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence); + t.nms = tf.image.nonMaxSuppression(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence); const nms = await t.nms.array() as Array; const hands: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number }> = []; for (const index of nms) { diff --git a/src/hand/handtrack.ts b/src/hand/handtrack.ts index 71f83755..f32c9e4a 100644 --- a/src/hand/handtrack.ts +++ b/src/hand/handtrack.ts @@ -121,7 +121,7 @@ async function detectHands(input: Tensor, config: Config): Promise { } } -export async function validate(instance: Human): Promise { - interface Op { name: string, category: string, op: string } +let instance: Human; +type Missing = { name: string, url: string, missing: string[], ops: string[] } + +export function validateModel(newInstance: Human | null, model: GraphModel | null, name: string): Missing | null { + if (newInstance) instance = newInstance; + if (!model) return null; + if (!instance) log('instance not registred'); + if (!instance.config.validateModels) return null; const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div']; + const ignoreOps = ['biasadd', 'fusedbatchnormv3', 'matmul']; + const ops: string[] = []; + const missing: string[] = []; + interface Op { name: string, category: string, op: string } + // @ts-ignore // modelUrl is a private method + const url = model.modelUrl; + // @ts-ignore // executor is a private method + const executor = model.executor; + if (executor && executor.graph.nodes) { + for (const kernel of Object.values(executor.graph.nodes)) { + const op = (kernel as Op).op.toLowerCase(); + if (!ops.includes(op)) ops.push(op); + } + } else { + if (!executor && instance.config.debug) log('model signature not determined:', name); + } + for (const op of ops) { + if (!simpleOps.includes(op) // exclude simple ops + && !ignoreOps.includes(op) // exclude specific ops + && !instance.env.kernels.includes(op) // check actual kernel ops + && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _ + && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation + && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation + missing.push(op); + } + } + if (instance.config.debug && missing.length > 0) log('model validation failed:', name, missing); + return missing.length > 0 ? { name, missing, ops, url } : null; +} + +export function validate(newInstance: Human): Array<{ name: string, missing: string[] }> { + instance = newInstance; + const missing: Array = []; for (const defined of Object.keys(instance.models)) { const model: GraphModel | null = instance.models[defined as keyof Models] as GraphModel | null; if (!model) continue; - const ops: string[] = []; - // @ts-ignore // executor is a private method - const executor = model?.executor; - if (executor && executor.graph.nodes) { - for (const kernel of Object.values(executor.graph.nodes)) { - const op = (kernel as Op).op.toLowerCase(); - if (!ops.includes(op)) ops.push(op); - } - } else { - if (!executor && instance.config.debug) log('model signature not determined:', defined); - } - const missing: string[] = []; - for (const op of ops) { - if (!simpleOps.includes(op) // exclude simple ops - && !instance.env.kernels.includes(op) // check actual kernel ops - && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _ - && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation - && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation - missing.push(op); - } - } - // log('model validation ops:', defined, ops); - if (instance.config.debug && missing.length > 0) log('model validation failed:', defined, missing); + const res = validateModel(instance, model, defined); + if (res) missing.push(res); } + return missing; } diff --git a/src/object/centernet.ts b/src/object/centernet.ts index e7cc0b04..eddafe1e 100644 --- a/src/object/centernet.ts +++ b/src/object/centernet.ts @@ -42,7 +42,7 @@ async function process(res: Tensor | null, outputShape: [number, number], config t.scores = tf.squeeze(arr[4]); t.classes = tf.squeeze(arr[5]); tf.dispose([res, ...arr]); - t.nms = await tf.image.nonMaxSuppressionAsync(t.boxes, t.scores, config.object.maxDetected, config.object.iouThreshold, (config.object.minConfidence || 0)); + t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, config.object.maxDetected, config.object.iouThreshold, (config.object.minConfidence || 0)); const nms = await t.nms.data(); let i = 0; for (const id of Array.from(nms)) { diff --git a/src/object/nanodet.ts b/src/object/nanodet.ts index 8952ca2d..e23adcfd 100644 --- a/src/object/nanodet.ts +++ b/src/object/nanodet.ts @@ -91,7 +91,7 @@ async function process(res: Tensor[], outputShape: [number, number], config: Con const nmsScores = results.map((a) => a.score); let nmsIdx: Array = []; if (nmsBoxes && nmsBoxes.length > 0) { - const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence); + const nms = tf.image.nonMaxSuppression(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence); nmsIdx = await nms.data(); tf.dispose(nms); } diff --git a/src/tfjs/backend.ts b/src/tfjs/backend.ts index 908ea234..ae1c5ee0 100644 --- a/src/tfjs/backend.ts +++ b/src/tfjs/backend.ts @@ -113,7 +113,7 @@ export async function check(instance: Human, force = false) { if (tf.env().flagRegistry['WEBGL_USE_SHAPES_UNIFORMS']) tf.env().set('WEBGL_USE_SHAPES_UNIFORMS', true); if (tf.env().flagRegistry['CPU_HANDOFF_SIZE_THRESHOLD']) tf.env().set('CPU_HANDOFF_SIZE_THRESHOLD', 256); if (tf.env().flagRegistry['WEBGL_EXP_CONV']) tf.env().set('WEBGL_EXP_CONV', true); // - if (tf.env().flagRegistry['USE_SETTIMEOUTWPM']) tf.env().set('USE_SETTIMEOUTWPM', true); // + if (tf.env().flagRegistry['USE_SETTIMEOUTCUSTOM']) tf.env().set('USE_SETTIMEOUTCUSTOM', true); // // if (tf.env().flagRegistry['WEBGL_PACK_DEPTHWISECONV']) tf.env().set('WEBGL_PACK_DEPTHWISECONV', false); // if (if (tf.env().flagRegistry['WEBGL_FORCE_F16_TEXTURES']) && !instance.config.object.enabled) tf.env().set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision if (typeof instance.config['deallocate'] !== 'undefined' && instance.config['deallocate']) { // hidden param diff --git a/src/tfjs/load.ts b/src/tfjs/load.ts index 807ee006..6e225f6b 100644 --- a/src/tfjs/load.ts +++ b/src/tfjs/load.ts @@ -3,6 +3,7 @@ import * as tf from '../../dist/tfjs.esm.js'; import type { GraphModel } from './types'; import type { Config } from '../config'; import * as modelsDefs from '../../models/models.json'; +import { validateModel } from '../models'; const options = { cacheModels: true, @@ -80,5 +81,6 @@ export async function loadModel(modelPath: string | undefined): Promise): vo if (!profileData || !profileData.kernels) return; const maxDetected = 5; // @ts-ignore profileData.kernels is tfjs internal type - const time = profileData.kernels + const time = (profileData.kernels as Array) .filter((a) => a.kernelTimeMs > 0) .reduce((a, b) => a += b.kernelTimeMs, 0); // @ts-ignore profileData.kernels is tfjs internal type - const slowest = profileData.kernels + const slowest = (profileData.kernels as Array) .map((a, i) => { a.id = i; return a; }) .filter((a) => a.kernelTimeMs > 0) .sort((a, b) => b.kernelTimeMs - a.kernelTimeMs); // @ts-ignore profileData.kernels is tfjs internal type - const largest = profileData.kernels + const largest = (profileData.kernels as Array) .map((a, i) => { a.id = i; return a; }) .filter((a) => a.totalBytesSnapshot > 0) .sort((a, b) => b.totalBytesSnapshot - a.totalBytesSnapshot); diff --git a/src/warmup.ts b/src/warmup.ts index c01cfe37..03fbf9bb 100644 --- a/src/warmup.ts +++ b/src/warmup.ts @@ -78,7 +78,7 @@ async function warmupNode(instance: Human): Promise { if (instance.config.warmup === 'face') img = atob(sample.face); else img = atob(sample.body); let res; - if ('node' in tf) { + if (('node' in tf) && (tf.getBackend() === 'tensorflow')) { // @ts-ignore tf.node may be undefined const data = tf['node'].decodeJpeg(img); const expanded = data.expandDims(0); @@ -126,7 +126,6 @@ export async function runCompile(allModels: Models) { if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions } const tensor = tf.zeros(shape, dtype); - // const res = await model.executeAsync(tensor); // fails with current tfjs try { const res = model.execute(tensor); compiledModels.push(modelName); diff --git a/test/build.log b/test/build.log index 35e72036..fea70c11 100644 --- a/test/build.log +++ b/test/build.log @@ -1,24 +1,791 @@ -2022-08-08 15:08:28 INFO:  Application: {"name":"@vladmandic/human","version":"2.9.2"} -2022-08-08 15:08:28 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-08-08 15:08:28 INFO:  Toolchain: {"build":"0.7.8","esbuild":"0.14.54","typescript":"4.7.4","typedoc":"0.23.10","eslint":"8.21.0"} -2022-08-08 15:08:28 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-08-08 15:08:28 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]} -2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":608} -2022-08-08 15:08:28 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":652676,"outputBytes":305745} -2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":612} -2022-08-08 15:08:28 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":652680,"outputBytes":305749} -2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":664} -2022-08-08 15:08:28 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":652732,"outputBytes":305799} -2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":358} -2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1032,"outputBytes":583} -2022-08-08 15:08:28 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652651,"outputBytes":304598} -2022-08-08 15:08:28 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":1271,"outputBytes":2787569} -2022-08-08 15:08:29 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3439637,"outputBytes":1667460} -2022-08-08 15:08:29 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3439637,"outputBytes":3069462} -2022-08-08 15:08:36 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":30} -2022-08-08 15:08:38 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} -2022-08-08 15:08:38 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6787,"outputBytes":3141} -2022-08-08 15:08:38 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":7798} -2022-08-08 15:08:47 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":108,"errors":0,"warnings":0} -2022-08-08 15:08:47 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-08-08 15:08:47 INFO:  Done... +2022-08-10 10:00:06 INFO:  Application: {"name":"@vladmandic/human","version":"2.9.2"} +2022-08-10 10:00:06 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-08-10 10:00:06 INFO:  Toolchain: {"build":"0.7.8","esbuild":"0.14.54","typescript":"4.7.4","typedoc":"0.23.10","eslint":"8.21.0"} +2022-08-10 10:00:06 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-08-10 10:00:06 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]} +2022-08-10 10:00:06 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":608} +2022-08-10 10:00:06 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":652520,"outputBytes":305668} +2022-08-10 10:00:06 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":612} +2022-08-10 10:00:06 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":652524,"outputBytes":305672} +2022-08-10 10:00:06 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":664} +2022-08-10 10:00:06 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":652576,"outputBytes":305722} +2022-08-10 10:00:06 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":358} +2022-08-10 10:00:06 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1032,"outputBytes":583} +2022-08-10 10:00:06 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652495,"outputBytes":304521} +2022-08-10 10:00:06 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":1271,"outputBytes":2787569} +2022-08-10 10:00:06 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3439481,"outputBytes":1667383} +2022-08-10 10:00:06 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3439481,"outputBytes":3069362} +2022-08-10 10:00:13 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":30} +2022-08-10 10:00:15 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} +2022-08-10 10:00:15 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":3141} +2022-08-10 10:00:15 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":7798} +2022-08-10 10:00:25 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":108,"errors":1,"warnings":1} +2022-08-10 10:00:25 WARN:   +/home/vlado/dev/human/test/test-main.js + 7:5 error 'lastOp' is never reassigned. Use 'const' instead prefer-const + 16:3 warning Unexpected console statement no-console + +✖ 2 problems (1 error, 1 warning) + 1 error and 0 warnings potentially fixable with the `--fix` option. + +2022-08-10 10:00:25 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-08-10 10:00:25 INFO:  Done... +2022-08-10 10:18:46 INFO:  @vladmandic/human version 2.9.2 +2022-08-10 10:18:46 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.15.0 +2022-08-10 10:18:46 INFO:  Application: {"name":"@vladmandic/human","version":"2.9.2"} +2022-08-10 10:18:46 INFO:  Environment: {"profile":"development","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-08-10 10:18:46 INFO:  Toolchain: {"build":"0.7.8","esbuild":"0.14.54","typescript":"4.7.4","typedoc":"0.23.10","eslint":"8.21.0"} +2022-08-10 10:18:46 INFO:  Build: {"profile":"development","steps":["serve","watch","compile"]} +2022-08-10 10:18:46 STATE: WebServer: {"ssl":false,"port":10030,"root":"."} +2022-08-10 10:18:46 STATE: WebServer: {"ssl":true,"port":10031,"root":".","sslKey":"node_modules/@vladmandic/build/cert/https.key","sslCrt":"node_modules/@vladmandic/build/cert/https.crt"} +2022-08-10 10:18:46 STATE: Watch: {"locations":["src/**/*","tfjs/**/*","demo/**/*.ts"]} +2022-08-10 10:18:46 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:18:46 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653010,"outputBytes":484314} +2022-08-10 10:18:46 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:18:46 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653030,"outputBytes":484330} +2022-08-10 10:18:46 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:18:46 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653117,"outputBytes":484421} +2022-08-10 10:18:46 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:18:46 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:18:46 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652767,"outputBytes":486373} +2022-08-10 10:18:46 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:18:46 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3435971,"outputBytes":1667383} +2022-08-10 10:18:47 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3435971,"outputBytes":3064866} +2022-08-10 10:18:47 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:18:47 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:18:47 INFO:  Listening... +2022-08-10 10:21:12 INFO:  Watch: {"event":"modify","input":"src/human.ts"} +2022-08-10 10:21:12 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:21:12 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653062,"outputBytes":484366} +2022-08-10 10:21:12 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:21:12 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653082,"outputBytes":484382} +2022-08-10 10:21:12 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:21:12 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653169,"outputBytes":484473} +2022-08-10 10:21:12 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:21:12 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:21:12 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652819,"outputBytes":486425} +2022-08-10 10:21:12 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:21:12 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436023,"outputBytes":1667425} +2022-08-10 10:21:13 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436023,"outputBytes":3064918} +2022-08-10 10:21:13 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:21:13 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:22:18 INFO:  Watch: {"event":"modify","input":"src/human.ts"} +2022-08-10 10:22:18 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:22:18 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653088,"outputBytes":484392} +2022-08-10 10:22:18 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:22:18 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653108,"outputBytes":484408} +2022-08-10 10:22:18 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:22:18 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653195,"outputBytes":484499} +2022-08-10 10:22:18 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:22:18 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:22:18 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652845,"outputBytes":486451} +2022-08-10 10:22:19 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:22:19 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436049,"outputBytes":1667446} +2022-08-10 10:22:19 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436049,"outputBytes":3064944} +2022-08-10 10:22:19 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:22:19 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:22:21 INFO:  Watch: {"event":"modify","input":"src/human.ts"} +2022-08-10 10:22:21 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:22:21 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653088,"outputBytes":484392} +2022-08-10 10:22:21 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:22:21 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653108,"outputBytes":484408} +2022-08-10 10:22:21 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:22:21 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653195,"outputBytes":484499} +2022-08-10 10:22:21 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:22:21 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:22:21 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652845,"outputBytes":486451} +2022-08-10 10:22:21 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:22:21 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436049,"outputBytes":1667446} +2022-08-10 10:22:22 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436049,"outputBytes":3064944} +2022-08-10 10:22:22 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:22:22 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:25:27 INFO:  Watch: {"event":"modify","input":"src/human.ts"} +2022-08-10 10:25:27 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:25:27 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653010,"outputBytes":484314} +2022-08-10 10:25:27 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:25:27 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653030,"outputBytes":484330} +2022-08-10 10:25:27 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:25:27 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653117,"outputBytes":484421} +2022-08-10 10:25:27 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:25:27 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:25:27 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652767,"outputBytes":486373} +2022-08-10 10:25:27 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:25:27 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3435971,"outputBytes":1667383} +2022-08-10 10:25:27 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3435971,"outputBytes":3064866} +2022-08-10 10:25:27 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:25:27 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:37:46 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:37:46 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:37:46 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653132,"outputBytes":484475} +2022-08-10 10:37:46 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:37:46 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653152,"outputBytes":484491} +2022-08-10 10:37:46 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:37:46 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653239,"outputBytes":484582} +2022-08-10 10:37:46 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:37:46 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:37:46 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652889,"outputBytes":486534} +2022-08-10 10:37:46 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:37:46 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436093,"outputBytes":1667449} +2022-08-10 10:37:46 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436093,"outputBytes":3065027} +2022-08-10 10:37:46 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:37:46 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:38:24 INFO:  Watch: {"event":"modify","input":"src/tfjs/load.ts"} +2022-08-10 10:38:24 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:38:24 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653217,"outputBytes":484526} +2022-08-10 10:38:24 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:38:24 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653237,"outputBytes":484542} +2022-08-10 10:38:24 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:38:24 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653324,"outputBytes":484633} +2022-08-10 10:38:24 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:38:24 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:38:24 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652974,"outputBytes":486586} +2022-08-10 10:38:24 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:38:24 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436178,"outputBytes":1667462} +2022-08-10 10:38:25 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436178,"outputBytes":3065079} +2022-08-10 10:38:25 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:38:25 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:38:44 INFO:  Watch: {"event":"modify","input":"src/tfjs/load.ts"} +2022-08-10 10:38:44 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:38:44 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653216,"outputBytes":484526} +2022-08-10 10:38:44 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:38:44 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653236,"outputBytes":484542} +2022-08-10 10:38:44 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:38:44 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653323,"outputBytes":484633} +2022-08-10 10:38:44 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:38:44 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:38:44 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":652973,"outputBytes":486586} +2022-08-10 10:38:44 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:38:45 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436177,"outputBytes":1667462} +2022-08-10 10:38:45 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436177,"outputBytes":3065079} +2022-08-10 10:38:45 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:38:45 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:40:54 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:40:54 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:40:54 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653373,"outputBytes":485001} +2022-08-10 10:40:54 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:40:54 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653393,"outputBytes":485017} +2022-08-10 10:40:54 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:40:54 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653480,"outputBytes":485108} +2022-08-10 10:40:54 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:40:54 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:40:54 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653130,"outputBytes":487061} +2022-08-10 10:40:54 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:40:54 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436334,"outputBytes":1667535} +2022-08-10 10:40:55 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436334,"outputBytes":3065584} +2022-08-10 10:40:55 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:40:55 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:41:15 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:41:15 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:41:15 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653402,"outputBytes":485026} +2022-08-10 10:41:15 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:41:15 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653422,"outputBytes":485042} +2022-08-10 10:41:15 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:41:15 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653509,"outputBytes":485133} +2022-08-10 10:41:15 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:41:15 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:41:15 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653159,"outputBytes":487086} +2022-08-10 10:41:15 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:41:15 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436363,"outputBytes":1667543} +2022-08-10 10:41:15 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436363,"outputBytes":3065609} +2022-08-10 10:41:15 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:41:15 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:41:40 INFO:  Watch: {"event":"modify","input":"src/tfjs/load.ts"} +2022-08-10 10:41:40 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:41:40 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653407,"outputBytes":485031} +2022-08-10 10:41:40 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:41:40 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653427,"outputBytes":485047} +2022-08-10 10:41:40 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:41:40 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653514,"outputBytes":485138} +2022-08-10 10:41:40 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:41:40 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:41:40 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653164,"outputBytes":487091} +2022-08-10 10:41:40 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:41:41 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436368,"outputBytes":1667548} +2022-08-10 10:41:41 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436368,"outputBytes":3065614} +2022-08-10 10:41:41 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:41:41 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:42:54 INFO:  Watch: {"event":"modify","input":"src/human.ts"} +2022-08-10 10:42:54 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:42:54 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653478,"outputBytes":485066} +2022-08-10 10:42:54 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:42:54 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653498,"outputBytes":485082} +2022-08-10 10:42:54 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:42:54 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653585,"outputBytes":485173} +2022-08-10 10:42:54 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:42:54 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:42:54 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653235,"outputBytes":487126} +2022-08-10 10:42:54 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:42:54 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436439,"outputBytes":1667565} +2022-08-10 10:42:55 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436439,"outputBytes":3065649} +2022-08-10 10:42:55 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:42:55 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:44:00 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:44:00 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:44:00 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653453,"outputBytes":485041} +2022-08-10 10:44:00 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:44:00 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653473,"outputBytes":485057} +2022-08-10 10:44:00 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:44:00 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653560,"outputBytes":485148} +2022-08-10 10:44:00 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:44:00 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:44:00 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653210,"outputBytes":487101} +2022-08-10 10:44:00 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:44:00 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436414,"outputBytes":1667548} +2022-08-10 10:44:00 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436414,"outputBytes":3065624} +2022-08-10 10:44:00 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:44:00 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:46:50 INFO:  Watch: {"event":"modify","input":"src/config.ts"} +2022-08-10 10:46:50 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:46:50 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653566,"outputBytes":485065} +2022-08-10 10:46:50 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:46:50 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653586,"outputBytes":485081} +2022-08-10 10:46:50 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:46:50 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653673,"outputBytes":485172} +2022-08-10 10:46:50 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:46:50 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:46:50 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653323,"outputBytes":487125} +2022-08-10 10:46:50 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:46:50 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436527,"outputBytes":1667566} +2022-08-10 10:46:50 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436527,"outputBytes":3065648} +2022-08-10 10:46:50 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:46:50 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:47:22 INFO:  Watch: {"event":"modify","input":"src/config.ts"} +2022-08-10 10:47:22 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:47:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653664,"outputBytes":485065} +2022-08-10 10:47:22 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:47:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653684,"outputBytes":485081} +2022-08-10 10:47:22 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:47:23 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653771,"outputBytes":485172} +2022-08-10 10:47:23 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:47:23 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:47:23 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653421,"outputBytes":487125} +2022-08-10 10:47:23 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:47:23 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436625,"outputBytes":1667566} +2022-08-10 10:47:23 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436625,"outputBytes":3065648} +2022-08-10 10:47:23 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:47:23 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:48:57 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:48:57 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:48:57 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653716,"outputBytes":485121} +2022-08-10 10:48:57 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:48:57 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653736,"outputBytes":485137} +2022-08-10 10:48:57 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:48:57 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653823,"outputBytes":485228} +2022-08-10 10:48:57 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:48:57 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:48:57 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653473,"outputBytes":487181} +2022-08-10 10:48:57 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:48:58 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436677,"outputBytes":1667595} +2022-08-10 10:48:58 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436677,"outputBytes":3065704} +2022-08-10 10:48:58 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:48:58 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:49:22 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:49:22 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:49:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653744,"outputBytes":485147} +2022-08-10 10:49:22 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:49:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653764,"outputBytes":485163} +2022-08-10 10:49:22 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:49:22 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653851,"outputBytes":485254} +2022-08-10 10:49:22 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:49:22 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:49:22 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653501,"outputBytes":487207} +2022-08-10 10:49:23 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:49:23 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436705,"outputBytes":1667604} +2022-08-10 10:49:23 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436705,"outputBytes":3065730} +2022-08-10 10:49:23 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:49:23 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:49:47 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 10:49:47 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:49:47 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653716,"outputBytes":485121} +2022-08-10 10:49:47 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:49:47 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653736,"outputBytes":485137} +2022-08-10 10:49:47 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:49:47 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653823,"outputBytes":485228} +2022-08-10 10:49:47 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:49:47 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:49:47 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653473,"outputBytes":487181} +2022-08-10 10:49:47 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:49:47 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436677,"outputBytes":1667595} +2022-08-10 10:49:47 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436677,"outputBytes":3065704} +2022-08-10 10:49:47 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:49:47 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:50:21 INFO:  Watch: {"event":"modify","input":"src/tfjs/load.ts"} +2022-08-10 10:50:22 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:50:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653750,"outputBytes":485161} +2022-08-10 10:50:22 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:50:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653770,"outputBytes":485177} +2022-08-10 10:50:22 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:50:22 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653857,"outputBytes":485268} +2022-08-10 10:50:22 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:50:22 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:50:22 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653507,"outputBytes":487221} +2022-08-10 10:50:22 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:50:22 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436711,"outputBytes":1667605} +2022-08-10 10:50:22 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436711,"outputBytes":3065744} +2022-08-10 10:50:22 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:50:22 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:50:50 INFO:  Watch: {"event":"modify","input":"src/tfjs/load.ts"} +2022-08-10 10:50:50 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:50:50 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653727,"outputBytes":485132} +2022-08-10 10:50:50 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:50:50 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653747,"outputBytes":485148} +2022-08-10 10:50:50 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:50:50 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653834,"outputBytes":485239} +2022-08-10 10:50:50 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:50:50 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:50:50 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653484,"outputBytes":487192} +2022-08-10 10:50:50 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:50:51 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436688,"outputBytes":1667601} +2022-08-10 10:50:51 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436688,"outputBytes":3065715} +2022-08-10 10:50:51 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:50:51 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:51:54 INFO:  Watch: {"event":"modify","input":"src/tfjs/load.ts"} +2022-08-10 10:51:54 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:51:54 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653716,"outputBytes":485121} +2022-08-10 10:51:54 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:51:54 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653736,"outputBytes":485137} +2022-08-10 10:51:54 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:51:54 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653823,"outputBytes":485228} +2022-08-10 10:51:54 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:51:54 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:51:54 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653473,"outputBytes":487181} +2022-08-10 10:51:54 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:51:54 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436677,"outputBytes":1667595} +2022-08-10 10:51:54 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436677,"outputBytes":3065704} +2022-08-10 10:51:54 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:51:54 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 10:54:58 INFO:  Watch: {"event":"modify","input":"src/human.ts"} +2022-08-10 10:54:58 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 10:54:58 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653831,"outputBytes":485165} +2022-08-10 10:54:58 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 10:54:58 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":653851,"outputBytes":485181} +2022-08-10 10:54:58 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 10:54:58 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":653938,"outputBytes":485272} +2022-08-10 10:54:58 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 10:54:58 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 10:54:58 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653588,"outputBytes":487225} +2022-08-10 10:54:58 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 10:54:59 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436792,"outputBytes":1667619} +2022-08-10 10:54:59 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436792,"outputBytes":3065748} +2022-08-10 10:54:59 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 10:54:59 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:15:56 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 11:15:56 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:15:56 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":653988,"outputBytes":485208} +2022-08-10 11:15:56 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:15:56 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654008,"outputBytes":485224} +2022-08-10 11:15:56 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:15:56 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654095,"outputBytes":485315} +2022-08-10 11:15:56 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:15:56 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:15:56 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653745,"outputBytes":487268} +2022-08-10 11:15:56 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:15:56 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436949,"outputBytes":1667657} +2022-08-10 11:15:57 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436949,"outputBytes":3065791} +2022-08-10 11:15:57 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:15:57 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:17:26 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 11:17:26 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:17:26 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654013,"outputBytes":485233} +2022-08-10 11:17:26 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:17:26 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654033,"outputBytes":485249} +2022-08-10 11:17:26 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:17:26 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654120,"outputBytes":485340} +2022-08-10 11:17:26 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:17:26 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:17:26 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653770,"outputBytes":487293} +2022-08-10 11:17:26 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:17:27 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3436974,"outputBytes":1667674} +2022-08-10 11:17:27 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3436974,"outputBytes":3065816} +2022-08-10 11:17:27 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:17:27 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:28:22 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 11:28:22 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:28:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654133,"outputBytes":485271} +2022-08-10 11:28:22 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:28:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654153,"outputBytes":485287} +2022-08-10 11:28:22 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:28:22 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654240,"outputBytes":485378} +2022-08-10 11:28:22 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:28:22 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:28:22 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653890,"outputBytes":487331} +2022-08-10 11:28:22 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:28:22 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437094,"outputBytes":1667692} +2022-08-10 11:28:22 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437094,"outputBytes":3065854} +2022-08-10 11:28:22 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:28:22 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:28:25 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 11:28:25 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:28:25 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654133,"outputBytes":485271} +2022-08-10 11:28:25 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:28:25 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654153,"outputBytes":485287} +2022-08-10 11:28:25 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:28:25 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654240,"outputBytes":485378} +2022-08-10 11:28:25 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:28:25 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:28:25 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653890,"outputBytes":487331} +2022-08-10 11:28:25 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:28:26 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437094,"outputBytes":1667692} +2022-08-10 11:28:26 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437094,"outputBytes":3065854} +2022-08-10 11:28:26 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:28:26 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:29:22 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 11:29:22 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:29:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654124,"outputBytes":485275} +2022-08-10 11:29:22 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:29:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654144,"outputBytes":485291} +2022-08-10 11:29:22 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:29:22 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654231,"outputBytes":485382} +2022-08-10 11:29:22 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:29:22 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:29:22 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653881,"outputBytes":487335} +2022-08-10 11:29:22 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:29:23 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437085,"outputBytes":1667699} +2022-08-10 11:29:23 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437085,"outputBytes":3065858} +2022-08-10 11:29:23 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:29:23 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:29:31 INFO:  Watch: {"event":"modify","input":"src/face/facemesh.ts"} +2022-08-10 11:29:31 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:29:31 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654124,"outputBytes":485275} +2022-08-10 11:29:31 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:29:31 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654144,"outputBytes":485291} +2022-08-10 11:29:31 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:29:31 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654231,"outputBytes":485382} +2022-08-10 11:29:31 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:29:31 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:29:31 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653881,"outputBytes":487335} +2022-08-10 11:29:31 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:29:31 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437085,"outputBytes":1667699} +2022-08-10 11:29:31 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437085,"outputBytes":3065858} +2022-08-10 11:29:31 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:29:31 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:34:00 INFO:  Watch: {"event":"modify","input":"src/face/match.ts"} +2022-08-10 11:34:00 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:34:00 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654170,"outputBytes":485325} +2022-08-10 11:34:00 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:34:00 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654190,"outputBytes":485341} +2022-08-10 11:34:00 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:34:00 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654277,"outputBytes":485432} +2022-08-10 11:34:00 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:34:00 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:34:00 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653927,"outputBytes":487385} +2022-08-10 11:34:00 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:34:00 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437131,"outputBytes":1667718} +2022-08-10 11:34:01 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437131,"outputBytes":3065908} +2022-08-10 11:34:01 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:34:01 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:34:15 INFO:  Watch: {"event":"modify","input":"src/face/match.ts"} +2022-08-10 11:34:15 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:34:15 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654192,"outputBytes":485347} +2022-08-10 11:34:15 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:34:15 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654212,"outputBytes":485363} +2022-08-10 11:34:15 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:34:15 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654299,"outputBytes":485454} +2022-08-10 11:34:15 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:34:15 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:34:15 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653949,"outputBytes":487407} +2022-08-10 11:34:15 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:34:16 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437153,"outputBytes":1667740} +2022-08-10 11:34:16 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437153,"outputBytes":3065930} +2022-08-10 11:34:16 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:34:16 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:34:29 INFO:  Watch: {"event":"modify","input":"src/face/match.ts"} +2022-08-10 11:34:29 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:34:29 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654192,"outputBytes":485347} +2022-08-10 11:34:29 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:34:29 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654212,"outputBytes":485363} +2022-08-10 11:34:29 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:34:29 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654299,"outputBytes":485454} +2022-08-10 11:34:29 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:34:29 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:34:29 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653949,"outputBytes":487407} +2022-08-10 11:34:29 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:34:29 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437153,"outputBytes":1667740} +2022-08-10 11:34:30 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437153,"outputBytes":3065930} +2022-08-10 11:34:30 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:34:30 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 11:51:00 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 11:51:00 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 11:51:00 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654209,"outputBytes":485364} +2022-08-10 11:51:00 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 11:51:00 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654229,"outputBytes":485380} +2022-08-10 11:51:00 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 11:51:00 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654316,"outputBytes":485471} +2022-08-10 11:51:00 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 11:51:00 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 11:51:01 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653966,"outputBytes":487424} +2022-08-10 11:51:01 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 11:51:01 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437170,"outputBytes":1667756} +2022-08-10 11:51:01 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437170,"outputBytes":3065947} +2022-08-10 11:51:01 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 11:51:01 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:17:37 INFO:  Watch: {"event":"modify","input":"src/object/nanodet.ts"} +2022-08-10 12:17:37 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:17:37 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654243,"outputBytes":485398} +2022-08-10 12:17:37 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:17:37 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654263,"outputBytes":485414} +2022-08-10 12:17:37 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:17:37 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654350,"outputBytes":485505} +2022-08-10 12:17:37 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:17:37 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:17:37 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654000,"outputBytes":487458} +2022-08-10 12:17:37 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:17:37 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437204,"outputBytes":1667781} +2022-08-10 12:17:38 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437204,"outputBytes":3065981} +2022-08-10 12:17:38 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:17:38 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:19:57 INFO:  Watch: {"event":"modify","input":"src/object/nanodet.ts"} +2022-08-10 12:19:57 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:19:57 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654339,"outputBytes":485494} +2022-08-10 12:19:57 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:19:57 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654359,"outputBytes":485510} +2022-08-10 12:19:57 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:19:57 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654446,"outputBytes":485601} +2022-08-10 12:19:57 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:19:57 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:19:57 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654096,"outputBytes":487554} +2022-08-10 12:19:57 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:19:58 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437300,"outputBytes":1667873} +2022-08-10 12:19:58 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437300,"outputBytes":3066077} +2022-08-10 12:19:58 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:19:58 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:21:14 INFO:  Watch: {"event":"modify","input":"src/object/nanodet.ts"} +2022-08-10 12:21:14 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:21:14 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654297,"outputBytes":485452} +2022-08-10 12:21:14 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:21:14 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654317,"outputBytes":485468} +2022-08-10 12:21:14 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:21:14 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654404,"outputBytes":485559} +2022-08-10 12:21:14 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:21:14 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:21:14 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654054,"outputBytes":487512} +2022-08-10 12:21:14 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:21:14 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437258,"outputBytes":1667833} +2022-08-10 12:21:14 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437258,"outputBytes":3066034} +2022-08-10 12:21:14 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:21:14 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:22:00 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 12:22:00 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:22:00 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654280,"outputBytes":485435} +2022-08-10 12:22:00 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:22:00 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654300,"outputBytes":485451} +2022-08-10 12:22:00 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:22:00 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654387,"outputBytes":485542} +2022-08-10 12:22:00 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:22:00 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:22:00 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654037,"outputBytes":487495} +2022-08-10 12:22:00 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:22:00 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437241,"outputBytes":1667817} +2022-08-10 12:22:00 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437241,"outputBytes":3066017} +2022-08-10 12:22:00 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:22:01 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:23:44 INFO:  Watch: {"event":"modify","input":"src/object/nanodet.ts"} +2022-08-10 12:23:44 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:23:44 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654192,"outputBytes":485347} +2022-08-10 12:23:44 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:23:44 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654212,"outputBytes":485363} +2022-08-10 12:23:44 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:23:44 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654299,"outputBytes":485454} +2022-08-10 12:23:44 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:23:44 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:23:44 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":653949,"outputBytes":487407} +2022-08-10 12:23:44 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:23:44 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437153,"outputBytes":1667740} +2022-08-10 12:23:44 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437153,"outputBytes":3065930} +2022-08-10 12:23:44 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:23:44 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:26:39 INFO:  Watch: {"event":"modify","input":"src/face/facemesh.ts"} +2022-08-10 12:26:39 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:26:39 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654282,"outputBytes":485480} +2022-08-10 12:26:39 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:26:39 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654302,"outputBytes":485496} +2022-08-10 12:26:39 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:26:39 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654389,"outputBytes":485587} +2022-08-10 12:26:39 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:26:39 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:26:39 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654039,"outputBytes":487540} +2022-08-10 12:26:39 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:26:39 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437243,"outputBytes":1667831} +2022-08-10 12:26:39 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437243,"outputBytes":3066064} +2022-08-10 12:26:39 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:26:39 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:33:03 INFO:  Watch: {"event":"modify","input":"src/face/facemesh.ts"} +2022-08-10 12:33:03 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:33:03 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654333,"outputBytes":485526} +2022-08-10 12:33:03 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:33:03 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654353,"outputBytes":485542} +2022-08-10 12:33:03 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:33:03 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654440,"outputBytes":485633} +2022-08-10 12:33:03 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:33:03 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:33:03 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654090,"outputBytes":487598} +2022-08-10 12:33:03 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:33:03 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437294,"outputBytes":1667844} +2022-08-10 12:33:03 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437294,"outputBytes":3066105} +2022-08-10 12:33:03 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:33:03 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:35:39 INFO:  Watch: {"event":"modify","input":"src/face/insightface.ts"} +2022-08-10 12:35:40 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:35:40 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654356,"outputBytes":485549} +2022-08-10 12:35:40 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:35:40 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654376,"outputBytes":485565} +2022-08-10 12:35:40 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:35:40 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654463,"outputBytes":485656} +2022-08-10 12:35:40 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:35:40 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:35:40 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654113,"outputBytes":487621} +2022-08-10 12:35:40 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:35:40 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437317,"outputBytes":1667859} +2022-08-10 12:35:40 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437317,"outputBytes":3066128} +2022-08-10 12:35:40 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:35:40 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:37:30 INFO:  Watch: {"event":"modify","input":"src/models.ts"} +2022-08-10 12:37:30 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:37:30 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654476,"outputBytes":485639} +2022-08-10 12:37:30 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:37:30 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654496,"outputBytes":485655} +2022-08-10 12:37:30 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:37:30 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654583,"outputBytes":485746} +2022-08-10 12:37:30 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:37:30 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:37:30 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654233,"outputBytes":487711} +2022-08-10 12:37:30 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:37:30 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437437,"outputBytes":1667917} +2022-08-10 12:37:30 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437437,"outputBytes":3066219} +2022-08-10 12:37:30 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:37:30 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:37:36 INFO:  Watch: {"event":"modify","input":"src/face/insightface.ts"} +2022-08-10 12:37:36 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:37:36 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654453,"outputBytes":485616} +2022-08-10 12:37:36 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:37:36 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654473,"outputBytes":485632} +2022-08-10 12:37:36 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:37:36 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654560,"outputBytes":485723} +2022-08-10 12:37:36 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:37:36 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:37:36 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654210,"outputBytes":487688} +2022-08-10 12:37:36 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:37:36 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437414,"outputBytes":1667902} +2022-08-10 12:37:37 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437414,"outputBytes":3066196} +2022-08-10 12:37:37 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:37:37 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:46:49 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:46:49 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:46:49 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654531,"outputBytes":485694} +2022-08-10 12:46:49 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:46:49 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654551,"outputBytes":485710} +2022-08-10 12:46:49 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:46:49 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654638,"outputBytes":485801} +2022-08-10 12:46:49 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:46:49 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:46:49 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654288,"outputBytes":487766} +2022-08-10 12:46:49 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:46:49 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437492,"outputBytes":1667969} +2022-08-10 12:46:49 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437492,"outputBytes":3066274} +2022-08-10 12:46:49 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:46:49 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:47:32 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:47:32 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:47:32 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654453,"outputBytes":485616} +2022-08-10 12:47:32 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:47:32 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654473,"outputBytes":485632} +2022-08-10 12:47:32 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:47:32 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654560,"outputBytes":485723} +2022-08-10 12:47:32 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:47:32 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:47:32 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654210,"outputBytes":487688} +2022-08-10 12:47:33 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:47:33 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437414,"outputBytes":1667902} +2022-08-10 12:47:33 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437414,"outputBytes":3066196} +2022-08-10 12:47:33 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:47:33 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:48:32 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:48:32 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:48:32 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654501,"outputBytes":485664} +2022-08-10 12:48:32 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:48:32 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654521,"outputBytes":485680} +2022-08-10 12:48:32 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:48:32 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654608,"outputBytes":485771} +2022-08-10 12:48:32 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:48:32 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:48:33 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654258,"outputBytes":487736} +2022-08-10 12:48:33 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:48:33 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437462,"outputBytes":1667944} +2022-08-10 12:48:33 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437462,"outputBytes":3066244} +2022-08-10 12:48:33 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:48:33 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:49:22 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:49:22 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:49:22 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654539,"outputBytes":485704} +2022-08-10 12:49:22 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:49:22 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654559,"outputBytes":485720} +2022-08-10 12:49:22 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:49:22 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654646,"outputBytes":485811} +2022-08-10 12:49:22 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:49:22 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:49:23 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654296,"outputBytes":487788} +2022-08-10 12:49:23 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:49:23 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437500,"outputBytes":1667977} +2022-08-10 12:49:23 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437500,"outputBytes":3066296} +2022-08-10 12:49:23 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:49:23 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:49:41 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:49:41 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:49:41 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654562,"outputBytes":485729} +2022-08-10 12:49:41 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:49:41 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654582,"outputBytes":485745} +2022-08-10 12:49:41 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:49:41 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654669,"outputBytes":485836} +2022-08-10 12:49:41 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:49:41 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:49:41 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654319,"outputBytes":487825} +2022-08-10 12:49:41 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:49:41 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437523,"outputBytes":1667997} +2022-08-10 12:49:42 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437523,"outputBytes":3066317} +2022-08-10 12:49:42 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:49:42 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:50:12 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:50:12 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:50:12 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654603,"outputBytes":485766} +2022-08-10 12:50:12 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:50:12 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654623,"outputBytes":485782} +2022-08-10 12:50:12 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:50:12 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654710,"outputBytes":485873} +2022-08-10 12:50:12 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:50:12 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:50:12 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654360,"outputBytes":487838} +2022-08-10 12:50:12 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:50:12 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437564,"outputBytes":1668032} +2022-08-10 12:50:12 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437564,"outputBytes":3066346} +2022-08-10 12:50:12 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:50:12 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:51:42 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:51:42 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:51:42 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654643,"outputBytes":485804} +2022-08-10 12:51:42 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:51:42 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654663,"outputBytes":485820} +2022-08-10 12:51:42 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:51:42 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654750,"outputBytes":485911} +2022-08-10 12:51:42 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:51:42 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:51:42 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654400,"outputBytes":487888} +2022-08-10 12:51:42 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:51:42 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437604,"outputBytes":1668053} +2022-08-10 12:51:43 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437604,"outputBytes":3066379} +2022-08-10 12:51:43 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:51:43 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} +2022-08-10 12:52:06 INFO:  Watch: {"event":"modify","input":"src/warmup.ts"} +2022-08-10 12:52:06 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":102,"outputBytes":1098} +2022-08-10 12:52:06 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":75,"inputBytes":654493,"outputBytes":485654} +2022-08-10 12:52:06 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1118} +2022-08-10 12:52:06 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":75,"inputBytes":654513,"outputBytes":485670} +2022-08-10 12:52:06 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":149,"outputBytes":1205} +2022-08-10 12:52:06 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":75,"inputBytes":654600,"outputBytes":485761} +2022-08-10 12:52:06 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1069,"outputBytes":1438} +2022-08-10 12:52:06 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2112,"outputBytes":855} +2022-08-10 12:52:06 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":75,"inputBytes":654250,"outputBytes":487738} +2022-08-10 12:52:06 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":11,"inputBytes":2351,"outputBytes":2784059} +2022-08-10 12:52:06 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":75,"inputBytes":3437454,"outputBytes":1667923} +2022-08-10 12:52:06 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":75,"inputBytes":3437454,"outputBytes":3066229} +2022-08-10 12:52:06 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6716,"outputBytes":4560} +2022-08-10 12:52:06 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15629,"outputBytes":11921} diff --git a/test/node.js b/test/node.js index 1f013005..3e1f9dc9 100644 --- a/test/node.js +++ b/test/node.js @@ -9,16 +9,21 @@ log.configure({ inspect: { breakLength: 500 } }); const tests = [ 'test-node.js', - // 'test-node-gpu.js', - // 'test-node-wasm.js', + 'test-node-gpu.js', + 'test-node-wasm.js', + // 'test-node-cpu.js', ]; const demos = [ - '../demo/nodejs/node.js', - '../demo/nodejs/node-canvas.js', - '../demo/nodejs/node-env.js', - '../demo/nodejs/node-event.js', - '../demo/nodejs/node-multiprocess.js', + { 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/nodejs/node-video.js', args: [] }, + // { cmd: '../demo/nodejs/node-webcam.js', args: [] }, ]; const ignoreMessages = [ @@ -61,8 +66,12 @@ function logStdIO(ok, test, buffer) { }); for (const line of filtered) { if (line.length < 2) continue; - if (ok) log.data(test, 'stdout:', line); - else log.warn(test, 'stderr:', line); + if (ok) { + log.data(test, 'stdout:', line); + } else { + if (status[test]) status[test].failed = 'critical'; + log.warn(test, 'stderr:', line); + } } } @@ -84,13 +93,20 @@ async function runTest(test) { async function runDemo(demo) { log.info(); log.info(demo, 'start'); + status[demo.cmd] = { passed: 0, failed: 0 }; return new Promise((resolve) => { - const child = fork(path.join(__dirname, demo), [], { silent: true }); - child.on('message', (data) => logMessage(demo, data)); - child.on('error', (data) => log.error(demo, ':', data.message || data)); - child.on('close', (code) => resolve(code)); - child.stdout?.on('data', (data) => logStdIO(true, demo, data)); - child.stderr?.on('data', (data) => logStdIO(false, demo, data)); + const child = fork(path.join(__dirname, demo.cmd), [...demo.args], { silent: true }); + child.on('message', (data) => logMessage(demo.cmd, data)); + child.on('error', (data) => { + status[demo.cmd].failed++; + log.error(demo.cmd, ':', data.message || data); + }); + child.on('close', (code) => { + status[demo.cmd].passed++; + resolve(code); + }); + // child.stdout?.on('data', (data) => logStdIO(true, demo.cmd, data)); + child.stderr?.on('data', (data) => logStdIO(false, demo.cmd, data)); }); } @@ -101,15 +117,16 @@ async function testAll() { log.header(); process.on('unhandledRejection', (data) => log.error('nodejs unhandled rejection', data)); process.on('uncaughtException', (data) => log.error('nodejs unhandled exception', data)); - log.info('tests:', tests); log.info('demos:', demos); - // for (const demo of demos) await runDemo(demo); + for (const demo of demos) await runDemo(demo); + log.info('tests:', tests); for (const test of tests) await runTest(test); - log.info('all tests complete'); - log.info('failed:', { count: failedMessages.length, messages: failedMessages }); + log.state('all tests complete'); for (const [test, result] of Object.entries(status)) { - log.info('status:', { test, ...result }); + log.info(' status', { test, ...result }); } + log.info('failures', { count: failedMessages.length }); + for (const msg of failedMessages) log.warn(' failed', { test: msg.test, message: msg.data }); } testAll(); diff --git a/test/test-main.js b/test/test-main.js index 3110adb7..99a59f20 100644 --- a/test/test-main.js +++ b/test/test-main.js @@ -4,13 +4,17 @@ const canvasJS = require('canvas'); let fetch; // fetch is dynamically imported later let config; +let lastOp = 'unknown'; const log = (status, ...data) => { if (typeof process.send !== 'undefined') process.send([status, data]); // send to parent process over ipc - // eslint-disable-next-line no-console - else console.log(status, ...data); // write to console if no parent process + else console.log(status, ...data); // eslint-disable-line no-console }; +process.on('uncaughtException', (err) => { + log('error', 'uncaughtException', lastOp, err); +}); + async function testHTTP() { if (config.modelBasePath.startsWith('file:')) return true; return new Promise((resolve) => { @@ -28,6 +32,7 @@ async function testHTTP() { } async function getImage(human, input, options = { channels: 3, expand: true, cast: true }) { + lastOp = `getImage ${input}`; let img; try { img = await canvasJS.loadImage(input); @@ -51,15 +56,17 @@ async function getImage(human, input, options = { channels: 3, expand: true, cas } function printResults(detect) { - const person = (detect.face && detect.face[0]) ? { score: detect.face[0].score, age: detect.face[0].age, gender: detect.face[0].gender } : {}; - const object = (detect.object && detect.object[0]) ? { score: detect.object[0].score, class: detect.object[0].label } : {}; - const body = (detect.body && detect.body[0]) ? { score: detect.body[0].score, keypoints: detect.body[0].keypoints.length } : {}; + lastOp = `printResults ${detect}`; + const person = (detect.face && detect.face[0]) ? { score: detect.face[0]?.score, age: detect.face[0]?.age, gender: detect.face[0]?.gender } : {}; + const object = (detect.object && detect.object[0]) ? { score: detect.object[0]?.score, class: detect.object[0].label } : {}; + const body = (detect.body && detect.body[0]) ? { score: detect.body[0]?.score, keypoints: detect.body[0]?.keypoints?.length } : {}; const persons = detect.persons; if (detect.face) log('data', ' result: face:', detect.face?.length, 'body:', detect.body?.length, 'hand:', detect.hand?.length, 'gesture:', detect.gesture?.length, 'object:', detect.object?.length, 'person:', persons.length, person, object, body); if (detect.performance) log('data', ' result: performance:', 'load:', detect?.performance.load, 'total:', detect.performance?.total); } async function testInstance(human) { + lastOp = `testInstance ${human}`; if (human) log('state', 'passed: create human'); else log('error', 'failed: create human'); @@ -87,7 +94,9 @@ async function testInstance(human) { } async function testWarmup(human, title) { + lastOp = `testWarmup ${title}`; let warmup; + // try default try { warmup = await human.warmup(config); } catch (err) { @@ -99,18 +108,38 @@ async function testWarmup(human, title) { } else { log('error', 'failed: warmup:', config.warmup, title); } + /* + // now try with monkey-patch + globalThis.Canvas = canvasJS.Canvas; // monkey-patch to use external canvas library + globalThis.ImageData = canvasJS.ImageData; // monkey-patch to use external canvas library + try { + warmup = await human.warmup(config); + } catch (err) { + log('error', 'error warmup'); + } + if (warmup) { + log('state', 'passed: warmup:', config.warmup, title); + printResults(warmup); + } else { + log('error', 'failed: warmup:', config.warmup, title); + } + */ return warmup; } async function testDetect(human, input, title, checkLeak = true) { + lastOp = `testDetect ${title}`; + log('state', 'start', title); await human.load(config); + const missing = human.check(); + for (const op of missing) log('warn', 'missing kernel ops', { title, model: op.name, url: op.url, missing: op.missing, backkend: human.tf.getBackend() }); const tensors = human.tf.engine().state.numTensors; const image = input ? await getImage(human, input) : human.tf.randomNormal([1, 1024, 1024, 3]); if (!image) { - log('error', 'failed: detect: input is null'); + log('error', 'failed: detect: input is null', { input, title }); return false; } - let detect; + let detect = {}; try { detect = await human.detect(image, config); } catch (err) { @@ -140,21 +169,23 @@ async function events(event) { } const verify = (state, ...messages) => { + lastOp = `verify ${messages}`; if (state) log('state', 'passed:', ...messages); else log('error', 'failed:', ...messages); }; async function verifyDetails(human) { + lastOp = `verifyDetails ${human}`; log('info', 'test: details verification'); const res = await testDetect(human, 'samples/in/ai-body.jpg', 'default'); verify(res.face.length === 1, 'details face length', res.face.length); for (const face of res.face) { verify(face.score > 0.9 && face.boxScore > 0.9 && face.faceScore > 0.9, 'details face score', face.score, face.boxScore, face.faceScore); - verify(face.age > 23 && face.age < 30 && face.gender === 'female' && face.genderScore > 0.9 && face.iris > 70 && face.iris < 90, 'details face age/gender', face.age, face.gender, face.genderScore, face.iris); + verify(face.age > 23 && face.age < 30 && face.gender === 'female' && face.genderScore > 0.9 && face.iris > 70 && face.iris < 105, 'details face age/gender', face.age, face.gender, face.genderScore, face.iris); verify(face.box.length === 4 && face.boxRaw.length === 4 && face.mesh.length === 478 && face.meshRaw.length === 478 && face.embedding.length === 1024, 'details face arrays', face.box.length, face.mesh.length, face.embedding.length); verify(face.emotion.length >= 2 && face.emotion[0].score > 0.30 && face.emotion[0].emotion === 'angry', 'details face emotion', face.emotion.length, face.emotion[0]); - verify(face.real > 0.75, 'details face anti-spoofing', face.real); - verify(face.live > 0.75, 'details face liveness', face.live); + verify(face.real > 0.55, 'details face anti-spoofing', face.real); + verify(face.live > 0.70, 'details face liveness', face.live); } verify(res.body.length === 1, 'details body length', res.body.length); for (const body of res.body) { @@ -174,6 +205,7 @@ async function verifyDetails(human) { } async function testTensorShapes(human, input) { + lastOp = `testTensorShapes ${input}`; await human.load(config); const numTensors = human.tf.engine().state.numTensors; let res; @@ -209,6 +241,7 @@ async function testTensorShapes(human, input) { } async function verifyCompare(human) { + lastOp = `verifyCompare ${human}`; log('info', 'test: input compare'); const t1 = await getImage(human, 'samples/in/ai-face.jpg'); const t2 = await getImage(human, 'samples/in/ai-body.jpg'); @@ -221,6 +254,7 @@ async function verifyCompare(human) { } async function test(Human, inputConfig) { + lastOp = `test ${inputConfig}`; config = inputConfig; fetch = (await import('node-fetch')).default; const ok = await testHTTP(); @@ -276,13 +310,15 @@ async function test(Human, inputConfig) { res = await testWarmup(human, 'default'); if (!res || res?.face?.length !== 1 || res?.body?.length !== 1 || res?.hand?.length !== 1 || res?.gesture?.length < 6) log('error', 'failed: warmup body result mismatch', res?.face?.length, res?.body?.length, res?.hand?.length, res?.gesture?.length); else log('state', 'passed: warmup body result match'); - log('state', 'details:', { - face: { boxScore: res.face[0].boxScore, faceScore: res.face[0].faceScore, age: res.face[0].age, gender: res.face[0].gender, genderScore: res.face[0].genderScore }, - emotion: res.face[0].emotion, - body: { score: res.body[0].score, keypoints: res.body[0].keypoints.length }, - hand: { boxScore: res.hand[0].boxScore, fingerScore: res.hand[0].fingerScore, keypoints: res.hand[0].keypoints.length }, - gestures: res.gesture, - }); + if (res) { + log('state', 'details:', { + face: { boxScore: res.face[0].boxScore, faceScore: res.face[0].faceScore, age: res.face[0].age, gender: res.face[0].gender, genderScore: res.face[0].genderScore }, + emotion: res.face[0].emotion, + body: { score: res.body[0].score, keypoints: res.body[0].keypoints.length }, + hand: { boxScore: res.hand[0].boxScore, fingerScore: res.hand[0].fingerScore, keypoints: res.hand[0].keypoints.length }, + gestures: res.gesture, + }); + } await verifyDetails(human); await testTensorShapes(human, 'samples/in/ai-body.jpg'); @@ -318,18 +354,6 @@ async function test(Human, inputConfig) { if (!res || !res.error) log('error', 'failed: invalid input', res); else log('state', 'passed: invalid input', res.error || res); - // test face attention - log('info', 'test face attention'); - config.face.mesh = { enabled: true }; - res = await testDetect(human, 'samples/in/ai-face.jpg', 'face mesh'); - if (!res || !res.face[0] || res.face[0].mesh.length !== 478 || Object.keys(res.face[0].annotations).length !== 36) log('error', 'failed: face mesh', { mesh: res.face[0]?.mesh?.length, annotations: Object.keys(res.face[0].annotations).length }); - else log('state', 'passed: face attention'); - human.models.facemesh = null; // unload model - config.face.attention = { enabled: true }; - res = await testDetect(human, 'samples/in/ai-face.jpg', 'face attention'); - if (!res || !res.face[0] || res.face[0].mesh.length !== 478 || Object.keys(res.face[0].annotations).length !== 36) log('error', 'failed: face attention', { mesh: res.face[0]?.mesh?.length, annotations: Object.keys(res.face[0].annotations).length }); - else log('state', 'passed: face attention'); - // test face similarity log('info', 'test face similarity'); human.reset(); @@ -349,44 +373,18 @@ async function test(Human, inputConfig) { if (res1 < 1 || res2 < 0.40 || res3 < 0.40 || res2 > 0.75 || res3 > 0.75) log('error', 'failed: face similarity', { similarity: [res1, res2, res3], descriptors: [desc1?.length, desc2?.length, desc3?.length] }); else log('state', 'passed: face similarity', { similarity: [res1, res2, res3], descriptors: [desc1?.length, desc2?.length, desc3?.length] }); - // test alternative face embeddings - log('info', 'test face similarity alternative'); - human.reset(); - config.async = false; - config.cacheSensitivity = 0; - config.face['mobilefacenet'] = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }; - res = await testDetect(human, 'samples/in/ai-face.jpg', 'face embeddings'); - if (!res || !res.face || !res.face[0] || res.face[0].embedding.length !== 192) log('error', 'failed: mobilefacenet', { embedding: res.face[0]?.embedding?.length }); - else log('state', 'passed: mobilefacenet'); - config.face['insightface'] = { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }; - res = await testDetect(human, 'samples/in/ai-face.jpg', 'face embeddings'); - if (!res || !res.face || !res.face[0] || res.face[0].embedding.length !== 512) log('error', 'failed: insightface', { embedding: res.face[0]?.embedding?.length }); - else log('state', 'passed: insightface'); - - // test face matching - log('info', 'test face matching'); - const db = JSON.parse(fs.readFileSync('demo/facematch/faces.json').toString()); - const arr = db.map((rec) => rec.embedding); - if (db.length < 20) log('error', 'failed: face database ', db.length); - else log('state', 'passed: face database', db.length); - res1 = human.match(desc1, arr); - res2 = human.match(desc2, arr); - res3 = human.match(desc3, arr); - if (res1.index !== 4 || res2.index !== 4 || res3.index !== 4) log('error', 'failed: face match', res1, res2, res3); - else log('state', 'passed: face match', { first: { index: res1.index, similarity: res1.similarity } }, { second: { index: res2.index, similarity: res2.similarity } }, { third: { index: res3.index, similarity: res3.similarity } }); - // test object detection log('info', 'test object'); - human.reset(); config.object = { enabled: true, modelPath: 'mb3-centernet.json' }; res = await testDetect(human, 'samples/in/ai-body.jpg', 'object'); if (!res || res?.object?.length < 1 || res?.object[0]?.label !== 'person') log('error', 'failed: centernet', res?.object); else log('state', 'passed: centernet'); - + human.models['centernet'] = null; config.object = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/nanodet.json' }; res = await testDetect(human, 'samples/in/ai-body.jpg', 'object'); if (!res || res?.object?.length < 1 || res?.object[0]?.label !== 'person') log('error', 'failed: nanodet', res?.object); else log('state', 'passed: nanodet'); + human.models['nanodet'] = null; config.object.enabled = false; // test sensitive config @@ -426,24 +424,64 @@ async function test(Human, inputConfig) { config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/blazepose-heavy.json' }; res = await testDetect(human, 'samples/in/ai-body.jpg', 'blazepose'); - if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 39) log('error', 'failed: blazepose', { body: res.body[0] }); + if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 39) log('error', 'failed: blazepose', { body: res.body?.[0] }); else log('state', 'passed: blazepose'); config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/efficientpose.json' }; res = await testDetect(human, 'samples/in/ai-body.jpg', 'efficientpose'); - if (!res || !res.body || !res.body[0] || res.body[0].score < 0.7 || res.body[0].keypoints?.length !== 13) log('error', 'failed: efficientpose', { body: res.body[0] }); + if (!res || !res.body || !res.body[0] || res.body[0].score < 0.7 || res.body[0].keypoints?.length !== 13) log('error', 'failed: efficientpose', { body: res.body?.[0] }); else log('state', 'passed: efficientpose'); config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/posenet.json' }; res = await testDetect(human, 'samples/in/ai-body.jpg', 'posenet'); - if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 16) log('error', 'failed: posenet', { body: res.body[0] }); + if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 16) log('error', 'failed: posenet', { body: res.body?.[0] }); else log('state', 'passed: posenet'); config.body = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/movenet-lightning.json' }; res = await testDetect(human, 'samples/in/ai-body.jpg', 'movenet'); - if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 17) log('error', 'failed: movenet', { body: res.body[0] }); + if (!res || !res.body || !res.body[0] || res.body[0].score < 0.9 || res.body[0].keypoints?.length !== 17) log('error', 'failed: movenet', { body: res.body?.[0] }); else log('state', 'passed: movenet'); + // test face matching + log('info', 'test face matching'); + const db = JSON.parse(fs.readFileSync('demo/facematch/faces.json').toString()); + const arr = db.map((rec) => rec.embedding); + if (db.length < 20) log('error', 'failed: face database ', db.length); + else log('state', 'passed: face database', db.length); + res1 = human.match(desc1, arr); + res2 = human.match(desc2, arr); + res3 = human.match(desc3, arr); + if (res1.index !== 4 || res2.index !== 4 || res3.index !== 4) log('error', 'failed: face match', res1, res2, res3); + else log('state', 'passed: face match', { first: { index: res1.index, similarity: res1.similarity } }, { second: { index: res2.index, similarity: res2.similarity } }, { third: { index: res3.index, similarity: res3.similarity } }); + + // test alternative face embeddings + log('info', 'test face similarity alternative'); + human.reset(); + config.async = false; + config.cacheSensitivity = 0; + config.face['mobilefacenet'] = { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }; + res = await testDetect(human, 'samples/in/ai-face.jpg', 'face embeddings'); + if (!res || !res.face || !res.face[0] || res.face[0].embedding?.length !== 192) log('error', 'failed: mobilefacenet', { embedding: res.face?.[0]?.embedding?.length }); + else log('state', 'passed: mobilefacenet', { embedding: res.face?.[0]?.embedding?.length }); + config.face['insightface'] = { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }; + res = await testDetect(human, 'samples/in/ai-face.jpg', 'face embeddings'); + if (!res || !res.face || !res.face[0] || res.face[0]?.embedding?.length !== 512) log('error', 'failed: insightface', { embedding: res.face?.[0]?.embedding?.length }); + else log('state', 'passed: insightface', { embedding: res.face?.[0]?.embedding?.length }); + human.models['mobilefacenet'] = null; + config.face['mobilefacenet'] = { enabled: false }; + human.models['insightface'] = null; + config.face['insightface'] = { enabled: false }; + + // test face attention + log('info', 'test face attention'); + human.models.facemesh = null; + config.face.attention = { enabled: true }; + res = await testDetect(human, 'samples/in/ai-face.jpg', 'face attention'); + if (!res || !res.face[0] || res.face[0].mesh.length !== 478 || Object.keys(res.face[0].annotations).length !== 36) log('error', 'failed: face attention', { mesh: res.face?.[0]?.mesh?.length, annotations: Object.keys(res.face?.[0]?.annotations | {}).length }); + else log('state', 'passed: face attention'); + human.models.facemesh = null; // unload model + config.face.attention = { enabled: false }; + // test detectors only log('info', 'test detectors'); human.reset(); diff --git a/test/test-node-cpu.js b/test/test-node-cpu.js new file mode 100644 index 00000000..3b464c63 --- /dev/null +++ b/test/test-node-cpu.js @@ -0,0 +1,28 @@ +process.env.TF_CPP_MIN_LOG_LEVEL = '2'; +const Human = require('../dist/human.node.js').default; +const test = require('./test-main.js').test; + +const config = { + cacheSensitivity: 0, + modelBasePath: 'file://models/', + backend: 'cpu', + debug: false, + async: true, + face: { + enabled: true, + detector: { rotation: true }, + mesh: { enabled: true }, + iris: { enabled: true }, + description: { enabled: true }, + emotion: { enabled: true }, + antispoof: { enabled: true }, + liveness: { enabled: true }, + }, + hand: { enabled: true }, + body: { enabled: true }, + object: { enabled: true }, + segmentation: { enabled: true }, + filter: { enabled: false }, +}; + +test(Human, config); diff --git a/test/test.log b/test/test.log index 0c94ed72..713bf70b 100644 --- a/test/test.log +++ b/test/test.log @@ -1,298 +1,468 @@ -2022-08-08 15:09:00 INFO:  @vladmandic/human version 2.9.2 -2022-08-08 15:09:00 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.15.0 -2022-08-08 15:09:00 INFO:  tests: ["test-node.js"] -2022-08-08 15:09:00 INFO:  demos: ["../demo/nodejs/node.js","../demo/nodejs/node-canvas.js","../demo/nodejs/node-env.js","../demo/nodejs/node-event.js","../demo/nodejs/node-multiprocess.js"] -2022-08-08 15:09:00 INFO:  -2022-08-08 15:09:00 INFO:  test-node.js start -2022-08-08 15:09:00 INFO:  test-node.js test: configuration validation -2022-08-08 15:09:00 STATE: test-node.js passed: configuration default validation [] -2022-08-08 15:09:00 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-08-08 15:09:00 INFO:  test-node.js test: model load -2022-08-08 15:09:00 STATE: test-node.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] -2022-08-08 15:09:00 INFO:  test-node.js test: warmup -2022-08-08 15:09:00 STATE: test-node.js passed: create human -2022-08-08 15:09:00 INFO:  test-node.js human version: 2.9.2 -2022-08-08 15:09:00 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.15.0 -2022-08-08 15:09:00 INFO:  test-node.js tfjs version: 3.19.0 -2022-08-08 15:09:00 INFO:  test-node.js tensorflow binding version: 2.7.3-dev20220521 -2022-08-08 15:09:00 STATE: test-node.js passed: set backend: tensorflow -2022-08-08 15:09:00 STATE: test-node.js tensors 1921 -2022-08-08 15:09:00 STATE: test-node.js passed: load models -2022-08-08 15:09:00 STATE: test-node.js result: defined models: 23 loaded models: 12 -2022-08-08 15:09:00 STATE: test-node.js passed: warmup: none default -2022-08-08 15:09:00 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-08-08 15:09:00 DATA:  test-node.js result: performance: load: null total: null -2022-08-08 15:09:00 STATE: test-node.js passed: warmup none result match -2022-08-08 15:09:00 STATE: test-node.js event: image -2022-08-08 15:09:00 STATE: test-node.js event: detect -2022-08-08 15:09:00 STATE: test-node.js event: warmup -2022-08-08 15:09:00 STATE: test-node.js passed: warmup: face default -2022-08-08 15:09:00 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} -2022-08-08 15:09:00 DATA:  test-node.js result: performance: load: null total: 361 -2022-08-08 15:09:00 STATE: test-node.js passed: warmup face result match -2022-08-08 15:09:00 STATE: test-node.js event: image -2022-08-08 15:09:01 STATE: test-node.js event: detect -2022-08-08 15:09:01 STATE: test-node.js event: warmup -2022-08-08 15:09:01 STATE: test-node.js passed: warmup: body default -2022-08-08 15:09:01 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:01 DATA:  test-node.js result: performance: load: null total: 270 -2022-08-08 15:09:01 STATE: test-node.js passed: warmup body result match -2022-08-08 15:09:01 STATE: test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} -2022-08-08 15:09:01 INFO:  test-node.js test: details verification -2022-08-08 15:09:01 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:01 STATE: test-node.js event: image -2022-08-08 15:09:01 STATE: test-node.js event: detect -2022-08-08 15:09:01 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-08-08 15:09:01 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:01 DATA:  test-node.js result: performance: load: null total: 257 -2022-08-08 15:09:01 STATE: test-node.js passed: details face length 1 -2022-08-08 15:09:01 STATE: test-node.js passed: details face score 1 0.93 1 -2022-08-08 15:09:01 STATE: test-node.js passed: details face age/gender 23.7 female 0.97 85.47 -2022-08-08 15:09:01 STATE: test-node.js passed: details face arrays 4 478 1024 -2022-08-08 15:09:01 STATE: test-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} -2022-08-08 15:09:01 STATE: test-node.js passed: details face anti-spoofing 0.79 -2022-08-08 15:09:01 STATE: test-node.js passed: details face liveness 0.83 -2022-08-08 15:09:01 STATE: test-node.js passed: details body length 1 -2022-08-08 15:09:01 STATE: test-node.js passed: details body 0.92 17 6 -2022-08-08 15:09:01 STATE: test-node.js passed: details hand length 1 -2022-08-08 15:09:01 STATE: test-node.js passed: details hand 0.51 0.73 point -2022-08-08 15:09:01 STATE: test-node.js passed: details hand arrays 21 5 7 -2022-08-08 15:09:01 STATE: test-node.js passed: details gesture length 7 -2022-08-08 15:09:01 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-08-08 15:09:01 STATE: test-node.js passed: details object length 1 -2022-08-08 15:09:01 STATE: test-node.js passed: details object 0.72 person -2022-08-08 15:09:01 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} -2022-08-08 15:09:01 STATE: test-node.js event: image -2022-08-08 15:09:02 STATE: test-node.js event: detect -2022-08-08 15:09:02 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-08-08 15:09:02 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-08-08 15:09:02 STATE: test-node.js event: image -2022-08-08 15:09:02 STATE: test-node.js event: detect -2022-08-08 15:09:02 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-08-08 15:09:02 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:02 STATE: test-node.js event: image -2022-08-08 15:09:03 STATE: test-node.js event: detect -2022-08-08 15:09:03 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-08-08 15:09:03 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:03 STATE: test-node.js event: image -2022-08-08 15:09:03 STATE: test-node.js event: detect -2022-08-08 15:09:03 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-08-08 15:09:03 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-08-08 15:09:03 STATE: test-node.js event: image -2022-08-08 15:09:03 STATE: test-node.js event: detect -2022-08-08 15:09:03 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-08-08 15:09:03 INFO:  test-node.js test default -2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:04 STATE: test-node.js event: image -2022-08-08 15:09:04 STATE: test-node.js event: detect -2022-08-08 15:09:04 STATE: test-node.js passed: detect: samples/in/ai-body.jpg async -2022-08-08 15:09:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:04 DATA:  test-node.js result: performance: load: null total: 248 -2022-08-08 15:09:04 STATE: test-node.js passed: default result face match 1 female 0.97 -2022-08-08 15:09:04 INFO:  test-node.js test sync -2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:04 STATE: test-node.js event: image -2022-08-08 15:09:04 STATE: test-node.js event: detect -2022-08-08 15:09:04 STATE: test-node.js passed: detect: samples/in/ai-body.jpg sync -2022-08-08 15:09:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:04 DATA:  test-node.js result: performance: load: null total: 219 -2022-08-08 15:09:04 STATE: test-node.js passed: default sync 1 female 0.97 -2022-08-08 15:09:04 INFO:  test-node.js test: image process -2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:04 STATE: test-node.js passed: image input null [1,256,256,3] -2022-08-08 15:09:04 INFO:  test-node.js test: image null -2022-08-08 15:09:04 STATE: test-node.js passed: invalid input could not convert input to tensor -2022-08-08 15:09:04 INFO:  test-node.js test face attention -2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:04 STATE: test-node.js event: image -2022-08-08 15:09:04 STATE: test-node.js event: detect -2022-08-08 15:09:04 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face mesh -2022-08-08 15:09:04 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-08-08 15:09:04 DATA:  test-node.js result: performance: load: null total: 213 -2022-08-08 15:09:04 STATE: test-node.js passed: face attention -2022-08-08 15:09:04 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:04 STATE: test-node.js event: image -2022-08-08 15:09:05 STATE: test-node.js event: detect -2022-08-08 15:09:05 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face attention -2022-08-08 15:09:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-08-08 15:09:05 DATA:  test-node.js result: performance: load: null total: 231 -2022-08-08 15:09:05 STATE: test-node.js passed: face attention -2022-08-08 15:09:05 INFO:  test-node.js test face similarity -2022-08-08 15:09:05 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:05 STATE: test-node.js event: image -2022-08-08 15:09:05 STATE: test-node.js event: detect -2022-08-08 15:09:05 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face similarity -2022-08-08 15:09:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-08-08 15:09:05 DATA:  test-node.js result: performance: load: null total: 213 -2022-08-08 15:09:05 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:05 STATE: test-node.js event: image -2022-08-08 15:09:05 STATE: test-node.js event: detect -2022-08-08 15:09:05 STATE: test-node.js passed: detect: samples/in/ai-body.jpg face similarity -2022-08-08 15:09:05 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:05 DATA:  test-node.js result: performance: load: null total: 230 -2022-08-08 15:09:05 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-08-08 15:09:05 STATE: test-node.js event: image -2022-08-08 15:09:06 STATE: test-node.js event: detect -2022-08-08 15:09:06 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg face similarity -2022-08-08 15:09:06 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 5 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-08-08 15:09:06 DATA:  test-node.js result: performance: load: null total: 206 -2022-08-08 15:09:06 STATE: test-node.js passed: face descriptor -2022-08-08 15:09:06 STATE: test-node.js passed: face similarity {"similarity":[1,0.44727452329649126,0.5567935850640406],"descriptors":[1024,1024,1024]} -2022-08-08 15:09:06 INFO:  test-node.js test face similarity alternative -2022-08-08 15:09:06 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:06 STATE: test-node.js event: image -2022-08-08 15:09:07 STATE: test-node.js event: detect -2022-08-08 15:09:07 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face embeddings -2022-08-08 15:09:07 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-08-08 15:09:07 DATA:  test-node.js result: performance: load: null total: 247 -2022-08-08 15:09:07 STATE: test-node.js passed: mobilefacenet -2022-08-08 15:09:07 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:07 STATE: test-node.js event: image -2022-08-08 15:09:08 STATE: test-node.js event: detect -2022-08-08 15:09:08 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face embeddings -2022-08-08 15:09:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-08-08 15:09:08 DATA:  test-node.js result: performance: load: null total: 263 -2022-08-08 15:09:08 STATE: test-node.js passed: insightface -2022-08-08 15:09:08 INFO:  test-node.js test face matching -2022-08-08 15:09:08 STATE: test-node.js passed: face database 40 -2022-08-08 15:09:08 STATE: test-node.js passed: face match {"first":{"index":4,"similarity":0.7827852615252829}} {"second":{"index":4,"similarity":0.5002052633015844}} {"third":{"index":4,"similarity":0.5401587887998899}} -2022-08-08 15:09:08 INFO:  test-node.js test object -2022-08-08 15:09:08 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:08 STATE: test-node.js event: image -2022-08-08 15:09:08 STATE: test-node.js event: detect -2022-08-08 15:09:08 STATE: test-node.js passed: detect: samples/in/ai-body.jpg object -2022-08-08 15:09:08 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:08 DATA:  test-node.js result: performance: load: null total: 268 -2022-08-08 15:09:08 STATE: test-node.js passed: centernet -2022-08-08 15:09:09 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:09 STATE: test-node.js event: image -2022-08-08 15:09:10 STATE: test-node.js event: detect -2022-08-08 15:09:10 STATE: test-node.js passed: detect: samples/in/ai-body.jpg object -2022-08-08 15:09:10 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 3 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17} -2022-08-08 15:09:10 DATA:  test-node.js result: performance: load: null total: 263 -2022-08-08 15:09:10 STATE: test-node.js passed: nanodet -2022-08-08 15:09:10 INFO:  test-node.js test sensitive -2022-08-08 15:09:10 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:10 STATE: test-node.js event: image -2022-08-08 15:09:10 STATE: test-node.js event: detect -2022-08-08 15:09:10 STATE: test-node.js passed: detect: samples/in/ai-body.jpg sensitive -2022-08-08 15:09:10 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-08-08 15:09:10 DATA:  test-node.js result: performance: load: null total: 205 -2022-08-08 15:09:10 STATE: test-node.js passed: sensitive result match -2022-08-08 15:09:10 STATE: test-node.js passed: sensitive face result match -2022-08-08 15:09:10 STATE: test-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] -2022-08-08 15:09:10 STATE: test-node.js passed: sensitive body result match -2022-08-08 15:09:10 STATE: test-node.js passed: sensitive hand result match -2022-08-08 15:09:10 INFO:  test-node.js test body -2022-08-08 15:09:12 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:12 STATE: test-node.js event: image -2022-08-08 15:09:12 STATE: test-node.js event: detect -2022-08-08 15:09:12 STATE: test-node.js passed: detect: samples/in/ai-body.jpg blazepose -2022-08-08 15:09:12 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39} -2022-08-08 15:09:12 DATA:  test-node.js result: performance: load: null total: 270 -2022-08-08 15:09:12 STATE: test-node.js passed: blazepose -2022-08-08 15:09:14 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:14 STATE: test-node.js event: image -2022-08-08 15:09:15 STATE: test-node.js event: detect -2022-08-08 15:09:15 STATE: test-node.js passed: detect: samples/in/ai-body.jpg efficientpose -2022-08-08 15:09:15 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13} -2022-08-08 15:09:15 DATA:  test-node.js result: performance: load: null total: 281 -2022-08-08 15:09:15 STATE: test-node.js passed: efficientpose -2022-08-08 15:09:16 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:16 STATE: test-node.js event: image -2022-08-08 15:09:16 STATE: test-node.js event: detect -2022-08-08 15:09:16 STATE: test-node.js passed: detect: samples/in/ai-body.jpg posenet -2022-08-08 15:09:16 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16} -2022-08-08 15:09:16 DATA:  test-node.js result: performance: load: null total: 209 -2022-08-08 15:09:16 STATE: test-node.js passed: posenet -2022-08-08 15:09:16 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:16 STATE: test-node.js event: image -2022-08-08 15:09:16 STATE: test-node.js event: detect -2022-08-08 15:09:16 STATE: test-node.js passed: detect: samples/in/ai-body.jpg movenet -2022-08-08 15:09:16 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} -2022-08-08 15:09:16 DATA:  test-node.js result: performance: load: null total: 206 -2022-08-08 15:09:16 STATE: test-node.js passed: movenet -2022-08-08 15:09:16 INFO:  test-node.js test detectors -2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:17 STATE: test-node.js event: image -2022-08-08 15:09:17 STATE: test-node.js event: detect -2022-08-08 15:09:17 STATE: test-node.js passed: detect: samples/in/ai-body.jpg detectors -2022-08-08 15:09:17 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} -2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 94 -2022-08-08 15:09:17 STATE: test-node.js passed: detector result face match -2022-08-08 15:09:17 STATE: test-node.js passed: detector result hand match -2022-08-08 15:09:17 INFO:  test-node.js test: multi-instance -2022-08-08 15:09:17 STATE: test-node.js event: image -2022-08-08 15:09:17 STATE: test-node.js event: detect -2022-08-08 15:09:17 STATE: test-node.js passed: detect: random multi instance -2022-08-08 15:09:17 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0} -2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 86 -2022-08-08 15:09:17 INFO:  test-node.js test: first instance -2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-08-08 15:09:17 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg multi instance -2022-08-08 15:09:17 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} -2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 88 -2022-08-08 15:09:17 INFO:  test-node.js test: second instance -2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-08-08 15:09:17 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg multi instance -2022-08-08 15:09:17 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} -2022-08-08 15:09:17 DATA:  test-node.js result: performance: load: null total: 85 -2022-08-08 15:09:17 INFO:  test-node.js test: concurrent -2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:17 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:18 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-08-08 15:09:18 STATE: test-node.js event: image -2022-08-08 15:09:18 STATE: test-node.js event: image -2022-08-08 15:09:18 STATE: test-node.js event: image -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936 -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936 -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936 -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936 -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936 -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 936 -2022-08-08 15:09:19 STATE: test-node.js event: detect -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 742 -2022-08-08 15:09:19 STATE: test-node.js event: detect -2022-08-08 15:09:19 STATE: test-node.js event: detect -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 742 -2022-08-08 15:09:19 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent -2022-08-08 15:09:19 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} -2022-08-08 15:09:19 DATA:  test-node.js result: performance: load: null total: 742 -2022-08-08 15:09:19 INFO:  test-node.js test: monkey-patch -2022-08-08 15:09:19 STATE: test-node.js event: image -2022-08-08 15:09:19 STATE: test-node.js event: detect -2022-08-08 15:09:19 STATE: test-node.js passed: monkey patch -2022-08-08 15:09:19 STATE: test-node.js passed: segmentation [65536] -2022-08-08 15:09:19 STATE: test-node.js passeed: equal usage -2022-08-08 15:09:19 INFO:  test-node.js test: input compare -2022-08-08 15:09:19 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-08-08 15:09:19 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-08-08 15:09:19 STATE: test-node.js passed: image compare 0 23.275441687091504 -2022-08-08 15:09:19 INFO:  test-node.js events: {"image":30,"detect":30,"warmup":2} -2022-08-08 15:09:19 INFO:  test-node.js tensors 4105 -2022-08-08 15:09:19 INFO:  test-node.js test complete: 19131 ms -2022-08-08 15:09:19 INFO:  all tests complete -2022-08-08 15:09:19 INFO:  failed: {"count":0,"messages":[]} -2022-08-08 15:09:19 INFO:  status: {"test":"test-node.js","passed":128,"failed":0} +2022-08-10 13:44:05 INFO:  @vladmandic/human version 2.9.2 +2022-08-10 13:44:05 INFO:  User: vlado Platform: linux Arch: x64 Node: v16.15.0 +2022-08-10 13:44:05 INFO:  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":[]}] +2022-08-10 13:44:05 INFO:  +2022-08-10 13:44:05 INFO:  {"cmd":"../demo/nodejs/node.js","args":[]} start +2022-08-10 13:44:06 INFO:  +2022-08-10 13:44:06 INFO:  {"cmd":"../demo/nodejs/node-simple.js","args":[]} start +2022-08-10 13:44:07 INFO:  +2022-08-10 13:44:07 INFO:  {"cmd":"../demo/nodejs/node-fetch.js","args":[]} start +2022-08-10 13:44:08 INFO:  +2022-08-10 13:44:08 INFO:  {"cmd":"../demo/nodejs/node-event.js","args":["samples/in/ai-body.jpg"]} start +2022-08-10 13:44:09 INFO:  +2022-08-10 13:44:09 INFO:  {"cmd":"../demo/nodejs/node-similarity.js","args":["samples/in/ai-face.jpg","samples/in/ai-upper.jpg"]} start +2022-08-10 13:44:09 INFO:  +2022-08-10 13:44:09 INFO:  {"cmd":"../demo/nodejs/node-canvas.js","args":["samples/in/ai-body.jpg","samples/out/ai-body.jpg"]} start +2022-08-10 13:44:10 INFO:  +2022-08-10 13:44:10 INFO:  {"cmd":"../demo/multithread/node-multiprocess.js","args":[]} start +2022-08-10 13:44:11 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] +2022-08-10 13:44:11 INFO:  +2022-08-10 13:44:11 INFO:  test-node.js start +2022-08-10 13:44:11 INFO:  test-node.js test: configuration validation +2022-08-10 13:44:11 STATE: test-node.js passed: configuration default validation [] +2022-08-10 13:44:11 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-08-10 13:44:11 INFO:  test-node.js test: model load +2022-08-10 13:44:12 STATE: test-node.js passed: models loaded 23 12 [{"name":"ssrnetage","loaded":false,"url":null},{"name":"gear","loaded":false,"url":null},{"name":"blazeposedetect","loaded":false,"url":null},{"name":"blazepose","loaded":false,"url":null},{"name":"centernet","loaded":true,"url":"file://models/mb3-centernet.json"},{"name":"efficientpose","loaded":false,"url":null},{"name":"mobilefacenet","loaded":false,"url":null},{"name":"insightface","loaded":false,"url":null},{"name":"emotion","loaded":true,"url":"file://models/emotion.json"},{"name":"facedetect","loaded":true,"url":"file://models/blazeface.json"},{"name":"faceiris","loaded":true,"url":"file://models/iris.json"},{"name":"facemesh","loaded":true,"url":"file://models/facemesh.json"},{"name":"faceres","loaded":true,"url":"file://models/faceres.json"},{"name":"ssrnetgender","loaded":false,"url":null},{"name":"handpose","loaded":false,"url":null},{"name":"handskeleton","loaded":true,"url":"file://models/handlandmark-full.json"},{"name":"handtrack","loaded":true,"url":"file://models/handtrack.json"},{"name":"liveness","loaded":true,"url":"file://models/liveness.json"},{"name":"movenet","loaded":true,"url":"file://models/movenet-lightning.json"},{"name":"nanodet","loaded":false,"url":null},{"name":"posenet","loaded":false,"url":null},{"name":"segmentation","loaded":true,"url":"file://models/selfie.json"},{"name":"antispoof","loaded":true,"url":"file://models/antispoof.json"}] +2022-08-10 13:44:12 INFO:  test-node.js test: warmup +2022-08-10 13:44:12 STATE: test-node.js passed: create human +2022-08-10 13:44:12 INFO:  test-node.js human version: 2.9.2 +2022-08-10 13:44:12 INFO:  test-node.js platform: linux x64 agent: NodeJS v16.15.0 +2022-08-10 13:44:12 INFO:  test-node.js tfjs version: 3.19.0 +2022-08-10 13:44:12 INFO:  test-node.js tensorflow binding version: 2.7.3-dev20220521 +2022-08-10 13:44:12 STATE: test-node.js passed: set backend: tensorflow +2022-08-10 13:44:12 STATE: test-node.js tensors 1921 +2022-08-10 13:44:12 STATE: test-node.js passed: load models +2022-08-10 13:44:12 STATE: test-node.js result: defined models: 23 loaded models: 12 +2022-08-10 13:44:12 STATE: test-node.js passed: warmup: none default +2022-08-10 13:44:12 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-08-10 13:44:12 DATA:  test-node.js result: performance: load: null total: null +2022-08-10 13:44:12 STATE: test-node.js passed: warmup none result match +2022-08-10 13:44:12 STATE: test-node.js event: image +2022-08-10 13:44:12 STATE: test-node.js event: detect +2022-08-10 13:44:12 STATE: test-node.js event: warmup +2022-08-10 13:44:12 STATE: test-node.js passed: warmup: face default +2022-08-10 13:44:12 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2022-08-10 13:44:12 DATA:  test-node.js result: performance: load: null total: 351 +2022-08-10 13:44:12 STATE: test-node.js passed: warmup face result match +2022-08-10 13:44:12 STATE: test-node.js event: image +2022-08-10 13:44:12 STATE: test-node.js event: detect +2022-08-10 13:44:12 STATE: test-node.js event: warmup +2022-08-10 13:44:12 STATE: test-node.js passed: warmup: body default +2022-08-10 13:44:12 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:12 DATA:  test-node.js result: performance: load: null total: 257 +2022-08-10 13:44:12 STATE: test-node.js passed: warmup body result match +2022-08-10 13:44:12 STATE: test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} +2022-08-10 13:44:12 INFO:  test-node.js test: details verification +2022-08-10 13:44:12 STATE: test-node.js start default +2022-08-10 13:44:12 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:12 STATE: test-node.js event: image +2022-08-10 13:44:13 STATE: test-node.js event: detect +2022-08-10 13:44:13 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-08-10 13:44:13 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:13 DATA:  test-node.js result: performance: load: null total: 259 +2022-08-10 13:44:13 STATE: test-node.js passed: details face length 1 +2022-08-10 13:44:13 STATE: test-node.js passed: details face score 1 0.93 1 +2022-08-10 13:44:13 STATE: test-node.js passed: details face age/gender 23.7 female 0.97 85.47 +2022-08-10 13:44:13 STATE: test-node.js passed: details face arrays 4 478 1024 +2022-08-10 13:44:13 STATE: test-node.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-08-10 13:44:13 STATE: test-node.js passed: details face anti-spoofing 0.79 +2022-08-10 13:44:13 STATE: test-node.js passed: details face liveness 0.83 +2022-08-10 13:44:13 STATE: test-node.js passed: details body length 1 +2022-08-10 13:44:13 STATE: test-node.js passed: details body 0.92 17 6 +2022-08-10 13:44:13 STATE: test-node.js passed: details hand length 1 +2022-08-10 13:44:13 STATE: test-node.js passed: details hand 0.51 0.73 point +2022-08-10 13:44:13 STATE: test-node.js passed: details hand arrays 21 5 7 +2022-08-10 13:44:13 STATE: test-node.js passed: details gesture length 7 +2022-08-10 13:44:13 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-08-10 13:44:13 STATE: test-node.js passed: details object length 1 +2022-08-10 13:44:13 STATE: test-node.js passed: details object 0.72 person +2022-08-10 13:44:13 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-08-10 13:44:13 STATE: test-node.js event: image +2022-08-10 13:44:13 STATE: test-node.js event: detect +2022-08-10 13:44:13 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-08-10 13:44:13 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-08-10 13:44:13 STATE: test-node.js event: image +2022-08-10 13:44:14 STATE: test-node.js event: detect +2022-08-10 13:44:14 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-08-10 13:44:14 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:14 STATE: test-node.js event: image +2022-08-10 13:44:14 STATE: test-node.js event: detect +2022-08-10 13:44:14 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-08-10 13:44:14 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:14 STATE: test-node.js event: image +2022-08-10 13:44:14 STATE: test-node.js event: detect +2022-08-10 13:44:14 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-08-10 13:44:15 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-08-10 13:44:15 STATE: test-node.js event: image +2022-08-10 13:44:15 STATE: test-node.js event: detect +2022-08-10 13:44:15 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-08-10 13:44:15 INFO:  test-node.js test default +2022-08-10 13:44:15 STATE: test-node.js start async +2022-08-10 13:44:15 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:15 STATE: test-node.js event: image +2022-08-10 13:44:15 STATE: test-node.js event: detect +2022-08-10 13:44:15 STATE: test-node.js passed: detect: samples/in/ai-body.jpg async +2022-08-10 13:44:15 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:15 DATA:  test-node.js result: performance: load: null total: 243 +2022-08-10 13:44:15 STATE: test-node.js passed: default result face match 1 female 0.97 +2022-08-10 13:44:15 INFO:  test-node.js test sync +2022-08-10 13:44:15 STATE: test-node.js start sync +2022-08-10 13:44:15 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:15 STATE: test-node.js event: image +2022-08-10 13:44:16 STATE: test-node.js event: detect +2022-08-10 13:44:16 STATE: test-node.js passed: detect: samples/in/ai-body.jpg sync +2022-08-10 13:44:16 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:16 DATA:  test-node.js result: performance: load: null total: 217 +2022-08-10 13:44:16 STATE: test-node.js passed: default sync 1 female 0.97 +2022-08-10 13:44:16 INFO:  test-node.js test: image process +2022-08-10 13:44:16 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:16 STATE: test-node.js passed: image input null [1,256,256,3] +2022-08-10 13:44:16 INFO:  test-node.js test: image null +2022-08-10 13:44:16 STATE: test-node.js passed: invalid input could not convert input to tensor +2022-08-10 13:44:16 INFO:  test-node.js test face similarity +2022-08-10 13:44:16 STATE: test-node.js start face similarity +2022-08-10 13:44:16 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:16 STATE: test-node.js event: image +2022-08-10 13:44:16 STATE: test-node.js event: detect +2022-08-10 13:44:16 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face similarity +2022-08-10 13:44:16 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-08-10 13:44:16 DATA:  test-node.js result: performance: load: null total: 222 +2022-08-10 13:44:16 STATE: test-node.js start face similarity +2022-08-10 13:44:16 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:16 STATE: test-node.js event: image +2022-08-10 13:44:16 STATE: test-node.js event: detect +2022-08-10 13:44:16 STATE: test-node.js passed: detect: samples/in/ai-body.jpg face similarity +2022-08-10 13:44:16 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:16 DATA:  test-node.js result: performance: load: null total: 218 +2022-08-10 13:44:16 STATE: test-node.js start face similarity +2022-08-10 13:44:16 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-08-10 13:44:16 STATE: test-node.js event: image +2022-08-10 13:44:17 STATE: test-node.js event: detect +2022-08-10 13:44:17 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-08-10 13:44:17 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-08-10 13:44:17 DATA:  test-node.js result: performance: load: null total: 223 +2022-08-10 13:44:17 STATE: test-node.js passed: face descriptor +2022-08-10 13:44:17 STATE: test-node.js passed: face similarity {"similarity":[1,0.44727452329649126,0.5567935850640406],"descriptors":[1024,1024,1024]} +2022-08-10 13:44:17 INFO:  test-node.js test object +2022-08-10 13:44:17 STATE: test-node.js start object +2022-08-10 13:44:17 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:17 STATE: test-node.js event: image +2022-08-10 13:44:17 STATE: test-node.js event: detect +2022-08-10 13:44:17 STATE: test-node.js passed: detect: samples/in/ai-body.jpg object +2022-08-10 13:44:17 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:17 DATA:  test-node.js result: performance: load: null total: 222 +2022-08-10 13:44:17 STATE: test-node.js passed: centernet +2022-08-10 13:44:17 STATE: test-node.js start object +2022-08-10 13:44:18 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:18 STATE: test-node.js event: image +2022-08-10 13:44:18 STATE: test-node.js event: detect +2022-08-10 13:44:18 STATE: test-node.js passed: detect: samples/in/ai-body.jpg object +2022-08-10 13:44:18 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 2 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.86,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:18 DATA:  test-node.js result: performance: load: null total: 259 +2022-08-10 13:44:18 STATE: test-node.js passed: nanodet +2022-08-10 13:44:18 INFO:  test-node.js test sensitive +2022-08-10 13:44:18 STATE: test-node.js start sensitive +2022-08-10 13:44:18 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:18 STATE: test-node.js event: image +2022-08-10 13:44:18 STATE: test-node.js event: detect +2022-08-10 13:44:18 STATE: test-node.js passed: detect: samples/in/ai-body.jpg sensitive +2022-08-10 13:44:18 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-08-10 13:44:18 DATA:  test-node.js result: performance: load: null total: 183 +2022-08-10 13:44:18 STATE: test-node.js passed: sensitive result match +2022-08-10 13:44:18 STATE: test-node.js passed: sensitive face result match +2022-08-10 13:44:18 STATE: test-node.js passed: sensitive face emotion result [{"score":0.59,"emotion":"angry"},{"score":0.29,"emotion":"fear"}] +2022-08-10 13:44:18 STATE: test-node.js passed: sensitive body result match +2022-08-10 13:44:18 STATE: test-node.js passed: sensitive hand result match +2022-08-10 13:44:18 INFO:  test-node.js test body +2022-08-10 13:44:18 STATE: test-node.js start blazepose +2022-08-10 13:44:20 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:20 STATE: test-node.js event: image +2022-08-10 13:44:20 STATE: test-node.js event: detect +2022-08-10 13:44:20 STATE: test-node.js passed: detect: samples/in/ai-body.jpg blazepose +2022-08-10 13:44:20 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.99,"keypoints":39} +2022-08-10 13:44:20 DATA:  test-node.js result: performance: load: null total: 256 +2022-08-10 13:44:20 STATE: test-node.js passed: blazepose +2022-08-10 13:44:20 STATE: test-node.js start efficientpose +2022-08-10 13:44:23 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:23 STATE: test-node.js event: image +2022-08-10 13:44:23 STATE: test-node.js event: detect +2022-08-10 13:44:23 STATE: test-node.js passed: detect: samples/in/ai-body.jpg efficientpose +2022-08-10 13:44:23 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.75,"keypoints":13} +2022-08-10 13:44:23 DATA:  test-node.js result: performance: load: null total: 265 +2022-08-10 13:44:23 STATE: test-node.js passed: efficientpose +2022-08-10 13:44:23 STATE: test-node.js start posenet +2022-08-10 13:44:24 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:24 STATE: test-node.js event: image +2022-08-10 13:44:24 STATE: test-node.js event: detect +2022-08-10 13:44:24 STATE: test-node.js passed: detect: samples/in/ai-body.jpg posenet +2022-08-10 13:44:24 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.96,"keypoints":16} +2022-08-10 13:44:24 DATA:  test-node.js result: performance: load: null total: 182 +2022-08-10 13:44:24 STATE: test-node.js passed: posenet +2022-08-10 13:44:24 STATE: test-node.js start movenet +2022-08-10 13:44:24 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:24 STATE: test-node.js event: image +2022-08-10 13:44:24 STATE: test-node.js event: detect +2022-08-10 13:44:24 STATE: test-node.js passed: detect: samples/in/ai-body.jpg movenet +2022-08-10 13:44:24 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 0 person: 1 {"score":1,"age":23.7,"gender":"female"} {} {"score":0.92,"keypoints":17} +2022-08-10 13:44:24 DATA:  test-node.js result: performance: load: null total: 189 +2022-08-10 13:44:24 STATE: test-node.js passed: movenet +2022-08-10 13:44:24 INFO:  test-node.js test face matching +2022-08-10 13:44:24 STATE: test-node.js passed: face database 40 +2022-08-10 13:44:24 STATE: test-node.js passed: face match {"first":{"index":4,"similarity":0.7827852615252829}} {"second":{"index":4,"similarity":0.5002052633015844}} {"third":{"index":4,"similarity":0.5401587887998899}} +2022-08-10 13:44:24 INFO:  test-node.js test face similarity alternative +2022-08-10 13:44:24 STATE: test-node.js start face embeddings +2022-08-10 13:44:25 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:25 STATE: test-node.js event: image +2022-08-10 13:44:25 STATE: test-node.js event: detect +2022-08-10 13:44:25 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face embeddings +2022-08-10 13:44:25 DATA:  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-10 13:44:25 DATA:  test-node.js result: performance: load: null total: 213 +2022-08-10 13:44:25 STATE: test-node.js passed: mobilefacenet {"embedding":192} +2022-08-10 13:44:25 STATE: test-node.js start face embeddings +2022-08-10 13:44:26 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:26 STATE: test-node.js event: image +2022-08-10 13:44:26 STATE: test-node.js event: detect +2022-08-10 13:44:26 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face embeddings +2022-08-10 13:44:26 DATA:  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-10 13:44:26 DATA:  test-node.js result: performance: load: null total: 214 +2022-08-10 13:44:26 STATE: test-node.js passed: insightface {"embedding":512} +2022-08-10 13:44:26 INFO:  test-node.js test face attention +2022-08-10 13:44:26 STATE: test-node.js start face attention +2022-08-10 13:44:26 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:26 STATE: test-node.js event: image +2022-08-10 13:44:26 STATE: test-node.js event: detect +2022-08-10 13:44:26 STATE: test-node.js passed: detect: samples/in/ai-face.jpg face attention +2022-08-10 13:44:26 DATA:  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-10 13:44:26 DATA:  test-node.js result: performance: load: null total: 185 +2022-08-10 13:44:26 STATE: test-node.js passed: face attention +2022-08-10 13:44:26 INFO:  test-node.js test detectors +2022-08-10 13:44:26 STATE: test-node.js start detectors +2022-08-10 13:44:26 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:26 STATE: test-node.js event: image +2022-08-10 13:44:26 STATE: test-node.js event: detect +2022-08-10 13:44:26 STATE: test-node.js passed: detect: samples/in/ai-body.jpg detectors +2022-08-10 13:44:26 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} +2022-08-10 13:44:26 DATA:  test-node.js result: performance: load: null total: 86 +2022-08-10 13:44:26 STATE: test-node.js passed: detector result face match +2022-08-10 13:44:26 STATE: test-node.js passed: detector result hand match +2022-08-10 13:44:26 INFO:  test-node.js test: multi-instance +2022-08-10 13:44:26 STATE: test-node.js start multi instance +2022-08-10 13:44:26 STATE: test-node.js event: image +2022-08-10 13:44:27 STATE: test-node.js event: detect +2022-08-10 13:44:27 STATE: test-node.js passed: detect: random multi instance +2022-08-10 13:44:27 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0,"keypoints":0} +2022-08-10 13:44:27 DATA:  test-node.js result: performance: load: null total: 84 +2022-08-10 13:44:27 INFO:  test-node.js test: first instance +2022-08-10 13:44:27 STATE: test-node.js start multi instance +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-08-10 13:44:27 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg multi instance +2022-08-10 13:44:27 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} +2022-08-10 13:44:27 DATA:  test-node.js result: performance: load: null total: 86 +2022-08-10 13:44:27 INFO:  test-node.js test: second instance +2022-08-10 13:44:27 STATE: test-node.js start multi instance +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-08-10 13:44:27 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg multi instance +2022-08-10 13:44:27 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} +2022-08-10 13:44:27 DATA:  test-node.js result: performance: load: null total: 83 +2022-08-10 13:44:27 INFO:  test-node.js test: concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js start concurrent +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-08-10 13:44:27 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:28 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:28 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-08-10 13:44:28 STATE: test-node.js event: image +2022-08-10 13:44:28 STATE: test-node.js event: image +2022-08-10 13:44:28 STATE: test-node.js event: image +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 1049 +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 1049 +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 1050 +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 1050 +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 1050 +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 1050 +2022-08-10 13:44:28 STATE: test-node.js event: detect +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 0 person: 1 {"score":0.96,"gender":"unknown"} {} {"score":0.75,"keypoints":7} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 781 +2022-08-10 13:44:28 STATE: test-node.js event: detect +2022-08-10 13:44:28 STATE: test-node.js event: detect +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-face.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.91,"gender":"unknown"} {} {"score":0.47,"keypoints":3} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 781 +2022-08-10 13:44:28 STATE: test-node.js passed: detect: samples/in/ai-body.jpg concurrent +2022-08-10 13:44:28 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 0 person: 1 {"score":0.93,"gender":"unknown"} {} {"score":0.92,"keypoints":17} +2022-08-10 13:44:28 DATA:  test-node.js result: performance: load: null total: 781 +2022-08-10 13:44:28 INFO:  test-node.js test: monkey-patch +2022-08-10 13:44:28 STATE: test-node.js event: image +2022-08-10 13:44:29 STATE: test-node.js event: detect +2022-08-10 13:44:29 STATE: test-node.js passed: monkey patch +2022-08-10 13:44:29 STATE: test-node.js passed: segmentation [65536] +2022-08-10 13:44:29 STATE: test-node.js passeed: equal usage +2022-08-10 13:44:29 INFO:  test-node.js test: input compare +2022-08-10 13:44:29 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:29 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-08-10 13:44:29 STATE: test-node.js passed: image compare 0 23.275441687091504 +2022-08-10 13:44:29 INFO:  test-node.js events: {"image":29,"detect":29,"warmup":2} +2022-08-10 13:44:29 INFO:  test-node.js tensors 4105 +2022-08-10 13:44:29 INFO:  test-node.js test complete: 17323 ms +2022-08-10 13:44:29 INFO:  +2022-08-10 13:44:29 INFO:  test-node-gpu.js start +2022-08-10 13:44:30 INFO:  test-node-gpu.js test: configuration validation +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: configuration default validation [] +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-08-10 13:44:30 INFO:  test-node-gpu.js test: model load +2022-08-10 13:44:30 STATE: 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-10 13:44:30 INFO:  test-node-gpu.js test: warmup +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: create human +2022-08-10 13:44:30 INFO:  test-node-gpu.js human version: 2.9.2 +2022-08-10 13:44:30 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v16.15.0 +2022-08-10 13:44:30 INFO:  test-node-gpu.js tfjs version: 3.19.0 +2022-08-10 13:44:30 INFO:  test-node-gpu.js tensorflow binding version: 2.7.3-dev20220521 +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: set backend: tensorflow +2022-08-10 13:44:30 STATE: test-node-gpu.js tensors 1921 +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: load models +2022-08-10 13:44:30 STATE: test-node-gpu.js result: defined models: 23 loaded models: 12 +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: warmup: none default +2022-08-10 13:44:30 DATA:  test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-08-10 13:44:30 DATA:  test-node-gpu.js result: performance: load: null total: null +2022-08-10 13:44:30 STATE: test-node-gpu.js passed: warmup none result match +2022-08-10 13:44:30 STATE: test-node-gpu.js event: image +2022-08-10 13:44:32 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:32 STATE: test-node-gpu.js event: warmup +2022-08-10 13:44:32 STATE: test-node-gpu.js passed: warmup: face default +2022-08-10 13:44:32 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2022-08-10 13:44:32 DATA:  test-node-gpu.js result: performance: load: null total: 2109 +2022-08-10 13:44:32 STATE: test-node-gpu.js passed: warmup face result match +2022-08-10 13:44:32 STATE: test-node-gpu.js event: image +2022-08-10 13:44:33 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:33 STATE: test-node-gpu.js event: warmup +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: warmup: body default +2022-08-10 13:44:33 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:33 DATA:  test-node-gpu.js result: performance: load: null total: 194 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: warmup body result match +2022-08-10 13:44:33 STATE: test-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":23.7,"gender":"female","genderScore":0.97},"emotion":[{"score":0.63,"emotion":"angry"},{"score":0.22,"emotion":"fear"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"face":0,"gesture":"mouth 10% open"},{"hand":0,"gesture":"pinky forward"},{"hand":0,"gesture":"palm up"},{"hand":0,"gesture":"open palm"},{"iris":0,"gesture":"looking left"},{"iris":0,"gesture":"looking up"}]} +2022-08-10 13:44:33 INFO:  test-node-gpu.js test: details verification +2022-08-10 13:44:33 STATE: test-node-gpu.js start default +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:33 STATE: test-node-gpu.js event: image +2022-08-10 13:44:33 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-08-10 13:44:33 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:33 DATA:  test-node-gpu.js result: performance: load: null total: 185 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face length 1 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face score 1 0.93 1 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face age/gender 23.7 female 0.97 85.47 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face arrays 4 478 1024 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face emotion 2 {"score":0.59,"emotion":"angry"} +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face anti-spoofing 0.79 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details face liveness 0.83 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details body length 1 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details body 0.92 17 6 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details hand length 1 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details hand 0.51 0.73 point +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details hand arrays 21 5 7 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details gesture length 7 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details object length 1 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: details object 0.72 person +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-08-10 13:44:33 STATE: test-node-gpu.js event: image +2022-08-10 13:44:33 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-08-10 13:44:33 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-08-10 13:44:33 STATE: test-node-gpu.js event: image +2022-08-10 13:44:34 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:34 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-08-10 13:44:34 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:34 STATE: test-node-gpu.js event: image +2022-08-10 13:44:34 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:34 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-08-10 13:44:34 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:34 STATE: test-node-gpu.js event: image +2022-08-10 13:44:34 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:34 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-08-10 13:44:35 STATE: test-node-gpu.js event: image +2022-08-10 13:44:35 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-08-10 13:44:35 INFO:  test-node-gpu.js test default +2022-08-10 13:44:35 STATE: test-node-gpu.js start async +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:35 STATE: test-node-gpu.js event: image +2022-08-10 13:44:35 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg async +2022-08-10 13:44:35 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:35 DATA:  test-node-gpu.js result: performance: load: null total: 192 +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: default result face match 1 female 0.97 +2022-08-10 13:44:35 INFO:  test-node-gpu.js test sync +2022-08-10 13:44:35 STATE: test-node-gpu.js start sync +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:35 STATE: test-node-gpu.js event: image +2022-08-10 13:44:35 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg sync +2022-08-10 13:44:35 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:35 DATA:  test-node-gpu.js result: performance: load: null total: 185 +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: default sync 1 female 0.97 +2022-08-10 13:44:35 INFO:  test-node-gpu.js test: image process +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: image input null [1,256,256,3] +2022-08-10 13:44:35 INFO:  test-node-gpu.js test: image null +2022-08-10 13:44:35 STATE: test-node-gpu.js passed: invalid input could not convert input to tensor +2022-08-10 13:44:35 INFO:  test-node-gpu.js test face similarity +2022-08-10 13:44:35 STATE: test-node-gpu.js start face similarity +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-08-10 13:44:36 STATE: test-node-gpu.js event: image +2022-08-10 13:44:36 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg face similarity +2022-08-10 13:44:36 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-08-10 13:44:36 DATA:  test-node-gpu.js result: performance: load: null total: 173 +2022-08-10 13:44:36 STATE: test-node-gpu.js start face similarity +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:36 STATE: test-node-gpu.js event: image +2022-08-10 13:44:36 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg face similarity +2022-08-10 13:44:36 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:36 DATA:  test-node-gpu.js result: performance: load: null total: 186 +2022-08-10 13:44:36 STATE: test-node-gpu.js start face similarity +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-08-10 13:44:36 STATE: test-node-gpu.js event: image +2022-08-10 13:44:36 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg face similarity +2022-08-10 13:44:36 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":23.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-08-10 13:44:36 DATA:  test-node-gpu.js result: performance: load: null total: 172 +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: face descriptor +2022-08-10 13:44:36 STATE: test-node-gpu.js passed: face similarity {"similarity":[1,0.447238756461232,0.556914029877052],"descriptors":[1024,1024,1024]} +2022-08-10 13:44:36 INFO:  test-node-gpu.js test object +2022-08-10 13:44:36 STATE: test-node-gpu.js start object +2022-08-10 13:44:37 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-08-10 13:44:37 STATE: test-node-gpu.js event: image +2022-08-10 13:44:37 STATE: test-node-gpu.js event: detect +2022-08-10 13:44:37 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg object +2022-08-10 13:44:37 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.7,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-08-10 13:44:37 DATA:  test-node-gpu.js result: performance: load: null total: 189 +2022-08-10 13:44:37 STATE: test-node-gpu.js passed: centernet +2022-08-10 13:44:37 STATE: test-node-gpu.js start object