首页 > 解决方案 > face-api.js - 为什么浏览器的 faceapi.detectAllFaces() 比服务器的快?

问题描述

我想在我的服务器端使用人脸检测。因此,我为这个任务找到了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()(第一次调用除外)在浏览器示例中比在ageAndGenderRecognition.ts中更快?我可以对我的faceapi.detectAllFaces()-function 做哪些类似的事情具有相同的速度?

标签: javascriptnode.jsperformancetensorflow.jsface-api

解决方案


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

  1. 您根本没有导入@tensorflow/tfjs-node,在这种情况下,tfjs 不使用本机 Tensorflow CPU 后端,CPU 上的操作将花费更长的时间。

  2. 您正在导入 @tensorflow/tfjs-node 但 face-api.js 的 tfjs-core 版本与您通过 npm 安装的 @tensorflow/tfjs-node 版本之间存在版本不匹配。在这种情况下,tfjs 将显示一条警告消息。

  3. 一切都设置正确,但你的 CPU 非常慢。在这种情况下,您可以尝试使用@tensorflow/tfjs-node-gpu(如果您有兼容 CUDA 的 nvidia GPU),也可以将 faceDetectionOptions 更改为新的 faceapi.TinyFaceDetectorOptions(),这将运行 TinyFaceDetector 而不是默认值SSD Mobilenet v1 模型,速度更快。

浏览器中的第一次调用需要这么长时间的原因并不是因为实际的预测时间。这是因为使用 tfjs 的 WebGL 后端,在第一次运行(预热运行)时,所有的着色器程序都被编译,这需要很长时间。之后这些被缓存。浏览器中的预测只需要几毫秒,因为 WebGL 后端是 GPU 加速的。浏览器中的 10 秒预热时间和您在 nodejs 中看到的预测时间完全不相关。


推荐阅读