BodyPix — это модель для сегментации человеческого тела на части и
выделения силуэта человека на изображении или видео в реальном времени.
В ml5.js BodyPix упрощает интеграцию модели в веб-приложения,
предоставляя удобный интерфейс для работы с потоковым видео,
изображениями и холстами (canvas).
Ключевые функции BodyPix в ml5.js:
options позволяют настроить точность и скорость модели.
Ключевые параметры:
let bodypix;
let video;
let canvas;
function setup() {
canvas = createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
video.hide();
const options = {
outputStride: 16,
segmentationThreshold: 0.5,
multiplier: 0.75
};
bodypix = ml5.bodyPix(video, options, modelReady);
}
function modelReady() {
console.log('BodyPix загружен');
segmentVideo();
}
function segmentVideo() {
bodypix.segmentWithParts(video, gotResults);
}
function gotResults(error, result) {
if (error) {
console.error(error);
return;
}
const mask = bodypix.toMask(result);
bodypix.drawMask(canvas, video, mask, 0.7, 10);
segmentVideo();
}
Особенности настройки для реального времени:
outputStride лучше выбирать 16 для компромисса
между точностью и производительностью.multiplier 0.5–0.75 уменьшает нагрузку на GPU/CPU.video.hide() позволяет выводить
сегментированное изображение только на холст, экономя ресурсы.Обработка видео высокой четкости требует значительных ресурсов. Использование меньшего размера видео ускоряет сегментацию без существенной потери качества:
video.size(320, 240);
Понижение segmentationThreshold позволяет модели быстрее
решать, какие пиксели считать человеком, но слишком низкое значение
приведет к ошибкам:
const options = {
segmentationThreshold: 0.4
};
Вместо обработки каждого кадра по отдельности можно пропускать часть кадров, обрабатывая, например, каждый второй кадр, чтобы поддерживать стабильный FPS.
let frameCount = 0;
function draw() {
frameCount++;
if (frameCount % 2 === 0) {
bodypix.segmentWithParts(video, gotResults);
}
}
Фильтрация маски через blurAmount помогает скрыть шумы и
нечеткие границы, что снижает визуальное напряжение, не требуя высоких
ресурсов:
bodypix.drawMask(canvas, video, mask, 0.7, 5);
BodyPix может выделять голову, торс, руки и ноги, что позволяет создавать интерактивные эффекты, например замену фона только за пределами рук или головы.
bodypix.segmentWithParts(video, function(error, result) {
if (error) {
console.error(error);
return;
}
const headMask = bodypix.toMask(result, {r:255, g:0, b:0, a:255}, {r:0, g:0, b:0, a:0});
bodypix.drawMask(canvas, video, headMask, 0.8, 8);
});
Разделение частей полезно для:
BodyPix хорошо сочетается с:
Для работы на слабых устройствах или мобильных браузерах:
multiplier: 0.5 и
outputStride: 32.requestAnimationFrame или пропуск кадров.createCanvas(width, height, WEBGL) для ускорения
рендеринга.console.log(frameRate()).Эти подходы позволяют BodyPix работать плавно даже на ноутбуках средней мощности, обеспечивая сегментацию в реальном времени без значительных задержек.