【发布时间】: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');
});
如何在服务器端实现这种识别并将结果传递给客户端???
【问题讨论】:
-
你安装了 face-api.js 推荐用于 Node.js 开发的东西吗? justadudewhohacks.github.io/face-api.js/docs/…
标签: javascript node.js face-api