pull/39/head
Vladimir Mandic 2021-02-20 21:49:39 -05:00
parent d5b0c77e51
commit b0098e8f17
22 changed files with 851 additions and 981 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

@ -559,7 +559,7 @@
] ]
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytes": 1175, "bytes": 1296,
"imports": [ "imports": [
{ {
"path": "src/env/index.ts", "path": "src/env/index.ts",
@ -634,7 +634,7 @@
] ]
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytes": 1808, "bytes": 1804,
"imports": [ "imports": [
{ {
"path": "src/classes/FaceDetection.ts", "path": "src/classes/FaceDetection.ts",
@ -1292,7 +1292,7 @@
] ]
}, },
"package.json": { "package.json": {
"bytes": 1841, "bytes": 1870,
"imports": [] "imports": []
}, },
"src/xception/extractParams.ts": { "src/xception/extractParams.ts": {
@ -2591,7 +2591,7 @@
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": {}, "inputs": {},
"bytes": 309815 "bytes": 310015
}, },
"dist/face-api.esm-nobundle.js": { "dist/face-api.esm-nobundle.js": {
"imports": [], "imports": [],
@ -2806,7 +2806,7 @@
"bytesInOutput": 94 "bytesInOutput": 94
}, },
"src/env/createBrowserEnv.ts": { "src/env/createBrowserEnv.ts": {
"bytesInOutput": 453 "bytesInOutput": 445
}, },
"src/env/createFileSystem.ts": { "src/env/createFileSystem.ts": {
"bytesInOutput": 247 "bytesInOutput": 247
@ -2866,13 +2866,13 @@
"bytesInOutput": 2214 "bytesInOutput": 2214
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytesInOutput": 381 "bytesInOutput": 442
}, },
"src/dom/toNetInput.ts": { "src/dom/toNetInput.ts": {
"bytesInOutput": 773 "bytesInOutput": 773
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytesInOutput": 489 "bytesInOutput": 485
}, },
"src/dom/extractFaceTensors.ts": { "src/dom/extractFaceTensors.ts": {
"bytesInOutput": 442 "bytesInOutput": 442
@ -3187,7 +3187,7 @@
"bytesInOutput": 443 "bytesInOutput": 443
} }
}, },
"bytes": 82178 "bytes": 82227
} }
} }
} }

424
dist/face-api.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

View File

@ -1,7 +1,7 @@
{ {
"inputs": { "inputs": {
"dist/tfjs.esm.js": { "dist/tfjs.esm.js": {
"bytes": 1055784, "bytes": 1055692,
"imports": [] "imports": []
}, },
"src/draw/drawContour.ts": { "src/draw/drawContour.ts": {
@ -559,7 +559,7 @@
] ]
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytes": 1175, "bytes": 1296,
"imports": [ "imports": [
{ {
"path": "src/env/index.ts", "path": "src/env/index.ts",
@ -634,7 +634,7 @@
] ]
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytes": 1808, "bytes": 1804,
"imports": [ "imports": [
{ {
"path": "src/classes/FaceDetection.ts", "path": "src/classes/FaceDetection.ts",
@ -1292,7 +1292,7 @@
] ]
}, },
"package.json": { "package.json": {
"bytes": 1841, "bytes": 1870,
"imports": [] "imports": []
}, },
"src/xception/extractParams.ts": { "src/xception/extractParams.ts": {
@ -2591,7 +2591,7 @@
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": {}, "inputs": {},
"bytes": 1447774 "bytes": 1447909
}, },
"dist/face-api.esm.js": { "dist/face-api.esm.js": {
"imports": [], "imports": [],
@ -2722,7 +2722,7 @@
"bytesInOutput": 181 "bytesInOutput": 181
}, },
"dist/tfjs.esm.js": { "dist/tfjs.esm.js": {
"bytesInOutput": 1047212 "bytesInOutput": 1047120
}, },
"src/draw/index.ts": { "src/draw/index.ts": {
"bytesInOutput": 280 "bytesInOutput": 280
@ -2803,7 +2803,7 @@
"bytesInOutput": 95 "bytesInOutput": 95
}, },
"src/env/createBrowserEnv.ts": { "src/env/createBrowserEnv.ts": {
"bytesInOutput": 453 "bytesInOutput": 445
}, },
"src/env/createFileSystem.ts": { "src/env/createFileSystem.ts": {
"bytesInOutput": 247 "bytesInOutput": 247
@ -2857,7 +2857,7 @@
"bytesInOutput": 111 "bytesInOutput": 111
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytesInOutput": 383 "bytesInOutput": 444
}, },
"src/dom/NetInput.ts": { "src/dom/NetInput.ts": {
"bytesInOutput": 2173 "bytesInOutput": 2173
@ -2866,7 +2866,7 @@
"bytesInOutput": 776 "bytesInOutput": 776
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytesInOutput": 494 "bytesInOutput": 490
}, },
"src/dom/extractFaceTensors.ts": { "src/dom/extractFaceTensors.ts": {
"bytesInOutput": 418 "bytesInOutput": 418
@ -3187,7 +3187,7 @@
"bytesInOutput": 446 "bytesInOutput": 446
} }
}, },
"bytes": 1134640 "bytes": 1134597
} }
} }
} }

404
dist/face-api.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

20
dist/face-api.json vendored
View File

@ -1,7 +1,7 @@
{ {
"inputs": { "inputs": {
"dist/tfjs.esm.js": { "dist/tfjs.esm.js": {
"bytes": 1055784, "bytes": 1055692,
"imports": [] "imports": []
}, },
"src/draw/drawContour.ts": { "src/draw/drawContour.ts": {
@ -559,7 +559,7 @@
] ]
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytes": 1175, "bytes": 1296,
"imports": [ "imports": [
{ {
"path": "src/env/index.ts", "path": "src/env/index.ts",
@ -634,7 +634,7 @@
] ]
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytes": 1808, "bytes": 1804,
"imports": [ "imports": [
{ {
"path": "src/classes/FaceDetection.ts", "path": "src/classes/FaceDetection.ts",
@ -1292,7 +1292,7 @@
] ]
}, },
"package.json": { "package.json": {
"bytes": 1841, "bytes": 1870,
"imports": [] "imports": []
}, },
"src/xception/extractParams.ts": { "src/xception/extractParams.ts": {
@ -2591,7 +2591,7 @@
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": {}, "inputs": {},
"bytes": 1447781 "bytes": 1447916
}, },
"dist/face-api.js": { "dist/face-api.js": {
"imports": [], "imports": [],
@ -2604,7 +2604,7 @@
"bytesInOutput": 3011 "bytesInOutput": 3011
}, },
"dist/tfjs.esm.js": { "dist/tfjs.esm.js": {
"bytesInOutput": 1047274 "bytesInOutput": 1047182
}, },
"src/draw/index.ts": { "src/draw/index.ts": {
"bytesInOutput": 280 "bytesInOutput": 280
@ -2685,7 +2685,7 @@
"bytesInOutput": 95 "bytesInOutput": 95
}, },
"src/env/createBrowserEnv.ts": { "src/env/createBrowserEnv.ts": {
"bytesInOutput": 453 "bytesInOutput": 445
}, },
"src/env/createFileSystem.ts": { "src/env/createFileSystem.ts": {
"bytesInOutput": 247 "bytesInOutput": 247
@ -2739,7 +2739,7 @@
"bytesInOutput": 111 "bytesInOutput": 111
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytesInOutput": 383 "bytesInOutput": 444
}, },
"src/dom/NetInput.ts": { "src/dom/NetInput.ts": {
"bytesInOutput": 2173 "bytesInOutput": 2173
@ -2748,7 +2748,7 @@
"bytesInOutput": 776 "bytesInOutput": 776
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytesInOutput": 494 "bytesInOutput": 490
}, },
"src/dom/extractFaceTensors.ts": { "src/dom/extractFaceTensors.ts": {
"bytesInOutput": 418 "bytesInOutput": 418
@ -3066,7 +3066,7 @@
"bytesInOutput": 446 "bytesInOutput": 446
} }
}, },
"bytes": 1134803 "bytes": 1134760
} }
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -559,7 +559,7 @@
] ]
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytes": 1175, "bytes": 1296,
"imports": [ "imports": [
{ {
"path": "src/env/index.ts", "path": "src/env/index.ts",
@ -634,7 +634,7 @@
] ]
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytes": 1808, "bytes": 1804,
"imports": [ "imports": [
{ {
"path": "src/classes/FaceDetection.ts", "path": "src/classes/FaceDetection.ts",
@ -1292,7 +1292,7 @@
] ]
}, },
"package.json": { "package.json": {
"bytes": 1841, "bytes": 1870,
"imports": [] "imports": []
}, },
"src/xception/extractParams.ts": { "src/xception/extractParams.ts": {
@ -2591,7 +2591,7 @@
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": {}, "inputs": {},
"bytes": 309700 "bytes": 309900
}, },
"dist/face-api.node-gpu.js": { "dist/face-api.node-gpu.js": {
"imports": [], "imports": [],
@ -2685,7 +2685,7 @@
"bytesInOutput": 94 "bytesInOutput": 94
}, },
"src/env/createBrowserEnv.ts": { "src/env/createBrowserEnv.ts": {
"bytesInOutput": 453 "bytesInOutput": 445
}, },
"src/env/createFileSystem.ts": { "src/env/createFileSystem.ts": {
"bytesInOutput": 247 "bytesInOutput": 247
@ -2745,13 +2745,13 @@
"bytesInOutput": 2214 "bytesInOutput": 2214
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytesInOutput": 381 "bytesInOutput": 442
}, },
"src/dom/toNetInput.ts": { "src/dom/toNetInput.ts": {
"bytesInOutput": 773 "bytesInOutput": 773
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytesInOutput": 489 "bytesInOutput": 485
}, },
"src/dom/extractFaceTensors.ts": { "src/dom/extractFaceTensors.ts": {
"bytesInOutput": 442 "bytesInOutput": 442
@ -3066,7 +3066,7 @@
"bytesInOutput": 443 "bytesInOutput": 443
} }
}, },
"bytes": 82721 "bytes": 82770
} }
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -559,7 +559,7 @@
] ]
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytes": 1175, "bytes": 1296,
"imports": [ "imports": [
{ {
"path": "src/env/index.ts", "path": "src/env/index.ts",
@ -634,7 +634,7 @@
] ]
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytes": 1808, "bytes": 1804,
"imports": [ "imports": [
{ {
"path": "src/classes/FaceDetection.ts", "path": "src/classes/FaceDetection.ts",
@ -1292,7 +1292,7 @@
] ]
}, },
"package.json": { "package.json": {
"bytes": 1841, "bytes": 1870,
"imports": [] "imports": []
}, },
"src/xception/extractParams.ts": { "src/xception/extractParams.ts": {
@ -2591,7 +2591,7 @@
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": {}, "inputs": {},
"bytes": 309692 "bytes": 309892
}, },
"dist/face-api.node.js": { "dist/face-api.node.js": {
"imports": [], "imports": [],
@ -2685,7 +2685,7 @@
"bytesInOutput": 94 "bytesInOutput": 94
}, },
"src/env/createBrowserEnv.ts": { "src/env/createBrowserEnv.ts": {
"bytesInOutput": 453 "bytesInOutput": 445
}, },
"src/env/createFileSystem.ts": { "src/env/createFileSystem.ts": {
"bytesInOutput": 247 "bytesInOutput": 247
@ -2745,13 +2745,13 @@
"bytesInOutput": 2214 "bytesInOutput": 2214
}, },
"src/dom/imageToSquare.ts": { "src/dom/imageToSquare.ts": {
"bytesInOutput": 381 "bytesInOutput": 442
}, },
"src/dom/toNetInput.ts": { "src/dom/toNetInput.ts": {
"bytesInOutput": 773 "bytesInOutput": 773
}, },
"src/dom/extractFaces.ts": { "src/dom/extractFaces.ts": {
"bytesInOutput": 489 "bytesInOutput": 485
}, },
"src/dom/extractFaceTensors.ts": { "src/dom/extractFaceTensors.ts": {
"bytesInOutput": 442 "bytesInOutput": 442
@ -3066,7 +3066,7 @@
"bytesInOutput": 443 "bytesInOutput": 443
} }
}, },
"bytes": 82713 "bytes": 82762
} }
} }
} }

398
dist/tfjs.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

8
dist/tfjs.esm.json vendored
View File

@ -25364,7 +25364,7 @@
"imports": [], "imports": [],
"exports": [], "exports": [],
"inputs": {}, "inputs": {},
"bytes": 1129507 "bytes": 1129446
}, },
"dist/tfjs.esm.js": { "dist/tfjs.esm.js": {
"imports": [], "imports": [],
@ -27550,7 +27550,7 @@
"bytesInOutput": 96 "bytesInOutput": 96
}, },
"node_modules/@tensorflow/tfjs-layers/dist/errors.js": { "node_modules/@tensorflow/tfjs-layers/dist/errors.js": {
"bytesInOutput": 542 "bytesInOutput": 452
}, },
"node_modules/@tensorflow/tfjs-layers/dist/utils/generic_utils.js": { "node_modules/@tensorflow/tfjs-layers/dist/utils/generic_utils.js": {
"bytesInOutput": 3474 "bytesInOutput": 3474
@ -29479,7 +29479,7 @@
"bytesInOutput": 14 "bytesInOutput": 14
}, },
"node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js": { "node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/ScatterNd.js": {
"bytesInOutput": 616 "bytesInOutput": 614
}, },
"node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js": { "node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Select.js": {
"bytesInOutput": 509 "bytesInOutput": 509
@ -29557,7 +29557,7 @@
"bytesInOutput": 0 "bytesInOutput": 0
} }
}, },
"bytes": 1055784 "bytes": 1055692
} }
} }
} }

View File

@ -3,7 +3,7 @@ import * as faceapi from '../dist/face-api.esm.js';
// configuration options // configuration options
const modelPath = 'https://vladmandic.github.io/face-api/model/'; // path to model folder that will be loaded using http const modelPath = 'https://vladmandic.github.io/face-api/model/'; // path to model folder that will be loaded using http
// const modelPath = '../model/'; // path to model folder that will be loaded using http // const modelPath = '../model/'; // path to model folder that will be loaded using http
const imgSize = 512; // maximum image size in pixels const imgSize = 720; // maximum image size in pixels
const minScore = 0.1; // minimum score const minScore = 0.1; // minimum score
const maxResults = 10; // maximum number of results to return const maxResults = 10; // maximum number of results to return
const samples = ['sample (1).jpg', 'sample (2).jpg', 'sample (3).jpg', 'sample (4).jpg', 'sample (5).jpg', 'sample (6).jpg']; // sample images to be loaded using http const samples = ['sample (1).jpg', 'sample (2).jpg', 'sample (3).jpg', 'sample (4).jpg', 'sample (5).jpg', 'sample (6).jpg']; // sample images to be loaded using http

View File

@ -1,6 +1,7 @@
// @ts-nocheck // @ts-nocheck
const fs = require('fs'); const fs = require('fs');
const process = require('process');
const path = require('path'); const path = require('path');
const log = require('@vladmandic/pilogger'); const log = require('@vladmandic/pilogger');
// eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require // eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require
@ -11,6 +12,7 @@ const modelPathRoot = '../model';
const imgPathRoot = './example'; // modify to include your sample images const imgPathRoot = './example'; // modify to include your sample images
const minScore = 0.1; const minScore = 0.1;
const maxResults = 5; const maxResults = 5;
let optionsSSDMobileNet;
async function image(img) { async function image(img) {
const buffer = fs.readFileSync(img); const buffer = fs.readFileSync(img);
@ -22,10 +24,19 @@ async function image(img) {
return result; return result;
} }
async function detect(tensor) {
const result = await faceapi
.detectAllFaces(tensor, optionsSSDMobileNet)
.withFaceLandmarks()
.withFaceExpressions()
.withFaceDescriptors()
.withAgeAndGender();
return result;
}
async function main() { async function main() {
log.header(); log.header();
log.info('FaceAPI single-process test'); log.info('FaceAPI single-process test');
const t0 = process.hrtime.bigint();
await faceapi.tf.setBackend('tensorflow'); await faceapi.tf.setBackend('tensorflow');
await faceapi.tf.enableProdMode(); await faceapi.tf.enableProdMode();
@ -41,23 +52,32 @@ async function main() {
await faceapi.nets.faceLandmark68Net.loadFromDisk(modelPath); await faceapi.nets.faceLandmark68Net.loadFromDisk(modelPath);
await faceapi.nets.faceRecognitionNet.loadFromDisk(modelPath); await faceapi.nets.faceRecognitionNet.loadFromDisk(modelPath);
await faceapi.nets.faceExpressionNet.loadFromDisk(modelPath); await faceapi.nets.faceExpressionNet.loadFromDisk(modelPath);
const optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence: minScore, maxResults }); optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence: minScore, maxResults });
const dir = fs.readdirSync(imgPathRoot); if (process.argv.length !== 3) {
for (const img of dir) { const t0 = process.hrtime.bigint();
if (!img.toLocaleLowerCase().endsWith('.jpg')) continue; const dir = fs.readdirSync(imgPathRoot);
const tensor = await image(path.join(imgPathRoot, img)); for (const img of dir) {
const result = await faceapi if (!img.toLocaleLowerCase().endsWith('.jpg')) continue;
.detectAllFaces(tensor, optionsSSDMobileNet) const tensor = await image(path.join(imgPathRoot, img));
.withFaceLandmarks() const result = await detect(tensor);
.withFaceExpressions() log.data('Image:', img, 'Detected faces:', result.length);
.withFaceDescriptors() tensor.dispose();
.withAgeAndGender(); }
log.data('Image:', img, 'Detected faces:', result.length); const t1 = process.hrtime.bigint();
tensor.dispose(); log.info('Processed', dir.length, 'images in', Math.trunc(parseInt(t1 - t0) / 1000 / 1000), 'ms');
} else {
const param = process.argv[2];
if (fs.existsSync(param)) {
const tensor = await image(param);
const result = await detect(tensor);
log.data('Image:', param, 'Detected faces:', result.length);
for (const i of result) {
log.data('Gender:', i.genderProbability, i.gender, 'Age:', i.age);
}
tensor.dispose();
}
} }
const t1 = process.hrtime.bigint();
log.info('Processed', dir.length, 'images in', Math.trunc(parseInt(t1 - t0) / 1000 / 1000), 'ms');
} }
main(); main();

414
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -38,18 +38,18 @@
}, },
"homepage": "https://github.com/vladmandic/face-api#readme", "homepage": "https://github.com/vladmandic/face-api#readme",
"dependencies": { "dependencies": {
"@tensorflow/tfjs-node": "^3.1.0",
"@tensorflow/tfjs-node-gpu": "^3.1.0",
"@vladmandic/pilogger": "^0.2.14" "@vladmandic/pilogger": "^0.2.14"
}, },
"devDependencies": { "devDependencies": {
"@tensorflow/tfjs": "^3.1.0", "@tensorflow/tfjs": "^3.1.0",
"@tensorflow/tfjs-backend-wasm": "^3.1.0", "@tensorflow/tfjs-backend-wasm": "^3.1.0",
"@tensorflow/tfjs-node": "^3.1.0", "@types/node": "^14.14.31",
"@tensorflow/tfjs-node-gpu": "^3.1.0", "@typescript-eslint/eslint-plugin": "^4.15.2-alpha.5",
"@types/node": "^14.14.28", "@typescript-eslint/parser": "^4.15.2-alpha.5",
"@typescript-eslint/eslint-plugin": "^4.15.1",
"@typescript-eslint/parser": "^4.15.1",
"chokidar": "^3.5.1", "chokidar": "^3.5.1",
"esbuild": "^0.8.46", "esbuild": "^0.8.49",
"eslint": "^7.20.0", "eslint": "^7.20.0",
"eslint-config-airbnb-base": "^14.2.1", "eslint-config-airbnb-base": "^14.2.1",
"eslint-plugin-import": "^2.22.1", "eslint-plugin-import": "^2.22.1",
@ -58,6 +58,6 @@
"eslint-plugin-promise": "^4.3.1", "eslint-plugin-promise": "^4.3.1",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"tslib": "^2.1.0", "tslib": "^2.1.0",
"typescript": "^4.1.5" "typescript": "^4.3.0-dev.20210220"
} }
} }