我想在我的服务器端使用人脸检测。因此,我找到了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();
为什么 faceapi.detectAllFaces()
(第一次调用除外)在 browser-example 中更快比 ageAndGenderRecognition.ts ?我可以对我的 faceapi.detectAllFaces()
函数做哪些类似的事情具有相同的速度?
最佳答案
您的 nodejs 示例代码运行 10s 可能有一些原因:
您根本没有导入 @tensorflow/tfjs-node,在这种情况下,tfjs 不使用 native 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后端,第一次运行(warm up run)所有的shader程序都被编译了,所以耗时很长。之后这些被缓存。浏览器中的预测只需要几毫秒,因为 WebGL 后端是 GPU 加速的。浏览器中的 10 秒预热时间与您在 nodejs 中看到的预测时间完全无关。
关于javascript - face-api.js - 为什么浏览器的 faceapi.detectAllFaces() 比服务器的快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245926/