Изучение и внедрение различных приложений на базе искусственного интеллекта с использованием библиотеки TensorFlow.js дает вам возможность делать так много удивительных вещей с помощью машинного обучения в браузере.

Это руководство является последним в моей серии, использующей TensorFlow.js для машинного обучения и реализации этих моделей в приложениях React. Здесь мы узнаем о другой библиотеке TensorFlow, которая помогает с сегментацией тела.

Сегментация тела - это задача глубокого обучения, которая сегментирует и выделяет границы между различными частями тела, такими как туловище, нижняя часть руки, плечо, бедро и голень. Модель тела-пикс, предоставляемая TensorFlow.js, может обнаруживать до 23 различных сегментов человеческого тела.

В этом уроке мы узнаем, как сегментировать части тела с помощью веб-камеры в режиме реального времени, а затем рисовать цветные маски на основе частей тела на холсте.

Идея состоит в том, чтобы создать приложение React с потоком веб-камеры, который передает видеоданные в модель body-pix TF.js, которая сегментирует части тела, позволяя нам рисовать цветные маски поверх этих частей тела.

Что мы рассмотрим в этом уроке

  • Создание холста для потоковой передачи видео с веб-камеры.
  • Обнаружение и сегментирование частей тела с использованием предварительно обученной модели body-pix из TensorFlow.js.
  • Рисование масок цветных сегментов вокруг частей тела на холсте JavaScript в реальном времени с помощью веб-камеры.

Приступим!

Создание приложения React

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

npx create-react-app body-segmentation-react

После успешной настройки проекта мы можем запустить его, выполнив следующую команду:

npm run start

После успешной сборки откроется окно браузера со следующим результатом:

Установка необходимых пакетов

Теперь нам нужно установить в наш проект необходимые зависимости. В нашем проекте необходимо установить следующие зависимости:

  • @ tensorflow / tfjs: основной пакет TensorFlow на основе JavaScript.
  • @ tensorflow-models / body-pix: Этот пакет предоставляет предварительно обученную модель TensorFlow для исправления тела для сегментирования частей тела. Этот пакет также предлагает модули для рисования цветной маски вокруг сегментированных частей тела.
  • react-webcam: этот компонент библиотеки обеспечивает доступ к веб-камере в проекте React.

Мы можем использовать npm или yarn для установки зависимостей, выполнив следующие команды в нашем терминале проекта:

npm install @tensorflow/tfjs @tensorflow-models/body-pix react-webcam

Теперь нам нужно импортировать все установленные зависимости в наш файл App.js, как указано в фрагменте кода ниже:

import './App.css';
import React, { useRef } from "react";
import * as tf from "@tensorflow/tfjs";
import * as bodyPix from "@tensorflow-models/body-pix";
import Webcam from "react-webcam";

Настроить веб-камеру и холст

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

const webcamReference = useRef(null);
const canvasReference = useRef(null);

Затем нам нужно инициализировать компонент Webcam в нашем методе render. Используя это, мы можем транслировать поток веб-камеры на холсте, также передавая refs как свойства prop. Нам также нужно добавить компонент canvas чуть ниже компонента Webcam. Компонент canvas позволяет нам рисовать все, что мы хотим отобразить в потоке веб-камеры.

return (
    <div className="App">
        **<Webcam
          ref={webcamReference}
          style={{
            position: "absolute",
            marginLeft: "auto",
            marginRight: "auto",
            left: 0,
            right: 0,
            textAlign: "center",
            zindex: 9,
            width: 720,
            height: 500,
          }}
        />
        <canvas
          ref={canvasReference}
          style={{
            position: "absolute",
            marginLeft: "auto",
            marginRight: "auto",
            left: 0,
            right: 0,
            textAlign: "center",
            zindex: 9,
            width: 720,
            height: 500,
          }}
        />
    </div>
  );

Здесь стили, применяемые для компонентов Webcam и canvas, одинаковы, поскольку мы собираемся нарисовать цветную маску на холсте, который помещается поверх потока веб-камеры.

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

Загрузка модели body-pix

На этом этапе мы собираемся создать функцию с именем loadBodyPixModel, которая инициализирует модель body-pix с помощью метода load из модуля bodyPix. Мы загружаем модель как нейронную сеть в константу network. Общий код этой функции представлен во фрагменте ниже:

const loadBodyPixModel = async () => {
  const network = await bodyPix.load();
  console.log("Body-Pix model loaded.");
};

Теперь, чтобы запустить эту функцию, нам нужно вызвать ее в функции основного функционального компонента:

loadBodyPixModel();
return (

Обнаружение сегментов тела

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

const detectBodySegments = async (network) => {
    // Check data is available
    if (
      typeof webcamReference.current !== "undefined" &&
      webcamReference.current !== null &&
      webcamReference.current.video.readyState === 4
    ) {
	
		}
{

Затем нам нужно получить свойства видео вместе с размерами, используя webcamReference, который мы определили ранее:

const video = webcamReference.current.video;
const videoWidth = webcamReference.current.video.videoWidth;
const videoHeight = webcamReference.current.video.videoHeight;

Затем нам нужно установить одинаковые размеры Webcam и canvas в зависимости от высоты и ширины видеопотока, используя код из следующего фрагмента:

webcamReference.current.video.width = videoWidth;
webcamReference.current.video.height = videoHeight;
canvasReference.current.width = videoWidth;
canvasReference.current.height = videoHeight;

Теперь мы начинаем процесс сегментации, используя метод segmentPersonParts, предоставленный моделью нейронной сети network, полученной в качестве параметра. Метод segmentPersonParts принимает данные потока video в качестве параметра, как показано во фрагменте кода ниже:

const body = await network.segmentPersonParts(video);
console.log(body);

Затем нам нужно вызвать эту detectBodySegments функцию внутри метода loadBodyPixModel в методе setInterval, передав модель нейронной сети network в качестве параметра. Это позволяет функции detectBodySegments запускаться каждые 100 миллисекунд. Реализация кодирования представлена ​​ниже:

const loadBodyPixModel = async () => {
  const network = await bodyPix.load();
  console.log("Body-Pix model loaded.");
  setInterval(() => {
    detectBodySegments(network);
  }, 100);
};

Если мы запустим проект, данные о сегментации нашего тела с веб-камеры будут записаны в консоли браузера:

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

На приведенном выше снимке экрана мы можем видеть данные части тела вместе с координатами положения, что позволит нам нарисовать вокруг нее цветную маску.

Рисование цветной маски на холсте

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

К счастью, библиотека моделей body-pix предоставляет нам метод окраски маски: toColoredPartMask. Чтобы нарисовать маску, мы можем использовать метод drawMask из модуля bodyPix, передавая конфигурации как холст, видео, инициализированные данные coloredBodyParts, значение непрозрачности, плотность размытия и свойства отражения по горизонтали. Все это показано во фрагменте кода ниже:

const body = await network.segmentPersonParts(video);
console.log(body);
const coloredBodyParts = bodyPix.toColoredPartMask(body);
const opacityValue = 0.7;
const flipHorizontal = false;
const maskBlurDensity = 0;
const canvas = canvasReference.current;
bodyPix.drawMask(
  canvas,
  video,
  coloredBodyParts,
  opacityValue,
  maskBlurDensity,
  flipHorizontal
);

А вот и полная функция:

const detectBodySegments = async (network) => {
      if (
        typeof webcamReference.current !== "undefined" &&
        webcamReference.current !== null &&
        webcamReference.current.video.readyState === 4
      ) {
        const video = webcamReference.current.video;
        const videoWidth = webcamReference.current.video.videoWidth;
        const videoHeight = webcamReference.current.video.videoHeight;
        webcamReference.current.video.width = videoWidth;
        webcamReference.current.video.height = videoHeight;
        canvasReference.current.width = videoWidth;
        canvasReference.current.height = videoHeight;
        const body = await network.segmentPersonParts(video);
        console.log(body);
        const coloredBodyParts = bodyPix.toColoredPartMask(body);
        const opacityValue = 0.7;
        const flipHorizontal = false;
        const maskBlurDensity = 0;
        const canvas = canvasReference.current;
        bodyPix.drawMask(
          canvas,
          video,
          coloredBodyParts,
          opacityValue,
          maskBlurDensity,
          flipHorizontal
        );
      }
  };

Таким образом, демонстрируется окончательный результат:

Мы можем видеть формирование цветных масок вокруг сегментированных частей тела по мере движения тела.

Мы успешно реализовали сегментацию тела в реальном времени с использованием модели TensorFlow и веб-камеры в нашем проекте React.

Вывод

В этом руководстве мы узнали, как использовать модель body-pix TensorFlow.js и библиотеку веб-камеры React, чтобы сегментировать части человеческого тела и рисовать цветные маски вокруг этих сегментированных частей. Весь процесс реализации этого приложения React для сегментации тела был упрощен благодаря доступности предварительно обученной модели TensorFlow body-pix.

Я надеюсь, что вы нашли это руководство полезным и полезным. Такую сегментацию тела можно использовать в различных приложениях, связанных с модой, чтобы позволить виртуальную примерку или иным образом добавить эффекты к телу человека.

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

Для демонстрации всего проекта вы можете заглянуть в Codesandbox.

Примечание редактора. Heartbeat - это онлайн-публикация и сообщество, созданное авторами и посвященное предоставлению первоклассных образовательных ресурсов для специалистов по науке о данных, машинному обучению и глубокому обучению. Мы стремимся поддерживать и вдохновлять разработчиков и инженеров из всех слоев общества.

Независимо от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить модели машинного обучения.