Для работы с библиотекой ml5.js необходимо подключить саму библиотеку и, при необходимости, библиотеку p5.js для упрощённой работы с графикой и DOM-элементами. Подключение осуществляется через 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>
После подключения создаётся элемент <canvas> для
отображения изображения или <img> для загрузки
статичного изображения. Важно убедиться, что изображение загружено перед
передачей в модель, иначе классификация не будет выполнена
корректно.
ml5.js предоставляет удобный интерфейс для работы с предобученными
моделями через ml5.imageClassifier. Наиболее часто
используются модели:
Пример загрузки модели MobileNet:
let classifier;
function preload() {
classifier = ml5.imageClassifier('MobileNet');
}
Использование preload() гарантирует, что модель будет
полностью загружена до выполнения кода, связанного с классификацией.
Для корректной работы классификатора изображение должно быть передано
как DOM-элемент или объект p5.Image. Пример загрузки через
p5.js:
let img;
function preload() {
img = loadImage('image.jpg');
}
function setup() {
createCanvas(400, 400);
image(img, 0, 0, width, height);
}
Важно учитывать масштабирование: некоторые модели требуют, чтобы изображение имело определённый размер или пропорции. MobileNet автоматически масштабирует изображение до 224x224 пикселей.
Классификация вызывается методом classify, который
принимает изображение и функцию обратного вызова:
function classifyImage() {
classifier.classify(img, (error, results) => {
if (error) {
console.error(error);
return;
}
console.log(results);
});
}
Результат results представляет собой массив объектов с
полями:
label — название класса, определённого моделью.confidence — вероятность принадлежности изображения
этому классу (от 0 до 1).Пример обработки результатов:
results.forEach(result => {
console.log(`Класс: ${result.label}, вероятность: ${(result.confidence * 100).toFixed(2)}%`);
});
Для наглядного представления результатов можно выводить название класса и вероятность прямо на канвасе:
function draw() {
image(img, 0, 0, width, height);
if (results) {
fill(255, 0, 0);
textSize(20);
textAlign(LEFT, TOP);
text(`${results[0].label} (${(results[0].confidence * 100).toFixed(2)}%)`, 10, 10);
}
}
Такой подход позволяет одновременно отображать изображение и результаты классификации в реальном времени.
ml5.js поддерживает загрузку моделей, обученных через Teachable Machine или экспортированных из TensorFlow.js. Пошаговый процесс:
model.json и соответствующих
весов.ml5.imageClassifier с указанием
пути:classifier = ml5.imageClassifier('model/model.json', modelLoaded);
function modelLoaded() {
console.log('Модель загружена и готова к работе');
}
Использование кастомной модели позволяет классифицировать специфические объекты или ситуации, которые не входят в стандартный набор MobileNet.
При работе с ml5.js важно учитывать следующие аспекты:
if (error) в
callback-функциях.async/awaitДля современного JavaScript рекомендуется использовать асинхронные функции, что позволяет сделать код более читаемым:
async function classifyAsync() {
try {
const results = await classifier.classify(img);
console.log(results);
} catch (error) {
console.error(error);
}
}
Такой подход избавляет от вложенных callback-функций и упрощает обработку ошибок.
Для анализа модели полезно выводить все возможные классы с вероятностями:
results.forEach(result => {
console.log(`${result.label}: ${(result.confidence * 100).toFixed(2)}%`);
});
Это позволяет понять, насколько модель уверена в своём выборе и при необходимости корректировать данные для обучения кастомной модели.
Некоторые модели ml5.js позволяют задавать опции при создании классификатора, например:
topk — количество топ-классов, которые возвращает метод
classify.version — версия модели MobileNet (1.0,
2.0).Пример:
classifier = ml5.imageClassifier('MobileNet', { topk: 5 });
Такой подход позволяет получать сразу несколько наиболее вероятных категорий для каждого изображения.