face-api.js - Почему браузер faceapi.detectAllFaces () работает быстрее, чем сервер? - PullRequest
6 голосов
/ 21 мая 2019

Я хочу использовать функцию распознавания лиц на моей стороне сервера.Поэтому я нашел face-api.js для этой задачи.Я обнаружил, что каждый вызов faceapi.detectAllFaces() длится ~ 10 секунд.Но когда я запускаю пример браузера , только первая функция длится 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() -функция имела такую ​​же скорость?

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Может быть несколько причин, по которым ваш пример кода nodejs работает в течение 10 с:

  1. Вы вообще не импортируете @ tenorflow / tfjs-node, в этом случае tfjs не использует собственный серверный процессор Tensorflow, и операции с ЦП будут намного более длительными.

  2. Вы импортируете @ tenorflow / tfjs-node, но существует несоответствие версии между версией tfjs-core, которую face-api.js, и версией @ tenorflow / tfjs-node, которую вы установили через npm. В этом случае tfjs отобразит предупреждающее сообщение.

  3. Все настроено правильно, но ваш процессор просто невероятно медленный. В этом случае вы можете попытаться использовать @ tenorflow / tfjs-node-gpu (если у вас есть совместимый с CUDA графический процессор nvidia) или вы можете изменить faceDetectionOptions на новый faceapi.TinyFaceDetectorOptions (), который будет запускать TinyFaceDetector вместо значения по умолчанию Модель SSD Mobilenet v1, которая намного быстрее.

Причина, по которой первый вызов в браузере занимает столько времени, не связана с фактическим временем предсказания. Это связано с тем, что с помощью бэкэнда tfjs WebGL при первом запуске (прогрев прогона) компилируются все шейдерные программы, что занимает много времени. После этого они кэшируются. Прогноз в браузере занимает всего несколько миллисекунд, потому что серверная часть WebGL ускоряется на GPU. Время прогрева 10 секунд в браузере и время предсказания, которое вы видите в nodejs, вообще не связаны.

1 голос
/ 24 мая 2019

Tensorflow.js, как правило, будет работать лучше при использовании графического процессора (вместо процессора).

Итак, одна вещь, которая может объяснить разницу в производительности, заключается в том, что на стороне браузера тензор потока будет работать на графическом процессоре (через WebGL), тогда как на узле он будет работать на процессоре (если вы не используете @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.

Чтобы использовать графический процессор на узле, проверьте github tfjs-node: https://github.com/tensorflow/tfjs-node

...