64 lines
2.0 KiB
JavaScript
64 lines
2.0 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const log = require('@vladmandic/pilogger');
|
|
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();
|