Библиотека ml5.js предоставляет высокоуровневый интерфейс для работы с машинным обучением в браузере. Одним из ключевых компонентов является детекция лица, которая позволяет обнаруживать лица на изображениях или в реальном времени с камеры и определять их координаты для последующей обработки.
Для реализации детекции лица используется модель FaceApi, построенная на основе TensorFlow.js. Модель поддерживает обнаружение лиц, определение ключевых точек (глаз, носа, рта) и построение ограничивающих рамок вокруг обнаруженных лиц.
Создание модели начинается с вызова конструктора ml5.faceApi с настройками:
const faceOptions = {
withLandmarks: true, // Определение ключевых точек лица
withDescriptors: false, // Генерация дескрипторов (для распознавания)
minConfidence: 0.5 // Минимальная уверенность для детекции
};
const faceapi = ml5.faceApi(videoElement, faceOptions, modelReady);
videoElement — HTML-элемент <video>,
который используется для потоковой передачи с веб-камеры.faceOptions задаёт конфигурацию модели.modelReady — функция обратного вызова, вызываемая после
полной загрузки модели.После загрузки модели необходимо запустить процесс детекции:
function modelReady() {
console.log('FaceApi модель загружена');
faceapi.detect(gotResults);
}
function gotResults(err, result) {
if (err) {
console.error(err);
return;
}
if (result && result.length > 0) {
drawFaces(result);
}
faceapi.detect(gotResults); // Продолжение детекции в цикле
}
Метод detect возвращает массив объектов, каждый из которых представляет одно обнаруженное лицо. Основные поля объекта:
alignedRect — ограничивающая рамка лица в виде объекта
{ _x, _y, _width, _height }.parts — координаты ключевых точек лица (глаза, нос,
рот, брови).expressions — вероятности различных выражений лица (при
использовании модели с распознаванием эмоций).Для визуализации лиц используется HTML-элемент
<canvas>:
function drawFaces(faces) {
context.clearRect(0, 0, canvas.width, canvas.height);
faces.forEach(face => {
const { _x, _y, _width, _height } = face.alignedRect._box;
context.strokeStyle = 'red';
context.lineWidth = 2;
context.strokeRect(_x, _y, _width, _height);
if (face.parts) {
drawLandmarks(face.parts);
}
});
}
function drawLandmarks(parts) {
context.fillStyle = 'blue';
Object.values(parts).forEach(partArray => {
partArray.forEach(point => {
context.beginPath();
context.arc(point._x, point._y, 2, 0, 2 * Math.PI);
context.fill();
});
});
}
strokeRect используется для отрисовки прямоугольников
вокруг лиц.arc позволяет визуализировать ключевые точки лица.FaceApi позволяет гибко настраивать детекцию:
minConfidence — повышает точность, уменьшая количество
ложных срабатываний.withLandmarks — включение или отключение определения
ключевых точек.withDescriptors — используется для идентификации лиц
через сравнение дескрипторов.Пример динамического изменения параметров:
faceapi.options.minConfidence = 0.7;
faceapi.options.withLandmarks = true;
faceapi.options.withDescriptors = false;
Для детекции в реальном времени важно правильно синхронизировать
видеопоток и отрисовку на canvas. Используется цикл
requestAnimationFrame:
function renderLoop() {
context.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
requestAnimationFrame(renderLoop);
}
renderLoop();
Метод detect вызывается асинхронно внутри
gotResults, обеспечивая непрерывную обработку каждого
кадра.
Для повышения скорости работы с видео:
video.width и
video.height).minConfidence, снижая нагрузку на
модель.Обнаруженные лица можно использовать для:
ml5.js предоставляет простой и эффективный интерфейс для всех этих задач, скрывая сложности работы с нейросетями и TensorFlow.js.