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();