ml5.js предоставляет удобный интерфейс для работы с современными моделями машинного обучения на стороне клиента. Одной из возможностей является попиксельная классификация изображений, которая позволяет анализировать и классифицировать отдельные пиксели для определения различных объектов или областей, например, частей тела.
Попиксельная классификация осуществляется через модели, обученные на разметке изображений, где каждый пиксель принадлежит к определённому классу. Для работы с ml5.js чаще всего используются предобученные модели типа BodyPix или pix2pix, адаптированные под задачи сегментации и генерации изображений.
Для начала требуется подключить библиотеку ml5.js. Обычно это делается через CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/ml5/0.12.2/ml5.min.js"></script>
Инициализация модели сегментации выполняется через объект
ml5.BodyPix, который позволяет получать маску частей тела с
видеопотока или изображения.
let bodypix;
function setup() {
createCanvas(640, 480);
bodypix = ml5.bodyPix(modelReady);
}
function modelReady() {
console.log('BodyPix модель загружена');
}
Особенности инициализации:
ml5.bodyPix(options) позволяет задать параметры модели:
количество слоёв, размер входного изображения, точность.segment() для
анализа изображения или видео.Для сегментации можно использовать как статические изображения, так и поток с веб-камеры. Пример работы с видео:
let video;
let segmentation;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(640, 480);
video.hide();
bodypix.segment(video, gotResults);
}
function gotResults(error, result) {
if (error) {
console.error(error);
return;
}
segmentation = result;
bodypix.segment(video, gotResults); // непрерывная обработка видео
}
function draw() {
if (segmentation) {
image(segmentation.backgroundMask, 0, 0, width, height);
}
}
Ключевые моменты:
video.hide() скрывает исходное видео, чтобы отображать
только результат сегментации.segmentation содержит маски для каждой части тела
(personMask, leftArmMask,
rightLegMask и другие).segment() вызывается рекурсивно для непрерывной
обработки кадров видео.Результат сегментации представляет собой набор масок для различных частей тела. Эти маски можно использовать для цветовой визуализации:
function drawSegmentation(segmentation) {
loadPixels();
for (let y = 0; y < segmentation.height; y++) {
for (let x = 0; x < segmentation.width; x++) {
let n = x + y * segmentation.width;
let partId = segmentation.data[n];
let col = color(0, 0, 0, 0);
switch(partId) {
case 0: col = color(255, 0, 0, 150); break; // голова
case 1: col = color(0, 255, 0, 150); break; // торс
case 2: col = color(0, 0, 255, 150); break; // руки
}
set(x, y, col);
}
}
updatePixels();
}
Особенности работы с пикселями:
segmentation.data[n] возвращает класс пикселя.При работе с видео важно учитывать производительность:
video.size(width, height)) ускоряет обработку.architecture: 'MobileNetV1', outputStride: 16 снижает
нагрузку на браузер.p5.Image уменьшает количество операций с пикселями.ml5.js поддерживает расширенные функции попиксельной классификации:
Пример комбинированного эффекта:
function applyEffect(segmentation) {
loadPixels();
for (let i = 0; i < pixels.length; i += 4) {
let partId = segmentation.data[i / 4];
if (partId === 2) { // руки
pixels[i] = 255 - pixels[i]; // инверсия красного
pixels[i+1] = 255 - pixels[i+1]; // инверсия зелёного
pixels[i+2] = 255 - pixels[i+2]; // инверсия синего
}
}
updatePixels();
}
Эта техника позволяет создавать интерактивные художественные эффекты с попиксельной точностью, одновременно отслеживая части тела.
Структура проекта для попиксельной классификации обычно включает:
segment().p5.js или Canvas API.Такой подход обеспечивает высокую точность распознавания частей тела и гибкость при создании интерактивных приложений.