face-api.js-为什么浏览器的faceapi.detectAllFaces()比服务器的要快?

时间:2019-05-21 20:29:59

标签: javascript node.js performance tensorflow.js face-api

我想在服务器端使用人脸检测。因此,我为此任务找到了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()(首次呼叫除外)比ageAndGenderRecognition.ts中的更快?我可以对faceapi.detectAllFaces()函数执行的哪些类似操作具有相同的速度?

3 个答案:

答案 0 :(得分:3)

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

  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加速的。浏览器中的10s预热时间与您在nodejs中看到的预测时间根本无关。

答案 1 :(得分:1)

使用GPU(而不是CPU)时,Tensorflow.js通常会表现更好。

所以可以解释性能差异的一件事是,在浏览器端,tensorflow将在GPU上运行(通过WebGL),而在节点上,tensorflow将在CPU上运行(除非您使用@tensorflow/tfjs-node-gpu )。

默认情况下,face-api.js库似乎使用@tensorflow/tfjs-nodehttps://github.com/justadudewhohacks/face-api.js#face-apijs-for-nodejs)。 因此,也许您可​​以尝试使用@tensorflow/tfjs-node-gpu替换导入。

为了在节点上使用GPU,请检查tfjs-node github:https://github.com/tensorflow/tfjs-node

答案 2 :(得分:0)

就像@justadudewhohacks提到的那样,我的Node.js代码运行得非常慢,而为我解决的只是将以下行添加到文件顶部:

import '@tensorflow/tfjs-node';

速度更快。如果您有NVIDIA显卡,也可以尝试导入

   import '@tensorflow/tfjs-node-gpu';