diff --git a/CHANGELOG.md b/CHANGELOG.md index 841bd016..48cf9345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/human - Version: **2.6.4** + Version: **2.6.5** Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition** Author: **Vladimir Mandic ** @@ -9,8 +9,10 @@ ## Changelog -### **HEAD -> main** 2022/03/19 mandic00@live.com +### **2.6.5** 2022/04/01 mandic00@live.com +- bundle offscreencanvas types +- prototype precompile pass ### **origin/main** 2022/03/16 mandic00@live.com diff --git a/demo/faceid/index.js b/demo/faceid/index.js index 9184b9bb..c29a04e1 100644 --- a/demo/faceid/index.js +++ b/demo/faceid/index.js @@ -4,329 +4,8 @@ author: ' */ -// 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 }, - mobilefacenet: { enabled: false, modelPath: "https://vladmandic.github.io/human-models/models/mobilefacenet.json" }, - 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 && (human.result.face[0].genderScore || 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; - 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); - } 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); - 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() { - log2("human version:", human.version, "| tfjs version:", human.tf.version["tfjs-core"]); - 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; +import{Human as H}from"../../dist/human.esm.js";var d,R="human",m="person",g=(...t)=>console.log("indexdb",...t);async function b(){return d?!0:new Promise(t=>{let i=indexedDB.open(R,1);i.onerror=s=>g("error:",s),i.onupgradeneeded=s=>{g("create:",s.target),d=s.target.result,d.createObjectStore(m,{keyPath:"id",autoIncrement:!0})},i.onsuccess=s=>{d=s.target.result,g("open:",d),t(!0)}})}async function C(){let t=[];return d||await b(),new Promise(i=>{let s=d.transaction([m],"readwrite").objectStore(m).openCursor(null,"next");s.onerror=o=>g("load error:",o),s.onsuccess=o=>{o.target.result?(t.push(o.target.result.value),o.target.result.continue()):i(t)}})}async function k(){return d||await b(),new Promise(t=>{let i=d.transaction([m],"readwrite").objectStore(m).count();i.onerror=s=>g("count error:",s),i.onsuccess=()=>t(i.result)})}async function x(t){d||await b();let i={name:t.name,descriptor:t.descriptor,image:t.image};d.transaction([m],"readwrite").objectStore(m).put(i),g("save:",i)}async function D(t){d||await b(),d.transaction([m],"readwrite").objectStore(m).delete(t.id),g("delete:",t)}var v={modelBasePath:"../../models",filter:{equalization:!0},face:{enabled:!0,detector:{rotation:!0,return:!0,cropFactor:1.6,mask:!1},description:{enabled:!0},mobilefacenet:{enabled:!1,modelPath:"https://vladmandic.github.io/human-models/models/mobilefacenet.json"},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:v.face.detector.mask,rotation:v.face.detector.rotation,cropFactor:v.face.detector.cropFactor,...I},n={faceCount:!1,faceConfidence:!1,facingCenter:!1,lookingCenter:!1,blinkDetected:!1,faceSize:!1,antispoofCheck:!1,livenessCheck:!1,elapsedMs:0},M=()=>n.faceCount&&n.faceSize&&n.blinkDetected&&n.facingCenter&&n.lookingCenter&&n.faceConfidence&&n.antispoofCheck&&n.livenessCheck,r={face:null,record:null},l={start:0,end:0,time:0},a=new H(v);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")},h={detect:0,draw:0},y={detect:0,draw:0},E=0,p=(...t)=>{e.log.innerText+=t.join(" ")+` +`,console.log(...t)},w=t=>e.fps.innerText=t;async function S(){w("starting webcam...");let t={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},i=await navigator.mediaDevices.getUserMedia(t),s=new Promise(o=>{e.video.onloadeddata=()=>o(!0)});e.video.srcObject=i,e.video.play(),await s,e.canvas.width=e.video.videoWidth,e.canvas.height=e.video.videoHeight,a.env.initial&&p("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();y.detect=1e3/(t-h.detect),h.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(y.draw=1e3/(i-h.draw),h.draw=i,w(`fps: ${y.detect.toFixed(1).padStart(5," ")} detect | ${y.draw.toFixed(1).padStart(5," ")} draw`),n.faceCount=a.result.face.length===1,n.faceCount){let o=Object.values(a.result.gesture).map(f=>f.gesture);(o.includes("blink left eye")||o.includes("blink right eye"))&&(l.start=a.now()),l.start>0&&!o.includes("blink left eye")&&!o.includes("blink right eye")&&(l.end=a.now()),n.blinkDetected=n.blinkDetected||Math.abs(l.end-l.start)>c.blinkMin&&Math.abs(l.end-l.start)c.minConfidence&&(a.result.face[0].faceScore||0)>c.minConfidence&&(a.result.face[0].genderScore||0)>c.minConfidence,n.antispoofCheck=(a.result.face[0].real||0)>c.minConfidence,n.livenessCheck=(a.result.face[0].live||0)>c.minConfidence,n.faceSize=a.result.face[0].box[2]>=c.minSize&&a.result.face[0].box[3]>=c.minSize}let s=32;for(let[o,f]of Object.entries(n)){let u=document.getElementById(`ok-${o}`);u||(u=document.createElement("div"),u.innerText=o,u.className="ok",u.style.top=`${s}px`,e.ok.appendChild(u)),typeof f=="boolean"?u.style.backgroundColor=f?"lightgreen":"lightcoral":u.innerText=`${o}:${f}`,s+=28}return M()||n.elapsedMs>c.maxTime?(e.video.pause(),a.result.face[0]):(n.elapsedMs=Math.trunc(a.now()-E),new Promise(o=>{setTimeout(async()=>{await L()&&o(a.result.face[0])},30)}))}async function P(){var t,i;if(e.name.value.length>0){let s=(t=e.canvas.getContext("2d"))==null?void 0:t.getImageData(0,0,e.canvas.width,e.canvas.height),o={id:0,name:e.name.value,descriptor:(i=r.face)==null?void 0:i.embedding,image:s};await x(o),p("saved face record:",o.name)}else p("invalid name")}async function z(){r.record&&r.record.id>0&&await D(r.record)}async function j(){var o,f;if((o=e.canvas.getContext("2d"))==null||o.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 k()===0)return p("face database is empty"),document.body.style.background="black",e.delete.style.display="none",!1;let t=await C(),i=t.map(u=>u.descriptor),s=await a.match(r.face.embedding,i,I);return r.record=t[s.index]||null,r.record&&(p(`best match: ${r.record.name} | id: ${r.record.id} | similarity: ${Math.round(1e3*s.similarity)/10}%`),e.name.value=r.record.name,e.source.style.display="",(f=e.source.getContext("2d"))==null||f.putImageData(r.record.image,0,0)),document.body.style.background=s.similarity>c.threshold?"darkgreen":"maroon",s.similarity>c.threshold}async function B(){var t,i,s,o;return n.faceCount=!1,n.faceConfidence=!1,n.facingCenter=!1,n.blinkDetected=!1,n.faceSize=!1,n.antispoofCheck=!1,n.livenessCheck=!1,n.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=((o=(s=r.face)==null?void 0:s.tensor)==null?void 0:o.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():(p("did not find valid face"),!1)}async function q(){p("human version:",a.version,"| tfjs version:",a.tf.version["tfjs-core"]),p("options:",JSON.stringify(c).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),w("loading..."),p("known face records:",await k()),await S(),await a.load(),w("initializing..."),e.retry.addEventListener("click",B),e.save.addEventListener("click",P),e.delete.addEventListener("click",z),await a.warmup(),await B()}window.onload=q; /** * Human demo for browsers * @default Human Library diff --git a/demo/faceid/index.js.map b/demo/faceid/index.js.map index 76145ea1..de684c96 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: false, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.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 && (human.result.face[0].genderScore || 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);\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);\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('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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", + "mappings": "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", "names": [] } diff --git a/demo/typescript/index.js b/demo/typescript/index.js index 447a2046..24d94078 100644 --- a/demo/typescript/index.js +++ b/demo/typescript/index.js @@ -4,100 +4,8 @@ author: ' */ -// demo/typescript/index.ts -import { Human } from "../../dist/human.esm.js"; -var humanConfig = { - modelBasePath: "../../models", - filter: { enabled: true, equalization: false }, - face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } }, - body: { enabled: true }, - hand: { enabled: true }, - object: { enabled: true }, - 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 }; -var fps = { detect: 0, draw: 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 } } }; - 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) { - 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; - } - const now = human.now(); - fps.detect = 1e3 / (now - timestamp.detect); - timestamp.detect = now; - requestAnimationFrame(detectionLoop); -} -async function drawLoop() { - if (!dom.video.paused) { - const interpolated = await human.next(human.result); - await human.draw.canvas(dom.video, dom.canvas); - await human.draw.all(dom.canvas, interpolated); - perf(interpolated.performance); - } - const now = human.now(); - fps.draw = 1e3 / (now - timestamp.draw); - timestamp.draw = now; - status(dom.video.paused ? "paused" : `fps: ${fps.detect.toFixed(1).padStart(5, " ")} detect | ${fps.draw.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("loaded models:", Object.values(human.models).filter((model) => model !== null).length); - status("initializing..."); - await human.warmup(); - await webCam(); - await detectionLoop(); - await drawLoop(); -} -window.onload = main; +import{Human as p}from"../../dist/human.esm.js";var w={modelBasePath:"../../models",filter:{enabled:!0,equalization:!1},face:{enabled:!0,detector:{rotation:!1},mesh:{enabled:!0},iris:{enabled:!0},description:{enabled:!0},emotion:{enabled:!0}},body:{enabled:!0},hand:{enabled:!0},object:{enabled:!0},gesture:{enabled:!0}},t=new p(w);t.env.perfadd=!1;t.draw.options.font='small-caps 18px "Lato"';t.draw.options.lineHeight=20;var e={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("status"),perf:document.getElementById("performance")},i={detect:0,draw:0,tensors:0},d={detect:0,draw:0},s=(...a)=>{e.log.innerText+=a.join(" ")+` +`,console.log(...a)},r=a=>e.fps.innerText=a,b=a=>e.perf.innerText="tensors:"+t.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}}},n=await navigator.mediaDevices.getUserMedia(a),m=new Promise(f=>{e.video.onloadeddata=()=>f(!0)});e.video.srcObject=n,e.video.play(),await m,e.canvas.width=e.video.videoWidth,e.canvas.height=e.video.videoHeight;let o=n.getVideoTracks()[0],u=o.getCapabilities?o.getCapabilities():"",v=o.getSettings?o.getSettings():"",g=o.getConstraints?o.getConstraints():"";s("video:",e.video.videoWidth,e.video.videoHeight,o.label,{stream:n,track:o,settings:v,constraints:g,capabilities:u}),e.canvas.onclick=()=>{e.video.paused?e.video.play():e.video.pause()}}async function c(){if(!e.video.paused){await t.detect(e.video);let n=t.tf.memory().numTensors;n-i.tensors!==0&&s("allocated tensors:",n-i.tensors),i.tensors=n}let a=t.now();d.detect=1e3/(a-i.detect),i.detect=a,requestAnimationFrame(c)}async function l(){if(!e.video.paused){let n=await t.next(t.result);await t.draw.canvas(e.video,e.canvas),await t.draw.all(e.canvas,n),b(n.performance)}let a=t.now();d.draw=1e3/(a-i.draw),i.draw=a,r(e.video.paused?"paused":`fps: ${d.detect.toFixed(1).padStart(5," ")} detect | ${d.draw.toFixed(1).padStart(5," ")} draw`),setTimeout(l,30)}async function y(){s("human version:",t.version,"| tfjs version:",t.tf.version["tfjs-core"]),s("platform:",t.env.platform,"| agent:",t.env.agent),r("loading..."),await t.load(),s("backend:",t.tf.getBackend(),"| available:",t.env.backends),s("loaded models:",Object.values(t.models).filter(a=>a!==null).length),r("initializing..."),await t.warmup(),await h(),await c(),await l()}window.onload=y; /** * Human demo for browsers * @default Human Library diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map index ff5638de..518c681f 100644 --- a/demo/typescript/index.js.map +++ b/demo/typescript/index.js.map @@ -2,6 +2,6 @@ "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: 'webgpu' as const,\n // async: true,\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: false },\n face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } },\n body: { enabled: true },\n hand: { enabled: true },\n object: { enabled: true },\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\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 }; // 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\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 } } };\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 // console.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 }\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\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 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 perf(interpolated.performance); // write performance data\n }\n const now = human.now();\n fps.draw = 1000 / (now - timestamp.draw);\n timestamp.draw = now;\n status(dom.video.paused ? 'paused' : `fps: ${fps.detect.toFixed(1).padStart(5, ' ')} detect | ${fps.draw.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('loaded models:', 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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", + "mappings": ";;;;;;AASA,gDATA,AAWA,GAAM,GAA+B,CAGnC,cAAe,eACf,OAAQ,CAAE,QAAS,GAAM,aAAc,EAAM,EAC7C,KAAM,CAAE,QAAS,GAAM,SAAU,CAAE,SAAU,EAAM,EAAG,KAAM,CAAE,QAAS,EAAK,EAAG,KAAM,CAAE,QAAS,EAAK,EAAG,YAAa,CAAE,QAAS,EAAK,EAAG,QAAS,CAAE,QAAS,EAAK,CAAE,EACnK,KAAM,CAAE,QAAS,EAAK,EACtB,KAAM,CAAE,QAAS,EAAK,EACtB,OAAQ,CAAE,QAAS,EAAK,EACxB,QAAS,CAAE,QAAS,EAAK,CAC3B,EAEM,EAAQ,GAAI,GAAM,CAAW,EAEnC,EAAM,IAAI,QAAa,GACvB,EAAM,KAAK,QAAQ,KAAO,yBAC1B,EAAM,KAAK,QAAQ,WAAa,GAEhC,GAAM,GAAM,CACV,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,IAAK,SAAS,eAAe,KAAK,EAClC,IAAK,SAAS,eAAe,QAAQ,EACrC,KAAM,SAAS,eAAe,aAAa,CAC7C,EACM,EAAY,CAAE,OAAQ,EAAG,KAAM,EAAG,QAAS,CAAE,EAC7C,EAAM,CAAE,OAAQ,EAAG,KAAM,CAAE,EAE3B,EAAM,IAAI,IAAQ,CACtB,EAAI,IAAI,WAAa,EAAI,KAAK,GAAG,EAAI;AAAA,EAErC,QAAQ,IAAI,GAAG,CAAG,CACpB,EACM,EAAS,AAAC,GAAQ,EAAI,IAAI,UAAY,EACtC,EAAO,AAAC,GAAQ,EAAI,KAAK,UAAY,WAAa,EAAM,GAAG,OAAO,EAAE,WAAa,mBAAqB,KAAK,UAAU,CAAG,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,KAAM,KAAK,EAEzK,kBAAwB,CACtB,EAAO,oBAAoB,EAE3B,GAAM,GAAkC,CAAE,MAAO,GAAO,MAAO,CAAE,WAAY,OAAQ,WAAY,OAAQ,MAAO,CAAE,MAAO,SAAS,KAAK,WAAY,CAAE,CAAE,EACjJ,EAAsB,KAAM,WAAU,aAAa,aAAa,CAAO,EACvE,EAAQ,GAAI,SAAQ,AAAC,GAAY,CAAE,EAAI,MAAM,aAAe,IAAM,EAAQ,EAAI,CAAG,CAAC,EACxF,EAAI,MAAM,UAAY,EACtB,EAAI,MAAM,KAAK,EACf,KAAM,GACN,EAAI,OAAO,MAAQ,EAAI,MAAM,WAC7B,EAAI,OAAO,OAAS,EAAI,MAAM,YAC9B,GAAM,GAA0B,EAAO,eAAe,EAAE,GAClD,EAAgD,EAAM,gBAAkB,EAAM,gBAAgB,EAAI,GAClG,EAAwC,EAAM,YAAc,EAAM,YAAY,EAAI,GAClF,EAA8C,EAAM,eAAiB,EAAM,eAAe,EAAI,GACpG,EAAI,SAAU,EAAI,MAAM,WAAY,EAAI,MAAM,YAAa,EAAM,MAAO,CAAE,SAAQ,QAAO,WAAU,cAAa,cAAa,CAAC,EAC9H,EAAI,OAAO,QAAU,IAAM,CACzB,AAAI,EAAI,MAAM,OAAQ,EAAI,MAAM,KAAK,EAChC,EAAI,MAAM,MAAM,CACvB,CACF,CAEA,kBAA+B,CAC7B,GAAI,CAAC,EAAI,MAAM,OAAQ,CAErB,KAAM,GAAM,OAAO,EAAI,KAAK,EAC5B,GAAM,GAAU,EAAM,GAAG,OAAO,EAAE,WAClC,AAAI,EAAU,EAAU,UAAY,GAAG,EAAI,qBAAsB,EAAU,EAAU,OAAO,EAC5F,EAAU,QAAU,CACtB,CACA,GAAM,GAAM,EAAM,IAAI,EACtB,EAAI,OAAS,IAAQ,GAAM,EAAU,QACrC,EAAU,OAAS,EACnB,sBAAsB,CAAa,CACrC,CAEA,kBAA0B,CACxB,GAAI,CAAC,EAAI,MAAM,OAAQ,CACrB,GAAM,GAAe,KAAM,GAAM,KAAK,EAAM,MAAM,EAClD,KAAM,GAAM,KAAK,OAAO,EAAI,MAAO,EAAI,MAAM,EAC7C,KAAM,GAAM,KAAK,IAAI,EAAI,OAAQ,CAAY,EAC7C,EAAK,EAAa,WAAW,CAC/B,CACA,GAAM,GAAM,EAAM,IAAI,EACtB,EAAI,KAAO,IAAQ,GAAM,EAAU,MACnC,EAAU,KAAO,EACjB,EAAO,EAAI,MAAM,OAAS,SAAW,QAAQ,EAAI,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,cAAc,EAAI,KAAK,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,QAAQ,EAE3I,WAAW,EAAU,EAAE,CACzB,CAEA,kBAAsB,CACpB,EAAI,iBAAkB,EAAM,QAAS,kBAAmB,EAAM,GAAG,QAAQ,YAAY,EACrF,EAAI,YAAa,EAAM,IAAI,SAAU,WAAY,EAAM,IAAI,KAAK,EAChE,EAAO,YAAY,EACnB,KAAM,GAAM,KAAK,EACjB,EAAI,WAAY,EAAM,GAAG,WAAW,EAAG,eAAgB,EAAM,IAAI,QAAQ,EACzE,EAAI,iBAAkB,OAAO,OAAO,EAAM,MAAM,EAAE,OAAO,AAAC,GAAU,IAAU,IAAI,EAAE,MAAM,EAC1F,EAAO,iBAAiB,EACxB,KAAM,GAAM,OAAO,EACnB,KAAM,GAAO,EACb,KAAM,GAAc,EACpB,KAAM,GAAS,CACjB,CAEA,OAAO,OAAS", "names": [] } diff --git a/test/build.log b/test/build.log index 28c6bb83..b2b51f0b 100644 --- a/test/build.log +++ b/test/build.log @@ -1,86 +1,24 @@ -2022-04-01 09:08:29 INFO:  Application: {"name":"@vladmandic/human","version":"2.6.4"} -2022-04-01 09:08:29 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-04-01 09:08:29 INFO:  Toolchain: {"build":"0.7.2","esbuild":"0.14.29","typescript":"4.6.3","typedoc":"0.22.13","eslint":"8.12.0"} -2022-04-01 09:08:29 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-04-01 09:08:29 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]} -2022-04-01 09:08: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":595} -2022-04-01 09:08:29 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":64,"inputBytes":564766,"outputBytes":293301} -2022-04-01 09:08: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":599} -2022-04-01 09:08:29 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":64,"inputBytes":564770,"outputBytes":293305} -2022-04-01 09:08: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":651} -2022-04-01 09:08:29 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":64,"inputBytes":564822,"outputBytes":293355} -2022-04-01 09:08:29 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":394} -2022-04-01 09:08: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":1068,"outputBytes":615} -2022-04-01 09:08:29 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":64,"inputBytes":564786,"outputBytes":292260} -2022-04-01 09:08:30 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1344131} -2022-04-01 09:08:30 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":64,"inputBytes":1908302,"outputBytes":1635407} -2022-04-01 09:08:30 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":64,"inputBytes":1908302,"outputBytes":2113578} -2022-04-01 09:08:35 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":114} -2022-04-01 09:08:37 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":75,"generated":true} -2022-04-01 09:08:37 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5862,"outputBytes":2915} -2022-04-01 09:08:37 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15174,"outputBytes":7820} -2022-04-01 09:08:45 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":96,"errors":0,"warnings":0} -2022-04-01 09:08:45 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-04-01 09:08:45 INFO:  Done... -2022-04-01 09:09:34 INFO:  @vladmandic/human version 2.6.4 -2022-04-01 09:09:34 INFO:  User: vlado Platform: linux Arch: x64 Node: v17.4.0 -2022-04-01 09:09:34 INFO:  Application: {"name":"@vladmandic/human","version":"2.6.4"} -2022-04-01 09:09:34 INFO:  Environment: {"profile":"development","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-04-01 09:09:34 INFO:  Toolchain: {"build":"0.7.2","esbuild":"0.14.29","typescript":"4.6.3","typedoc":"0.22.13","eslint":"8.12.0"} -2022-04-01 09:09:34 INFO:  Build: {"profile":"development","steps":["serve","watch","compile"]} -2022-04-01 09:09:34 STATE: WebServer: {"ssl":false,"port":10030,"root":"."} -2022-04-01 09:09:34 STATE: WebServer: {"ssl":true,"port":10031,"root":".","sslKey":"node_modules/@vladmandic/build/cert/https.key","sslCrt":"node_modules/@vladmandic/build/cert/https.crt"} -2022-04-01 09:09:34 STATE: Watch: {"locations":["src/**/*","tfjs/**/*","demo/**/*.ts"]} -2022-04-01 09:09:34 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":1084} -2022-04-01 09:09:34 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":64,"inputBytes":565255,"outputBytes":461910} -2022-04-01 09:09:34 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":1104} -2022-04-01 09:09:34 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":64,"inputBytes":565275,"outputBytes":461926} -2022-04-01 09:09:34 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":1191} -2022-04-01 09:09:34 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":64,"inputBytes":565362,"outputBytes":462017} -2022-04-01 09:09:34 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":1652} -2022-04-01 09:09:34 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":2326,"outputBytes":912} -2022-04-01 09:09:34 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":64,"inputBytes":565083,"outputBytes":463792} -2022-04-01 09:09:34 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":2521981} -2022-04-01 09:09:34 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":64,"inputBytes":3086152,"outputBytes":1635604} -2022-04-01 09:09:34 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":64,"inputBytes":3086152,"outputBytes":2990599} -2022-04-01 09:09:34 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5862,"outputBytes":4125} -2022-04-01 09:09:34 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15174,"outputBytes":11794} -2022-04-01 09:09:34 INFO:  Listening... -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/html","size":7842,"url":"/","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/css","size":107884,"url":"/icons.css","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":48528,"url":"/index.js","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":2990599,"url":"/dist/human.esm.js","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":14514,"url":"/helpers/menu.js","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":10901,"url":"/helpers/gl-bench.js","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"image/x-icon","size":261950,"url":"/favicon.ico","remote":"::1"} -2022-04-01 09:09:47 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::1"} -2022-04-01 09:09:48 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/manifest+json","size":304,"url":"/manifest.webmanifest","remote":"::1"} -2022-04-01 09:09:48 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"image/png","size":142790,"url":"/assets/icon.png","remote":"::1"} -2022-04-01 09:09:50 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":1778,"url":"/index-worker.js","remote":"::1"} -2022-04-01 09:09:50 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":1635604,"url":"/dist/human.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/html","size":1953,"url":"/typescript","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":48528,"url":"/index.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":2990599,"url":"/dist/human.esm.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":14514,"url":"/helpers/menu.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":10901,"url":"/helpers/gl-bench.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":3406,"url":"/helpers/webrtc.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":5785,"url":"/helpers/jsonview.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/manifest+json","size":304,"url":"/manifest.webmanifest","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":4115,"url":"/index-pwa.js","remote":"::1"} -2022-04-01 09:10:49 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"image/png","size":142790,"url":"/assets/icon.png","remote":"::1"} -2022-04-01 09:10:55 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/manifest+json","size":304,"url":"/manifest.webmanifest","remote":"::1"} -2022-04-01 09:10:55 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/octet-stream","size":5089284,"url":"/dist/human.esm.js.map","remote":"::1"} -2022-04-01 09:11:02 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/html","size":1953,"url":"/typescript/index.html","remote":"::1"} -2022-04-01 09:11:02 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":4125,"url":"/typescript/index.js","remote":"::1"} -2022-04-01 09:11:02 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"font/woff2","size":181500,"url":"/assets/lato-light.woff2","remote":"::1"} -2022-04-01 09:11:02 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"text/javascript","size":2990599,"url":"/dist/human.esm.js","remote":"::1"} -2022-04-01 09:11:02 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/octet-stream","size":8956,"url":"/typescript/index.js.map","remote":"::1"} -2022-04-01 09:11:02 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/octet-stream","size":5089284,"url":"/dist/human.esm.js.map","remote":"::1"} -2022-04-01 09:11:03 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/manifest+json","size":304,"url":"/manifest.webmanifest","remote":"::1"} -2022-04-01 09:11:03 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"image/png","size":142790,"url":"/assets/icon.png","remote":"::1"} -2022-04-01 09:11:03 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/json","size":201677,"url":"/models/mb3-centernet.json","remote":"::1"} -2022-04-01 09:11:03 DATA:  HTTPS: {"method":"GET","ver":"2.0","status":200,"mime":"application/octet-stream","size":4030290,"url":"/models/mb3-centernet.bin","remote":"::1"} +2022-04-01 09:12:16 INFO:  Application: {"name":"@vladmandic/human","version":"2.6.5"} +2022-04-01 09:12:16 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-04-01 09:12:16 INFO:  Toolchain: {"build":"0.7.2","esbuild":"0.14.29","typescript":"4.6.3","typedoc":"0.22.13","eslint":"8.12.0"} +2022-04-01 09:12:16 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-04-01 09:12:16 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]} +2022-04-01 09:12:16 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":595} +2022-04-01 09:12:16 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":64,"inputBytes":564766,"outputBytes":293301} +2022-04-01 09:12:16 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":599} +2022-04-01 09:12:16 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":64,"inputBytes":564770,"outputBytes":293305} +2022-04-01 09:12:16 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":651} +2022-04-01 09:12:16 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":64,"inputBytes":564822,"outputBytes":293355} +2022-04-01 09:12:16 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1063,"outputBytes":394} +2022-04-01 09:12:16 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1068,"outputBytes":615} +2022-04-01 09:12:16 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":64,"inputBytes":564786,"outputBytes":292260} +2022-04-01 09:12:17 STATE: Compile: {"name":"tfjs/browser/esm/custom","format":"esm","platform":"browser","input":"tfjs/tf-custom.ts","output":"dist/tfjs.esm.js","files":1,"inputBytes":110,"outputBytes":1344131} +2022-04-01 09:12:17 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":64,"inputBytes":1908302,"outputBytes":1635407} +2022-04-01 09:12:17 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":64,"inputBytes":1908302,"outputBytes":2113578} +2022-04-01 09:12:23 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":114} +2022-04-01 09:12:25 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":75,"generated":true} +2022-04-01 09:12:25 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5862,"outputBytes":2915} +2022-04-01 09:12:25 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":15174,"outputBytes":7820} +2022-04-01 09:12:33 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":96,"errors":0,"warnings":0} +2022-04-01 09:12:33 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-04-01 09:12:33 INFO:  Done... diff --git a/test/test.log b/test/test.log index 5286d914..a784eb5b 100644 --- a/test/test.log +++ b/test/test.log @@ -1,684 +1,684 @@ -2022-03-19 11:01:29 INFO:  @vladmandic/human version 2.6.4 -2022-03-19 11:01:29 INFO:  User: vlado Platform: linux Arch: x64 Node: v17.4.0 -2022-03-19 11:01:29 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] -2022-03-19 11:01:29 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-03-19 11:01:29 INFO:  -2022-03-19 11:01:29 INFO:  test-node.js start -2022-03-19 11:01:29 INFO:  test-node.js test: configuration validation -2022-03-19 11:01:29 STATE: test-node.js passed: configuration default validation [] -2022-03-19 11:01:29 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-03-19 11:01:29 INFO:  test-node.js test: model load -2022-03-19 11:01:29 STATE: test-node.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false},{"name":"gear","loaded":false},{"name":"blazeposedetect","loaded":false},{"name":"blazepose","loaded":false},{"name":"centernet","loaded":true},{"name":"efficientpose","loaded":false},{"name":"mobilefacenet","loaded":false},{"name":"emotion","loaded":true},{"name":"facedetect","loaded":true},{"name":"faceiris","loaded":true},{"name":"facemesh","loaded":true},{"name":"faceres","loaded":true},{"name":"ssrnetgender","loaded":false},{"name":"handpose","loaded":false},{"name":"handskeleton","loaded":true},{"name":"handtrack","loaded":true},{"name":"liveness","loaded":true},{"name":"movenet","loaded":true},{"name":"nanodet","loaded":false},{"name":"posenet","loaded":false},{"name":"segmentation","loaded":true},{"name":"antispoof","loaded":true}] -2022-03-19 11:01:29 INFO:  test-node.js test: warmup -2022-03-19 11:01:29 STATE: test-node.js passed: create human -2022-03-19 11:01:29 INFO:  test-node.js human version: 2.6.4 -2022-03-19 11:01:29 INFO:  test-node.js platform: linux x64 agent: NodeJS v17.4.0 -2022-03-19 11:01:29 INFO:  test-node.js tfjs version: 3.14.0 -2022-03-19 11:01:29 INFO:  test-node.js tensorflow binding version: 2.7.0-dev20211101 -2022-03-19 11:01:29 STATE: test-node.js passed: set backend: tensorflow -2022-03-19 11:01:29 STATE: test-node.js tensors 1919 -2022-03-19 11:01:29 STATE: test-node.js passed: load models -2022-03-19 11:01:29 STATE: test-node.js result: defined models: 22 loaded models: 12 -2022-03-19 11:01:29 STATE: test-node.js passed: warmup: none default -2022-03-19 11:01:29 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-03-19 11:01:29 DATA:  test-node.js result: performance: load: null total: null -2022-03-19 11:01:29 STATE: test-node.js passed: warmup none result match -2022-03-19 11:01:29 STATE: test-node.js event: image -2022-03-19 11:01:30 STATE: test-node.js event: detect -2022-03-19 11:01:30 STATE: test-node.js event: warmup -2022-03-19 11:01:30 STATE: test-node.js passed: warmup: face default -2022-03-19 11:01:30 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} -2022-03-19 11:01:30 DATA:  test-node.js result: performance: load: null total: 369 -2022-03-19 11:01:30 STATE: test-node.js passed: warmup face result match -2022-03-19 11:01:30 STATE: test-node.js event: image -2022-03-19 11:01:30 STATE: test-node.js event: detect -2022-03-19 11:01:30 STATE: test-node.js event: warmup -2022-03-19 11:01:30 STATE: test-node.js passed: warmup: body default -2022-03-19 11:01:30 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:30 DATA:  test-node.js result: performance: load: null total: 262 -2022-03-19 11:01:30 STATE: test-node.js passed: warmup body result match -2022-03-19 11:01:30 STATE: test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":29.6,"gender":"female","genderScore":0.89},"emotion":[{"score":0.35,"emotion":"fear"},{"score":0.28,"emotion":"angry"},{"score":0.15,"emotion":"sad"},{"score":0.1,"emotion":"surprise"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"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-03-19 11:01:30 INFO:  test-node.js test: details verification -2022-03-19 11:01:30 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:30 STATE: test-node.js event: image -2022-03-19 11:01:30 STATE: test-node.js event: detect -2022-03-19 11:01:30 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:30 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:30 DATA:  test-node.js result: performance: load: null total: 264 -2022-03-19 11:01:30 STATE: test-node.js passed: details face length 1 -2022-03-19 11:01:30 STATE: test-node.js passed: details face score 1 0.93 1 -2022-03-19 11:01:30 STATE: test-node.js passed: details face age/gender 29.6 female 0.91 73.26 -2022-03-19 11:01:30 STATE: test-node.js passed: details face arrays 4 478 1024 -2022-03-19 11:01:30 STATE: test-node.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} -2022-03-19 11:01:30 STATE: test-node.js passed: details face anti-spoofing 0.78 -2022-03-19 11:01:30 STATE: test-node.js passed: details face liveness 0.83 -2022-03-19 11:01:30 STATE: test-node.js passed: details body length 1 -2022-03-19 11:01:30 STATE: test-node.js passed: details body 0.92 17 6 -2022-03-19 11:01:30 STATE: test-node.js passed: details hand length 1 -2022-03-19 11:01:30 STATE: test-node.js passed: details hand 0.51 0.73 point -2022-03-19 11:01:30 STATE: test-node.js passed: details hand arrays 21 5 7 -2022-03-19 11:01:30 STATE: test-node.js passed: details gesture length 6 -2022-03-19 11:01:30 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-03-19 11:01:30 STATE: test-node.js passed: details object length 1 -2022-03-19 11:01:30 STATE: test-node.js passed: details object 0.72 person -2022-03-19 11:01:31 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} -2022-03-19 11:01:31 STATE: test-node.js event: image -2022-03-19 11:01:31 STATE: test-node.js event: detect -2022-03-19 11:01:31 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-03-19 11:01:31 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-03-19 11:01:31 STATE: test-node.js event: image -2022-03-19 11:01:31 STATE: test-node.js event: detect -2022-03-19 11:01:31 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-03-19 11:01:31 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:31 STATE: test-node.js event: image -2022-03-19 11:01:32 STATE: test-node.js event: detect -2022-03-19 11:01:32 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-03-19 11:01:32 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:32 STATE: test-node.js event: image -2022-03-19 11:01:32 STATE: test-node.js event: detect -2022-03-19 11:01:32 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-03-19 11:01:32 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-03-19 11:01:32 STATE: test-node.js event: image -2022-03-19 11:01:32 STATE: test-node.js event: detect -2022-03-19 11:01:32 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-03-19 11:01:32 INFO:  test-node.js test default -2022-03-19 11:01:33 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:33 STATE: test-node.js event: image -2022-03-19 11:01:33 STATE: test-node.js event: detect -2022-03-19 11:01:33 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:33 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:33 DATA:  test-node.js result: performance: load: null total: 219 -2022-03-19 11:01:33 STATE: test-node.js passed: default result face match 1 female 0.91 -2022-03-19 11:01:33 INFO:  test-node.js test sync -2022-03-19 11:01:33 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:33 STATE: test-node.js event: image -2022-03-19 11:01:33 STATE: test-node.js event: detect -2022-03-19 11:01:33 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:33 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:33 DATA:  test-node.js result: performance: load: null total: 206 -2022-03-19 11:01:33 STATE: test-node.js passed: default sync 1 female 0.91 -2022-03-19 11:01:33 INFO:  test-node.js test: image process -2022-03-19 11:01:33 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:33 STATE: test-node.js passed: image input null [1,256,256,3] -2022-03-19 11:01:33 INFO:  test-node.js test: image null -2022-03-19 11:01:33 STATE: test-node.js passed: invalid input could not convert input to tensor -2022-03-19 11:01:33 INFO:  test-node.js test face similarity -2022-03-19 11:01:33 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:33 STATE: test-node.js event: image -2022-03-19 11:01:33 STATE: test-node.js event: detect -2022-03-19 11:01:33 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:33 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-03-19 11:01:33 DATA:  test-node.js result: performance: load: null total: 197 -2022-03-19 11:01:34 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:34 STATE: test-node.js event: image -2022-03-19 11:01:34 STATE: test-node.js event: detect -2022-03-19 11:01:34 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:34 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:34 DATA:  test-node.js result: performance: load: null total: 213 -2022-03-19 11:01:34 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-03-19 11:01:34 STATE: test-node.js event: image -2022-03-19 11:01:34 STATE: test-node.js event: detect -2022-03-19 11:01:34 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:34 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-03-19 11:01:34 DATA:  test-node.js result: performance: load: null total: 183 -2022-03-19 11:01:34 STATE: test-node.js passed: face descriptor -2022-03-19 11:01:34 STATE: test-node.js passed: face similarity {"similarity":[1,0.5632803981762933,0.5194114531612539],"descriptors":[1024,1024,1024]} -2022-03-19 11:01:34 INFO:  test-node.js test face matching -2022-03-19 11:01:34 STATE: test-node.js passed: face database 40 -2022-03-19 11:01:34 STATE: test-node.js passed: face match {"first":{"index":4,"similarity":0.8797924743573865}} {"second":{"index":4,"similarity":0.548081908581344}} {"third":{"index":4,"similarity":0.4999696807961951}} -2022-03-19 11:01:34 INFO:  test-node.js test object -2022-03-19 11:01:34 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:34 STATE: test-node.js event: image -2022-03-19 11:01:34 STATE: test-node.js event: detect -2022-03-19 11:01:34 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:34 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:34 DATA:  test-node.js result: performance: load: null total: 221 -2022-03-19 11:01:34 STATE: test-node.js passed: object result match -2022-03-19 11:01:34 INFO:  test-node.js test sensitive -2022-03-19 11:01:35 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:35 STATE: test-node.js event: image -2022-03-19 11:01:35 STATE: test-node.js event: detect -2022-03-19 11:01:35 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:35 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:35 DATA:  test-node.js result: performance: load: null total: 223 -2022-03-19 11:01:35 STATE: test-node.js passed: sensitive result match -2022-03-19 11:01:35 STATE: test-node.js passed: sensitive face result match -2022-03-19 11:01:35 STATE: test-node.js passed: sensitive face emotion result [{"score":0.34,"emotion":"fear"},{"score":0.29,"emotion":"angry"},{"score":0.15,"emotion":"sad"}] -2022-03-19 11:01:35 STATE: test-node.js passed: sensitive body result match -2022-03-19 11:01:35 STATE: test-node.js passed: sensitive hand result match -2022-03-19 11:01:35 INFO:  test-node.js test detectors -2022-03-19 11:01:35 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:35 STATE: test-node.js event: image -2022-03-19 11:01:35 STATE: test-node.js event: detect -2022-03-19 11:01:35 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:35 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:35 DATA:  test-node.js result: performance: load: null total: 144 -2022-03-19 11:01:35 STATE: test-node.js passed: detector result face match -2022-03-19 11:01:35 STATE: test-node.js passed: detector result hand match -2022-03-19 11:01:35 INFO:  test-node.js test: multi-instance -2022-03-19 11:01:35 STATE: test-node.js event: image -2022-03-19 11:01:35 STATE: test-node.js event: detect -2022-03-19 11:01:35 STATE: test-node.js passed: detect: random default -2022-03-19 11:01:35 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} -2022-03-19 11:01:35 DATA:  test-node.js result: performance: load: null total: 141 -2022-03-19 11:01:35 INFO:  test-node.js test: first instance -2022-03-19 11:01:35 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-03-19 11:01:36 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:36 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:36 DATA:  test-node.js result: performance: load: null total: 141 -2022-03-19 11:01:36 INFO:  test-node.js test: second instance -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-03-19 11:01:36 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:36 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:36 DATA:  test-node.js result: performance: load: null total: 137 -2022-03-19 11:01:36 INFO:  test-node.js test: concurrent -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:36 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:37 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} -2022-03-19 11:01:37 STATE: test-node.js event: image -2022-03-19 11:01:37 STATE: test-node.js event: image -2022-03-19 11:01:37 STATE: test-node.js event: image -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1413 -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1413 -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1529 -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1529 -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1529 -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1529 -2022-03-19 11:01:38 STATE: test-node.js event: detect -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1245 -2022-03-19 11:01:38 STATE: test-node.js event: detect -2022-03-19 11:01:38 STATE: test-node.js event: detect -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1245 -2022-03-19 11:01:38 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:38 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:38 DATA:  test-node.js result: performance: load: null total: 1245 -2022-03-19 11:01:38 INFO:  test-node.js test: monkey-patch -2022-03-19 11:01:38 STATE: test-node.js event: image -2022-03-19 11:01:38 STATE: test-node.js event: detect -2022-03-19 11:01:38 STATE: test-node.js passed: monkey patch -2022-03-19 11:01:38 STATE: test-node.js passed: segmentation [65536] -2022-03-19 11:01:38 STATE: test-node.js passeed: equal usage -2022-03-19 11:01:38 INFO:  test-node.js test: input compare -2022-03-19 11:01:38 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:38 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} -2022-03-19 11:01:38 STATE: test-node.js passed: image compare 0 23.275441687091504 -2022-03-19 11:01:38 INFO:  test-node.js events: {"image":21,"detect":21,"warmup":2} -2022-03-19 11:01:38 INFO:  test-node.js tensors 1925 -2022-03-19 11:01:38 INFO:  test-node.js test complete: 9071 ms -2022-03-19 11:01:38 INFO:  -2022-03-19 11:01:38 INFO:  test-node-gpu.js start -2022-03-19 11:01:40 INFO:  test-node-gpu.js test: configuration validation -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: configuration default validation [] -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-03-19 11:01:40 INFO:  test-node-gpu.js test: model load -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false},{"name":"gear","loaded":false},{"name":"blazeposedetect","loaded":false},{"name":"blazepose","loaded":false},{"name":"centernet","loaded":true},{"name":"efficientpose","loaded":false},{"name":"mobilefacenet","loaded":false},{"name":"emotion","loaded":true},{"name":"facedetect","loaded":true},{"name":"faceiris","loaded":true},{"name":"facemesh","loaded":true},{"name":"faceres","loaded":true},{"name":"ssrnetgender","loaded":false},{"name":"handpose","loaded":false},{"name":"handskeleton","loaded":true},{"name":"handtrack","loaded":true},{"name":"liveness","loaded":true},{"name":"movenet","loaded":true},{"name":"nanodet","loaded":false},{"name":"posenet","loaded":false},{"name":"segmentation","loaded":true},{"name":"antispoof","loaded":true}] -2022-03-19 11:01:40 INFO:  test-node-gpu.js test: warmup -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: create human -2022-03-19 11:01:40 INFO:  test-node-gpu.js human version: 2.6.4 -2022-03-19 11:01:40 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v17.4.0 -2022-03-19 11:01:40 INFO:  test-node-gpu.js tfjs version: 3.14.0 -2022-03-19 11:01:40 INFO:  test-node-gpu.js tensorflow binding version: 2.7.0-dev20211101 -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: set backend: tensorflow -2022-03-19 11:01:40 STATE: test-node-gpu.js tensors 1919 -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: load models -2022-03-19 11:01:40 STATE: test-node-gpu.js result: defined models: 22 loaded models: 12 -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: warmup: none default -2022-03-19 11:01:40 DATA:  test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-03-19 11:01:40 DATA:  test-node-gpu.js result: performance: load: null total: null -2022-03-19 11:01:40 STATE: test-node-gpu.js passed: warmup none result match -2022-03-19 11:01:40 STATE: test-node-gpu.js event: image -2022-03-19 11:01:43 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:43 STATE: test-node-gpu.js event: warmup -2022-03-19 11:01:43 STATE: test-node-gpu.js passed: warmup: face default -2022-03-19 11:01:43 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} -2022-03-19 11:01:43 DATA:  test-node-gpu.js result: performance: load: null total: 3114 -2022-03-19 11:01:43 STATE: test-node-gpu.js passed: warmup face result match -2022-03-19 11:01:43 STATE: test-node-gpu.js event: image -2022-03-19 11:01:43 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:43 STATE: test-node-gpu.js event: warmup -2022-03-19 11:01:43 STATE: test-node-gpu.js passed: warmup: body default -2022-03-19 11:01:43 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:43 DATA:  test-node-gpu.js result: performance: load: null total: 233 -2022-03-19 11:01:43 STATE: test-node-gpu.js passed: warmup body result match -2022-03-19 11:01:43 STATE: test-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":29.6,"gender":"female","genderScore":0.89},"emotion":[{"score":0.35,"emotion":"fear"},{"score":0.28,"emotion":"angry"},{"score":0.15,"emotion":"sad"},{"score":0.1,"emotion":"surprise"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"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-03-19 11:01:43 INFO:  test-node-gpu.js test: details verification -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:44 STATE: test-node-gpu.js event: image -2022-03-19 11:01:44 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:44 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:44 DATA:  test-node-gpu.js result: performance: load: null total: 190 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face length 1 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face score 1 0.93 1 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face age/gender 29.6 female 0.91 73.26 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face arrays 4 478 1024 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face anti-spoofing 0.78 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details face liveness 0.83 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details body length 1 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details body 0.92 17 6 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details hand length 1 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details hand 0.51 0.73 point -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details hand arrays 21 5 7 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details gesture length 6 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details object length 1 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: details object 0.72 person -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} -2022-03-19 11:01:44 STATE: test-node-gpu.js event: image -2022-03-19 11:01:44 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-03-19 11:01:44 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} -2022-03-19 11:01:44 STATE: test-node-gpu.js event: image -2022-03-19 11:01:45 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:45 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-03-19 11:01:45 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:45 STATE: test-node-gpu.js event: image -2022-03-19 11:01:45 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:45 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-03-19 11:01:45 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:45 STATE: test-node-gpu.js event: image -2022-03-19 11:01:45 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:45 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-03-19 11:01:46 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-03-19 11:01:46 STATE: test-node-gpu.js event: image -2022-03-19 11:01:46 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:46 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-03-19 11:01:46 INFO:  test-node-gpu.js test default -2022-03-19 11:01:46 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:46 STATE: test-node-gpu.js event: image -2022-03-19 11:01:46 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:46 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:46 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:46 DATA:  test-node-gpu.js result: performance: load: null total: 219 -2022-03-19 11:01:46 STATE: test-node-gpu.js passed: default result face match 1 female 0.91 -2022-03-19 11:01:46 INFO:  test-node-gpu.js test sync -2022-03-19 11:01:46 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:46 STATE: test-node-gpu.js event: image -2022-03-19 11:01:47 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:47 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:47 DATA:  test-node-gpu.js result: performance: load: null total: 219 -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: default sync 1 female 0.91 -2022-03-19 11:01:47 INFO:  test-node-gpu.js test: image process -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: image input null [1,256,256,3] -2022-03-19 11:01:47 INFO:  test-node-gpu.js test: image null -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: invalid input could not convert input to tensor -2022-03-19 11:01:47 INFO:  test-node-gpu.js test face similarity -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:47 STATE: test-node-gpu.js event: image -2022-03-19 11:01:47 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:47 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-03-19 11:01:47 DATA:  test-node-gpu.js result: performance: load: null total: 200 -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:47 STATE: test-node-gpu.js event: image -2022-03-19 11:01:47 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:47 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:47 DATA:  test-node-gpu.js result: performance: load: null total: 198 -2022-03-19 11:01:47 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-03-19 11:01:47 STATE: test-node-gpu.js event: image -2022-03-19 11:01:48 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:48 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-03-19 11:01:48 DATA:  test-node-gpu.js result: performance: load: null total: 201 -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: face descriptor -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: face similarity {"similarity":[1,0.5630857211196999,0.5193140083083794],"descriptors":[1024,1024,1024]} -2022-03-19 11:01:48 INFO:  test-node-gpu.js test face matching -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: face database 40 -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.8799993617830532}} {"second":{"index":4,"similarity":0.5479640431307572}} {"third":{"index":4,"similarity":0.49994916272803597}} -2022-03-19 11:01:48 INFO:  test-node-gpu.js test object -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:48 STATE: test-node-gpu.js event: image -2022-03-19 11:01:48 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:48 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:48 DATA:  test-node-gpu.js result: performance: load: null total: 180 -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: object result match -2022-03-19 11:01:48 INFO:  test-node-gpu.js test sensitive -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:48 STATE: test-node-gpu.js event: image -2022-03-19 11:01:48 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:48 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:48 DATA:  test-node-gpu.js result: performance: load: null total: 210 -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: sensitive result match -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: sensitive face result match -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: sensitive face emotion result [{"score":0.34,"emotion":"fear"},{"score":0.29,"emotion":"angry"},{"score":0.15,"emotion":"sad"}] -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: sensitive body result match -2022-03-19 11:01:48 STATE: test-node-gpu.js passed: sensitive hand result match -2022-03-19 11:01:48 INFO:  test-node-gpu.js test detectors -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:49 STATE: test-node-gpu.js event: image -2022-03-19 11:01:49 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: performance: load: null total: 119 -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: detector result face match -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: detector result hand match -2022-03-19 11:01:49 INFO:  test-node-gpu.js test: multi-instance -2022-03-19 11:01:49 STATE: test-node-gpu.js event: image -2022-03-19 11:01:49 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: detect: random default -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.08,"keypoints":15} -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: performance: load: null total: 116 -2022-03-19 11:01:49 INFO:  test-node-gpu.js test: first instance -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: performance: load: null total: 110 -2022-03-19 11:01:49 INFO:  test-node-gpu.js test: second instance -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:49 DATA:  test-node-gpu.js result: performance: load: null total: 124 -2022-03-19 11:01:49 INFO:  test-node-gpu.js test: concurrent -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:49 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:50 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} -2022-03-19 11:01:50 STATE: test-node-gpu.js event: image -2022-03-19 11:01:50 STATE: test-node-gpu.js event: image -2022-03-19 11:01:50 STATE: test-node-gpu.js event: image -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 1068 -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 1068 -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 1134 -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 1134 -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 1134 -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 1134 -2022-03-19 11:01:51 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 877 -2022-03-19 11:01:51 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:51 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 877 -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:51 DATA:  test-node-gpu.js result: performance: load: null total: 877 -2022-03-19 11:01:51 INFO:  test-node-gpu.js test: monkey-patch -2022-03-19 11:01:51 STATE: test-node-gpu.js event: image -2022-03-19 11:01:51 STATE: test-node-gpu.js event: detect -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: monkey patch -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: segmentation [65536] -2022-03-19 11:01:51 STATE: test-node-gpu.js passeed: equal usage -2022-03-19 11:01:51 INFO:  test-node-gpu.js test: input compare -2022-03-19 11:01:51 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} -2022-03-19 11:01:52 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} -2022-03-19 11:01:52 STATE: test-node-gpu.js passed: image compare 0 23.275441687091504 -2022-03-19 11:01:52 INFO:  test-node-gpu.js events: {"image":21,"detect":21,"warmup":2} -2022-03-19 11:01:52 INFO:  test-node-gpu.js tensors 1925 -2022-03-19 11:01:52 INFO:  test-node-gpu.js test complete: 11979 ms -2022-03-19 11:01:52 INFO:  -2022-03-19 11:01:52 INFO:  test-node-wasm.js start -2022-03-19 11:01:53 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/ -2022-03-19 11:01:53 INFO:  test-node-wasm.js test: configuration validation -2022-03-19 11:01:53 STATE: test-node-wasm.js passed: configuration default validation [] -2022-03-19 11:01:53 STATE: test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] -2022-03-19 11:01:53 INFO:  test-node-wasm.js test: model load -2022-03-19 11:01:54 STATE: test-node-wasm.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false},{"name":"gear","loaded":false},{"name":"blazeposedetect","loaded":false},{"name":"blazepose","loaded":false},{"name":"centernet","loaded":true},{"name":"efficientpose","loaded":false},{"name":"mobilefacenet","loaded":false},{"name":"emotion","loaded":true},{"name":"facedetect","loaded":true},{"name":"faceiris","loaded":true},{"name":"facemesh","loaded":true},{"name":"faceres","loaded":true},{"name":"ssrnetgender","loaded":false},{"name":"handpose","loaded":false},{"name":"handskeleton","loaded":true},{"name":"handtrack","loaded":true},{"name":"liveness","loaded":true},{"name":"movenet","loaded":true},{"name":"nanodet","loaded":false},{"name":"posenet","loaded":false},{"name":"segmentation","loaded":true},{"name":"antispoof","loaded":true}] -2022-03-19 11:01:54 INFO:  test-node-wasm.js test: warmup -2022-03-19 11:01:54 STATE: test-node-wasm.js passed: create human -2022-03-19 11:01:54 INFO:  test-node-wasm.js human version: 2.6.4 -2022-03-19 11:01:54 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v17.4.0 -2022-03-19 11:01:54 INFO:  test-node-wasm.js tfjs version: 3.14.0 -2022-03-19 11:01:54 STATE: test-node-wasm.js passed: set backend: wasm -2022-03-19 11:01:54 STATE: test-node-wasm.js tensors 1919 -2022-03-19 11:01:54 STATE: test-node-wasm.js passed: load models -2022-03-19 11:01:54 STATE: test-node-wasm.js result: defined models: 22 loaded models: 12 -2022-03-19 11:01:54 STATE: test-node-wasm.js passed: warmup: none default -2022-03-19 11:01:54 DATA:  test-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} -2022-03-19 11:01:54 DATA:  test-node-wasm.js result: performance: load: null total: null -2022-03-19 11:01:54 STATE: test-node-wasm.js passed: warmup none result match -2022-03-19 11:01:54 STATE: test-node-wasm.js event: image -2022-03-19 11:01:55 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:55 STATE: test-node-wasm.js event: warmup -2022-03-19 11:01:55 STATE: test-node-wasm.js passed: warmup: face default -2022-03-19 11:01:55 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-03-19 11:01:55 DATA:  test-node-wasm.js result: performance: load: null total: 526 -2022-03-19 11:01:55 STATE: test-node-wasm.js passed: warmup face result match -2022-03-19 11:01:55 STATE: test-node-wasm.js event: image -2022-03-19 11:01:55 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:55 STATE: test-node-wasm.js event: warmup -2022-03-19 11:01:55 STATE: test-node-wasm.js passed: warmup: body default -2022-03-19 11:01:55 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:55 DATA:  test-node-wasm.js result: performance: load: null total: 387 -2022-03-19 11:01:55 STATE: test-node-wasm.js passed: warmup body result match -2022-03-19 11:01:55 STATE: test-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":29.6,"gender":"female","genderScore":0.91},"emotion":[{"score":0.34,"emotion":"fear"},{"score":0.29,"emotion":"angry"},{"score":0.15,"emotion":"sad"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"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-03-19 11:01:55 INFO:  test-node-wasm.js test: details verification -2022-03-19 11:01:55 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:01:55 STATE: test-node-wasm.js event: image -2022-03-19 11:01:56 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:56 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:56 DATA:  test-node-wasm.js result: performance: load: null total: 319 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face length 1 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face score 1 0.93 1 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face age/gender 29.6 female 0.91 73.26 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face arrays 4 478 1024 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face anti-spoofing 0.78 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details face liveness 0.83 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details body length 1 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details body 0.92 17 6 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details hand length 1 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details hand 0.51 0.73 point -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details hand arrays 21 5 7 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details gesture length 6 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details object length 1 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: details object 0.72 person -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264} -2022-03-19 11:01:56 STATE: test-node-wasm.js event: image -2022-03-19 11:01:56 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 -2022-03-19 11:01:56 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} -2022-03-19 11:01:56 STATE: test-node-wasm.js event: image -2022-03-19 11:01:57 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:57 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 -2022-03-19 11:01:57 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:01:57 STATE: test-node-wasm.js event: image -2022-03-19 11:01:57 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:57 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 -2022-03-19 11:01:58 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} -2022-03-19 11:01:58 STATE: test-node-wasm.js event: image -2022-03-19 11:01:58 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:58 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 -2022-03-19 11:01:58 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} -2022-03-19 11:01:58 STATE: test-node-wasm.js event: image -2022-03-19 11:01:58 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:58 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 -2022-03-19 11:01:58 INFO:  test-node-wasm.js test default -2022-03-19 11:01:59 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:01:59 STATE: test-node-wasm.js event: image -2022-03-19 11:01:59 STATE: test-node-wasm.js event: detect -2022-03-19 11:01:59 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:01:59 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:01:59 DATA:  test-node-wasm.js result: performance: load: null total: 346 -2022-03-19 11:01:59 STATE: test-node-wasm.js passed: default result face match 1 female 0.93 -2022-03-19 11:01:59 INFO:  test-node-wasm.js test sync -2022-03-19 11:01:59 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:01:59 STATE: test-node-wasm.js event: image -2022-03-19 11:02:00 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:00 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:00 DATA:  test-node-wasm.js result: performance: load: null total: 357 -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: default sync 1 female 0.93 -2022-03-19 11:02:00 INFO:  test-node-wasm.js test: image process -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: image input null [1,256,256,3] -2022-03-19 11:02:00 INFO:  test-node-wasm.js test: image null -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: invalid input could not convert input to tensor -2022-03-19 11:02:00 INFO:  test-node-wasm.js test face similarity -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-03-19 11:02:00 STATE: test-node-wasm.js event: image -2022-03-19 11:02:00 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:02:00 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} -2022-03-19 11:02:00 DATA:  test-node-wasm.js result: performance: load: null total: 314 -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:00 STATE: test-node-wasm.js event: image -2022-03-19 11:02:00 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:00 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:00 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:00 DATA:  test-node-wasm.js result: performance: load: null total: 338 -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-03-19 11:02:01 STATE: test-node-wasm.js event: image -2022-03-19 11:02:01 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:02:01 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} -2022-03-19 11:02:01 DATA:  test-node-wasm.js result: performance: load: null total: 296 -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: face descriptor -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: face similarity {"similarity":[1,0.5888036339038205,0.4689331535670693],"descriptors":[1024,1024,1024]} -2022-03-19 11:02:01 INFO:  test-node-wasm.js test face matching -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: face database 40 -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.8797924799049534}} {"second":{"index":4,"similarity":0.573642308237338}} {"third":{"index":4,"similarity":0.45582039900188964}} -2022-03-19 11:02:01 INFO:  test-node-wasm.js test object -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:01 STATE: test-node-wasm.js event: image -2022-03-19 11:02:01 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:01 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:01 DATA:  test-node-wasm.js result: performance: load: null total: 328 -2022-03-19 11:02:01 STATE: test-node-wasm.js passed: object result match -2022-03-19 11:02:01 INFO:  test-node-wasm.js test sensitive -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:02 STATE: test-node-wasm.js event: image -2022-03-19 11:02:02 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:02 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:02 DATA:  test-node-wasm.js result: performance: load: null total: 357 -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: sensitive result match -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: sensitive face result match -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: sensitive face emotion result [{"score":0.54,"emotion":"angry"},{"score":0.2,"emotion":"fear"},{"score":0.16,"emotion":"surprise"}] -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: sensitive body result match -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: sensitive hand result match -2022-03-19 11:02:02 INFO:  test-node-wasm.js test detectors -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:02 STATE: test-node-wasm.js event: image -2022-03-19 11:02:02 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:02 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:02 DATA:  test-node-wasm.js result: performance: load: null total: 244 -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: detector result face match -2022-03-19 11:02:02 STATE: test-node-wasm.js passed: detector result hand match -2022-03-19 11:02:02 INFO:  test-node-wasm.js test: multi-instance -2022-03-19 11:02:03 STATE: test-node-wasm.js event: image -2022-03-19 11:02:03 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: detect: random default -2022-03-19 11:02:03 DATA:  test-node-wasm.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} -2022-03-19 11:02:03 DATA:  test-node-wasm.js result: performance: load: null total: 222 -2022-03-19 11:02:03 INFO:  test-node-wasm.js test: first instance -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:02:03 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:02:03 DATA:  test-node-wasm.js result: performance: load: null total: 226 -2022-03-19 11:02:03 INFO:  test-node-wasm.js test: second instance -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:02:03 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:02:03 DATA:  test-node-wasm.js result: performance: load: null total: 223 -2022-03-19 11:02:03 INFO:  test-node-wasm.js test: concurrent -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-03-19 11:02:03 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} -2022-03-19 11:02:04 STATE: test-node-wasm.js event: image -2022-03-19 11:02:04 STATE: test-node-wasm.js event: image -2022-03-19 11:02:04 STATE: test-node-wasm.js event: image -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 1985 -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 1985 -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 2193 -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 2193 -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 2193 -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 2193 -2022-03-19 11:02:06 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 1889 -2022-03-19 11:02:06 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:06 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 1889 -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} -2022-03-19 11:02:06 DATA:  test-node-wasm.js result: performance: load: null total: 1889 -2022-03-19 11:02:06 INFO:  test-node-wasm.js test: monkey-patch -2022-03-19 11:02:06 STATE: test-node-wasm.js event: image -2022-03-19 11:02:06 STATE: test-node-wasm.js event: detect -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: monkey patch -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: segmentation [65536] -2022-03-19 11:02:06 STATE: test-node-wasm.js passeed: equal usage -2022-03-19 11:02:06 INFO:  test-node-wasm.js test: input compare -2022-03-19 11:02:06 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} -2022-03-19 11:02:07 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} -2022-03-19 11:02:07 STATE: test-node-wasm.js passed: image compare 0 23.280073018790848 -2022-03-19 11:02:07 INFO:  test-node-wasm.js events: {"image":21,"detect":21,"warmup":2} -2022-03-19 11:02:07 INFO:  test-node-wasm.js tensors 1927 -2022-03-19 11:02:07 INFO:  test-node-wasm.js test complete: 13748 ms -2022-03-19 11:02:07 INFO:  all tests complete -2022-03-19 11:02:07 INFO:  failed: {"count":0,"messages":[]} -2022-03-19 11:02:07 INFO:  status: {"test":"test-node.js","passed":101,"failed":0} -2022-03-19 11:02:07 INFO:  status: {"test":"test-node-gpu.js","passed":101,"failed":0} -2022-03-19 11:02:07 INFO:  status: {"test":"test-node-wasm.js","passed":102,"failed":0} +2022-04-01 09:12:39 INFO:  @vladmandic/human version 2.6.5 +2022-04-01 09:12:39 INFO:  User: vlado Platform: linux Arch: x64 Node: v17.4.0 +2022-04-01 09:12:39 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] +2022-04-01 09:12:39 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-04-01 09:12:39 INFO:  +2022-04-01 09:12:39 INFO:  test-node.js start +2022-04-01 09:12:39 INFO:  test-node.js test: configuration validation +2022-04-01 09:12:39 STATE: test-node.js passed: configuration default validation [] +2022-04-01 09:12:39 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-04-01 09:12:39 INFO:  test-node.js test: model load +2022-04-01 09:12:39 STATE: test-node.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false},{"name":"gear","loaded":false},{"name":"blazeposedetect","loaded":false},{"name":"blazepose","loaded":false},{"name":"centernet","loaded":true},{"name":"efficientpose","loaded":false},{"name":"mobilefacenet","loaded":false},{"name":"emotion","loaded":true},{"name":"facedetect","loaded":true},{"name":"faceiris","loaded":true},{"name":"facemesh","loaded":true},{"name":"faceres","loaded":true},{"name":"ssrnetgender","loaded":false},{"name":"handpose","loaded":false},{"name":"handskeleton","loaded":true},{"name":"handtrack","loaded":true},{"name":"liveness","loaded":true},{"name":"movenet","loaded":true},{"name":"nanodet","loaded":false},{"name":"posenet","loaded":false},{"name":"segmentation","loaded":true},{"name":"antispoof","loaded":true}] +2022-04-01 09:12:39 INFO:  test-node.js test: warmup +2022-04-01 09:12:39 STATE: test-node.js passed: create human +2022-04-01 09:12:39 INFO:  test-node.js human version: 2.6.5 +2022-04-01 09:12:39 INFO:  test-node.js platform: linux x64 agent: NodeJS v17.4.0 +2022-04-01 09:12:39 INFO:  test-node.js tfjs version: 3.15.0 +2022-04-01 09:12:39 INFO:  test-node.js tensorflow binding version: 2.7.0-dev20211101 +2022-04-01 09:12:39 STATE: test-node.js passed: set backend: tensorflow +2022-04-01 09:12:39 STATE: test-node.js tensors 1919 +2022-04-01 09:12:39 STATE: test-node.js passed: load models +2022-04-01 09:12:39 STATE: test-node.js result: defined models: 22 loaded models: 12 +2022-04-01 09:12:39 STATE: test-node.js passed: warmup: none default +2022-04-01 09:12:39 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-04-01 09:12:39 DATA:  test-node.js result: performance: load: null total: null +2022-04-01 09:12:39 STATE: test-node.js passed: warmup none result match +2022-04-01 09:12:39 STATE: test-node.js event: image +2022-04-01 09:12:40 STATE: test-node.js event: detect +2022-04-01 09:12:40 STATE: test-node.js event: warmup +2022-04-01 09:12:40 STATE: test-node.js passed: warmup: face default +2022-04-01 09:12:40 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2022-04-01 09:12:40 DATA:  test-node.js result: performance: load: null total: 385 +2022-04-01 09:12:40 STATE: test-node.js passed: warmup face result match +2022-04-01 09:12:40 STATE: test-node.js event: image +2022-04-01 09:12:40 STATE: test-node.js event: detect +2022-04-01 09:12:40 STATE: test-node.js event: warmup +2022-04-01 09:12:40 STATE: test-node.js passed: warmup: body default +2022-04-01 09:12:40 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:40 DATA:  test-node.js result: performance: load: null total: 273 +2022-04-01 09:12:40 STATE: test-node.js passed: warmup body result match +2022-04-01 09:12:40 STATE: test-node.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":29.6,"gender":"female","genderScore":0.89},"emotion":[{"score":0.35,"emotion":"fear"},{"score":0.28,"emotion":"angry"},{"score":0.15,"emotion":"sad"},{"score":0.1,"emotion":"surprise"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"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-04-01 09:12:40 INFO:  test-node.js test: details verification +2022-04-01 09:12:40 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:40 STATE: test-node.js event: image +2022-04-01 09:12:40 STATE: test-node.js event: detect +2022-04-01 09:12:40 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:40 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:40 DATA:  test-node.js result: performance: load: null total: 249 +2022-04-01 09:12:40 STATE: test-node.js passed: details face length 1 +2022-04-01 09:12:40 STATE: test-node.js passed: details face score 1 0.93 1 +2022-04-01 09:12:40 STATE: test-node.js passed: details face age/gender 29.6 female 0.91 73.26 +2022-04-01 09:12:40 STATE: test-node.js passed: details face arrays 4 478 1024 +2022-04-01 09:12:40 STATE: test-node.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} +2022-04-01 09:12:40 STATE: test-node.js passed: details face anti-spoofing 0.78 +2022-04-01 09:12:40 STATE: test-node.js passed: details face liveness 0.83 +2022-04-01 09:12:40 STATE: test-node.js passed: details body length 1 +2022-04-01 09:12:40 STATE: test-node.js passed: details body 0.92 17 6 +2022-04-01 09:12:40 STATE: test-node.js passed: details hand length 1 +2022-04-01 09:12:40 STATE: test-node.js passed: details hand 0.51 0.73 point +2022-04-01 09:12:40 STATE: test-node.js passed: details hand arrays 21 5 7 +2022-04-01 09:12:40 STATE: test-node.js passed: details gesture length 6 +2022-04-01 09:12:40 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-04-01 09:12:40 STATE: test-node.js passed: details object length 1 +2022-04-01 09:12:40 STATE: test-node.js passed: details object 0.72 person +2022-04-01 09:12:40 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-04-01 09:12:40 STATE: test-node.js event: image +2022-04-01 09:12:41 STATE: test-node.js event: detect +2022-04-01 09:12:41 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-04-01 09:12:41 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-04-01 09:12:41 STATE: test-node.js event: image +2022-04-01 09:12:41 STATE: test-node.js event: detect +2022-04-01 09:12:41 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-04-01 09:12:41 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:41 STATE: test-node.js event: image +2022-04-01 09:12:42 STATE: test-node.js event: detect +2022-04-01 09:12:42 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-04-01 09:12:42 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:42 STATE: test-node.js event: image +2022-04-01 09:12:42 STATE: test-node.js event: detect +2022-04-01 09:12:42 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-04-01 09:12:42 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-04-01 09:12:42 STATE: test-node.js event: image +2022-04-01 09:12:42 STATE: test-node.js event: detect +2022-04-01 09:12:42 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-04-01 09:12:42 INFO:  test-node.js test default +2022-04-01 09:12:43 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:43 STATE: test-node.js event: image +2022-04-01 09:12:43 STATE: test-node.js event: detect +2022-04-01 09:12:43 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:43 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:43 DATA:  test-node.js result: performance: load: null total: 225 +2022-04-01 09:12:43 STATE: test-node.js passed: default result face match 1 female 0.91 +2022-04-01 09:12:43 INFO:  test-node.js test sync +2022-04-01 09:12:43 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:43 STATE: test-node.js event: image +2022-04-01 09:12:43 STATE: test-node.js event: detect +2022-04-01 09:12:43 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:43 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:43 DATA:  test-node.js result: performance: load: null total: 226 +2022-04-01 09:12:43 STATE: test-node.js passed: default sync 1 female 0.91 +2022-04-01 09:12:43 INFO:  test-node.js test: image process +2022-04-01 09:12:43 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:43 STATE: test-node.js passed: image input null [1,256,256,3] +2022-04-01 09:12:43 INFO:  test-node.js test: image null +2022-04-01 09:12:43 STATE: test-node.js passed: invalid input could not convert input to tensor +2022-04-01 09:12:43 INFO:  test-node.js test face similarity +2022-04-01 09:12:43 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:43 STATE: test-node.js event: image +2022-04-01 09:12:43 STATE: test-node.js event: detect +2022-04-01 09:12:43 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:12:43 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-04-01 09:12:43 DATA:  test-node.js result: performance: load: null total: 219 +2022-04-01 09:12:44 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:44 STATE: test-node.js event: image +2022-04-01 09:12:44 STATE: test-node.js event: detect +2022-04-01 09:12:44 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:44 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:44 DATA:  test-node.js result: performance: load: null total: 222 +2022-04-01 09:12:44 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-04-01 09:12:44 STATE: test-node.js event: image +2022-04-01 09:12:44 STATE: test-node.js event: detect +2022-04-01 09:12:44 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:44 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-04-01 09:12:44 DATA:  test-node.js result: performance: load: null total: 207 +2022-04-01 09:12:44 STATE: test-node.js passed: face descriptor +2022-04-01 09:12:44 STATE: test-node.js passed: face similarity {"similarity":[1,0.5632803981762933,0.5194114531612539],"descriptors":[1024,1024,1024]} +2022-04-01 09:12:44 INFO:  test-node.js test face matching +2022-04-01 09:12:44 STATE: test-node.js passed: face database 40 +2022-04-01 09:12:44 STATE: test-node.js passed: face match {"first":{"index":4,"similarity":0.8797924743573865}} {"second":{"index":4,"similarity":0.548081908581344}} {"third":{"index":4,"similarity":0.4999696807961951}} +2022-04-01 09:12:44 INFO:  test-node.js test object +2022-04-01 09:12:44 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:44 STATE: test-node.js event: image +2022-04-01 09:12:45 STATE: test-node.js event: detect +2022-04-01 09:12:45 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:45 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:45 DATA:  test-node.js result: performance: load: null total: 227 +2022-04-01 09:12:45 STATE: test-node.js passed: object result match +2022-04-01 09:12:45 INFO:  test-node.js test sensitive +2022-04-01 09:12:45 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:45 STATE: test-node.js event: image +2022-04-01 09:12:45 STATE: test-node.js event: detect +2022-04-01 09:12:45 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:45 DATA:  test-node.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:45 DATA:  test-node.js result: performance: load: null total: 246 +2022-04-01 09:12:45 STATE: test-node.js passed: sensitive result match +2022-04-01 09:12:45 STATE: test-node.js passed: sensitive face result match +2022-04-01 09:12:45 STATE: test-node.js passed: sensitive face emotion result [{"score":0.34,"emotion":"fear"},{"score":0.29,"emotion":"angry"},{"score":0.15,"emotion":"sad"}] +2022-04-01 09:12:45 STATE: test-node.js passed: sensitive body result match +2022-04-01 09:12:45 STATE: test-node.js passed: sensitive hand result match +2022-04-01 09:12:45 INFO:  test-node.js test detectors +2022-04-01 09:12:45 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:45 STATE: test-node.js event: image +2022-04-01 09:12:45 STATE: test-node.js event: detect +2022-04-01 09:12:45 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:45 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:45 DATA:  test-node.js result: performance: load: null total: 168 +2022-04-01 09:12:45 STATE: test-node.js passed: detector result face match +2022-04-01 09:12:45 STATE: test-node.js passed: detector result hand match +2022-04-01 09:12:45 INFO:  test-node.js test: multi-instance +2022-04-01 09:12:45 STATE: test-node.js event: image +2022-04-01 09:12:46 STATE: test-node.js event: detect +2022-04-01 09:12:46 STATE: test-node.js passed: detect: random default +2022-04-01 09:12:46 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} +2022-04-01 09:12:46 DATA:  test-node.js result: performance: load: null total: 152 +2022-04-01 09:12:46 INFO:  test-node.js test: first instance +2022-04-01 09:12:46 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-04-01 09:12:46 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:46 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:12:46 DATA:  test-node.js result: performance: load: null total: 160 +2022-04-01 09:12:46 INFO:  test-node.js test: second instance +2022-04-01 09:12:46 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-04-01 09:12:46 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:46 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:12:46 DATA:  test-node.js result: performance: load: null total: 168 +2022-04-01 09:12:46 INFO:  test-node.js test: concurrent +2022-04-01 09:12:46 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:46 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:46 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:46 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:47 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-04-01 09:12:47 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-04-01 09:12:47 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:47 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:47 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-04-01 09:12:47 STATE: test-node.js event: image +2022-04-01 09:12:47 STATE: test-node.js event: image +2022-04-01 09:12:47 STATE: test-node.js event: image +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1527 +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1527 +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1659 +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1659 +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1659 +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1659 +2022-04-01 09:12:48 STATE: test-node.js event: detect +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1385 +2022-04-01 09:12:48 STATE: test-node.js event: detect +2022-04-01 09:12:48 STATE: test-node.js event: detect +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1386 +2022-04-01 09:12:48 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:48 DATA:  test-node.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:48 DATA:  test-node.js result: performance: load: null total: 1386 +2022-04-01 09:12:48 INFO:  test-node.js test: monkey-patch +2022-04-01 09:12:48 STATE: test-node.js event: image +2022-04-01 09:12:48 STATE: test-node.js event: detect +2022-04-01 09:12:48 STATE: test-node.js passed: monkey patch +2022-04-01 09:12:48 STATE: test-node.js passed: segmentation [65536] +2022-04-01 09:12:48 STATE: test-node.js passeed: equal usage +2022-04-01 09:12:48 INFO:  test-node.js test: input compare +2022-04-01 09:12:48 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:49 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-04-01 09:12:49 STATE: test-node.js passed: image compare 0 23.275441687091504 +2022-04-01 09:12:49 INFO:  test-node.js events: {"image":21,"detect":21,"warmup":2} +2022-04-01 09:12:49 INFO:  test-node.js tensors 1925 +2022-04-01 09:12:49 INFO:  test-node.js test complete: 9737 ms +2022-04-01 09:12:49 INFO:  +2022-04-01 09:12:49 INFO:  test-node-gpu.js start +2022-04-01 09:12:50 INFO:  test-node-gpu.js test: configuration validation +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: configuration default validation [] +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-04-01 09:12:50 INFO:  test-node-gpu.js test: model load +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false},{"name":"gear","loaded":false},{"name":"blazeposedetect","loaded":false},{"name":"blazepose","loaded":false},{"name":"centernet","loaded":true},{"name":"efficientpose","loaded":false},{"name":"mobilefacenet","loaded":false},{"name":"emotion","loaded":true},{"name":"facedetect","loaded":true},{"name":"faceiris","loaded":true},{"name":"facemesh","loaded":true},{"name":"faceres","loaded":true},{"name":"ssrnetgender","loaded":false},{"name":"handpose","loaded":false},{"name":"handskeleton","loaded":true},{"name":"handtrack","loaded":true},{"name":"liveness","loaded":true},{"name":"movenet","loaded":true},{"name":"nanodet","loaded":false},{"name":"posenet","loaded":false},{"name":"segmentation","loaded":true},{"name":"antispoof","loaded":true}] +2022-04-01 09:12:50 INFO:  test-node-gpu.js test: warmup +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: create human +2022-04-01 09:12:50 INFO:  test-node-gpu.js human version: 2.6.5 +2022-04-01 09:12:50 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v17.4.0 +2022-04-01 09:12:50 INFO:  test-node-gpu.js tfjs version: 3.15.0 +2022-04-01 09:12:50 INFO:  test-node-gpu.js tensorflow binding version: 2.7.0-dev20211101 +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: set backend: tensorflow +2022-04-01 09:12:50 STATE: test-node-gpu.js tensors 1919 +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: load models +2022-04-01 09:12:50 STATE: test-node-gpu.js result: defined models: 22 loaded models: 12 +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: warmup: none default +2022-04-01 09:12:50 DATA:  test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-04-01 09:12:50 DATA:  test-node-gpu.js result: performance: load: null total: null +2022-04-01 09:12:50 STATE: test-node-gpu.js passed: warmup none result match +2022-04-01 09:12:51 STATE: test-node-gpu.js event: image +2022-04-01 09:12:55 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:55 STATE: test-node-gpu.js event: warmup +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: warmup: face default +2022-04-01 09:12:55 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.42,"keypoints":4} +2022-04-01 09:12:55 DATA:  test-node-gpu.js result: performance: load: null total: 4014 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: warmup face result match +2022-04-01 09:12:55 STATE: test-node-gpu.js event: image +2022-04-01 09:12:55 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:55 STATE: test-node-gpu.js event: warmup +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: warmup: body default +2022-04-01 09:12:55 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:55 DATA:  test-node-gpu.js result: performance: load: null total: 177 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: warmup body result match +2022-04-01 09:12:55 STATE: test-node-gpu.js details: {"face":{"boxScore":0.92,"faceScore":1,"age":29.6,"gender":"female","genderScore":0.89},"emotion":[{"score":0.35,"emotion":"fear"},{"score":0.28,"emotion":"angry"},{"score":0.15,"emotion":"sad"},{"score":0.1,"emotion":"surprise"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.52,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"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-04-01 09:12:55 INFO:  test-node-gpu.js test: details verification +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:55 STATE: test-node-gpu.js event: image +2022-04-01 09:12:55 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:55 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:55 DATA:  test-node-gpu.js result: performance: load: null total: 152 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face length 1 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face score 1 0.93 1 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face age/gender 29.6 female 0.91 73.26 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face arrays 4 478 1024 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face anti-spoofing 0.78 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details face liveness 0.83 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details body length 1 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details body 0.92 17 6 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details hand length 1 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details hand 0.51 0.73 point +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details hand arrays 21 5 7 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details gesture length 6 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details object length 1 +2022-04-01 09:12:55 STATE: test-node-gpu.js passed: details object 0.72 person +2022-04-01 09:12:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-04-01 09:12:56 STATE: test-node-gpu.js event: image +2022-04-01 09:12:56 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:56 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-04-01 09:12:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-04-01 09:12:56 STATE: test-node-gpu.js event: image +2022-04-01 09:12:56 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:56 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-04-01 09:12:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:56 STATE: test-node-gpu.js event: image +2022-04-01 09:12:57 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:57 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-04-01 09:12:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:57 STATE: test-node-gpu.js event: image +2022-04-01 09:12:57 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:57 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-04-01 09:12:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-04-01 09:12:57 STATE: test-node-gpu.js event: image +2022-04-01 09:12:57 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:57 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-04-01 09:12:57 INFO:  test-node-gpu.js test default +2022-04-01 09:12:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:57 STATE: test-node-gpu.js event: image +2022-04-01 09:12:58 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:58 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:58 DATA:  test-node-gpu.js result: performance: load: null total: 162 +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: default result face match 1 female 0.91 +2022-04-01 09:12:58 INFO:  test-node-gpu.js test sync +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:58 STATE: test-node-gpu.js event: image +2022-04-01 09:12:58 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:58 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:58 DATA:  test-node-gpu.js result: performance: load: null total: 159 +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: default sync 1 female 0.91 +2022-04-01 09:12:58 INFO:  test-node-gpu.js test: image process +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: image input null [1,256,256,3] +2022-04-01 09:12:58 INFO:  test-node-gpu.js test: image null +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: invalid input could not convert input to tensor +2022-04-01 09:12:58 INFO:  test-node-gpu.js test face similarity +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:12:58 STATE: test-node-gpu.js event: image +2022-04-01 09:12:58 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:12:58 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-04-01 09:12:58 DATA:  test-node-gpu.js result: performance: load: null total: 153 +2022-04-01 09:12:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:58 STATE: test-node-gpu.js event: image +2022-04-01 09:12:59 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:59 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:59 DATA:  test-node-gpu.js result: performance: load: null total: 161 +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-04-01 09:12:59 STATE: test-node-gpu.js event: image +2022-04-01 09:12:59 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:12:59 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-04-01 09:12:59 DATA:  test-node-gpu.js result: performance: load: null total: 141 +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: face descriptor +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: face similarity {"similarity":[1,0.5630857211196999,0.5193140083083794],"descriptors":[1024,1024,1024]} +2022-04-01 09:12:59 INFO:  test-node-gpu.js test face matching +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: face database 40 +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.8799993617830532}} {"second":{"index":4,"similarity":0.5479640431307572}} {"third":{"index":4,"similarity":0.49994916272803597}} +2022-04-01 09:12:59 INFO:  test-node-gpu.js test object +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:59 STATE: test-node-gpu.js event: image +2022-04-01 09:12:59 STATE: test-node-gpu.js event: detect +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:12:59 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:12:59 DATA:  test-node-gpu.js result: performance: load: null total: 206 +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: object result match +2022-04-01 09:12:59 INFO:  test-node-gpu.js test sensitive +2022-04-01 09:12:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:12:59 STATE: test-node-gpu.js event: image +2022-04-01 09:13:00 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 2 gesture: 8 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: performance: load: null total: 147 +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: sensitive result match +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: sensitive face result match +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: sensitive face emotion result [{"score":0.34,"emotion":"fear"},{"score":0.29,"emotion":"angry"},{"score":0.15,"emotion":"sad"}] +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: sensitive body result match +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: sensitive hand result match +2022-04-01 09:13:00 INFO:  test-node-gpu.js test detectors +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:13:00 STATE: test-node-gpu.js event: image +2022-04-01 09:13:00 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: performance: load: null total: 82 +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detector result face match +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detector result hand match +2022-04-01 09:13:00 INFO:  test-node-gpu.js test: multi-instance +2022-04-01 09:13:00 STATE: test-node-gpu.js event: image +2022-04-01 09:13:00 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detect: random default +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: performance: load: null total: 75 +2022-04-01 09:13:00 INFO:  test-node-gpu.js test: first instance +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: performance: load: null total: 76 +2022-04-01 09:13:00 INFO:  test-node-gpu.js test: second instance +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:00 DATA:  test-node-gpu.js result: performance: load: null total: 73 +2022-04-01 09:13:00 INFO:  test-node-gpu.js test: concurrent +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:13:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:13:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:13:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-04-01 09:13:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-04-01 09:13:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:13:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:13:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-04-01 09:13:01 STATE: test-node-gpu.js event: image +2022-04-01 09:13:01 STATE: test-node-gpu.js event: image +2022-04-01 09:13:01 STATE: test-node-gpu.js event: image +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 958 +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 958 +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 1014 +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 1014 +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 1014 +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 1014 +2022-04-01 09:13:02 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 736 +2022-04-01 09:13:02 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:02 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 736 +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:02 DATA:  test-node-gpu.js result: performance: load: null total: 736 +2022-04-01 09:13:02 INFO:  test-node-gpu.js test: monkey-patch +2022-04-01 09:13:02 STATE: test-node-gpu.js event: image +2022-04-01 09:13:02 STATE: test-node-gpu.js event: detect +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: monkey patch +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: segmentation [65536] +2022-04-01 09:13:02 STATE: test-node-gpu.js passeed: equal usage +2022-04-01 09:13:02 INFO:  test-node-gpu.js test: input compare +2022-04-01 09:13:02 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-04-01 09:13:03 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-04-01 09:13:03 STATE: test-node-gpu.js passed: image compare 0 23.275441687091504 +2022-04-01 09:13:03 INFO:  test-node-gpu.js events: {"image":21,"detect":21,"warmup":2} +2022-04-01 09:13:03 INFO:  test-node-gpu.js tensors 1925 +2022-04-01 09:13:03 INFO:  test-node-gpu.js test complete: 12312 ms +2022-04-01 09:13:04 INFO:  +2022-04-01 09:13:04 INFO:  test-node-wasm.js start +2022-04-01 09:13:04 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/ +2022-04-01 09:13:04 INFO:  test-node-wasm.js test: configuration validation +2022-04-01 09:13:04 STATE: test-node-wasm.js passed: configuration default validation [] +2022-04-01 09:13:04 STATE: test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-04-01 09:13:04 INFO:  test-node-wasm.js test: model load +2022-04-01 09:13:05 STATE: test-node-wasm.js passed: models loaded 22 12 [{"name":"ssrnetage","loaded":false},{"name":"gear","loaded":false},{"name":"blazeposedetect","loaded":false},{"name":"blazepose","loaded":false},{"name":"centernet","loaded":true},{"name":"efficientpose","loaded":false},{"name":"mobilefacenet","loaded":false},{"name":"emotion","loaded":true},{"name":"facedetect","loaded":true},{"name":"faceiris","loaded":true},{"name":"facemesh","loaded":true},{"name":"faceres","loaded":true},{"name":"ssrnetgender","loaded":false},{"name":"handpose","loaded":false},{"name":"handskeleton","loaded":true},{"name":"handtrack","loaded":true},{"name":"liveness","loaded":true},{"name":"movenet","loaded":true},{"name":"nanodet","loaded":false},{"name":"posenet","loaded":false},{"name":"segmentation","loaded":true},{"name":"antispoof","loaded":true}] +2022-04-01 09:13:05 INFO:  test-node-wasm.js test: warmup +2022-04-01 09:13:05 STATE: test-node-wasm.js passed: create human +2022-04-01 09:13:05 INFO:  test-node-wasm.js human version: 2.6.5 +2022-04-01 09:13:05 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v17.4.0 +2022-04-01 09:13:05 INFO:  test-node-wasm.js tfjs version: 3.15.0 +2022-04-01 09:13:05 STATE: test-node-wasm.js passed: set backend: wasm +2022-04-01 09:13:05 STATE: test-node-wasm.js tensors 1919 +2022-04-01 09:13:05 STATE: test-node-wasm.js passed: load models +2022-04-01 09:13:05 STATE: test-node-wasm.js result: defined models: 22 loaded models: 12 +2022-04-01 09:13:05 STATE: test-node-wasm.js passed: warmup: none default +2022-04-01 09:13:05 DATA:  test-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-04-01 09:13:05 DATA:  test-node-wasm.js result: performance: load: null total: null +2022-04-01 09:13:05 STATE: test-node-wasm.js passed: warmup none result match +2022-04-01 09:13:05 STATE: test-node-wasm.js event: image +2022-04-01 09:13:06 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:06 STATE: test-node-wasm.js event: warmup +2022-04-01 09:13:06 STATE: test-node-wasm.js passed: warmup: face default +2022-04-01 09:13:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-04-01 09:13:06 DATA:  test-node-wasm.js result: performance: load: null total: 562 +2022-04-01 09:13:06 STATE: test-node-wasm.js passed: warmup face result match +2022-04-01 09:13:06 STATE: test-node-wasm.js event: image +2022-04-01 09:13:06 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:06 STATE: test-node-wasm.js event: warmup +2022-04-01 09:13:06 STATE: test-node-wasm.js passed: warmup: body default +2022-04-01 09:13:06 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:06 DATA:  test-node-wasm.js result: performance: load: null total: 431 +2022-04-01 09:13:06 STATE: test-node-wasm.js passed: warmup body result match +2022-04-01 09:13:06 STATE: test-node-wasm.js details: {"face":{"boxScore":0.93,"faceScore":1,"age":29.6,"gender":"female","genderScore":0.91},"emotion":[{"score":0.34,"emotion":"fear"},{"score":0.29,"emotion":"angry"},{"score":0.15,"emotion":"sad"}],"body":{"score":0.92,"keypoints":17},"hand":{"boxScore":0.51,"fingerScore":0.73,"keypoints":21},"gestures":[{"face":0,"gesture":"facing right"},{"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-04-01 09:13:06 INFO:  test-node-wasm.js test: details verification +2022-04-01 09:13:06 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:06 STATE: test-node-wasm.js event: image +2022-04-01 09:13:07 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:07 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 6 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:07 DATA:  test-node-wasm.js result: performance: load: null total: 392 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face length 1 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face score 1 0.93 1 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face age/gender 29.6 female 0.91 73.26 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face arrays 4 478 1024 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face anti-spoofing 0.78 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details face liveness 0.83 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details body length 1 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details body 0.92 17 6 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details hand length 1 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details hand 0.51 0.73 point +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details hand arrays 21 5 7 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details gesture length 6 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details object length 1 +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: details object 0.72 person +2022-04-01 09:13:07 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264} +2022-04-01 09:13:07 STATE: test-node-wasm.js event: image +2022-04-01 09:13:08 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:08 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-04-01 09:13:08 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} +2022-04-01 09:13:08 STATE: test-node-wasm.js event: image +2022-04-01 09:13:08 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:08 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-04-01 09:13:08 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:08 STATE: test-node-wasm.js event: image +2022-04-01 09:13:09 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:09 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-04-01 09:13:09 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:09 STATE: test-node-wasm.js event: image +2022-04-01 09:13:09 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:09 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-04-01 09:13:10 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-04-01 09:13:10 STATE: test-node-wasm.js event: image +2022-04-01 09:13:10 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:10 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-04-01 09:13:10 INFO:  test-node-wasm.js test default +2022-04-01 09:13:10 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:10 STATE: test-node-wasm.js event: image +2022-04-01 09:13:11 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:11 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:11 DATA:  test-node-wasm.js result: performance: load: null total: 382 +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: default result face match 1 female 0.93 +2022-04-01 09:13:11 INFO:  test-node-wasm.js test sync +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:11 STATE: test-node-wasm.js event: image +2022-04-01 09:13:11 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:11 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:11 DATA:  test-node-wasm.js result: performance: load: null total: 401 +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: default sync 1 female 0.93 +2022-04-01 09:13:11 INFO:  test-node-wasm.js test: image process +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: image input null [1,256,256,3] +2022-04-01 09:13:11 INFO:  test-node-wasm.js test: image null +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: invalid input could not convert input to tensor +2022-04-01 09:13:11 INFO:  test-node-wasm.js test face similarity +2022-04-01 09:13:11 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-04-01 09:13:11 STATE: test-node-wasm.js event: image +2022-04-01 09:13:12 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:12 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:12 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":23.6,"gender":"female"} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":3} +2022-04-01 09:13:12 DATA:  test-node-wasm.js result: performance: load: null total: 372 +2022-04-01 09:13:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:12 STATE: test-node-wasm.js event: image +2022-04-01 09:13:12 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:12 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:12 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:12 DATA:  test-node-wasm.js result: performance: load: null total: 374 +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-04-01 09:13:13 STATE: test-node-wasm.js event: image +2022-04-01 09:13:13 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:13 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 4 object: 1 person: 1 {"score":1,"age":29.5,"gender":"female"} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":7} +2022-04-01 09:13:13 DATA:  test-node-wasm.js result: performance: load: null total: 348 +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: face descriptor +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: face similarity {"similarity":[1,0.5888036339038205,0.4689331535670693],"descriptors":[1024,1024,1024]} +2022-04-01 09:13:13 INFO:  test-node-wasm.js test face matching +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: face database 40 +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: face match {"first":{"index":4,"similarity":0.8797924799049534}} {"second":{"index":4,"similarity":0.573642308237338}} {"third":{"index":4,"similarity":0.45582039900188964}} +2022-04-01 09:13:13 INFO:  test-node-wasm.js test object +2022-04-01 09:13:13 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:13 STATE: test-node-wasm.js event: image +2022-04-01 09:13:14 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:14 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 7 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:14 DATA:  test-node-wasm.js result: performance: load: null total: 386 +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: object result match +2022-04-01 09:13:14 INFO:  test-node-wasm.js test sensitive +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:14 STATE: test-node-wasm.js event: image +2022-04-01 09:13:14 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:14 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 2 gesture: 9 object: 1 person: 1 {"score":1,"age":29.6,"gender":"female"} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:14 DATA:  test-node-wasm.js result: performance: load: null total: 428 +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: sensitive result match +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: sensitive face result match +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: sensitive face emotion result [{"score":0.54,"emotion":"angry"},{"score":0.2,"emotion":"fear"},{"score":0.16,"emotion":"surprise"}] +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: sensitive body result match +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: sensitive hand result match +2022-04-01 09:13:14 INFO:  test-node-wasm.js test detectors +2022-04-01 09:13:14 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:14 STATE: test-node-wasm.js event: image +2022-04-01 09:13:15 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:15 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:15 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:15 DATA:  test-node-wasm.js result: performance: load: null total: 284 +2022-04-01 09:13:15 STATE: test-node-wasm.js passed: detector result face match +2022-04-01 09:13:15 STATE: test-node-wasm.js passed: detector result hand match +2022-04-01 09:13:15 INFO:  test-node-wasm.js test: multi-instance +2022-04-01 09:13:15 STATE: test-node-wasm.js event: image +2022-04-01 09:13:15 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:15 STATE: test-node-wasm.js passed: detect: random default +2022-04-01 09:13:15 DATA:  test-node-wasm.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.06,"keypoints":15} +2022-04-01 09:13:15 DATA:  test-node-wasm.js result: performance: load: null total: 240 +2022-04-01 09:13:15 INFO:  test-node-wasm.js test: first instance +2022-04-01 09:13:15 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-04-01 09:13:15 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:15 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:15 DATA:  test-node-wasm.js result: performance: load: null total: 265 +2022-04-01 09:13:15 INFO:  test-node-wasm.js test: second instance +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:16 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:16 DATA:  test-node-wasm.js result: performance: load: null total: 270 +2022-04-01 09:13:16 INFO:  test-node-wasm.js test: concurrent +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:16 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-04-01 09:13:17 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-04-01 09:13:17 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-04-01 09:13:17 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:17 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-04-01 09:13:17 STATE: test-node-wasm.js event: image +2022-04-01 09:13:17 STATE: test-node-wasm.js event: image +2022-04-01 09:13:17 STATE: test-node-wasm.js event: image +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2440 +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2440 +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2714 +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2714 +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2714 +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2714 +2022-04-01 09:13:19 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 0 gesture: 0 object: 1 person: 1 {"score":0.96} {"score":0.71,"class":"person"} {"score":0.75,"keypoints":16} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2375 +2022-04-01 09:13:19 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:19 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 2 object: 1 person: 1 {"score":0.91} {"score":0.82,"class":"person"} {"score":0.47,"keypoints":17} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2375 +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: face: 1 body: 1 hand: 1 gesture: 0 object: 1 person: 1 {"score":0.93} {"score":0.72,"class":"person"} {"score":0.92,"keypoints":17} +2022-04-01 09:13:19 DATA:  test-node-wasm.js result: performance: load: null total: 2375 +2022-04-01 09:13:19 INFO:  test-node-wasm.js test: monkey-patch +2022-04-01 09:13:19 STATE: test-node-wasm.js event: image +2022-04-01 09:13:19 STATE: test-node-wasm.js event: detect +2022-04-01 09:13:19 STATE: test-node-wasm.js passed: monkey patch +2022-04-01 09:13:20 STATE: test-node-wasm.js passed: segmentation [65536] +2022-04-01 09:13:20 STATE: test-node-wasm.js passeed: equal usage +2022-04-01 09:13:20 INFO:  test-node-wasm.js test: input compare +2022-04-01 09:13:20 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-04-01 09:13:20 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-04-01 09:13:20 STATE: test-node-wasm.js passed: image compare 0 23.280073018790848 +2022-04-01 09:13:20 INFO:  test-node-wasm.js events: {"image":21,"detect":21,"warmup":2} +2022-04-01 09:13:20 INFO:  test-node-wasm.js tensors 1927 +2022-04-01 09:13:20 INFO:  test-node-wasm.js test complete: 15701 ms +2022-04-01 09:13:20 INFO:  all tests complete +2022-04-01 09:13:20 INFO:  failed: {"count":0,"messages":[]} +2022-04-01 09:13:20 INFO:  status: {"test":"test-node.js","passed":101,"failed":0} +2022-04-01 09:13:20 INFO:  status: {"test":"test-node-gpu.js","passed":101,"failed":0} +2022-04-01 09:13:20 INFO:  status: {"test":"test-node-wasm.js","passed":102,"failed":0}