我想在服务器端使用人脸检测。因此,我为此任务找到了face-api.js
我发现每次faceapi.detectAllFaces()的通话持续约10秒。
但是,当我启动browser-example时,只有第一个函数持续10秒,所有下一个函数持续不到一秒。

我的服务器端代码(您可以在ageAndGenderRecognition.ts中看到类似的代码):

import * as faceapi from 'face-api.js';
import { canvas, faceDetectionNet, faceDetectionOptions, saveFile } from './commons';
await faceDetectionNet.loadFromDisk('../../weights')
await faceapi.nets.faceLandmark68Net.loadFromDisk('../../weights')
await faceapi.nets.ageGenderNet.loadFromDisk('../../weights')

const img = await canvas.loadImage('../images/bbt1.jpg')

console.time();
const results = await faceapi.detectAllFaces(img, faceDetectionOptions);
// ~10 seconds.
console.timeEnd();

console.time();
const results2 = await faceapi.detectAllFaces(img, faceDetectionOptions);
// ~10 seconds again.
console.timeEnd();

为什么browser-example中的faceapi.detectAllFaces()(首次 call 除外)比ageAndGenderRecognition.ts更快?我可以对faceapi.detectAllFaces() -function做哪些类似的事情,并且速度相同?

最佳答案

您的nodejs示例代码运行10 s可能有某些原因:

  • 您根本不会导入@ tensorflow / tfjs-node,在这种情况下,tfjs不使用本机Tensorflow CPU后端,并且操作将在CPU上花费更长的时间。
  • 您正在导入@ tensorflow / tfjs-node,但face-api.js的tfjs-core版本与您通过npm安装的@ tensorflow / tfjs-node版本之间版本不匹配。在这种情况下,tfjs将显示警告消息。
  • 一切设置正确,但是您的CPU速度非常慢。在这种情况下,您可以尝试使用@ tensorflow / tfjs-node-gpu(如果您具有CUDA兼容的nvidia GPU),也可以将faceDetectionOptions更改为新的faceapi.TinyFaceDetectorOptions(),它将运行TinyFaceDetector而不是默认值SSD Mobilenet v1模型,速度更快。

  • 浏览器中的第一次调用之所以花费如此长的时间,并不是由于实际的预测时间。这是因为使用tfjs的WebGL后端,在第一次运行(预热运行)时,所有着色器程序都会被编译,这会花费很长时间。之后,将它们缓存。浏览器中的预测仅需几毫秒,因为WebGL后端是GPU加速的。浏览器中的10s预热时间与您在nodejs中看到的预测时间完全无关。

    07-24 17:15