Режимы работы: одиночная и множественная поза

Библиотека ml5.js предоставляет высокоуровневый интерфейс для работы с моделями машинного обучения в браузере, упрощая интеграцию компьютерного зрения, распознавания речи, генерации изображений и других задач. Одной из популярных функций является распознавание поз с использованием модели PoseNet, которая позволяет отслеживать человеческое тело на изображении или видеопотоке.

Подключение и инициализация PoseNet

Для начала работы необходимо подключить библиотеку через CDN или пакетный менеджер. В классическом подходе с HTML и JavaScript подключение осуществляется так:

<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ml5/0.12.2/ml5.min.js"></script>

Инициализация PoseNet выполняется через функцию ml5.poseNet(video, modelReady), где video — объект видеопотока, а modelReady — callback, вызываемый после загрузки модели.

let video;
let poseNet;
let poses = [];

function setup() {
  createCanvas(640, 480);
  video = createCapture(VIDEO);
  video.size(width, height);
  poseNet = ml5.poseNet(video, 'single', modelReady);
  poseNet.on('pose', function(results) {
    poses = results;
  });
  video.hide();
}

function modelReady() {
  console.log('PoseNet готов к работе');
}

Одиночная поза (Single Pose)

Одиночная поза используется, когда в кадре присутствует один человек. Она характеризуется высокой скоростью обработки и меньшей нагрузкой на систему, так как модель ищет и обрабатывает лишь один набор ключевых точек тела.

  • Формат вызова: 'single'
  • Возвращаемый результат: массив с одним объектом pose, содержащим координаты ключевых точек.
  • Применение: интерактивные приложения, игры с одним пользователем, обучающие программы, где нужен анализ движения одного человека.

Структура объекта pose:

{
  score: 0.998,  // уверенность модели
  keypoints: [
    { part: 'nose', position: { x: 320, y: 240 }, score: 0.99 },
    { part: 'leftEye', position: { x: 300, y: 220 }, score: 0.98 },
    // остальные ключевые точки
  ]
}

Доступ к координатам конкретной точки:

let noseX = poses[0].pose.keypoints[0].position.x;
let noseY = poses[0].pose.keypoints[0].position.y;

Множественная поза (Multi Pose)

Множественная поза активируется режимом 'multiple' и позволяет отслеживать сразу несколько людей в кадре. Модель возвращает массив объектов pose для каждого человека, что делает её идеальной для групповых интерактивных приложений, фитнес-тренировок, танцевальных игр и спортивного анализа.

  • Формат вызова: 'multiple'

  • Возвращаемый результат: массив объектов, каждый из которых имеет ключи pose и skeleton.

  • Особенности:

    • Для каждого человека создается отдельный набор ключевых точек.
    • Появляется дополнительная структура skeleton, соединяющая ключевые точки линиями, что облегчает визуализацию связей суставов.

Пример обработки множественных поз:

poseNet = ml5.poseNet(video, 'multiple', modelReady);

poseNet.on('pose', function(results) {
  poses = results;  // poses теперь содержит несколько объектов
  poses.forEach(p => {
    drawSkeleton(p.skeleton);
    drawKeypoints(p.pose.keypoints);
  });
});

Функции для визуализации:

function drawKeypoints(keypoints) {
  keypoints.forEach(point => {
    if (point.score > 0.5) {
      fill(255, 0, 0);
      ellipse(point.position.x, point.position.y, 10, 10);
    }
  });
}

function drawSkeleton(skeleton) {
  skeleton.forEach(bone => {
    let [partA, partB] = bone;
    stroke(0, 255, 0);
    line(partA.position.x, partA.position.y, partB.position.x, partB.position.y);
  });
}

Отличия режимов и производительность

Параметр Single Pose Multi Pose
Количество объектов 1 1–N
Скорость обработки Высокая Ниже из-за анализа нескольких поз
Использование памяти Минимальное Выше, зависит от числа людей
Сложность визуализации Простая Требует управления множеством объектов

Ключевой момент: выбор режима зависит от сценария использования. Для интерактивного приложения с одной фигурой лучше использовать single, а для групповых мероприятий — multiple. Режим multiple автоматически корректирует идентификацию людей в кадре при их движении и пересечении.

Практические рекомендации

  • При работе с multiple важно фильтровать объекты с низкой уверенностью (score < 0.5), чтобы избежать ложных срабатываний.
  • Для стабильной визуализации поз рекомендуется сглаживание координат через фильтры, например, экспоненциальное скользящее среднее.
  • Совмещение с библиотекой p5.js облегчает создание интерактивной графики, поскольку PoseNet возвращает координаты в системе координат видеопотока.

Интеграция с событиями

Можно использовать данные поз для управления событиями в реальном времени, например, жестами рук или положением головы:

if (poses.length > 0) {
  let rightWrist = poses[0].pose.rightWrist;
  if (rightWrist.y < height / 2) {
    console.log('Рука поднята вверх');
  }
}

В режиме multiple подобная проверка проводится для каждого человека:

poses.forEach((p, index) => {
  if (p.pose.rightWrist.y < height / 2) {
    console.log(`Человек ${index + 1} поднял руку`);
  }
});

Этот подход позволяет строить интерактивные системы, реагирующие на движения каждого участника в кадре, что особенно полезно в образовательных и развлекательных приложениях.