ml5.js — это библиотека высокого уровня для работы с машинным обучением в браузере на JavaScript. Одной из ключевых возможностей библиотеки является сегментация объектов в реальном времени, включая выделение человека на фоне (person segmentation). Этот инструмент позволяет создавать интерактивные визуальные эффекты, заменять фон, накладывать фильтры и интегрировать компьютерное зрение в веб-приложения без глубокого погружения в TensorFlow.js.
Для работы с ml5.js необходимо подключить библиотеку через CDN:
Использование p5.js обеспечивает удобное управление холстом
(canvas) и камерой (video capture).
Создание видеопотока с камеры выполняется через объект
createCapture():
let video;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
}
Важно скрывать исходное видео через video.hide(), чтобы
работать только с обработанным изображением на холсте.
ml5.js предоставляет модель bodyPix, которая
отвечает за сегментацию человека на изображении. Инициализация
выполняется с использованием объекта ml5.bodyPix:
let bodypix;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
bodypix = ml5.bodyPix(video, modelReady);
}
function modelReady() {
console.log('Модель BodyPix загружена');
}
Ключевые моменты:
modelReady,
сигнализирующий о готовности модели к работе.bodyPix.segment принимает объект с параметрами,
влияющими на качество и скорость сегментации. Основные параметры:
outputStride — уменьшает детализацию для ускорения
работы (8, 16, 32).segmentationThreshold — порог уверенности для
распознавания человека (0–1).multiplier — масштаб модели, влияет на скорость и
точность (0.50, 0.75, 1.0).Пример:
const options = {
flipHorizontal: true,
internalResolution: 'medium',
segmentationThreshold: 0.5
};
bodypix.segmentWithParts(video, options, gotResults);
Функция обратного вызова gotResults получает объект с
маской сегментации:
function gotResults(error, result) {
if (error) {
console.error(error);
return;
}
// result — объект с информацией о маске и частях тела
drawSegmentation(result);
bodypix.segmentWithParts(video, options, gotResults); // вызов для следующего кадра
}
Важный момент: сегментация работает на каждом кадре видео, поэтому нужно рекурсивно вызывать метод сегментации для обработки потокового видео.
Для создания эффекта выделения человека на фоне используется маска сегментации, где пиксели человека окрашиваются в один цвет, а фон — в другой:
function drawSegmentation(segmentation) {
loadPixels();
const mask = segmentation.data; // массив с маской
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
const index = (y * width + x) * 4;
if (mask[y * width + x] === 0) {
// фон — затемнение
pixels[index] = pixels[index] * 0.5;
pixels[index+1] = pixels[index+1] * 0.5;
pixels[index+2] = pixels[index+2] * 0.5;
}
// тело остаётся без изменений
}
}
updatePixels();
}
Особенности визуализации:
mask содержит бинарные значения (0 — фон, 1 —
человек).segmentWithParts, чтобы работать с частями тела отдельно
(руки, ноги, лицо).Сегментация открывает множество возможностей для интерактивных приложений:
if (mask[y * width + x] === 0) {
// применяем фильтр размытия для пикселей фона
}
Для работы в реальном времени на веб-странице важно учитывать нагрузку на CPU/GPU:
internalResolution.outputStride для ускорения
сегментации.BodyPix в ml5.js работает в мобильных браузерах, но нужно учитывать:
flipHorizontal: true для корректного
зеркального отображения камеры.Можно создавать веб-приложения, где пользователь управляет фильтрами через ползунки и кнопки:
let blurSlider;
function setupUI() {
blurSlider = createSlider(0, 20, 5);
}
function drawSegmentation(segmentation) {
let blurAmount = blurSlider.value();
// применяем размытие к фону с использованием blurAmount
}
Такое взаимодействие делает проект динамическим, а использование ml5.js позволяет внедрять сложные функции сегментации без сложной настройки нейросетей.