【问题标题】:How to implement face-api.js in expess REST API如何在 expess REST API 中实现 face-api.js
【发布时间】:2020-10-23 06:56:58
【问题描述】:

我发现 face-api.js 在识别人脸方面很有用。我需要在服务器端比较两个图像。我正在上传一张图片并链接到原始图片或两张图片、查询图片和原始图片。

我编写了一个从浏览器端人脸识别中提取的代码。在发送 POST 时,我遇到了很多错误,例如。

  • 未定义提取
  • Blob 未定义
  • 只允许使用绝对 URL(尝试以下代码时)

这是我的代码 app.js

const express = require('express');
const faceapi = require('face-api.js');
const fetch = require('node-fetch');
const fs = require('fs');
const path = require('path');
const multer = require('multer');

faceapi.env.monkeyPatch({ fetch: fetch });

// SET STORAGE
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/uploads/');
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname);
  }
});
const upload = multer({ storage: storage });

const app = express();

app.post('/', upload.single('image'), async (req, res) => {
  console.log(req.file);

  try {
    const labeledFaceDescriptors = await loadLabeledImages();
    console.log('labeledFaceDescriptors: ', labeledFaceDescriptors);

    const faceMatcher = new faceapi.FaceMatcher(
      labeledFaceDescriptors,
      0.6
    );
    let image;
    image = await faceapi.bufferToImage(req.file);
    console.log(image);

    const displaySize = { width: image.width, height: image.height };
    const detections = await faceapi
      .detectAllFaces(image)
      .withFaceLandmarks()
      .withFaceDescriptors();
    const resizedDetections = faceapi.resizeResults(
      detections,
      displaySize
    );
    const results = resizedDetections.map((d) =>
      faceMatcher.findBestMatch(d.descriptor)
    );
    results.forEach((result, i) => {
      const box = resizedDetections[i].detection.box;
      res.send(result.toString());
    });
  } catch (error) {
    console.log(error);

    res.send(error.message);
  }
});

function loadLabeledImages() {
  const labels = [
    'Black Widow',
    'Captain America',
    'Captain Marvel',
    'Hawkeye',
    'Jim Rhodes',
    'Thor',
    'Tony Stark'
  ];
  return Promise.all(
    labels.map(async (label) => {
      const descriptions = [];
      for (let i = 1; i <= 2; i++) {
        const img = await faceapi.fetchImage(
          `https://raw.githubusercontent.com/WebDevSimplified/Face-Recognition-JavaScript/master/labeled_images/${label}/${i}.jpg`
        );
        const detections = await faceapi
          .detectSingleFace(img)
          .withFaceLandmarks()
          .withFaceDescriptor();
        descriptions.push(detections.descriptor);
      }

      return new faceapi.LabeledFaceDescriptors(label, descriptions);
    })
  );
}

app.listen(3000, () => {
  console.log('app running on port: 3000');
});

如何在服务器端实现这种识别并将结果传递给客户端???

【问题讨论】:

标签: javascript node.js face-api


【解决方案1】:

我遇到了同样的问题,这对我有用

const canvas = require("canvas");
const { Canvas, Image, ImageData } = canvas; 

替换

  const img = await faceapi.fetchImage(
      `https://raw.githubusercontent.com/WebDevSimplified/Face-Recognition-JavaScript/master/labeled_images/${label}/${i}.jpg`
    );

        const img =  await canvas.loadImage(`http://localhost:3001/labeled_images/${label}/${i}.jpg`);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2020-10-15
    • 1970-01-01
    • 2020-04-24
    • 2020-06-27
    • 2017-04-23
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多