【问题标题】:face-api.js - Why is browser's faceapi.detectAllFaces() is faster than server's?face-api.js - 为什么浏览器的 faceapi.detectAllFaces() 比服务器的快?
【发布时间】:2019-05-21 20:29:58
【问题描述】:

我想在我的服务器端使用人脸检测。因此,我为此任务找到了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()-function 做哪些类似的事情具有相同的速度?

【问题讨论】:

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


    【解决方案1】:

    您的 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 加速的。浏览器中的 10s 预热时间和你在 nodejs 中看到的预测时间完全没有关系。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 我试过了,但对我不起作用。我想是因为我的电脑上没有 GPU。
      • 我想注意:在浏览器示例中,仅第一次调用 detectAllFaces 持续 10 秒。和 ALL NEXT - 不到 0.3 秒。但是 nodejs-example 中的所有调用都持续 10 秒。
      【解决方案3】:

      正如@justadudewhohacks 所提到的,我的 Node.js 代码运行速度非常慢,而为我解决的只是将这一行添加到文件顶部:

      import '@tensorflow/tfjs-node';
      

      它的速度快了很多。如果你有 NVIDIA 显卡,你也可以尝试导入

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        相关资源
        最近更新 更多