node-face-compare.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435
  1. /**
  2. * FaceAPI demo that loads two images and finds similarity most prominant face in each image
  3. */
  4. const fs = require('fs');
  5. const tf = require('@tensorflow/tfjs-node');
  6. const faceapi = require('../dist/face-api.node');
  7. let optionsSSDMobileNet;
  8. const getDescriptors = async (imageFile) => {
  9. const buffer = fs.readFileSync(imageFile);
  10. const tensor = tf.node.decodeImage(buffer, 3);
  11. const faces = await faceapi.detectAllFaces(tensor, optionsSSDMobileNet)
  12. .withFaceLandmarks()
  13. .withFaceDescriptors();
  14. tf.dispose(tensor);
  15. return faces.map((face) => face.descriptor);
  16. };
  17. const main = async (file1, file2) => {
  18. console.log('input images:', file1, file2); // eslint-disable-line no-console
  19. await tf.ready();
  20. await faceapi.nets.ssdMobilenetv1.loadFromDisk('model');
  21. optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence: 0.5, maxResults: 1 });
  22. await faceapi.nets.faceLandmark68Net.loadFromDisk('model');
  23. await faceapi.nets.faceRecognitionNet.loadFromDisk('model');
  24. const desc1 = await getDescriptors(file1);
  25. const desc2 = await getDescriptors(file2);
  26. const distance = faceapi.euclideanDistance(desc1[0], desc2[0]); // only compare first found face in each image
  27. console.log('distance between most prominant detected faces:', distance); // eslint-disable-line no-console
  28. console.log('similarity between most prominant detected faces:', 1 - distance); // eslint-disable-line no-console
  29. };
  30. main('demo/sample1.jpg', 'demo/sample2.jpg');