Библиотека ml5.js предоставляет высокоуровневый интерфейс для работы с моделями машинного обучения в браузере. Одним из наиболее интересных применений является использование данных о позе человека для интерактивного управления интерфейсом.
Для получения данных о позе используется модель PoseNet, встроенная в ml5.js. PoseNet анализирует изображение с камеры и возвращает координаты ключевых точек тела:
Каждая точка представлена объектом с координатами x, y и значением confidence, показывающим степень уверенности модели в правильности распознавания.
Для работы с PoseNet необходимо подключить ml5.js и получить доступ к видеопотоку:
let video;
let poseNet;
let poses = [];
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
poseNet = ml5.poseNet(video, modelReady);
poseNet.on('pose', function(results) {
poses = results;
});
}
function modelReady() {
console.log("PoseNet загружен и готов к работе");
}
После этого массив poses будет содержать информацию о
всех распознанных позах на текущем кадре.
Для управления интерфейсом важно учитывать точность распознавания. Обычно фильтруют ключевые точки по значению confidence, чтобы исключить шум:
function getKeypoint(name) {
if (poses.length > 0) {
let keypoint = poses[0].pose.keypoints.find(k => k.part === name);
if (keypoint && keypoint.score > 0.5) {
return { x: keypoint.position.x, y: keypoint.position.y };
}
}
return null;
}
Этот подход позволяет безопасно использовать только надёжные координаты для интерактивных действий.
Примеры управления интерфейсом на основе данных о позе:
Перемещение объекта мышкой Координаты запястья можно привязать к позиции объекта:
function draw() {
background(220);
let wrist = getKeypoint('rightWrist');
if (wrist) {
ellipse(wrist.x, wrist.y, 50, 50);
}
}
Объект будет следовать за движением руки.
Включение событий по жестам Для распознавания поднятой руки можно использовать сравнение вертикальной координаты запястья и плеча:
let wrist = getKeypoint('rightWrist');
let shoulder = getKeypoint('rightShoulder');
if (wrist && shoulder && wrist.y < shoulder.y) {
console.log("Рука поднята – активируем событие");
}Мышление в пространстве Можно использовать обе руки для масштабирования или вращения элементов:
let leftWrist = getKeypoint('leftWrist');
let rightWrist = getKeypoint('rightWrist');
if (leftWrist && rightWrist) {
let distance = dist(leftWrist.x, leftWrist.y, rightWrist.x, rightWrist.y);
console.log("Расстояние между руками:", distance);
}
Изменение расстояния между руками можно связывать с масштабированием графики или интерфейса.
Данные о позе могут быть шумными. Для плавного управления рекомендуется использовать интерполяцию:
let prevX = 0, prevY = 0;
let alpha = 0.2; // скорость сглаживания
function smoothMove(targetX, targetY) {
prevX = prevX + (targetX - prevX) * alpha;
prevY = prevY + (targetY - prevY) * alpha;
return { x: prevX, y: prevY };
}
Сглаживание позволяет сделать движения объектов более естественными и избежать резких скачков.
Использование данных о позе открывает возможности для:
ml5.js поддерживает комбинирование PoseNet с другими моделями:
Сочетание этих инструментов позволяет создавать полноценные интерфейсы управления движением, где каждое движение пользователя может влиять на поведение системы.