Библиотека ml5.js предоставляет удобные высокоуровневые интерфейсы для работы с машинным обучением в браузере, включая обработку видео и изображений. Одной из популярных задач является выделение объекта на видео и изменение фонового изображения либо его размытие. Для этих целей используется модель BodyPix, которая способна выполнять сегментацию человеческого тела в реальном времени.
Для работы с ml5.js требуется подключение библиотеки через CDN или локальный файл:
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ml5/0.12.2/ml5.min.js"></script>
После этого создается объект камеры через p5.js:
let video;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
}
Модель 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 модель загружена');
}
После загрузки модели можно выполнять сегментацию видео в реальном времени.
BodyPix возвращает маску объекта с прозрачным или бинарным изображением. Простейший способ получить маску человека:
function draw() {
image(video, 0, 0, width, height);
bodypix.segmentWithParts(video, gotResults);
}
function gotResults(error, result) {
if (error) {
console.error(error);
return;
}
let maskImage = result.backgroundMask; // маска фона
image(maskImage, 0, 0, width, height);
}
Ключевой момент: backgroundMask — это
изображение, где фон становится прозрачным, а человек остаётся
видимым.
Для замены фона на статическое изображение создается объект изображения с помощью p5.js, а затем маска применяется для наложения:
let bgImage;
function preload() {
bgImage = loadImage('background.jpg'); // любое изображение фона
}
function gotResults(error, result) {
if (error) return;
let mask = result.backgroundMask;
// Сначала отрисовываем фон
image(bgImage, 0, 0, width, height);
// Затем накладываем сегментированного человека
mask.loadPixels();
video.loadPixels();
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
let index = (x + y * width) * 4;
let alpha = mask.pixels[index + 3];
if (alpha > 0) {
video.pixels[index] = video.pixels[index];
video.pixels[index + 1] = video.pixels[index + 1];
video.pixels[index + 2] = video.pixels[index + 2];
video.pixels[index + 3] = 255;
} else {
video.pixels[index + 3] = 0;
}
}
}
video.updatePixels();
image(video, 0, 0, width, height);
}
Важный момент: для корректного наложения нужно использовать альфа-канал маски.
Для создания эффекта размытия можно использовать фильтры p5.js вместе с маской:
function gotResults(error, result) {
if (error) return;
let mask = result.backgroundMask;
let bg = createImage(width, height);
bg.copy(video, 0, 0, width, height, 0, 0, width, height);
bg.filter(BLUR, 8); // размытие фона
image(bg, 0, 0); // отображаем размытый фон
image(mask, 0, 0); // накладываем маску человека
}
Этот подход позволяет размывать фон, сохраняя четкость объекта в центре сцены.
BodyPix поддерживает несколько параметров для улучшения точности и производительности:
let options = {
outputStride: 16, // 8,16,32 – чем меньше, тем выше точность
segmentationThreshold: 0.5 // порог для бинарной маски
};
bodypix.segment(video, options, gotResults);
Для реального времени необходимо:
Такой подход обеспечивает плавное отображение и уменьшает нагрузку на браузер при обработке видео.
Использование ml5.js и BodyPix позволяет создавать высокоэффективные решения для сегментации человека, замены фона и размытия, оставаясь полностью на стороне клиента, без серверной обработки. Это открывает широкие возможности для интерактивных приложений и веб-анимаций.