modularize pipeline models

pull/50/head
Vladimir Mandic 2020-11-23 22:55:01 -05:00
parent 4ef898b01a
commit c688254269
20 changed files with 74 additions and 76 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -30,7 +30,7 @@
"imports": [] "imports": []
}, },
"dist/human.esm.js": { "dist/human.esm.js": {
"bytes": 1783928, "bytes": 1784266,
"imports": [] "imports": []
} }
}, },
@ -38,14 +38,14 @@
"dist/demo-browser-index.js.map": { "dist/demo-browser-index.js.map": {
"imports": [], "imports": [],
"inputs": {}, "inputs": {},
"bytes": 2678104 "bytes": 2678448
}, },
"dist/demo-browser-index.js": { "dist/demo-browser-index.js": {
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": { "inputs": {
"dist/human.esm.js": { "dist/human.esm.js": {
"bytesInOutput": 1776683 "bytesInOutput": 1777021
}, },
"demo/draw.js": { "demo/draw.js": {
"bytesInOutput": 7668 "bytesInOutput": 7668
@ -60,7 +60,7 @@
"bytesInOutput": 19407 "bytesInOutput": 19407
} }
}, },
"bytes": 1830418 "bytes": 1830756
} }
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/human.esm.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

22
dist/human.esm.json vendored
View File

@ -179,7 +179,7 @@
"imports": [] "imports": []
}, },
"src/face/facemesh.js": { "src/face/facemesh.js": {
"bytes": 2456, "bytes": 2720,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -227,8 +227,8 @@
} }
] ]
}, },
"src/gesture.js": { "src/gesture/gesture.js": {
"bytes": 3306, "bytes": 2981,
"imports": [] "imports": []
}, },
"src/hand/anchors.js": { "src/hand/anchors.js": {
@ -269,7 +269,7 @@
] ]
}, },
"src/hand/handpose.js": { "src/hand/handpose.js": {
"bytes": 3075, "bytes": 3187,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -290,7 +290,7 @@
"imports": [] "imports": []
}, },
"src/human.js": { "src/human.js": {
"bytes": 16049, "bytes": 16057,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -317,7 +317,7 @@
"path": "src/hand/handpose.js" "path": "src/hand/handpose.js"
}, },
{ {
"path": "src/gesture.js" "path": "src/gesture/gesture.js"
}, },
{ {
"path": "src/image.js" "path": "src/image.js"
@ -357,7 +357,7 @@
"dist/human.esm.js.map": { "dist/human.esm.js.map": {
"imports": [], "imports": [],
"inputs": {}, "inputs": {},
"bytes": 2582694 "bytes": 2583057
}, },
"dist/human.esm.js": { "dist/human.esm.js": {
"imports": [], "imports": [],
@ -381,7 +381,7 @@
"bytesInOutput": 9453 "bytesInOutput": 9453
}, },
"src/face/facemesh.js": { "src/face/facemesh.js": {
"bytesInOutput": 1885 "bytesInOutput": 2123
}, },
"src/profile.js": { "src/profile.js": {
"bytesInOutput": 860 "bytesInOutput": 860
@ -441,9 +441,9 @@
"bytesInOutput": 127032 "bytesInOutput": 127032
}, },
"src/hand/handpose.js": { "src/hand/handpose.js": {
"bytesInOutput": 1829 "bytesInOutput": 1929
}, },
"src/gesture.js": { "src/gesture/gesture.js": {
"bytesInOutput": 2255 "bytesInOutput": 2255
}, },
"src/imagefx.js": { "src/imagefx.js": {
@ -471,7 +471,7 @@
"bytesInOutput": 22 "bytesInOutput": 22
} }
}, },
"bytes": 1783928 "bytes": 1784266
} }
} }
} }

2
dist/human.js vendored

File diff suppressed because one or more lines are too long

6
dist/human.js.map vendored

File diff suppressed because one or more lines are too long

22
dist/human.json vendored
View File

@ -179,7 +179,7 @@
"imports": [] "imports": []
}, },
"src/face/facemesh.js": { "src/face/facemesh.js": {
"bytes": 2456, "bytes": 2720,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -227,8 +227,8 @@
} }
] ]
}, },
"src/gesture.js": { "src/gesture/gesture.js": {
"bytes": 3306, "bytes": 2981,
"imports": [] "imports": []
}, },
"src/hand/anchors.js": { "src/hand/anchors.js": {
@ -269,7 +269,7 @@
] ]
}, },
"src/hand/handpose.js": { "src/hand/handpose.js": {
"bytes": 3075, "bytes": 3187,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -290,7 +290,7 @@
"imports": [] "imports": []
}, },
"src/human.js": { "src/human.js": {
"bytes": 16049, "bytes": 16057,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -317,7 +317,7 @@
"path": "src/hand/handpose.js" "path": "src/hand/handpose.js"
}, },
{ {
"path": "src/gesture.js" "path": "src/gesture/gesture.js"
}, },
{ {
"path": "src/image.js" "path": "src/image.js"
@ -357,7 +357,7 @@
"dist/human.js.map": { "dist/human.js.map": {
"imports": [], "imports": [],
"inputs": {}, "inputs": {},
"bytes": 2549656 "bytes": 2550003
}, },
"dist/human.js": { "dist/human.js": {
"imports": [], "imports": [],
@ -379,7 +379,7 @@
"bytesInOutput": 9431 "bytesInOutput": 9431
}, },
"src/face/facemesh.js": { "src/face/facemesh.js": {
"bytesInOutput": 1868 "bytesInOutput": 2101
}, },
"src/profile.js": { "src/profile.js": {
"bytesInOutput": 850 "bytesInOutput": 850
@ -439,9 +439,9 @@
"bytesInOutput": 127032 "bytesInOutput": 127032
}, },
"src/hand/handpose.js": { "src/hand/handpose.js": {
"bytesInOutput": 1814 "bytesInOutput": 1910
}, },
"src/gesture.js": { "src/gesture/gesture.js": {
"bytesInOutput": 2235 "bytesInOutput": 2235
}, },
"src/imagefx.js": { "src/imagefx.js": {
@ -469,7 +469,7 @@
"bytesInOutput": 22 "bytesInOutput": 22
} }
}, },
"bytes": 1783239 "bytes": 1783568
} }
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/human.node.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

22
dist/human.node.json vendored
View File

@ -179,7 +179,7 @@
"imports": [] "imports": []
}, },
"src/face/facemesh.js": { "src/face/facemesh.js": {
"bytes": 2456, "bytes": 2720,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -227,8 +227,8 @@
} }
] ]
}, },
"src/gesture.js": { "src/gesture/gesture.js": {
"bytes": 3306, "bytes": 2981,
"imports": [] "imports": []
}, },
"src/hand/anchors.js": { "src/hand/anchors.js": {
@ -269,7 +269,7 @@
] ]
}, },
"src/hand/handpose.js": { "src/hand/handpose.js": {
"bytes": 3075, "bytes": 3187,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -290,7 +290,7 @@
"imports": [] "imports": []
}, },
"src/human.js": { "src/human.js": {
"bytes": 16049, "bytes": 16057,
"imports": [ "imports": [
{ {
"path": "dist/tfjs.esm.js" "path": "dist/tfjs.esm.js"
@ -317,7 +317,7 @@
"path": "src/hand/handpose.js" "path": "src/hand/handpose.js"
}, },
{ {
"path": "src/gesture.js" "path": "src/gesture/gesture.js"
}, },
{ {
"path": "src/image.js" "path": "src/image.js"
@ -357,7 +357,7 @@
"dist/human.node-gpu.js.map": { "dist/human.node-gpu.js.map": {
"imports": [], "imports": [],
"inputs": {}, "inputs": {},
"bytes": 685654 "bytes": 686025
}, },
"dist/human.node-gpu.js": { "dist/human.node-gpu.js": {
"imports": [], "imports": [],
@ -382,7 +382,7 @@
"bytesInOutput": 9509 "bytesInOutput": 9509
}, },
"src/face/facemesh.js": { "src/face/facemesh.js": {
"bytesInOutput": 1930 "bytesInOutput": 2168
}, },
"src/profile.js": { "src/profile.js": {
"bytesInOutput": 860 "bytesInOutput": 860
@ -442,9 +442,9 @@
"bytesInOutput": 127034 "bytesInOutput": 127034
}, },
"src/hand/handpose.js": { "src/hand/handpose.js": {
"bytesInOutput": 1873 "bytesInOutput": 1973
}, },
"src/gesture.js": { "src/gesture/gesture.js": {
"bytesInOutput": 2259 "bytesInOutput": 2259
}, },
"src/imagefx.js": { "src/imagefx.js": {
@ -469,7 +469,7 @@
"bytesInOutput": 21 "bytesInOutput": 21
} }
}, },
"bytes": 249907 "bytes": 250245
} }
} }
} }

View File

@ -38,17 +38,18 @@ class MediaPipeFaceMesh {
} }
} }
let faceModels = [null, null, null];
async function load(config) { async function load(config) {
const models = await Promise.all([ faceModels = await Promise.all([
blazeface.load(config), (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,
tf.loadGraphModel(config.face.mesh.modelPath, { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }), (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(config.face.mesh.modelPath, { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) : null,
tf.loadGraphModel(config.face.iris.modelPath, { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }), (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(config.face.iris.modelPath, { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) : null,
]); ]);
const faceMesh = new MediaPipeFaceMesh(models[0], models[1], models[2], config); const faceMesh = new MediaPipeFaceMesh(faceModels[0], faceModels[1], faceModels[2], config);
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(`Human: load model: ${config.face.mesh.modelPath.match(/\/(.*)\./)[1]}`); if (config.face.mesh.enabled) console.log(`Human: load model: ${config.face.mesh.modelPath.match(/\/(.*)\./)[1]}`);
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(`Human: load model: ${config.face.iris.modelPath.match(/\/(.*)\./)[1]}`); if (config.face.iris.enabled) console.log(`Human: load model: ${config.face.iris.modelPath.match(/\/(.*)\./)[1]}`);
return faceMesh; return faceMesh;
} }

View File

@ -22,9 +22,6 @@ exports.face = (res) => {
if (!res) return []; if (!res) return [];
const gestures = []; const gestures = [];
for (const face of res) { for (const face of res) {
// if (face.annotations['rightCheek'] && face.annotations['leftCheek'] && (face.annotations['rightCheek'].length > 0) && (face.annotations['leftCheek'].length > 0)) {
// gestures.push(`facing ${((face.annotations['rightCheek'][0][2] > 0) || (face.annotations['leftCheek'][0][2] < 0)) ? 'right' : 'left'}`);
// }
if (face.mesh && face.mesh.length > 0) { if (face.mesh && face.mesh.length > 0) {
const eyeFacing = face.mesh[35][2] - face.mesh[263][2]; const eyeFacing = face.mesh[35][2] - face.mesh[263][2];
if (Math.abs(eyeFacing) < 10) gestures.push('facing camera'); if (Math.abs(eyeFacing) < 10) gestures.push('facing camera');

View File

@ -69,16 +69,16 @@ exports.HandPose = HandPose;
async function load(config) { async function load(config) {
const [handDetectorModel, handPoseModel] = await Promise.all([ const [handDetectorModel, handPoseModel] = await Promise.all([
tf.loadGraphModel(config.hand.detector.modelPath, { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }), config.hand.enabled ? tf.loadGraphModel(config.hand.detector.modelPath, { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) : null,
tf.loadGraphModel(config.hand.skeleton.modelPath, { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }), config.hand.landmarks ? tf.loadGraphModel(config.hand.skeleton.modelPath, { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : null,
]); ]);
const detector = new handdetector.HandDetector(handDetectorModel, config.hand.inputSize, anchors.anchors); const detector = new handdetector.HandDetector(handDetectorModel, config.hand.inputSize, anchors.anchors);
const pipe = new pipeline.HandPipeline(detector, handPoseModel, config.hand.inputSize); const pipe = new pipeline.HandPipeline(detector, handPoseModel, config.hand.inputSize);
const handpose = new HandPose(pipe); const handpose = new HandPose(pipe);
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(`Human: load model: ${config.hand.detector.modelPath.match(/\/(.*)\./)[1]}`); if (config.hand.enabled) console.log(`Human: load model: ${config.hand.detector.modelPath.match(/\/(.*)\./)[1]}`);
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(`Human: load model: ${config.hand.skeleton.modelPath.match(/\/(.*)\./)[1]}`); if (config.hand.landmarks) console.log(`Human: load model: ${config.hand.skeleton.modelPath.match(/\/(.*)\./)[1]}`);
return handpose; return handpose;
} }
exports.load = load; exports.load = load;

View File

@ -6,7 +6,7 @@ import * as emotion from './emotion/emotion.js';
import * as embedding from './embedding/embedding.js'; import * as embedding from './embedding/embedding.js';
import * as posenet from './body/posenet.js'; import * as posenet from './body/posenet.js';
import * as handpose from './hand/handpose.js'; import * as handpose from './hand/handpose.js';
import * as gesture from './gesture.js'; import * as gesture from './gesture/gesture.js';
import * as image from './image.js'; import * as image from './image.js';
import * as profile from './profile.js'; import * as profile from './profile.js';
import * as config from '../config.js'; import * as config from '../config.js';