diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e64d185..24660f81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,17 +9,16 @@ ## Changelog +### **HEAD -> main** 2022/02/10 mandic00@live.com + + ### **2.6.3** 2022/02/10 mandic00@live.com - -### **origin/main** 2022/02/10 mandic00@live.com - +- rebuild ### **2.6.2** 2022/02/07 mandic00@live.com - -### **release: 2.6.1** 2022/01/20 mandic00@live.com - +- release rebuild ### **2.6.1** 2022/01/20 mandic00@live.com @@ -36,9 +35,7 @@ ### **2.5.7** 2021/12/27 mandic00@live.com - fix posenet - -### **release: 2.5.6** 2021/12/15 mandic00@live.com - +- release refresh ### **2.5.6** 2021/12/15 mandic00@live.com @@ -87,9 +84,7 @@ - rebuild - add type defs when working with relative path imports - disable humangl backend if webgl 1.0 is detected - -### **release: 2.5.1** 2021/11/08 mandic00@live.com - +- add additional hand gestures ### **2.5.1** 2021/11/08 mandic00@live.com @@ -117,9 +112,7 @@ - add ts demo - switch from es2018 to es2020 for main build - switch to custom tfjs for demos - -### **release: 2.4.1** 2021/10/25 mandic00@live.com - +- release 2.4 ### **2.4.1** 2021/10/25 mandic00@live.com @@ -153,17 +146,13 @@ - add node-match advanced example using worker thread pool - package updates - optimize image preprocessing - -### **release: 2.3.2** 2021/10/11 mandic00@live.com - +- set webgpu optimized flags - major precision improvements to movenet and handtrack - image processing fixes - redesign body and hand caching and interpolation - demo default config cleanup - improve gaze and face angle visualizations in draw - -### **release 2.3.1** 2021/10/06 mandic00@live.com - +- release 2.3.1 ### **2.3.1** 2021/10/06 mandic00@live.com @@ -173,7 +162,6 @@ - fix backend order initialization - added docker notes - breaking change: new similarity and match methods -- release candidate - tweaked default values - enable handtrack as default model - redesign face processing @@ -203,9 +191,7 @@ ### **2.2.2** 2021/09/17 mandic00@live.com - experimental webgl status monitoring - -### **release: 2.2.1** 2021/09/16 mandic00@live.com - +- major release ### **2.2.1** 2021/09/16 mandic00@live.com @@ -289,9 +275,7 @@ - reorganize demos - fix centernet box width & height - add body segmentation sample - -### **release: 2.0.1** 2021/06/08 mandic00@live.com - +- add release notes - release 2.0 ### **2.0.1** 2021/06/08 mandic00@live.com @@ -375,9 +359,7 @@ ### **1.8.2** 2021/05/04 mandic00@live.com - -### **release 1.8 with major changes and tfjs 3.6.0** 2021/04/30 mandic00@live.com - +- release 1.8 with major changes and tfjs 3.6.0 ### **1.8.1** 2021/04/30 mandic00@live.com @@ -411,7 +393,6 @@ - added filter.flip feature - added demo load image from http - mobile demo optimization and iris gestures -- full test run - full rebuild - new look - added benchmarks @@ -574,9 +555,6 @@ - remove blazeface-front, blazepose-upper, faceboxes - remove blazeface-front and faceboxes -### **release: 1.0.1** 2021/03/09 mandic00@live.com - - ### **1.0.1** 2021/03/09 mandic00@live.com - fix for face detector when mesh is disabled @@ -620,9 +598,6 @@ - embedding fix - 0.20.5 - fix imagefx and add dev builds - -### **0.20.4** 2021/02/19 mandic00@live.com - - 0.20.4 - 0.20.3 - rebuild diff --git a/demo/faceid/index.js.map b/demo/faceid/index.js.map new file mode 100644 index 00000000..dc71702c --- /dev/null +++ b/demo/faceid/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["index.ts", "indexdb.ts"], + "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport { 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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", + "names": [] +} diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map new file mode 100644 index 00000000..a07f857d --- /dev/null +++ b/demo/typescript/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["index.ts"], + "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport { Human, Config } from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\n\nconst humanConfig: Partial = { // user configuration for human, used to fine-tune behavior\n // backend: '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: false },\n gesture: { enabled: true },\n};\n\nconst human = new Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env['perfadd'] = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n\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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", + "names": [] +} diff --git a/package.json b/package.json index e0a84d91..08c35509 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "canvas": "^2.9.0", "dayjs": "^1.10.7", "esbuild": "^0.14.21", - "eslint": "8.8.0", + "eslint": "8.9.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-html": "^6.2.0", "eslint-plugin-import": "^2.25.4", diff --git a/test/build.log b/test/build.log new file mode 100644 index 00000000..3c8da835 --- /dev/null +++ b/test/build.log @@ -0,0 +1,24 @@ +2022-02-14 07:52:23 INFO:  Application: {"name":"@vladmandic/human","version":"2.6.3"} +2022-02-14 07:52:23 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-02-14 07:52:23 INFO:  Toolchain: {"build":"0.7.0","esbuild":"0.14.21","typescript":"4.5.5","typedoc":"0.22.11","eslint":"8.9.0"} +2022-02-14 07:52:23 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-02-14 07:52:23 STATE: Clean: {"locations":["dist/*","types/lib/*","typedoc/*"]} +2022-02-14 07:52:23 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":644} +2022-02-14 07:52:23 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":64,"inputBytes":562626,"outputBytes":293604} +2022-02-14 07:52:23 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":648} +2022-02-14 07:52:23 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":64,"inputBytes":562630,"outputBytes":293608} +2022-02-14 07:52:23 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":685} +2022-02-14 07:52:23 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":64,"inputBytes":562667,"outputBytes":293647} +2022-02-14 07:52:23 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-02-14 07:52:23 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1068,"outputBytes":615} +2022-02-14 07:52:23 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":64,"inputBytes":562597,"outputBytes":292357} +2022-02-14 07:52:23 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":1337647} +2022-02-14 07:52:23 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":64,"inputBytes":1899629,"outputBytes":1629209} +2022-02-14 07:52:23 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":64,"inputBytes":1899629,"outputBytes":2106801} +2022-02-14 07:52:27 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":112} +2022-02-14 07:52:29 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":69,"generated":true} +2022-02-14 07:52:29 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5863,"outputBytes":2915} +2022-02-14 07:52:29 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-02-14 07:52:36 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":95,"errors":0,"warnings":0} +2022-02-14 07:52:36 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-02-14 07:52:36 INFO:  Done... diff --git a/test/test.log b/test/test.log new file mode 100644 index 00000000..7d7bea1c --- /dev/null +++ b/test/test.log @@ -0,0 +1,684 @@ +2022-02-14 07:52:42 INFO:  @vladmandic/human version 2.6.3 +2022-02-14 07:52:42 INFO:  User: vlado Platform: linux Arch: x64 Node: v17.4.0 +2022-02-14 07:52:42 INFO:  tests: ["test-node.js","test-node-gpu.js","test-node-wasm.js"] +2022-02-14 07:52:42 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-02-14 07:52:42 INFO:  +2022-02-14 07:52:42 INFO:  test-node.js start +2022-02-14 07:52:43 INFO:  test-node.js test: configuration validation +2022-02-14 07:52:43 STATE: test-node.js passed: configuration default validation [] +2022-02-14 07:52:43 STATE: test-node.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-02-14 07:52:43 INFO:  test-node.js test: model load +2022-02-14 07:52:43 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-02-14 07:52:43 INFO:  test-node.js test: warmup +2022-02-14 07:52:43 STATE: test-node.js passed: create human +2022-02-14 07:52:43 INFO:  test-node.js human version: 2.6.3 +2022-02-14 07:52:43 INFO:  test-node.js platform: linux x64 agent: NodeJS v17.4.0 +2022-02-14 07:52:43 INFO:  test-node.js tfjs version: 3.13.0 +2022-02-14 07:52:43 INFO:  test-node.js tensorflow binding version: 2.7.0-dev20211101 +2022-02-14 07:52:43 STATE: test-node.js passed: set backend: tensorflow +2022-02-14 07:52:43 STATE: test-node.js tensors 1919 +2022-02-14 07:52:43 STATE: test-node.js passed: load models +2022-02-14 07:52:43 STATE: test-node.js result: defined models: 22 loaded models: 12 +2022-02-14 07:52:43 STATE: test-node.js passed: warmup: none default +2022-02-14 07:52:43 DATA:  test-node.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-02-14 07:52:43 DATA:  test-node.js result: performance: load: null total: null +2022-02-14 07:52:43 STATE: test-node.js passed: warmup none result match +2022-02-14 07:52:43 STATE: test-node.js event: image +2022-02-14 07:52:43 STATE: test-node.js event: detect +2022-02-14 07:52:43 STATE: test-node.js event: warmup +2022-02-14 07:52:43 STATE: test-node.js passed: warmup: face default +2022-02-14 07:52: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.42,"keypoints":4} +2022-02-14 07:52:43 DATA:  test-node.js result: performance: load: null total: 294 +2022-02-14 07:52:43 STATE: test-node.js passed: warmup face result match +2022-02-14 07:52:43 STATE: test-node.js event: image +2022-02-14 07:52:43 STATE: test-node.js event: detect +2022-02-14 07:52:43 STATE: test-node.js event: warmup +2022-02-14 07:52:43 STATE: test-node.js passed: warmup: body default +2022-02-14 07:52: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-02-14 07:52:43 DATA:  test-node.js result: performance: load: null total: 217 +2022-02-14 07:52:43 STATE: test-node.js passed: warmup body result match +2022-02-14 07:52:43 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-02-14 07:52:43 INFO:  test-node.js test: details verification +2022-02-14 07:52:43 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:43 STATE: test-node.js event: image +2022-02-14 07:52:44 STATE: test-node.js event: detect +2022-02-14 07:52:44 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52: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-02-14 07:52:44 DATA:  test-node.js result: performance: load: null total: 211 +2022-02-14 07:52:44 STATE: test-node.js passed: details face length 1 +2022-02-14 07:52:44 STATE: test-node.js passed: details face score 1 0.93 1 +2022-02-14 07:52:44 STATE: test-node.js passed: details face age/gender 29.6 female 0.91 73.26 +2022-02-14 07:52:44 STATE: test-node.js passed: details face arrays 4 478 1024 +2022-02-14 07:52:44 STATE: test-node.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} +2022-02-14 07:52:44 STATE: test-node.js passed: details face anti-spoofing 0.78 +2022-02-14 07:52:44 STATE: test-node.js passed: details face liveness 0.83 +2022-02-14 07:52:44 STATE: test-node.js passed: details body length 1 +2022-02-14 07:52:44 STATE: test-node.js passed: details body 0.92 17 6 +2022-02-14 07:52:44 STATE: test-node.js passed: details hand length 1 +2022-02-14 07:52:44 STATE: test-node.js passed: details hand 0.51 0.73 point +2022-02-14 07:52:44 STATE: test-node.js passed: details hand arrays 21 5 7 +2022-02-14 07:52:44 STATE: test-node.js passed: details gesture length 6 +2022-02-14 07:52:44 STATE: test-node.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-02-14 07:52:44 STATE: test-node.js passed: details object length 1 +2022-02-14 07:52:44 STATE: test-node.js passed: details object 0.72 person +2022-02-14 07:52:44 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-02-14 07:52:44 STATE: test-node.js event: image +2022-02-14 07:52:44 STATE: test-node.js event: detect +2022-02-14 07:52:44 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-02-14 07:52:44 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-02-14 07:52:44 STATE: test-node.js event: image +2022-02-14 07:52:44 STATE: test-node.js event: detect +2022-02-14 07:52:44 STATE: test-node.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-02-14 07:52:44 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:44 STATE: test-node.js event: image +2022-02-14 07:52:45 STATE: test-node.js event: detect +2022-02-14 07:52:45 STATE: test-node.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-02-14 07:52:45 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:45 STATE: test-node.js event: image +2022-02-14 07:52:45 STATE: test-node.js event: detect +2022-02-14 07:52:45 STATE: test-node.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-02-14 07:52:45 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-02-14 07:52:45 STATE: test-node.js event: image +2022-02-14 07:52:45 STATE: test-node.js event: detect +2022-02-14 07:52:45 STATE: test-node.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-02-14 07:52:45 INFO:  test-node.js test default +2022-02-14 07:52:46 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:46 STATE: test-node.js event: image +2022-02-14 07:52:46 STATE: test-node.js event: detect +2022-02-14 07:52:46 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:46 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-02-14 07:52:46 DATA:  test-node.js result: performance: load: null total: 196 +2022-02-14 07:52:46 STATE: test-node.js passed: default result face match 1 female 0.91 +2022-02-14 07:52:46 INFO:  test-node.js test sync +2022-02-14 07:52:46 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:46 STATE: test-node.js event: image +2022-02-14 07:52:46 STATE: test-node.js event: detect +2022-02-14 07:52:46 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:46 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-02-14 07:52:46 DATA:  test-node.js result: performance: load: null total: 178 +2022-02-14 07:52:46 STATE: test-node.js passed: default sync 1 female 0.91 +2022-02-14 07:52:46 INFO:  test-node.js test: image process +2022-02-14 07:52:46 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:46 STATE: test-node.js passed: image input null [1,256,256,3] +2022-02-14 07:52:46 INFO:  test-node.js test: image null +2022-02-14 07:52:46 STATE: test-node.js passed: invalid input could not convert input to tensor +2022-02-14 07:52:46 INFO:  test-node.js test face similarity +2022-02-14 07:52:46 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:46 STATE: test-node.js event: image +2022-02-14 07:52:46 STATE: test-node.js event: detect +2022-02-14 07:52:46 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:52:46 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-02-14 07:52:46 DATA:  test-node.js result: performance: load: null total: 171 +2022-02-14 07:52:46 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:46 STATE: test-node.js event: image +2022-02-14 07:52:47 STATE: test-node.js event: detect +2022-02-14 07:52:47 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:47 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-02-14 07:52:47 DATA:  test-node.js result: performance: load: null total: 178 +2022-02-14 07:52:47 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-02-14 07:52:47 STATE: test-node.js event: image +2022-02-14 07:52:47 STATE: test-node.js event: detect +2022-02-14 07:52:47 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:47 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-02-14 07:52:47 DATA:  test-node.js result: performance: load: null total: 160 +2022-02-14 07:52:47 STATE: test-node.js passed: face descriptor +2022-02-14 07:52:47 STATE: test-node.js passed: face similarity {"similarity":[1,0.5632803981762933,0.5194114531612539],"descriptors":[1024,1024,1024]} +2022-02-14 07:52:47 INFO:  test-node.js test face matching +2022-02-14 07:52:47 STATE: test-node.js passed: face database 40 +2022-02-14 07:52:47 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-02-14 07:52:47 INFO:  test-node.js test object +2022-02-14 07:52:47 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:47 STATE: test-node.js event: image +2022-02-14 07:52:47 STATE: test-node.js event: detect +2022-02-14 07:52:47 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:47 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-02-14 07:52:47 DATA:  test-node.js result: performance: load: null total: 179 +2022-02-14 07:52:47 STATE: test-node.js passed: object result match +2022-02-14 07:52:47 INFO:  test-node.js test sensitive +2022-02-14 07:52:47 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:47 STATE: test-node.js event: image +2022-02-14 07:52:48 STATE: test-node.js event: detect +2022-02-14 07:52:48 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:48 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-02-14 07:52:48 DATA:  test-node.js result: performance: load: null total: 204 +2022-02-14 07:52:48 STATE: test-node.js passed: sensitive result match +2022-02-14 07:52:48 STATE: test-node.js passed: sensitive face result match +2022-02-14 07:52:48 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-02-14 07:52:48 STATE: test-node.js passed: sensitive body result match +2022-02-14 07:52:48 STATE: test-node.js passed: sensitive hand result match +2022-02-14 07:52:48 INFO:  test-node.js test detectors +2022-02-14 07:52:48 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:48 STATE: test-node.js event: image +2022-02-14 07:52:48 STATE: test-node.js event: detect +2022-02-14 07:52:48 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52: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-02-14 07:52:48 DATA:  test-node.js result: performance: load: null total: 127 +2022-02-14 07:52:48 STATE: test-node.js passed: detector result face match +2022-02-14 07:52:48 STATE: test-node.js passed: detector result hand match +2022-02-14 07:52:48 INFO:  test-node.js test: multi-instance +2022-02-14 07:52:48 STATE: test-node.js event: image +2022-02-14 07:52:48 STATE: test-node.js event: detect +2022-02-14 07:52:48 STATE: test-node.js passed: detect: random default +2022-02-14 07:52:48 DATA:  test-node.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.06,"keypoints":15} +2022-02-14 07:52:48 DATA:  test-node.js result: performance: load: null total: 118 +2022-02-14 07:52:48 INFO:  test-node.js test: first instance +2022-02-14 07:52:48 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-02-14 07:52:48 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52: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-02-14 07:52:48 DATA:  test-node.js result: performance: load: null total: 117 +2022-02-14 07:52:48 INFO:  test-node.js test: second instance +2022-02-14 07:52:48 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-02-14 07:52:48 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52: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-02-14 07:52:48 DATA:  test-node.js result: performance: load: null total: 127 +2022-02-14 07:52:48 INFO:  test-node.js test: concurrent +2022-02-14 07:52:48 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:48 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:49 STATE: test-node.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289024} +2022-02-14 07:52:49 STATE: test-node.js event: image +2022-02-14 07:52:49 STATE: test-node.js event: image +2022-02-14 07:52:49 STATE: test-node.js event: image +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1265 +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1265 +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1376 +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1376 +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1376 +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1376 +2022-02-14 07:52:50 STATE: test-node.js event: detect +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1154 +2022-02-14 07:52:50 STATE: test-node.js event: detect +2022-02-14 07:52:50 STATE: test-node.js event: detect +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1154 +2022-02-14 07:52:50 STATE: test-node.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:50 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-02-14 07:52:50 DATA:  test-node.js result: performance: load: null total: 1154 +2022-02-14 07:52:50 INFO:  test-node.js test: monkey-patch +2022-02-14 07:52:50 STATE: test-node.js event: image +2022-02-14 07:52:50 STATE: test-node.js event: detect +2022-02-14 07:52:50 STATE: test-node.js passed: monkey patch +2022-02-14 07:52:50 STATE: test-node.js passed: segmentation [65536] +2022-02-14 07:52:50 STATE: test-node.js passeed: equal usage +2022-02-14 07:52:50 INFO:  test-node.js test: input compare +2022-02-14 07:52:50 STATE: test-node.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:51 STATE: test-node.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796864} +2022-02-14 07:52:51 STATE: test-node.js passed: image compare 0 23.275441687091504 +2022-02-14 07:52:51 INFO:  test-node.js events: {"image":21,"detect":21,"warmup":2} +2022-02-14 07:52:51 INFO:  test-node.js tensors 1925 +2022-02-14 07:52:51 INFO:  test-node.js test complete: 8045 ms +2022-02-14 07:52:51 INFO:  +2022-02-14 07:52:51 INFO:  test-node-gpu.js start +2022-02-14 07:52:51 INFO:  test-node-gpu.js test: configuration validation +2022-02-14 07:52:51 STATE: test-node-gpu.js passed: configuration default validation [] +2022-02-14 07:52:51 STATE: test-node-gpu.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-02-14 07:52:51 INFO:  test-node-gpu.js test: model load +2022-02-14 07:52:52 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-02-14 07:52:52 INFO:  test-node-gpu.js test: warmup +2022-02-14 07:52:52 STATE: test-node-gpu.js passed: create human +2022-02-14 07:52:52 INFO:  test-node-gpu.js human version: 2.6.3 +2022-02-14 07:52:52 INFO:  test-node-gpu.js platform: linux x64 agent: NodeJS v17.4.0 +2022-02-14 07:52:52 INFO:  test-node-gpu.js tfjs version: 3.13.0 +2022-02-14 07:52:52 INFO:  test-node-gpu.js tensorflow binding version: 2.7.0-dev20211101 +2022-02-14 07:52:52 STATE: test-node-gpu.js passed: set backend: tensorflow +2022-02-14 07:52:52 STATE: test-node-gpu.js tensors 1919 +2022-02-14 07:52:52 STATE: test-node-gpu.js passed: load models +2022-02-14 07:52:52 STATE: test-node-gpu.js result: defined models: 22 loaded models: 12 +2022-02-14 07:52:52 STATE: test-node-gpu.js passed: warmup: none default +2022-02-14 07:52:52 DATA:  test-node-gpu.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-02-14 07:52:52 DATA:  test-node-gpu.js result: performance: load: null total: null +2022-02-14 07:52:52 STATE: test-node-gpu.js passed: warmup none result match +2022-02-14 07:52:52 STATE: test-node-gpu.js event: image +2022-02-14 07:52:55 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:55 STATE: test-node-gpu.js event: warmup +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: warmup: face default +2022-02-14 07:52: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-02-14 07:52:55 DATA:  test-node-gpu.js result: performance: load: null total: 2733 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: warmup face result match +2022-02-14 07:52:55 STATE: test-node-gpu.js event: image +2022-02-14 07:52:55 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:55 STATE: test-node-gpu.js event: warmup +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: warmup: body default +2022-02-14 07:52: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-02-14 07:52:55 DATA:  test-node-gpu.js result: performance: load: null total: 136 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: warmup body result match +2022-02-14 07:52: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-02-14 07:52:55 INFO:  test-node-gpu.js test: details verification +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:55 STATE: test-node-gpu.js event: image +2022-02-14 07:52:55 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52: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-02-14 07:52:55 DATA:  test-node-gpu.js result: performance: load: null total: 125 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face length 1 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face score 1 0.93 1 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face age/gender 29.6 female 0.91 73.26 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face arrays 4 478 1024 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face anti-spoofing 0.78 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details face liveness 0.83 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details body length 1 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details body 0.92 17 6 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details hand length 1 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details hand 0.51 0.73 point +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details hand arrays 21 5 7 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details gesture length 6 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details object length 1 +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: details object 0.72 person +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996928} +2022-02-14 07:52:55 STATE: test-node-gpu.js event: image +2022-02-14 07:52:55 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:55 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1371996928} +2022-02-14 07:52:56 STATE: test-node-gpu.js event: image +2022-02-14 07:52:56 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:56 STATE: test-node-gpu.js event: image +2022-02-14 07:52:56 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:56 STATE: test-node-gpu.js event: image +2022-02-14 07:52:56 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-02-14 07:52:56 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-02-14 07:52:56 STATE: test-node-gpu.js event: image +2022-02-14 07:52:57 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-02-14 07:52:57 INFO:  test-node-gpu.js test default +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:57 STATE: test-node-gpu.js event: image +2022-02-14 07:52:57 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:57 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-02-14 07:52:57 DATA:  test-node-gpu.js result: performance: load: null total: 121 +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: default result face match 1 female 0.91 +2022-02-14 07:52:57 INFO:  test-node-gpu.js test sync +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:57 STATE: test-node-gpu.js event: image +2022-02-14 07:52:57 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:57 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-02-14 07:52:57 DATA:  test-node-gpu.js result: performance: load: null total: 112 +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: default sync 1 female 0.91 +2022-02-14 07:52:57 INFO:  test-node-gpu.js test: image process +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: image input null [1,256,256,3] +2022-02-14 07:52:57 INFO:  test-node-gpu.js test: image null +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: invalid input could not convert input to tensor +2022-02-14 07:52:57 INFO:  test-node-gpu.js test face similarity +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:57 STATE: test-node-gpu.js event: image +2022-02-14 07:52:57 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:52:57 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-02-14 07:52:57 DATA:  test-node-gpu.js result: performance: load: null total: 107 +2022-02-14 07:52:57 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:57 STATE: test-node-gpu.js event: image +2022-02-14 07:52:58 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52: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-02-14 07:52:58 DATA:  test-node-gpu.js result: performance: load: null total: 113 +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-02-14 07:52:58 STATE: test-node-gpu.js event: image +2022-02-14 07:52:58 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:58 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-02-14 07:52:58 DATA:  test-node-gpu.js result: performance: load: null total: 99 +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: face descriptor +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: face similarity {"similarity":[1,0.5630556935525979,0.5193764698386258],"descriptors":[1024,1024,1024]} +2022-02-14 07:52:58 INFO:  test-node-gpu.js test face matching +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: face database 40 +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: face match {"first":{"index":4,"similarity":0.8799972012493786}} {"second":{"index":4,"similarity":0.5479612754605243}} {"third":{"index":4,"similarity":0.5000142632384791}} +2022-02-14 07:52:58 INFO:  test-node-gpu.js test object +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:58 STATE: test-node-gpu.js event: image +2022-02-14 07:52:58 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52: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-02-14 07:52:58 DATA:  test-node-gpu.js result: performance: load: null total: 112 +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: object result match +2022-02-14 07:52:58 INFO:  test-node-gpu.js test sensitive +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:58 STATE: test-node-gpu.js event: image +2022-02-14 07:52:58 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:58 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-02-14 07:52:58 DATA:  test-node-gpu.js result: performance: load: null total: 145 +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: sensitive result match +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: sensitive face result match +2022-02-14 07:52:58 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-02-14 07:52:58 STATE: test-node-gpu.js passed: sensitive body result match +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: sensitive hand result match +2022-02-14 07:52:58 INFO:  test-node-gpu.js test detectors +2022-02-14 07:52:58 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:58 STATE: test-node-gpu.js event: image +2022-02-14 07:52:59 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:52:59 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-02-14 07:52:59 DATA:  test-node-gpu.js result: performance: load: null total: 68 +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: detector result face match +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: detector result hand match +2022-02-14 07:52:59 INFO:  test-node-gpu.js test: multi-instance +2022-02-14 07:52:59 STATE: test-node-gpu.js event: image +2022-02-14 07:52:59 STATE: test-node-gpu.js event: detect +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: detect: random default +2022-02-14 07:52:59 DATA:  test-node-gpu.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} +2022-02-14 07:52:59 DATA:  test-node-gpu.js result: performance: load: null total: 62 +2022-02-14 07:52:59 INFO:  test-node-gpu.js test: first instance +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:59 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-02-14 07:52:59 DATA:  test-node-gpu.js result: performance: load: null total: 63 +2022-02-14 07:52:59 INFO:  test-node-gpu.js test: second instance +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:52:59 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-02-14 07:52:59 DATA:  test-node-gpu.js result: performance: load: null total: 61 +2022-02-14 07:52:59 INFO:  test-node-gpu.js test: concurrent +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-02-14 07:52:59 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151289056} +2022-02-14 07:53:00 STATE: test-node-gpu.js event: image +2022-02-14 07:53:00 STATE: test-node-gpu.js event: image +2022-02-14 07:53:00 STATE: test-node-gpu.js event: image +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53: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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 694 +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53: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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 694 +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:00 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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 738 +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:00 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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 738 +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53: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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 738 +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53: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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 738 +2022-02-14 07:53:00 STATE: test-node-gpu.js event: detect +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53: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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 515 +2022-02-14 07:53:00 STATE: test-node-gpu.js event: detect +2022-02-14 07:53:00 STATE: test-node-gpu.js event: detect +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:00 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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 516 +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53: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-02-14 07:53:00 DATA:  test-node-gpu.js result: performance: load: null total: 516 +2022-02-14 07:53:00 INFO:  test-node-gpu.js test: monkey-patch +2022-02-14 07:53:00 STATE: test-node-gpu.js event: image +2022-02-14 07:53:00 STATE: test-node-gpu.js event: detect +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: monkey patch +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: segmentation [65536] +2022-02-14 07:53:00 STATE: test-node-gpu.js passeed: equal usage +2022-02-14 07:53:00 INFO:  test-node-gpu.js test: input compare +2022-02-14 07:53:00 STATE: test-node-gpu.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34696120} +2022-02-14 07:53:01 STATE: test-node-gpu.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1004796928} +2022-02-14 07:53:01 STATE: test-node-gpu.js passed: image compare 0 23.275441687091504 +2022-02-14 07:53:01 INFO:  test-node-gpu.js events: {"image":21,"detect":21,"warmup":2} +2022-02-14 07:53:01 INFO:  test-node-gpu.js tensors 1925 +2022-02-14 07:53:01 INFO:  test-node-gpu.js test complete: 9211 ms +2022-02-14 07:53:01 INFO:  +2022-02-14 07:53:01 INFO:  test-node-wasm.js start +2022-02-14 07:53:02 STATE: test-node-wasm.js passed: model server: https://vladmandic.github.io/human/models/ +2022-02-14 07:53:02 INFO:  test-node-wasm.js test: configuration validation +2022-02-14 07:53:02 STATE: test-node-wasm.js passed: configuration default validation [] +2022-02-14 07:53:02 STATE: test-node-wasm.js passed: configuration invalid validation [{"reason":"unknown property","where":"config.invalid = true"}] +2022-02-14 07:53:02 INFO:  test-node-wasm.js test: model load +2022-02-14 07:53:03 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-02-14 07:53:03 INFO:  test-node-wasm.js test: warmup +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: create human +2022-02-14 07:53:03 INFO:  test-node-wasm.js human version: 2.6.3 +2022-02-14 07:53:03 INFO:  test-node-wasm.js platform: linux x64 agent: NodeJS v17.4.0 +2022-02-14 07:53:03 INFO:  test-node-wasm.js tfjs version: 3.13.0 +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: set backend: wasm +2022-02-14 07:53:03 STATE: test-node-wasm.js tensors 1919 +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: load models +2022-02-14 07:53:03 STATE: test-node-wasm.js result: defined models: 22 loaded models: 12 +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: warmup: none default +2022-02-14 07:53:03 DATA:  test-node-wasm.js result: face: 0 body: 0 hand: 0 gesture: 0 object: 0 person: 0 {} {} {} +2022-02-14 07:53:03 DATA:  test-node-wasm.js result: performance: load: null total: null +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: warmup none result match +2022-02-14 07:53:03 STATE: test-node-wasm.js event: image +2022-02-14 07:53:03 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:03 STATE: test-node-wasm.js event: warmup +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: warmup: face default +2022-02-14 07:53:03 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-02-14 07:53:03 DATA:  test-node-wasm.js result: performance: load: null total: 515 +2022-02-14 07:53:03 STATE: test-node-wasm.js passed: warmup face result match +2022-02-14 07:53:03 STATE: test-node-wasm.js event: image +2022-02-14 07:53:04 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:04 STATE: test-node-wasm.js event: warmup +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: warmup: body default +2022-02-14 07:53:04 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-02-14 07:53:04 DATA:  test-node-wasm.js result: performance: load: null total: 353 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: warmup body result match +2022-02-14 07:53:04 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-02-14 07:53:04 INFO:  test-node-wasm.js test: details verification +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:04 STATE: test-node-wasm.js event: image +2022-02-14 07:53:04 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:04 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-02-14 07:53:04 DATA:  test-node-wasm.js result: performance: load: null total: 329 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face length 1 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face score 1 0.93 1 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face age/gender 29.6 female 0.91 73.26 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face arrays 4 478 1024 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face emotion 3 {"score":0.34,"emotion":"fear"} +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face anti-spoofing 0.78 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details face liveness 0.83 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details body length 1 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details body 0.92 17 6 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details hand length 1 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details hand 0.51 0.73 point +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details hand arrays 21 5 7 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details gesture length 6 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details gesture first {"face":0,"gesture":"facing right"} +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details object length 1 +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: details object 0.72 person +2022-02-14 07:53:04 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1413675264} +2022-02-14 07:53:05 STATE: test-node-wasm.js event: image +2022-02-14 07:53:05 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:05 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: float32 +2022-02-14 07:53:05 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,4] {"checksum":1413675264} +2022-02-14 07:53:05 STATE: test-node-wasm.js event: image +2022-02-14 07:53:05 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:05 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,4] dtype: float32 +2022-02-14 07:53:06 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:06 STATE: test-node-wasm.js event: image +2022-02-14 07:53:06 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:06 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,3] dtype: float32 +2022-02-14 07:53:06 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:06 STATE: test-node-wasm.js event: image +2022-02-14 07:53:06 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:06 STATE: test-node-wasm.js passed: tensor shape: [1200,1200,3] dtype: float32 +2022-02-14 07:53:07 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,4] {"checksum":1371996871} +2022-02-14 07:53:07 STATE: test-node-wasm.js event: image +2022-02-14 07:53:07 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:07 STATE: test-node-wasm.js passed: tensor shape: [1,1200,1200,4] dtype: int32 +2022-02-14 07:53:07 INFO:  test-node-wasm.js test default +2022-02-14 07:53:07 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:07 STATE: test-node-wasm.js event: image +2022-02-14 07:53:08 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:08 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-02-14 07:53:08 DATA:  test-node-wasm.js result: performance: load: null total: 318 +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: default result face match 1 female 0.93 +2022-02-14 07:53:08 INFO:  test-node-wasm.js test sync +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:08 STATE: test-node-wasm.js event: image +2022-02-14 07:53:08 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:08 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-02-14 07:53:08 DATA:  test-node-wasm.js result: performance: load: null total: 326 +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: default sync 1 female 0.93 +2022-02-14 07:53:08 INFO:  test-node-wasm.js test: image process +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: image input null [1,256,256,3] +2022-02-14 07:53:08 INFO:  test-node-wasm.js test: image null +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: invalid input could not convert input to tensor +2022-02-14 07:53:08 INFO:  test-node-wasm.js test face similarity +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-02-14 07:53:08 STATE: test-node-wasm.js event: image +2022-02-14 07:53:08 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:08 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:08 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-02-14 07:53:08 DATA:  test-node-wasm.js result: performance: load: null total: 299 +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:09 STATE: test-node-wasm.js event: image +2022-02-14 07:53:09 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:09 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-02-14 07:53:09 DATA:  test-node-wasm.js result: performance: load: null total: 310 +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-02-14 07:53:09 STATE: test-node-wasm.js event: image +2022-02-14 07:53:09 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53:09 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-02-14 07:53:09 DATA:  test-node-wasm.js result: performance: load: null total: 289 +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: face descriptor +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: face similarity {"similarity":[1,0.5888036339038205,0.4689331535670693],"descriptors":[1024,1024,1024]} +2022-02-14 07:53:09 INFO:  test-node-wasm.js test face matching +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: face database 40 +2022-02-14 07:53:09 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-02-14 07:53:09 INFO:  test-node-wasm.js test object +2022-02-14 07:53:09 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:09 STATE: test-node-wasm.js event: image +2022-02-14 07:53:10 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:10 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-02-14 07:53:10 DATA:  test-node-wasm.js result: performance: load: null total: 313 +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: object result match +2022-02-14 07:53:10 INFO:  test-node-wasm.js test sensitive +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:10 STATE: test-node-wasm.js event: image +2022-02-14 07:53:10 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:10 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-02-14 07:53:10 DATA:  test-node-wasm.js result: performance: load: null total: 341 +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: sensitive result match +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: sensitive face result match +2022-02-14 07:53:10 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-02-14 07:53:10 STATE: test-node-wasm.js passed: sensitive body result match +2022-02-14 07:53:10 STATE: test-node-wasm.js passed: sensitive hand result match +2022-02-14 07:53:10 INFO:  test-node-wasm.js test detectors +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:11 STATE: test-node-wasm.js event: image +2022-02-14 07:53:11 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:11 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-02-14 07:53:11 DATA:  test-node-wasm.js result: performance: load: null total: 226 +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: detector result face match +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: detector result hand match +2022-02-14 07:53:11 INFO:  test-node-wasm.js test: multi-instance +2022-02-14 07:53:11 STATE: test-node-wasm.js event: image +2022-02-14 07:53:11 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: detect: random default +2022-02-14 07:53:11 DATA:  test-node-wasm.js result: face: 0 body: 1 hand: 0 gesture: 0 object: 0 person: 0 {} {} {"score":0.07,"keypoints":15} +2022-02-14 07:53:11 DATA:  test-node-wasm.js result: performance: load: null total: 207 +2022-02-14 07:53:11 INFO:  test-node-wasm.js test: first instance +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53:11 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-02-14 07:53:11 DATA:  test-node-wasm.js result: performance: load: null total: 214 +2022-02-14 07:53:11 INFO:  test-node-wasm.js test: second instance +2022-02-14 07:53:11 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53:12 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-02-14 07:53:12 DATA:  test-node-wasm.js result: performance: load: null total: 211 +2022-02-14 07:53:12 INFO:  test-node-wasm.js test: concurrent +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-02-14 07:53:12 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:13 STATE: test-node-wasm.js passed: load image: samples/in/ai-upper.jpg [1,720,688,3] {"checksum":151155104} +2022-02-14 07:53:13 STATE: test-node-wasm.js event: image +2022-02-14 07:53:13 STATE: test-node-wasm.js event: image +2022-02-14 07:53:13 STATE: test-node-wasm.js event: image +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 1986 +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 1986 +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 2189 +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 2189 +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 2189 +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 2189 +2022-02-14 07:53:14 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-upper.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 1885 +2022-02-14 07:53:14 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:14 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-face.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 1885 +2022-02-14 07:53:14 STATE: test-node-wasm.js passed: detect: samples/in/ai-body.jpg default +2022-02-14 07:53:14 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-02-14 07:53:14 DATA:  test-node-wasm.js result: performance: load: null total: 1885 +2022-02-14 07:53:14 INFO:  test-node-wasm.js test: monkey-patch +2022-02-14 07:53:14 STATE: test-node-wasm.js event: image +2022-02-14 07:53:15 STATE: test-node-wasm.js event: detect +2022-02-14 07:53:15 STATE: test-node-wasm.js passed: monkey patch +2022-02-14 07:53:15 STATE: test-node-wasm.js passed: segmentation [65536] +2022-02-14 07:53:15 STATE: test-node-wasm.js passeed: equal usage +2022-02-14 07:53:15 INFO:  test-node-wasm.js test: input compare +2022-02-14 07:53:15 STATE: test-node-wasm.js passed: load image: samples/in/ai-face.jpg [1,256,256,3] {"checksum":34697856} +2022-02-14 07:53:15 STATE: test-node-wasm.js passed: load image: samples/in/ai-body.jpg [1,1200,1200,3] {"checksum":1038921856} +2022-02-14 07:53:15 STATE: test-node-wasm.js passed: image compare 0 23.280073018790848 +2022-02-14 07:53:15 INFO:  test-node-wasm.js events: {"image":21,"detect":21,"warmup":2} +2022-02-14 07:53:15 INFO:  test-node-wasm.js tensors 1927 +2022-02-14 07:53:15 INFO:  test-node-wasm.js test complete: 13247 ms +2022-02-14 07:53:15 INFO:  all tests complete +2022-02-14 07:53:15 INFO:  failed: {"count":0,"messages":[]} +2022-02-14 07:53:15 INFO:  status: {"test":"test-node.js","passed":101,"failed":0} +2022-02-14 07:53:15 INFO:  status: {"test":"test-node-gpu.js","passed":101,"failed":0} +2022-02-14 07:53:15 INFO:  status: {"test":"test-node-wasm.js","passed":102,"failed":0}