PoseNet и BlazePose

TensorFlow.js предоставляет мощные инструменты для анализа человеческой позы на изображениях и в видеопотоке. Две ключевые модели для решения этой задачи — PoseNet и BlazePose. Они позволяют детектировать положения тела, суставов и отдельных частей тела в реальном времени на стороне клиента.


PoseNet

PoseNet — это модель для распознавания поз человека в 2D-пространстве. Она способна определять ключевые точки тела, такие как голова, плечи, локти, запястья, бедра, колени и лодыжки.

Основные возможности:

  • Детектирование одного человека (single-pose) или нескольких людей (multi-pose).
  • Работает на изображениях и видеопотоке.
  • Генерирует массив ключевых точек с координатами (x, y) и вероятностью обнаружения.

Структура ключевых точек:

Каждая ключевая точка описывается объектом с полями:

  • position: объект с x и y.
  • score: вероятность обнаружения точки.
  • part: имя ключевой точки (например, 'leftWrist').

Инициализация PoseNet:

import * as tf from '@tensorflow/tfjs';
import * as posenet from '@tensorflow-models/posenet';

const net = await posenet.load({
  architecture: 'MobileNetV1', // Возможны также ResNet50
  outputStride: 16,
  inputResolution: { width: 640, height: 480 },
  multiplier: 0.75
});

Детектирование позы на изображении:

const pose = await net.estimateSinglePose(imageElement, {
  flipHorizontal: false
});
console.log(pose.keypoints);

Детектирование нескольких людей:

const poses = await net.estimateMultiplePoses(imageElement, {
  flipHorizontal: false,
  maxDetections: 5,
  scoreThreshold: 0.5,
  nmsRadius: 20
});

Особенности работы:

  • maxDetections определяет максимальное количество людей на изображении.
  • scoreThreshold фильтрует ключевые точки с низкой вероятностью.
  • nmsRadius используется для подавления повторяющихся детекций вблизи друг друга.

BlazePose

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

Основные возможности:

  • Детектирование одного человека с высоким FPS на веб-камерах.
  • Поддержка полной скелетной структуры.
  • Выдает не только координаты, но и индексы видимости ключевых точек.

Подключение BlazePose в TensorFlow.js:

import * as posedetection from '@tensorflow-models/pose-detection';
import '@tensorflow/tfjs-backend-webgl';

const detector = await posedetection.createDetector(
  posedetection.SupportedModels.BlazePose, 
  {
    runtime: 'tfjs',
    modelType: 'full' // Возможные варианты: 'lite', 'full', 'heavy'
  }
);

Получение позы на кадре:

const poses = await detector.estimatePoses(videoElement, {
  flipHorizontal: false
});
console.log(poses[0].keypoints);

Структура ключевых точек BlazePose:

Каждая точка имеет:

  • x, y — координаты в пикселях.
  • z — глубина (опционально, для 3D-позы).
  • score — вероятность обнаружения.
  • name — название части тела (например, 'left_elbow').

Сравнение PoseNet и BlazePose

Характеристика PoseNet BlazePose
Количество ключевых точек 17 33
Поддержка 3D Нет Частично (через z)
Точность Средняя Высокая
Производительность Быстрая на мобильных устройствах Очень высокая, оптимизировано для реального времени
Поддержка мультипоз Да Нет (только один человек)

Визуализация ключевых точек

Для визуализации используется Canvas. Пример рисования скелета PoseNet:

function drawKeypoints(keypoints, ctx) {
  keypoints.forEach(kp => {
    if (kp.score > 0.5) {
      ctx.beginPath();
      ctx.arc(kp.position.x, kp.position.y, 5, 0, 2 * Math.PI);
      ctx.fillStyle = 'red';
      ctx.fill();
    }
  });
}

function drawSkeleton(keypoints, ctx) {
  const adjacentPairs = posenet.getAdjacentKeyPoints(keypoints, 0.5);
  adjacentPairs.forEach(([kp1, kp2]) => {
    ctx.beginPath();
    ctx.moveTo(kp1.position.x, kp1.position.y);
    ctx.lineTo(kp2.position.x, kp2.position.y);
    ctx.strokeStyle = 'green';
    ctx.lineWidth = 2;
    ctx.stroke();
  });
}

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


Применение моделей

  • Фитнес и спорт: анализ техники выполнения упражнений.
  • AR/VR приложения: управление персонажами через движения пользователя.
  • Интерактивные игры: отслеживание поз и жестов.
  • Медицина и реабилитация: мониторинг движений пациентов.

PoseNet лучше подходит для мульти-пользовательских сценариев и легких приложений. BlazePose — для приложений, где важна точность и детализация движения одного человека.