Для работы с 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/p5.js/1.6.0/addons/p5.dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ml5/0.12.2/ml5.min.js"></script>
p5.js используется для работы с холстом и мультимедиа, а
ml5.js предоставляет удобный API для реализации моделей
машинного обучения прямо в браузере.
Для классификации в реальном времени необходимо захватывать кадры с
веб-камеры. В p5.js это реализуется с помощью объекта
createCapture():
let video;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(640, 480);
video.hide(); // скрыть элемент видео, чтобы рисовать его на холсте через p5.js
}
Метод video.hide() позволяет избежать дублирования
DOM-элемента и управлять отображением через canvas.
ml5.js предоставляет несколько предобученных моделей, наиболее удобная для работы с изображениями — MobileNet, которая подходит для общей классификации объектов.
let classifier;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(640, 480);
video.hide();
classifier = ml5.imageClassifier('MobileNet', video, modelReady);
}
function modelReady() {
console.log('Модель загружена');
classifyVideo();
}
Передача объекта video при создании классификатора
позволяет сразу использовать поток с камеры. Метод
modelReady вызывается после полной загрузки модели.
Для работы в реальном времени используется рекурсивный подход: как только классификация одного кадра завершена, вызывается функция для следующего кадра.
function classifyVideo() {
classifier.classify(gotResult);
}
function gotResult(error, results) {
if (error) {
console.error(error);
return;
}
console.log(results[0].label, results[0].confidence);
classifyVideo(); // следующий кадр
}
Каждый результат содержит два ключевых значения:
label — название объекта, распознанного моделью.confidence — вероятность распознавания (число от 0 до
1).Для удобного отображения данных можно отрисовывать видео и текст с результатами на canvas:
function draw() {
image(video, 0, 0);
if (classifier) {
fill(255);
stroke(0);
strokeWeight(2);
textSize(32);
textAlign(CENTER, BOTTOM);
text(results ? results[0].label : 'Загрузка...', width / 2, height - 20);
}
}
В этом примере текст с названием распознанного объекта накладывается
на видео. Использование textAlign и stroke
делает надпись более читаемой.
Для повышения стабильности классификации в реальном времени полезно учитывать порог уверенности:
const CONFIDENCE_THRESHOLD = 0.7;
function gotResult(error, results) {
if (error) {
console.error(error);
return;
}
if (results[0].confidence > CONFIDENCE_THRESHOLD) {
console.log('Объект распознан:', results[0].label);
}
classifyVideo();
}
Этот подход предотвращает «мельтешение» неправильных ярлыков при низкой вероятности и делает вывод более надежным.
ml5.js поддерживает работу с пользовательскими моделями через Teachable Machine. Это позволяет:
Пример загрузки пользовательской модели:
const modelURL = 'https://teachablemachine.withgoogle.com/models/ВАША_МОДЕЛЬ/model.json';
classifier = ml5.imageClassifier(modelURL, video, modelReady);
Классификация в реальном времени требует ресурсов CPU/GPU браузера. Для оптимизации:
video.size(320, 240)) при
приемлемом качестве.setInterval вместо непрерывного вызова.Сочетание классификации с визуализацией, звуковой обратной связью или взаимодействием с DOM позволяет создавать интерактивные приложения:
Такой подход превращает простой классификатор в полноценную интерактивную систему машинного зрения на фронтенде.