ml5.js предоставляет высокоуровневый интерфейс для работы с моделями машинного обучения в браузере на JavaScript. Одной из ключевых возможностей при работе с изображениями и видео является определение объектов и их расположения с помощью ограничивающих рамок (bounding boxes). Этот функционал особенно полезен для задач компьютерного зрения, таких как детекция объектов, отслеживание движений или создание интерактивных приложений.
objectDetectorml5.js включает метод objectDetector, который упрощает
использование предобученных моделей детекции объектов, например,
COCO-SSD.
Пример создания детектора:
let objectDetector;
let img;
function preload() {
img = loadImage('image.jpg');
objectDetector = ml5.objectDetector('cocossd');
}
function setup() {
createCanvas(640, 480);
objectDetector.detect(img, gotResults);
}
function gotResults(error, results) {
if (error) {
console.error(error);
return;
}
console.log(results);
}
Ключевые моменты:
Метод ml5.objectDetector('cocossd') возвращает
объект детектора.
Метод detect принимает изображение или видео и
функцию обратного вызова.
Функция обратного вызова получает массив объектов, каждый из которых содержит:
label — название класса объекта.confidence — вероятность детекции (от 0 до 1).x, y, width,
height — координаты и размеры bounding box.Каждый элемент массива results имеет следующую
структуру:
{
"label": "person",
"confidence": 0.98,
"x": 34,
"y": 50,
"width": 120,
"height": 260
}
Пояснения:
(x, y) — координаты верхнего левого угла рамки на
изображении.width и height — размеры рамки.label помогает классифицировать объект.confidence позволяет фильтровать низкокачественные
детекции.Для отображения bounding box на canvas используется комбинация
методов rect() и text():
function drawBoundingBoxes(results) {
for (let i = 0; i < results.length; i++) {
let object = results[i];
stroke(0, 255, 0);
strokeWeight(2);
noFill();
rect(object.x, object.y, object.width, object.height);
noStroke();
fill(255);
textSize(16);
text(object.label + " " + nf(object.confidence * 100, 2, 1) + "%", object.x + 5, object.y + 20);
}
}
Особенности:
stroke() задаёт цвет рамки.noFill() делает рамку прозрачной внутри.text() выводит название объекта и вероятность
детекции.nf() форматирует число до нужного количества знаков
после запятой.ml5.js позволяет использовать веб-камеру для live-детекции:
let video;
let objectDetector;
let detections = [];
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(640, 480);
video.hide();
objectDetector = ml5.objectDetector('cocossd', modelReady);
}
function modelReady() {
console.log('Model Loaded!');
detectObjects();
}
function detectObjects() {
objectDetector.detect(video, function(error, results) {
if (error) {
console.error(error);
return;
}
detections = results;
detectObjects(); // рекурсивный вызов для непрерывной детекции
});
}
function draw() {
image(video, 0, 0);
drawBoundingBoxes(detections);
}
Принцип работы:
createCapture(VIDEO) создаёт поток с
веб-камеры.detectObjects() выполняет рекурсивное
определение объектов.detections обновляется каждую итерацию и
используется для отрисовки рамок.video.size().confidence:let confidentObjects = detections.filter(obj => obj.confidence > 0.6);
detections.sort((a, b) => b.confidence - a.confidence);
YOLO через ml5.objectDetector('yolo').Получение ограничивающих рамок в ml5.js обеспечивает быстрый и удобный способ интеграции детекции объектов в веб-приложения. Правильное использование координат, визуализация и фильтрация результатов создаёт основу для сложных интерактивных систем компьютерного зрения на базе JavaScript.