From 5e089f1f1232c47874f038ddbcd9bf0cb7af09be Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 25 Apr 2021 14:15:38 -0400 Subject: [PATCH] remove blazeface-front and add unhandledrejection handler --- CHANGELOG.md | 3 +++ README.md | 2 +- TODO.md | 8 +++++--- demo/node-multiprocess-worker.js | 5 +++++ demo/node-multiprocess.js | 5 +++++ demo/node.js | 14 +++++++++++++- models/{blazeface-back.bin => blazeface.bin} | Bin models/{blazeface-back.json => blazeface.json} | 2 +- src/config.ts | 2 +- 9 files changed, 34 insertions(+), 7 deletions(-) rename models/{blazeface-back.bin => blazeface.bin} (100%) rename models/{blazeface-back.json => blazeface.json} (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 732b06af..917fc259 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ Repository: **** ### **HEAD -> main** 2021/04/25 mandic00@live.com +### **origin/main** 2021/04/25 mandic00@live.com + + ### **1.7.1** 2021/04/25 mandic00@live.com - remove obsolete binary models diff --git a/README.md b/README.md index b6919535..b5a3e282 100644 --- a/README.md +++ b/README.md @@ -203,7 +203,7 @@ detectVideo(); Default models in Human library are: -- **Face Detection**: MediaPipe BlazeFace-Back +- **Face Detection**: MediaPipe BlazeFace (Back version) - **Face Mesh**: MediaPipe FaceMesh - **Face Description**: HSE FaceRes - **Face Iris Analysis**: MediaPipe Iris diff --git a/TODO.md b/TODO.md index 49e38543..74783ed8 100644 --- a/TODO.md +++ b/TODO.md @@ -21,17 +21,19 @@ N/A ### Done -Major configuration simplification: +Configuration simplification: - Unified minConfidence and scoreThresdold as minConfidence - Replaced nmsRadius with built-in default - Replaced maxFaces, maxDetections, maxHands, maxResults with maxDetected - Remove deallocate, profile, scoped -Stop building sourcemaps for NodeJS deliverables +Build: + +- Stop building sourcemaps for NodeJS deliverables +- Build NodeJS deliverables in non-minified form ### TBD - Remove modelPaths -- Remove blazeface-front, replace blazeface-back with blazeface - NodeJS Exception handling diff --git a/demo/node-multiprocess-worker.js b/demo/node-multiprocess-worker.js index cf3cd972..eed50346 100644 --- a/demo/node-multiprocess-worker.js +++ b/demo/node-multiprocess-worker.js @@ -52,6 +52,11 @@ async function detect(img) { } async function main() { + process.on('unhandledRejection', (err) => { + // @ts-ignore // no idea if exception message is compelte + log.error(err?.message || err || 'no error message'); + }); + // on worker start first initialize message handler so we don't miss any messages process.on('message', (msg) => { if (msg.exit) process.exit(); // if main told worker to exit diff --git a/demo/node-multiprocess.js b/demo/node-multiprocess.js index fd69ae87..f42720d0 100644 --- a/demo/node-multiprocess.js +++ b/demo/node-multiprocess.js @@ -45,6 +45,11 @@ function measureLatency() { } async function main() { + process.on('unhandledRejection', (err) => { + // @ts-ignore // no idea if exception message is compelte + log.error(err?.message || err || 'no error message'); + }); + log.header(); log.info('FaceAPI multi-process test'); diff --git a/demo/node.js b/demo/node.js index 9f80531d..406fa19e 100644 --- a/demo/node.js +++ b/demo/node.js @@ -84,7 +84,12 @@ async function detect(input) { log.state('Processing:', tensor['shape']); // run actual detection - const result = await human.detect(tensor, myConfig); + let result; + try { + result = await human.detect(tensor, myConfig); + } catch (err) { + log.error('caught'); + } // dispose image tensor as we no longer need it tf.dispose(tensor); @@ -97,6 +102,8 @@ async function detect(input) { const emotion = face.emotion.reduce((prev, curr) => (prev.score > curr.score ? prev : curr)); log.data(` Face: #${i} boxConfidence:${face.boxConfidence} faceConfidence:${face.boxConfidence} age:${face.age} genderConfidence:${face.genderConfidence} gender:${face.gender} emotionScore:${emotion.score} emotion:${emotion.emotion} iris:${face.iris}`); } + } else { + log.data(' Face: N/A'); } if (result && result.body && result.body.length > 0) { for (let i = 0; i < result.body.length; i++) { @@ -134,6 +141,11 @@ async function detect(input) { } async function test() { + process.on('unhandledRejection', (err) => { + // @ts-ignore // no idea if exception message is compelte + log.error(err?.message || err || 'no error message'); + }); + // test with embedded full body image let result; diff --git a/models/blazeface-back.bin b/models/blazeface.bin similarity index 100% rename from models/blazeface-back.bin rename to models/blazeface.bin diff --git a/models/blazeface-back.json b/models/blazeface.json similarity index 99% rename from models/blazeface-back.json rename to models/blazeface.json index d1b84b8e..efb9345e 100644 --- a/models/blazeface-back.json +++ b/models/blazeface.json @@ -281,7 +281,7 @@ "weightsManifest": [ { - "paths": ["blazeface-back.bin"], + "paths": ["blazeface.bin"], "weights": [{"name":"unknown_135","shape":[1,1,96,2],"dtype":"float32"},{"name":"unknown_136","shape":[2],"dtype":"float32"},{"name":"StatefulPartitionedCall/functional_1/tf_op_layer_classificators_1/classificators_1/shape","shape":[3],"dtype":"int32"},{"name":"unknown_133","shape":[1,1,96,6],"dtype":"float32"},{"name":"unknown_134","shape":[6],"dtype":"float32"},{"name":"StatefulPartitionedCall/functional_1/tf_op_layer_classificators_2/classificators_2/shape","shape":[3],"dtype":"int32"},{"name":"unknown_131","shape":[1,1,96,32],"dtype":"float32"},{"name":"unknown_132","shape":[32],"dtype":"float32"},{"name":"StatefulPartitionedCall/functional_1/tf_op_layer_regressors_1/regressors_1/shape","shape":[3],"dtype":"int32"},{"name":"unknown_93","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_95","shape":[1,1,48,96],"dtype":"float32"},{"name":"unknown_96","shape":[96],"dtype":"float32"},{"name":"unknown_61","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_63","shape":[1,1,24,48],"dtype":"float32"},{"name":"unknown_64","shape":[48],"dtype":"float32"},{"name":"unknown_57","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_59","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_60","shape":[24],"dtype":"float32"},{"name":"unknown_53","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_55","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_56","shape":[24],"dtype":"float32"},{"name":"unknown_49","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_51","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_52","shape":[24],"dtype":"float32"},{"name":"unknown_29","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_31","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_32","shape":[24],"dtype":"float32"},{"name":"unknown","shape":[5,5,3,24],"dtype":"float32"},{"name":"unknown_0","shape":[24],"dtype":"float32"},{"name":"unknown_1","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_3","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_4","shape":[24],"dtype":"float32"},{"name":"unknown_5","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_7","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_8","shape":[24],"dtype":"float32"},{"name":"unknown_9","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_11","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_12","shape":[24],"dtype":"float32"},{"name":"unknown_13","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_15","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_16","shape":[24],"dtype":"float32"},{"name":"unknown_17","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_19","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_20","shape":[24],"dtype":"float32"},{"name":"unknown_21","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_23","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_24","shape":[24],"dtype":"float32"},{"name":"unknown_25","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_27","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_28","shape":[24],"dtype":"float32"},{"name":"unknown_33","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_35","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_36","shape":[24],"dtype":"float32"},{"name":"unknown_37","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_39","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_40","shape":[24],"dtype":"float32"},{"name":"unknown_41","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_43","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_44","shape":[24],"dtype":"float32"},{"name":"unknown_45","shape":[3,3,24,1],"dtype":"float32"},{"name":"unknown_47","shape":[1,1,24,24],"dtype":"float32"},{"name":"unknown_48","shape":[24],"dtype":"float32"},{"name":"StatefulPartitionedCall/functional_1/tf_op_layer_Pad/Pad/paddings","shape":[4,2],"dtype":"int32"},{"name":"unknown_65","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_67","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_68","shape":[48],"dtype":"float32"},{"name":"unknown_69","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_71","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_72","shape":[48],"dtype":"float32"},{"name":"unknown_73","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_75","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_76","shape":[48],"dtype":"float32"},{"name":"unknown_77","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_79","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_80","shape":[48],"dtype":"float32"},{"name":"unknown_81","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_83","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_84","shape":[48],"dtype":"float32"},{"name":"unknown_85","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_87","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_88","shape":[48],"dtype":"float32"},{"name":"unknown_89","shape":[3,3,48,1],"dtype":"float32"},{"name":"unknown_91","shape":[1,1,48,48],"dtype":"float32"},{"name":"unknown_92","shape":[48],"dtype":"float32"},{"name":"StatefulPartitionedCall/functional_1/tf_op_layer_Pad_1/Pad_1/paddings","shape":[4,2],"dtype":"int32"},{"name":"unknown_97","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_99","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_100","shape":[96],"dtype":"float32"},{"name":"unknown_101","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_103","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_104","shape":[96],"dtype":"float32"},{"name":"unknown_105","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_107","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_108","shape":[96],"dtype":"float32"},{"name":"unknown_109","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_111","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_112","shape":[96],"dtype":"float32"},{"name":"unknown_113","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_115","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_116","shape":[96],"dtype":"float32"},{"name":"unknown_117","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_119","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_120","shape":[96],"dtype":"float32"},{"name":"unknown_121","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_123","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_124","shape":[96],"dtype":"float32"},{"name":"unknown_125","shape":[3,3,96,1],"dtype":"float32"},{"name":"unknown_127","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_128","shape":[96],"dtype":"float32"},{"name":"unknown_129","shape":[1,1,96,96],"dtype":"float32"},{"name":"unknown_130","shape":[96],"dtype":"float32"},{"name":"StatefulPartitionedCall/functional_1/tf_op_layer_regressors_2/regressors_2/shape","shape":[3],"dtype":"int32"}] } ] diff --git a/src/config.ts b/src/config.ts index 38f25c5e..75cc13aa 100644 --- a/src/config.ts +++ b/src/config.ts @@ -248,7 +248,7 @@ const config: Config = { // detector, mesh, iris, age, gender, emotion // (note: module is not loaded until it is required) detector: { - modelPath: 'blazeface-back.json', // detector model, can be absolute path or relative to modelBasePath + modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath rotation: false, // use best-guess rotated face image or just box with rotation as-is // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees // this parameter is not valid in nodejs