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

标签 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();

为什么 faceapi.detectAllFaces()(第一次调用除外)在 browser-example 中更快比 ageAndGenderRecognition.ts ?我可以对我的 faceapi.detectAllFaces() 函数做哪些类似的事情具有相同的速度?

最佳答案

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

  1. 您根本没有导入 @tensorflow/tfjs-node,在这种情况下,tfjs 不使用 native 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后端,第一次运行(warm up run)所有的shader程序都被编译了,所以耗时很长。之后这些被缓存。浏览器中的预测只需要几毫秒,因为 WebGL 后端是 GPU 加速的。浏览器中的 10 秒预热时间与您在 nodejs 中看到的预测时间完全无关。

关于javascript - face-api.js - 为什么浏览器的 faceapi.detectAllFaces() 比服务器的快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245926/

相关文章:

javascript - 准备好的语句未在带有 mssql 的 Node js 中执行

javascript - 在同一个 Controller nodejs上调用函数

node.js - 使用 Visual Studio Code 的 Mocha 断点

javascript - Knockout Observable Array 异步调用绑定(bind)顺序问题

javascript - JS Regex 分别替换左右括号

javascript - 使用 JavaScript/jQuery 获取字符串的一部分

r - 为什么循环的执行时间与循环的大小不成正比

php - MySQL curdate() 和 now() 与 PHP date()

javascript - 在 uiwebview 中使用 javascript 将样式应用于文本范围

javascript - Javascript 中如何定义当前 GMT 时区?