Руководство по обнаружению ориентиров Pose для Интернета,Руководство по обнаружению ориентиров Pose для Интернета

Задача MediaPipe Pose Landmarker позволяет обнаруживать ориентиры человеческих тел на изображении или видео. Вы можете использовать это задание для определения ключевых положений тела, анализа позы и классификации движений. В этой задаче используются модели машинного обучения (ML), которые работают с отдельными изображениями или видео. Задача выводит ориентиры позы тела в координатах изображения и в трехмерных мировых координатах.

В этих инструкциях показано, как использовать Pose Landmarker для веб-приложений и приложений JavaScript. Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

Пример кода Pose Landmarker предоставляет вам полную реализацию этой задачи на JavaScript. Этот код поможет вам протестировать эту задачу и приступить к созданию собственного приложения для определения ориентиров позы. Вы можете просматривать, запускать и редактировать пример кода Pose Landmarker, используя только веб-браузер.

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки специально для использования Pose Landmarker. Общие сведения о настройке веб-среды и среды разработки JavaScript, включая требования к версии платформы, см. в руководстве по настройке веб-среды .

JavaScript-пакеты

Код Pose Landmarker доступен через пакет MediaPipe @mediapipe/tasks-vision NPM . Вы можете найти и загрузить эти библиотеки, следуя инструкциям в руководстве по установке платформы.

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

npm install @mediapipe/tasks-vision

Если вы хотите импортировать код задачи через службу сети доставки контента (CDN), добавьте следующий код в тег <head> вашего HTML-файла:

<!-- You can replace JSDeliver with another CDN if you prefer -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

Модель

Для задачи MediaPipe Pose Landmarker требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для Pose Landmarker см. в разделе «Модели » обзора задач.

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

<dev-project-root>/app/shared/models/

Создать задачу

Используйте одну из функций createFrom...() Pose Landmarker, чтобы подготовить задачу к выполнению выводов. Используйте функцию createFromModelPath() с относительным или абсолютным путем к файлу обученной модели. Если ваша модель уже загружена в память, вы можете использовать метод createFromModelBuffer() .

В приведенном ниже примере кода показано использование функции createFromOptions() для настройки задачи. Функция createFromOptions() позволяет вам настроить ориентир позы с помощью параметров конфигурации. Дополнительные сведения о параметрах конфигурации см. в разделе Параметры конфигурации .

Следующий код демонстрирует, как создать и настроить задачу с настраиваемыми параметрами:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const poseLandmarker = await poseLandmarker.createFromOptions(
    vision,
    {
      baseOptions: {
        modelAssetPath: "path/to/model"
      },
      runningMode: runningMode
    });

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для веб-приложений и приложений JavaScript:

Название опции Описание Диапазон значений Значение по умолчанию
runningMode Устанавливает режим выполнения задачи. Есть два режима:

ИЗОБРАЖЕНИЕ: Режим для ввода одного изображения.

ВИДЕО: режим для декодированных кадров видео или прямой трансляции входных данных, например с камеры.
{ IMAGE, VIDEO } IMAGE
numPoses Максимальное количество поз, которые может обнаружить ориентир позы. Integer > 0 1
minPoseDetectionConfidence Минимальный показатель достоверности, позволяющий считать обнаружение позы успешным. Float [0.0,1.0] 0.5
minPosePresenceConfidence Минимальный показатель достоверности оценки присутствия позы при обнаружении ориентира позы. Float [0.0,1.0] 0.5
minTrackingConfidence Минимальный показатель достоверности, позволяющий отслеживанию позы считаться успешным. Float [0.0,1.0] 0.5
outputSegmentationMasks Выводит ли Pose Landmarker маску сегментации для обнаруженной позы. Boolean False

Подготовьте данные

Pose Landmarker может обнаруживать позы на изображениях в любом формате, поддерживаемом хост-браузером. Задача также выполняет предварительную обработку входных данных, включая изменение размера, поворот и нормализацию значений. Чтобы определить позы в видео, вы можете использовать API для быстрой обработки одного кадра за раз, используя метку времени кадра, чтобы определить, когда позы встречаются в видео.

Запустить задачу

Pose Landmarker использует detect() (с рабочим режимом IMAGE ) detectForVideo() (с рабочим режимом VIDEO ) для инициирования выводов. Задача обрабатывает данные, пытается определить позы, а затем сообщает о результатах.

Вызовы методов detect() и detectForVideo() в Pose Landmarker выполняются синхронно и блокируют поток пользовательского вмешательства. Если вы обнаруживаете позы в видеокадрах с камеры устройства, каждое обнаружение блокирует основной поток. Вы можете предотвратить это, реализовав веб-воркеры для запуска методов detect() и detectForVideo() в другом потоке.

Следующий код демонстрирует, как выполнить обработку с помощью модели задачи:

Изображение

const image = document.getElementById("image") as HTMLImageElement;
const poseLandmarkerResult = poseLandmarker.detect(image);

видео

await poseLandmarker.setOptions({ runningMode: "VIDEO" });

let lastVideoTime = -1;
function renderLoop(): void {
  const video = document.getElementById("video");

  if (video.currentTime !== lastVideoTime) {
    const poseLandmarkerResult = poseLandmarker.detectForVideo(video);
    processResults(detections);
    lastVideoTime = video.currentTime;
  }

  requestAnimationFrame(() => {
    renderLoop();
  });
}

Более полную реализацию запуска задачи Pose Landmarker смотрите в примере кода .

Обработка и отображение результатов

Pose Landmarker возвращает poseLandmarkerResult для каждого запуска обнаружения. Объект результата содержит координаты для каждого ориентира позы.

Ниже показан пример выходных данных этой задачи:

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

Выходные данные содержат как нормализованные координаты ( Landmarks ), так и мировые координаты ( WorldLandmarks ) для каждого ориентира.

Выходные данные содержат следующие нормализованные координаты ( Landmarks ):

  • x и y : координаты ориентира, нормированные между 0,0 и 1,0 по ширине изображения ( x ) и высоте ( y ).

  • z : Глубина ориентира, в качестве исходной точки используется глубина в середине бедер. Чем меньше значение, тем ближе ориентир к камере. Величина z использует примерно тот же масштаб, что и x .

  • visibility : вероятность того, что ориентир будет виден на изображении.

Вывод содержит следующие мировые координаты ( WorldLandmarks ):

  • x , y и z : Реальные трехмерные координаты в метрах, в качестве начала координат используется середина бедер.

  • visibility : вероятность того, что ориентир будет виден на изображении.

На следующем изображении показана визуализация результатов задачи:

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

Пример кода Pose Landmarker демонстрирует, как отображать результаты, возвращаемые задачей, см. пример кода.

,

Задача MediaPipe Pose Landmarker позволяет обнаруживать ориентиры человеческих тел на изображении или видео. Вы можете использовать это задание для определения ключевых положений тела, анализа позы и классификации движений. В этой задаче используются модели машинного обучения (ML), которые работают с отдельными изображениями или видео. Задача выводит ориентиры позы тела в координатах изображения и в трехмерных мировых координатах.

В этих инструкциях показано, как использовать Pose Landmarker для веб-приложений и приложений JavaScript. Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

Пример кода Pose Landmarker предоставляет вам полную реализацию этой задачи на JavaScript. Этот код поможет вам протестировать эту задачу и приступить к созданию собственного приложения для определения ориентиров позы. Вы можете просматривать, запускать и редактировать пример кода Pose Landmarker, используя только веб-браузер.

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки специально для использования Pose Landmarker. Общие сведения о настройке веб-среды и среды разработки JavaScript, включая требования к версии платформы, см. в руководстве по настройке веб-среды .

JavaScript-пакеты

Код Pose Landmarker доступен через пакет MediaPipe @mediapipe/tasks-vision NPM . Вы можете найти и загрузить эти библиотеки, следуя инструкциям в руководстве по установке платформы.

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

npm install @mediapipe/tasks-vision

Если вы хотите импортировать код задачи через службу сети доставки контента (CDN), добавьте следующий код в тег <head> вашего HTML-файла:

<!-- You can replace JSDeliver with another CDN if you prefer -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

Модель

Для задачи MediaPipe Pose Landmarker требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для Pose Landmarker смотрите в разделе «Модели» обзора задач.

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

<dev-project-root>/app/shared/models/

Создать задачу

Используйте одну из функций createFrom...() Pose Landmarker, чтобы подготовить задачу к выполнению выводов. Используйте функцию createFromModelPath() с относительным или абсолютным путем к файлу обученной модели. Если ваша модель уже загружена в память, вы можете использовать метод createFromModelBuffer() .

В приведенном ниже примере кода показано использование функции createFromOptions() для настройки задачи. Функция createFromOptions() позволяет вам настроить ориентир позы с помощью параметров конфигурации. Дополнительные сведения о параметрах конфигурации см. в разделе Параметры конфигурации .

Следующий код демонстрирует, как создать и настроить задачу с настраиваемыми параметрами:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const poseLandmarker = await poseLandmarker.createFromOptions(
    vision,
    {
      baseOptions: {
        modelAssetPath: "path/to/model"
      },
      runningMode: runningMode
    });

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для веб-приложений и приложений JavaScript:

Название опции Описание Диапазон значений Значение по умолчанию
runningMode Устанавливает режим выполнения задачи. Есть два режима:

ИЗОБРАЖЕНИЕ: Режим для ввода одного изображения.

ВИДЕО: режим для декодированных кадров видео или прямой трансляции входных данных, например с камеры.
{ IMAGE, VIDEO } IMAGE
numPoses Максимальное количество поз, которые может обнаружить ориентир позы. Integer > 0 1
minPoseDetectionConfidence Минимальный показатель достоверности, позволяющий считать обнаружение позы успешным. Float [0.0,1.0] 0.5
minPosePresenceConfidence Минимальный показатель достоверности оценки присутствия позы при обнаружении ориентира позы. Float [0.0,1.0] 0.5
minTrackingConfidence Минимальный показатель достоверности, позволяющий отслеживанию позы считаться успешным. Float [0.0,1.0] 0.5
outputSegmentationMasks Выводит ли Pose Landmarker маску сегментации для обнаруженной позы. Boolean False

Подготовьте данные

Pose Landmarker может обнаруживать позы на изображениях в любом формате, поддерживаемом хост-браузером. Задача также выполняет предварительную обработку входных данных, включая изменение размера, поворот и нормализацию значений. Чтобы определить позы в видео, вы можете использовать API для быстрой обработки одного кадра за раз, используя метку времени кадра, чтобы определить, когда позы встречаются в видео.

Запустить задачу

Pose Landmarker использует detect() (с рабочим режимом IMAGE ) detectForVideo() (с рабочим режимом VIDEO ) для инициирования выводов. Задача обрабатывает данные, пытается определить позы, а затем сообщает о результатах.

Вызовы методов detect() и detectForVideo() в Pose Landmarker выполняются синхронно и блокируют поток пользовательского вмешательства. Если вы обнаруживаете позы в видеокадрах с камеры устройства, каждое обнаружение блокирует основной поток. Вы можете предотвратить это, реализовав веб-воркеры для запуска методов detect() и detectForVideo() в другом потоке.

Следующий код демонстрирует, как выполнить обработку с помощью модели задачи:

Изображение

const image = document.getElementById("image") as HTMLImageElement;
const poseLandmarkerResult = poseLandmarker.detect(image);

видео

await poseLandmarker.setOptions({ runningMode: "VIDEO" });

let lastVideoTime = -1;
function renderLoop(): void {
  const video = document.getElementById("video");

  if (video.currentTime !== lastVideoTime) {
    const poseLandmarkerResult = poseLandmarker.detectForVideo(video);
    processResults(detections);
    lastVideoTime = video.currentTime;
  }

  requestAnimationFrame(() => {
    renderLoop();
  });
}

Более полную реализацию запуска задачи Pose Landmarker смотрите в примере кода .

Обработка и отображение результатов

Pose Landmarker возвращает poseLandmarkerResult для каждого запуска обнаружения. Объект результата содержит координаты для каждого ориентира позы.

Ниже показан пример выходных данных этой задачи:

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

Выходные данные содержат как нормализованные координаты ( Landmarks ), так и мировые координаты ( WorldLandmarks ) для каждого ориентира.

Выходные данные содержат следующие нормализованные координаты ( Landmarks ):

  • x и y : координаты ориентира, нормированные между 0,0 и 1,0 по ширине изображения ( x ) и высоте ( y ).

  • z : Глубина ориентира, в качестве исходной точки используется глубина в середине бедер. Чем меньше значение, тем ближе ориентир к камере. Величина z использует примерно тот же масштаб, что и x .

  • visibility : вероятность того, что ориентир будет виден на изображении.

Вывод содержит следующие мировые координаты ( WorldLandmarks ):

  • x , y и z : Реальные трехмерные координаты в метрах, в качестве начала координат используется середина бедер.

  • visibility : вероятность того, что ориентир будет виден на изображении.

На следующем изображении показана визуализация результатов задачи:

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

Пример кода Pose Landmarker демонстрирует, как отображать результаты, возвращаемые задачей, см. пример кода.