fix linting and tests

pull/46/head
Vladimir Mandic 2021-04-03 11:02:49 -04:00
parent d1e5e71079
commit 5e88795227
18 changed files with 274 additions and 47 deletions

3
.npmignore Normal file
View File

@ -0,0 +1,3 @@
node_modules
pnpm-lock.yaml

View File

@ -1,6 +1,6 @@
# @vladmandic/face-api
Version: **1.1.7**
Version: **1.1.8**
Description: **FaceAPI: AI-powered Face Detection, Description & Recognition using Tensorflow/JS**
Author: **Vladimir Mandic <mandic00@live.com>**
@ -9,6 +9,12 @@ Repository: **<git+https://github.com/vladmandic/face-api.git>**
## Changelog
### **1.1.8** 2021/04/01 mandic00@live.com
### **origin/master** 2021/04/01 mandic00@live.com
### **1.1.7** 2021/03/31 mandic00@live.com
- enable minify

View File

@ -1,4 +1,5 @@
![Version](https://img.shields.io/github/package-json/v/vladmandic/face-api?style=flat-square?svg=true)
![Git Version](https://img.shields.io/github/package-json/v/vladmandic/face-api?style=flat-square&svg=true&label=git)
![NPM Version](https://img.shields.io/npm/v/@vladmandic/face-api.png?style=flat-square)
![Last Commit](https://img.shields.io/github/last-commit/vladmandic/face-api?style=flat-square?svg=true)
![License](https://img.shields.io/github/license/vladmandic/face-api?style=flat-square?svg=true)
![GitHub Status Checks](https://img.shields.io/github/checks-status/vladmandic/face-api/master?style=flat-square?svg=true)
@ -443,6 +444,8 @@ Compared to [face-api.js](https://github.com/justadudewhohacks/face-api.js) vers
<br>
![Downloads](https://img.shields.io/npm/dm/@vladmandic/face-api?style=flat-square?svg=true)
![Stars](https://img.shields.io/github/stars/vladmandic/face-api?style=flat-square?svg=true)
![Code Size](https://img.shields.io/github/languages/code-size/vladmandic/face-api?style=flat-square?svg=true)
![Downloads](https://img.shields.io/npm/dw/@vladmandic/face-api.png?style=flat-square)
![Downloads](https://img.shields.io/npm/dm/@vladmandic/face-api.png?style=flat-square)
![Downloads](https://img.shields.io/npm/dy/@vladmandic/face-api.png?style=flat-square)

View File

@ -13,7 +13,7 @@ var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {get: all[name], enumerable: true});
};
var __exportStar = (target, module2, desc) => {
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -24,8 +24,8 @@ var __exportStar = (target, module2, desc) => {
// dist/tfjs.esm.js
var tfjs_esm_exports = {};
__exportStar(tfjs_esm_exports, dist_star);
__exportStar(tfjs_esm_exports, tfjs_backend_wasm_star);
__reExport(tfjs_esm_exports, dist_star);
__reExport(tfjs_esm_exports, tfjs_backend_wasm_star);
import * as dist_star from "@tensorflow/tfjs/dist/index.js";
import * as tfjs_backend_wasm_star from "@tensorflow/tfjs-backend-wasm";
@ -2080,7 +2080,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
}
// package.json
var version = "1.1.7";
var version = "1.1.8";
// src/xception/extractParams.ts
function extractorsFactory2(extractWeights, paramMappings) {

54
dist/face-api.esm.js vendored
View File

@ -490,7 +490,7 @@ var __export2 = (target, all4) => {
for (var name in all4)
__defProp2(target, name, {get: all4[name], enumerable: true});
};
var __exportStar = (target, module2, desc) => {
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -499,7 +499,7 @@ var __exportStar = (target, module2, desc) => {
return target;
};
var __toModule = (module2) => {
return __exportStar(__markAsModule(__defProp2(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
return __reExport(__markAsModule(__defProp2(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
};
var require_browser = __commonJS(() => {
});
@ -19262,6 +19262,22 @@ __export2(kernel_impls_exports, {
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2020 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2017 Google LLC. All Rights Reserved.
@ -70946,6 +70962,38 @@ function sliceImpl2(vals, begin, size, shape, dtype) {
}
return outBuf.values;
}
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2019 Google LLC. All Rights Reserved.
@ -76594,7 +76642,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
}
// package.json
var version10 = "1.1.7";
var version10 = "1.1.8";
// src/xception/extractParams.ts
function extractorsFactory2(extractWeights, paramMappings) {

File diff suppressed because one or more lines are too long

54
dist/face-api.js vendored
View File

@ -616,7 +616,7 @@ var faceapi = (() => {
for (var name in all4)
__defProp2(target, name, {get: all4[name], enumerable: true});
};
var __exportStar = (target, module2, desc) => {
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -625,7 +625,7 @@ var faceapi = (() => {
return target;
};
var __toModule = (module2) => {
return __exportStar(__markAsModule(__defProp2(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
return __reExport(__markAsModule(__defProp2(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
};
var require_browser = __commonJS(() => {
});
@ -19388,6 +19388,22 @@ Expected: ${expectedFlat}.`);
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2020 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2017 Google LLC. All Rights Reserved.
@ -71072,6 +71088,38 @@ return a / b;`;
}
return outBuf.values;
}
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
/**
* @license
* Copyright 2019 Google LLC. All Rights Reserved.
@ -76720,7 +76768,7 @@ return a / b;`;
}
// package.json
var version10 = "1.1.7";
var version10 = "1.1.8";
// src/xception/extractParams.ts
function extractorsFactory2(extractWeights, paramMappings) {

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@ var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {get: all[name], enumerable: true});
};
var __exportStar = (target, module2, desc) => {
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -26,7 +26,7 @@ var __exportStar = (target, module2, desc) => {
return target;
};
var __toModule = (module2) => {
return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
};
// dist/tfjs.esm.js
@ -38,7 +38,7 @@ var require_tfjs_esm = __commonJS((exports) => {
var __getOwnPropNames2 = Object.getOwnPropertyNames;
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
var __exportStar2 = (target, module22, desc) => {
var __reExport2 = (target, module22, desc) => {
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
for (let key of __getOwnPropNames2(module22))
if (!__hasOwnProp2.call(target, key) && key !== "default")
@ -47,10 +47,10 @@ var require_tfjs_esm = __commonJS((exports) => {
return target;
};
var __toModule2 = (module22) => {
return __exportStar2(__markAsModule2(__defProp2(module22 != null ? __create2(__getProtoOf2(module22)) : {}, "default", module22 && module22.__esModule && "default" in module22 ? {get: () => module22.default, enumerable: true} : {value: module22, enumerable: true})), module22);
return __reExport2(__markAsModule2(__defProp2(module22 != null ? __create2(__getProtoOf2(module22)) : {}, "default", module22 && module22.__esModule && "default" in module22 ? {get: () => module22.default, enumerable: true} : {value: module22, enumerable: true})), module22);
};
__markAsModule2(exports);
__exportStar2(exports, __toModule2(require("@tensorflow/tfjs")));
__reExport2(exports, __toModule2(require("@tensorflow/tfjs")));
});
// src/index.ts
@ -2262,7 +2262,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
}
// package.json
var version = "1.1.7";
var version = "1.1.8";
// src/ageGenderNet/AgeGenderNet.ts
var tf20 = __toModule(require_tfjs_esm());

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@ var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {get: all[name], enumerable: true});
};
var __exportStar = (target, module2, desc) => {
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -26,7 +26,7 @@ var __exportStar = (target, module2, desc) => {
return target;
};
var __toModule = (module2) => {
return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
};
// dist/tfjs.esm.js
@ -38,7 +38,7 @@ var require_tfjs_esm = __commonJS((exports) => {
var __getOwnPropNames2 = Object.getOwnPropertyNames;
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
var __exportStar2 = (target, module22, desc) => {
var __reExport2 = (target, module22, desc) => {
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
for (let key of __getOwnPropNames2(module22))
if (!__hasOwnProp2.call(target, key) && key !== "default")
@ -47,10 +47,10 @@ var require_tfjs_esm = __commonJS((exports) => {
return target;
};
var __toModule2 = (module22) => {
return __exportStar2(__markAsModule2(__defProp2(module22 != null ? __create2(__getProtoOf2(module22)) : {}, "default", module22 && module22.__esModule && "default" in module22 ? {get: () => module22.default, enumerable: true} : {value: module22, enumerable: true})), module22);
return __reExport2(__markAsModule2(__defProp2(module22 != null ? __create2(__getProtoOf2(module22)) : {}, "default", module22 && module22.__esModule && "default" in module22 ? {get: () => module22.default, enumerable: true} : {value: module22, enumerable: true})), module22);
};
__markAsModule2(exports);
__exportStar2(exports, __toModule2(require("@tensorflow/tfjs-node-gpu")));
__reExport2(exports, __toModule2(require("@tensorflow/tfjs-node-gpu")));
});
// src/index.ts
@ -2262,7 +2262,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
}
// package.json
var version = "1.1.7";
var version = "1.1.8";
// src/ageGenderNet/AgeGenderNet.ts
var tf20 = __toModule(require_tfjs_esm());

File diff suppressed because one or more lines are too long

12
dist/face-api.node.js vendored
View File

@ -17,7 +17,7 @@ var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {get: all[name], enumerable: true});
};
var __exportStar = (target, module2, desc) => {
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -26,7 +26,7 @@ var __exportStar = (target, module2, desc) => {
return target;
};
var __toModule = (module2) => {
return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
};
// dist/tfjs.esm.js
@ -38,7 +38,7 @@ var require_tfjs_esm = __commonJS((exports) => {
var __getOwnPropNames2 = Object.getOwnPropertyNames;
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
var __exportStar2 = (target, module22, desc) => {
var __reExport2 = (target, module22, desc) => {
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
for (let key of __getOwnPropNames2(module22))
if (!__hasOwnProp2.call(target, key) && key !== "default")
@ -47,10 +47,10 @@ var require_tfjs_esm = __commonJS((exports) => {
return target;
};
var __toModule2 = (module22) => {
return __exportStar2(__markAsModule2(__defProp2(module22 != null ? __create2(__getProtoOf2(module22)) : {}, "default", module22 && module22.__esModule && "default" in module22 ? {get: () => module22.default, enumerable: true} : {value: module22, enumerable: true})), module22);
return __reExport2(__markAsModule2(__defProp2(module22 != null ? __create2(__getProtoOf2(module22)) : {}, "default", module22 && module22.__esModule && "default" in module22 ? {get: () => module22.default, enumerable: true} : {value: module22, enumerable: true})), module22);
};
__markAsModule2(exports);
__exportStar2(exports, __toModule2(require("@tensorflow/tfjs-node")));
__reExport2(exports, __toModule2(require("@tensorflow/tfjs-node")));
});
// src/index.ts
@ -2262,7 +2262,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
}
// package.json
var version = "1.1.7";
var version = "1.1.8";
// src/ageGenderNet/AgeGenderNet.ts
var tf20 = __toModule(require_tfjs_esm());

File diff suppressed because one or more lines are too long

58
dist/tfjs.esm.js vendored
View File

@ -17,7 +17,7 @@ var __export = (target, all4) => {
for (var name in all4)
__defProp(target, name, {get: all4[name], enumerable: true});
};
var __exportStar = (target, module, desc) => {
var __reExport = (target, module, desc) => {
if (module && typeof module === "object" || typeof module === "function") {
for (let key of __getOwnPropNames(module))
if (!__hasOwnProp.call(target, key) && key !== "default")
@ -26,7 +26,7 @@ var __exportStar = (target, module, desc) => {
return target;
};
var __toModule = (module) => {
return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module);
return __reExport(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module);
};
// (disabled):node_modules/.pnpm/node-fetch@2.6.1/node_modules/node-fetch/browser.js
@ -19468,6 +19468,24 @@ __export(kernel_impls_exports, {
* =============================================================================
*/
// node_modules/.pnpm/@tensorflow/tfjs-core@3.3.0/node_modules/@tensorflow/tfjs-core/dist/base.js
/**
* @license
* Copyright 2020 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
// node_modules/.pnpm/@tensorflow/tfjs-core@3.3.0/node_modules/@tensorflow/tfjs-core/dist/index.js
/**
* @license
@ -72848,6 +72866,42 @@ function sliceImpl2(vals, begin, size, shape, dtype) {
return outBuf.values;
}
// node_modules/.pnpm/@tensorflow/tfjs-backend-cpu@3.3.0/node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
// node_modules/.pnpm/@tensorflow/tfjs-backend-wasm@3.3.0/node_modules/@tensorflow/tfjs-backend-wasm/dist/kernel_utils/shared.js
/**
* @license
* Copyright 2020 Google LLC. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================================
*/
// node_modules/.pnpm/@tensorflow/tfjs-backend-wasm@3.3.0/node_modules/@tensorflow/tfjs-backend-wasm/dist/kernels/Concat.js
/**
* @license

File diff suppressed because one or more lines are too long

View File

@ -25,7 +25,7 @@
"dev": "node --trace-warnings server/serve.js",
"build": "rimraf dist/* types/* typedoc/* && node server/build.js",
"lint": "eslint src/**/* demo/*.js server/*.js",
"test": "eslint src/**/* demo/*.js server/*.js"
"test": "node --trace-warnings test/test-node.js"
},
"keywords": [
"tensorflow",
@ -50,7 +50,7 @@
"canvas": "^2.7.0",
"chokidar": "^3.5.1",
"dayjs": "^1.10.4",
"esbuild": "^0.11.2",
"esbuild": "^0.11.4",
"eslint": "^7.23.0",
"eslint-config-airbnb-base": "^14.2.1",
"eslint-plugin-import": "^2.22.1",

65
test/test-node.js Normal file
View File

@ -0,0 +1,65 @@
const fs = require('fs');
const path = require('path');
// eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require
const log = require('@vladmandic/pilogger');
// eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require
const tf = require('@tensorflow/tfjs-node');
const faceapi = require('../dist/face-api.node.js'); // this is equivalent to '@vladmandic/faceapi'
const modelPathRoot = '../model';
const minConfidence = 0.15;
const maxResults = 5;
let optionsSSDMobileNet;
async function image(img) {
const buffer = fs.readFileSync(img);
const decoded = tf.node.decodeImage(buffer);
const casted = decoded.toFloat();
const result = casted.expandDims(0);
decoded.dispose();
casted.dispose();
return result;
}
async function detect(tensor) {
try {
const result = await faceapi
.detectAllFaces(tensor, optionsSSDMobileNet)
.withFaceLandmarks()
.withFaceExpressions()
.withFaceDescriptors()
.withAgeAndGender();
return result;
} catch (err) {
log.error('Caught error', err.message);
return [];
}
}
async function main() {
await faceapi.tf.setBackend('tensorflow');
await faceapi.tf.enableProdMode();
await faceapi.tf.ENV.set('DEBUG', false);
await faceapi.tf.ready();
log.state('passed: tf initialized');
const modelPath = path.join(__dirname, modelPathRoot);
await faceapi.nets.ssdMobilenetv1.loadFromDisk(modelPath);
await faceapi.nets.ageGenderNet.loadFromDisk(modelPath);
await faceapi.nets.faceLandmark68Net.loadFromDisk(modelPath);
await faceapi.nets.faceRecognitionNet.loadFromDisk(modelPath);
await faceapi.nets.faceExpressionNet.loadFromDisk(modelPath);
optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence, maxResults });
log.state('passed: models loaded');
const tensor = await image('demo/sample1.jpg');
if (tensor) log.state('passed: image loaded');
else log.error('failed: image load');
const result = await detect(tensor);
if (result && result.length > 0) log.state('passed: detected faces', result.length);
else log.error('failed: detect faces');
tensor.dispose();
}
main();