human/test/test-node-gear.js

118 lines
4.3 KiB
JavaScript
Raw Permalink Normal View History

2021-11-13 18:23:32 +01:00
require('@tensorflow/tfjs-node');
const fs = require('fs');
const path = require('path');
const Human = require('../dist/human.node.js').default;
2022-08-30 16:28:33 +02:00
const log = (status, ...data) => {
if (typeof process.send !== 'undefined') process.send([status, data]); // send to parent process over ipc
else console.log(status, ...data); // eslint-disable-line no-console
};
2021-11-13 18:23:32 +01:00
process.env.TF_CPP_MIN_LOG_LEVEL = '2';
const humanConfig = {
backend: 'tensorflow',
2022-08-30 17:42:38 +02:00
debug: false,
2024-09-11 18:13:03 +02:00
cacheSensitivity: 0.01,
2022-08-30 17:42:38 +02:00
modelBasePath: 'https://vladmandic.github.io/human-models/models/',
2021-11-13 18:23:32 +01:00
face: {
2023-01-03 20:24:47 +01:00
detector: { enabled: true, modelPath: 'blazeface-back.json' },
2022-08-30 16:28:33 +02:00
mesh: { enabled: true },
2021-11-13 18:23:32 +01:00
iris: { enabled: false },
2022-08-30 17:42:38 +02:00
description: { enabled: true, modelPath: 'faceres.json' },
gear: { enabled: true, modelPath: 'gear.json' },
ssrnet: { enabled: true, modelPathAge: 'age.json', modelPathGender: 'gender.json' },
2021-11-13 18:23:32 +01:00
emotion: { enabled: false },
},
body: { enabled: false },
hand: { enabled: false },
object: { enabled: false },
gestures: { enabled: false },
};
const human = new Human(humanConfig);
function getImageTensor(imageFile) {
let tensor;
try {
const buffer = fs.readFileSync(imageFile);
tensor = human.tf.node.decodeImage(buffer, 3);
} catch (e) {
2022-08-30 16:28:33 +02:00
log('error', `failed: loading image ${imageFile}: ${e.message}`);
2021-11-13 18:23:32 +01:00
}
return tensor;
}
function printResult(obj) {
2022-08-30 16:28:33 +02:00
if (!obj || !obj.res || !obj.res.face || obj.res.face.length === 0) log('warn', 'failed: no faces detected');
2023-02-01 15:19:15 +01:00
else obj.res.face.forEach((face, i) => log('data', 'results', { face: i, model: obj.model, image: obj.image, age: face.age, gender: face.gender, genderScore: face.genderScore, race: face.race, emotion: face.emotion }));
2021-11-13 18:23:32 +01:00
}
async function main() {
2022-08-30 16:28:33 +02:00
const inputs = process.argv.length === 3 ? process.argv[2] : 'samples/in/ai-face.jpg';
if (!fs.existsSync(inputs)) throw new Error(`file not found: ${inputs}`);
const stat = fs.statSync(inputs);
2021-11-13 18:23:32 +01:00
const files = [];
2022-08-30 16:28:33 +02:00
if (stat.isFile()) files.push(inputs);
else if (stat.isDirectory()) fs.readdirSync(inputs).forEach((f) => files.push(path.join(inputs, f)));
log('data', 'input:', files);
2021-11-13 18:23:32 +01:00
let res;
for (const f of files) {
const tensor = getImageTensor(f);
if (!tensor) continue;
2022-08-30 16:28:33 +02:00
let msg = {};
2021-11-13 18:23:32 +01:00
human.config.face.description.enabled = true;
human.config.face.gear.enabled = false;
human.config.face.ssrnet.enabled = false;
2023-02-22 12:45:34 +01:00
human.env.initial = true;
await human.models.reset();
await human.load();
2021-11-13 18:23:32 +01:00
res = await human.detect(tensor);
2022-08-30 16:28:33 +02:00
msg = { model: 'faceres', image: f, res };
if (res?.face?.[0].age > 20 && res?.face?.[0].age < 30) log('state', 'passed: gear', msg.model, msg.image);
else log('error', 'failed: gear', msg);
printResult(msg);
2021-11-13 18:23:32 +01:00
human.config.face.description.enabled = false;
human.config.face.gear.enabled = true;
human.config.face.ssrnet.enabled = false;
2023-02-22 12:45:34 +01:00
human.env.initial = true;
await human.models.reset();
await human.load();
2021-11-13 18:23:32 +01:00
res = await human.detect(tensor);
2022-08-30 16:28:33 +02:00
msg = { model: 'gear', image: f, res };
if (res?.face?.[0].age > 20 && res?.face?.[0].age < 30) log('state', 'passed: gear', msg.model, msg.image);
else log('error', 'failed: gear', msg);
printResult(msg);
2021-11-13 18:23:32 +01:00
human.config.face.description.enabled = false;
human.config.face.gear.enabled = false;
human.config.face.ssrnet.enabled = true;
2023-02-22 12:45:34 +01:00
human.env.initial = true;
await human.models.reset();
await human.load();
res = await human.detect(tensor);
msg = { model: 'ssrnet', image: f, res };
if (res?.face?.[0].age > 20 && res?.face?.[0].age < 30) log('state', 'passed: gear', msg.model, msg.image);
else log('error', 'failed: gear', msg);
printResult(msg);
human.config.face.description.enabled = false;
human.config.face.gear.enabled = false;
human.config.face.ssrnet = { enabled: true, modelPathAge: 'age.json', modelPathGender: 'gender-ssrnet-imdb.json' };
human.env.initial = true;
await human.models.reset();
await human.load();
2021-11-13 18:23:32 +01:00
res = await human.detect(tensor);
2022-08-30 16:28:33 +02:00
msg = { model: 'ssrnet', image: f, res };
if (res?.face?.[0].age > 20 && res?.face?.[0].age < 30) log('state', 'passed: gear', msg.model, msg.image);
else log('error', 'failed: gear', msg);
printResult(msg);
2021-11-13 18:23:32 +01:00
human.tf.dispose(tensor);
}
}
2022-08-30 16:28:33 +02:00
exports.test = main;
if (require.main === module) main();