update dependencies
parent
107297015e
commit
7b8b30bfc9
|
@ -1,6 +1,6 @@
|
||||||
# @vladmandic/face-api
|
# @vladmandic/face-api
|
||||||
|
|
||||||
Version: **1.2.3**
|
Version: **1.2.4**
|
||||||
Description: **FaceAPI: AI-powered Face Detection & Rotation Tracking, Face Description & Recognition, Age & Gender & Emotion Prediction for Browser and NodeJS using TensorFlow/JS**
|
Description: **FaceAPI: AI-powered Face Detection & Rotation Tracking, Face Description & Recognition, Age & Gender & Emotion Prediction for Browser and NodeJS using TensorFlow/JS**
|
||||||
|
|
||||||
Author: **Vladimir Mandic <mandic00@live.com>**
|
Author: **Vladimir Mandic <mandic00@live.com>**
|
||||||
|
@ -9,6 +9,12 @@ Repository: **<git+https://github.com/vladmandic/face-api.git>**
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### **1.2.4** 2021/05/18 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
|
### **origin/master** 2021/05/04 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
### **1.2.3** 2021/05/04 mandic00@live.com
|
### **1.2.3** 2021/05/04 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require
|
||||||
const tf = require('@tensorflow/tfjs-node');
|
const tf = require('@tensorflow/tfjs-node');
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require
|
||||||
const image = require('@canvas/image'); // @canvas/image can decode jpeg, png, webp
|
const image = require('@canvas/image'); // @canvas/image can decode jpeg, png, webp
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies, node/no-unpublished-require
|
||||||
|
const log = require('@vladmandic/pilogger');
|
||||||
const faceapi = require('../dist/face-api.node.js'); // this is equivalent to '@vladmandic/faceapi'
|
const faceapi = require('../dist/face-api.node.js'); // this is equivalent to '@vladmandic/faceapi'
|
||||||
|
|
||||||
const modelPath = 'model/';
|
const modelPath = 'model/';
|
||||||
|
@ -8,24 +12,36 @@ const imageFile = 'demo/sample1.jpg';
|
||||||
const ssdOptions = { minConfidence: 0.1, maxResults: 10 };
|
const ssdOptions = { minConfidence: 0.1, maxResults: 10 };
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
|
log.header();
|
||||||
const buffer = fs.readFileSync(imageFile); // read image from disk
|
const buffer = fs.readFileSync(imageFile); // read image from disk
|
||||||
const canvas = await image.imageFromBuffer(buffer); // decode to canvas
|
const canvas = await image.imageFromBuffer(buffer); // decode to canvas
|
||||||
const imageData = image.getImageData(canvas); // read decoded image data from canvas
|
const imageData = image.getImageData(canvas); // read decoded image data from canvas
|
||||||
console.log('image:', imageFile, canvas.width, canvas.height);
|
log.info('image:', imageFile, canvas.width, canvas.height);
|
||||||
|
|
||||||
const tensor = tf.tidy(() => { // create tensor from image data
|
const tensor = tf.tidy(() => { // create tensor from image data
|
||||||
const data = tf.tensor(Array.from(imageData.data), [canvas.height, canvas.width, 4], 'int32'); // create rgba image tensor from flat array and flip to height x width
|
const data = tf.tensor(Array.from(imageData?.data || []), [canvas.height, canvas.width, 4], 'int32'); // create rgba image tensor from flat array and flip to height x width
|
||||||
const channels = tf.split(data, 4, 2); // split rgba to channels
|
const channels = tf.split(data, 4, 2); // split rgba to channels
|
||||||
const rgb = tf.stack([channels[0], channels[1], channels[2]], 2); // stack channels back to rgb
|
const rgb = tf.stack([channels[0], channels[1], channels[2]], 2); // stack channels back to rgb
|
||||||
const reshape = tf.reshape(rgb, [1, canvas.height, canvas.width, 3]); // move extra dim from the end of tensor and use it as batch number instead
|
const reshape = tf.reshape(rgb, [1, canvas.height, canvas.width, 3]); // move extra dim from the end of tensor and use it as batch number instead
|
||||||
return reshape;
|
return reshape;
|
||||||
});
|
});
|
||||||
console.log('tensor:', tensor.shape, tensor.size);
|
log.info('tensor:', tensor.shape, tensor.size);
|
||||||
|
|
||||||
|
// load models
|
||||||
|
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);
|
||||||
|
|
||||||
await faceapi.nets.ssdMobilenetv1.loadFromDisk(modelPath); // load basic model only
|
|
||||||
const optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options(ssdOptions); // create options object
|
const optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options(ssdOptions); // create options object
|
||||||
const result = await faceapi.detectAllFaces(tensor, optionsSSDMobileNet); // run detection
|
const result = await faceapi // run detection
|
||||||
console.log('results:', result);
|
.detectAllFaces(tensor, optionsSSDMobileNet)
|
||||||
|
.withFaceLandmarks()
|
||||||
|
.withFaceExpressions()
|
||||||
|
.withFaceDescriptors()
|
||||||
|
.withAgeAndGender();
|
||||||
|
log.data('results:', result);
|
||||||
}
|
}
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|
|
@ -6,9 +6,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||||
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
|
var __require = (x) => {
|
||||||
|
if (typeof require !== "undefined")
|
||||||
|
return require(x);
|
||||||
|
throw new Error('Dynamic require of "' + x + '" is not supported');
|
||||||
|
};
|
||||||
var __export = (target, all) => {
|
var __export = (target, all) => {
|
||||||
for (var name in all)
|
for (var name in all)
|
||||||
__defProp(target, name, {get: all[name], enumerable: true});
|
__defProp(target, name, {get: all[name], enumerable: true});
|
||||||
|
@ -793,7 +798,7 @@ function createFileSystem(fs) {
|
||||||
let requireFsError = "";
|
let requireFsError = "";
|
||||||
if (!fs) {
|
if (!fs) {
|
||||||
try {
|
try {
|
||||||
fs = require("fs");
|
fs = __require("fs");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
requireFsError = err.toString();
|
requireFsError = err.toString();
|
||||||
}
|
}
|
||||||
|
@ -849,7 +854,7 @@ function isBrowser() {
|
||||||
|
|
||||||
// src/env/isNodejs.ts
|
// src/env/isNodejs.ts
|
||||||
function isNodejs() {
|
function isNodejs() {
|
||||||
return typeof global === "object" && typeof require === "function" && typeof module !== "undefined" && typeof process !== "undefined" && !!process.version;
|
return typeof global === "object" && typeof __require === "function" && typeof module !== "undefined" && typeof process !== "undefined" && !!process.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/env/index.ts
|
// src/env/index.ts
|
||||||
|
@ -2080,7 +2085,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.2.3";
|
var version = "1.2.4";
|
||||||
|
|
||||||
// src/xception/extractParams.ts
|
// src/xception/extractParams.ts
|
||||||
function extractorsFactory2(extractWeights, paramMappings) {
|
function extractorsFactory2(extractWeights, paramMappings) {
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -7,12 +7,14 @@
|
||||||
|
|
||||||
var __create = Object.create;
|
var __create = Object.create;
|
||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
var __getProtoOf = Object.getPrototypeOf;
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
||||||
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = {exports: {}}).exports, mod), mod.exports);
|
var __commonJS = (cb, mod) => function __require() {
|
||||||
|
return mod || (0, cb[Object.keys(cb)[0]])((mod = {exports: {}}).exports, mod), mod.exports;
|
||||||
|
};
|
||||||
var __export = (target, all) => {
|
var __export = (target, all) => {
|
||||||
for (var name in all)
|
for (var name in all)
|
||||||
__defProp(target, name, {get: all[name], enumerable: true});
|
__defProp(target, name, {get: all[name], enumerable: true});
|
||||||
|
@ -30,13 +32,14 @@ var __toModule = (module2) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
// dist/tfjs.esm.js
|
// dist/tfjs.esm.js
|
||||||
var require_tfjs_esm = __commonJS((exports) => {
|
var require_tfjs_esm = __commonJS({
|
||||||
|
"dist/tfjs.esm.js"(exports) {
|
||||||
var __create2 = Object.create;
|
var __create2 = Object.create;
|
||||||
var __defProp2 = Object.defineProperty;
|
var __defProp2 = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
||||||
var __getProtoOf2 = Object.getPrototypeOf;
|
var __getProtoOf2 = Object.getPrototypeOf;
|
||||||
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
||||||
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
|
||||||
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
|
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
|
||||||
var __reExport2 = (target, module22, desc) => {
|
var __reExport2 = (target, module22, desc) => {
|
||||||
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
|
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
|
||||||
|
@ -51,6 +54,7 @@ var require_tfjs_esm = __commonJS((exports) => {
|
||||||
};
|
};
|
||||||
__markAsModule2(exports);
|
__markAsModule2(exports);
|
||||||
__reExport2(exports, __toModule2(require("@tensorflow/tfjs")));
|
__reExport2(exports, __toModule2(require("@tensorflow/tfjs")));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// src/index.ts
|
||||||
|
@ -2262,7 +2266,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.2.3";
|
var version = "1.2.4";
|
||||||
|
|
||||||
// src/ageGenderNet/AgeGenderNet.ts
|
// src/ageGenderNet/AgeGenderNet.ts
|
||||||
var tf20 = __toModule(require_tfjs_esm());
|
var tf20 = __toModule(require_tfjs_esm());
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -7,12 +7,14 @@
|
||||||
|
|
||||||
var __create = Object.create;
|
var __create = Object.create;
|
||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
var __getProtoOf = Object.getPrototypeOf;
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
||||||
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = {exports: {}}).exports, mod), mod.exports);
|
var __commonJS = (cb, mod) => function __require() {
|
||||||
|
return mod || (0, cb[Object.keys(cb)[0]])((mod = {exports: {}}).exports, mod), mod.exports;
|
||||||
|
};
|
||||||
var __export = (target, all) => {
|
var __export = (target, all) => {
|
||||||
for (var name in all)
|
for (var name in all)
|
||||||
__defProp(target, name, {get: all[name], enumerable: true});
|
__defProp(target, name, {get: all[name], enumerable: true});
|
||||||
|
@ -30,13 +32,14 @@ var __toModule = (module2) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
// dist/tfjs.esm.js
|
// dist/tfjs.esm.js
|
||||||
var require_tfjs_esm = __commonJS((exports) => {
|
var require_tfjs_esm = __commonJS({
|
||||||
|
"dist/tfjs.esm.js"(exports) {
|
||||||
var __create2 = Object.create;
|
var __create2 = Object.create;
|
||||||
var __defProp2 = Object.defineProperty;
|
var __defProp2 = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
||||||
var __getProtoOf2 = Object.getPrototypeOf;
|
var __getProtoOf2 = Object.getPrototypeOf;
|
||||||
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
||||||
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
|
||||||
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
|
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
|
||||||
var __reExport2 = (target, module22, desc) => {
|
var __reExport2 = (target, module22, desc) => {
|
||||||
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
|
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
|
||||||
|
@ -51,6 +54,7 @@ var require_tfjs_esm = __commonJS((exports) => {
|
||||||
};
|
};
|
||||||
__markAsModule2(exports);
|
__markAsModule2(exports);
|
||||||
__reExport2(exports, __toModule2(require("@tensorflow/tfjs-node-gpu")));
|
__reExport2(exports, __toModule2(require("@tensorflow/tfjs-node-gpu")));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// src/index.ts
|
||||||
|
@ -2262,7 +2266,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.2.3";
|
var version = "1.2.4";
|
||||||
|
|
||||||
// src/ageGenderNet/AgeGenderNet.ts
|
// src/ageGenderNet/AgeGenderNet.ts
|
||||||
var tf20 = __toModule(require_tfjs_esm());
|
var tf20 = __toModule(require_tfjs_esm());
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -7,12 +7,14 @@
|
||||||
|
|
||||||
var __create = Object.create;
|
var __create = Object.create;
|
||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
var __getProtoOf = Object.getPrototypeOf;
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
||||||
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = {exports: {}}).exports, mod), mod.exports);
|
var __commonJS = (cb, mod) => function __require() {
|
||||||
|
return mod || (0, cb[Object.keys(cb)[0]])((mod = {exports: {}}).exports, mod), mod.exports;
|
||||||
|
};
|
||||||
var __export = (target, all) => {
|
var __export = (target, all) => {
|
||||||
for (var name in all)
|
for (var name in all)
|
||||||
__defProp(target, name, {get: all[name], enumerable: true});
|
__defProp(target, name, {get: all[name], enumerable: true});
|
||||||
|
@ -30,13 +32,14 @@ var __toModule = (module2) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
// dist/tfjs.esm.js
|
// dist/tfjs.esm.js
|
||||||
var require_tfjs_esm = __commonJS((exports) => {
|
var require_tfjs_esm = __commonJS({
|
||||||
|
"dist/tfjs.esm.js"(exports) {
|
||||||
var __create2 = Object.create;
|
var __create2 = Object.create;
|
||||||
var __defProp2 = Object.defineProperty;
|
var __defProp2 = Object.defineProperty;
|
||||||
|
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
||||||
|
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
||||||
var __getProtoOf2 = Object.getPrototypeOf;
|
var __getProtoOf2 = Object.getPrototypeOf;
|
||||||
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
||||||
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
|
||||||
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
|
||||||
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
|
var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true});
|
||||||
var __reExport2 = (target, module22, desc) => {
|
var __reExport2 = (target, module22, desc) => {
|
||||||
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
|
if (module22 && typeof module22 === "object" || typeof module22 === "function") {
|
||||||
|
@ -51,6 +54,7 @@ var require_tfjs_esm = __commonJS((exports) => {
|
||||||
};
|
};
|
||||||
__markAsModule2(exports);
|
__markAsModule2(exports);
|
||||||
__reExport2(exports, __toModule2(require("@tensorflow/tfjs-node")));
|
__reExport2(exports, __toModule2(require("@tensorflow/tfjs-node")));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// src/index.ts
|
// src/index.ts
|
||||||
|
@ -2262,7 +2266,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
var version = "1.2.3";
|
var version = "1.2.4";
|
||||||
|
|
||||||
// src/ageGenderNet/AgeGenderNet.ts
|
// src/ageGenderNet/AgeGenderNet.ts
|
||||||
var tf20 = __toModule(require_tfjs_esm());
|
var tf20 = __toModule(require_tfjs_esm());
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue