ml5.js предоставляет высокоуровневый интерфейс для работы с моделями машинного обучения в браузере на JavaScript. Одной из ключевых возможностей библиотеки является работа с Handpose — моделью для распознавания положения рук и определения координат ключевых точек ладони в реальном времени. Эта модель основана на архитектуре MediaPipe Hands и адаптирована для использования в веб-приложениях через TensorFlow.js.
Распознавание ключевых точек руки Handpose
идентифицирует 21 ключевую точку на каждой руке,
включая кончики пальцев, суставы и основание ладони. Каждая точка
представлена объектом с координатами (x, y, z), где
x и y — положение на изображении в пикселях, а
z отражает глубину относительно камеры.
Отслеживание рук в реальном времени Модель способна работать на видеопотоке с веб-камеры, обновляя позиции точек с частотой до 30 кадров в секунду. Это делает возможным создание интерактивных интерфейсов, жестового управления и анимаций на основе положения рук.
Поддержка нескольких рук Хотя Handpose изначально оптимизирована для одной руки, ml5.js предоставляет механизмы обработки нескольких видеопотоков или переключения между руками, что позволяет расширять возможности приложений для комплексного жестового взаимодействия.
Модель подключается через объект ml5.handpose().
Основная структура кода выглядит следующим образом:
let handposeModel;
let video;
async function setup() {
video = createCapture(VIDEO);
video.size(640, 480);
handposeModel = await ml5.handpose(video, modelReady);
}
createCapture(VIDEO) создаёт поток с веб-камеры, а
функция modelReady вызывается после успешной загрузки
модели.
Для получения координат точек используется метод
on("predict", callback). Пример:
handposeModel.on("predict", results => {
if (results.length > 0) {
const hand = results[0];
hand.landmarks.forEach((point, index) => {
console.log(`Точка ${index}: x=${point[0]}, y=${point[1]}, z=${point[2]}`);
});
}
});
Каждое предсказание представляет собой массив из 21 точки, что позволяет строить визуализации или анализировать жесты.
Для отображения ключевых точек на холсте можно использовать стандартный canvas API:
function drawHand(points) {
stroke(0, 255, 0);
strokeWeight(4);
for (let i = 0; i < points.length; i++) {
point(points[i][0], points[i][1]);
}
}
Для соединения суставов и кончиков пальцев создаются линии между точками в порядке, соответствующем анатомии руки.
Определение жестов На основе координат ключевых точек можно создавать алгоритмы распознавания жестов, например, сжатие кулака, поднятый палец или специфические комбинации. Это требует расчёта углов между суставами и расстояний между точками.
Интерактивное управление Handpose интегрируется
с элементами веб-интерфейса, позволяя управлять слайдерами, кнопками и
анимацией с помощью жестов. Использование нормализации координат к
диапазону [0,1] упрощает адаптацию к различным размерам
экранов.
Анализ глубины и перспективы Третья координата
z даёт возможность оценивать расстояние руки до камеры, что
открывает применение для 3D-анимации и дополненной реальности.
requestAnimationFrame для обновления
визуализации обеспечивает плавное отображение движений руки.Handpose в ml5.js представляет собой мощный инструмент для анализа и визуализации движений руки в браузере, обеспечивая гибкость, точность и интеграцию с интерактивными веб-технологиями. Эта модель позволяет строить разнообразные приложения от обучения жестам до сложных систем взаимодействия с пользователем.