Библиотека ml5.js предоставляет высокоуровневый интерфейс для работы с моделями машинного обучения в браузере, упрощая интеграцию компьютерного зрения, распознавания речи, генерации изображений и других задач. Одной из популярных функций является распознавание поз с использованием модели 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, содержащим координаты ключевых точек.Структура объекта 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;
Множественная поза активируется режимом
'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} поднял руку`);
}
});
Этот подход позволяет строить интерактивные системы, реагирующие на движения каждого участника в кадре, что особенно полезно в образовательных и развлекательных приложениях.