ml5.js — это высокоуровневая библиотека для машинного обучения в браузере, построенная поверх TensorFlow.js. Она упрощает интеграцию моделей машинного обучения в веб-приложения, предоставляя готовые функции для классификации изображений, распознавания объектов, генерации текста и работы с аудио. При этом она полностью совместима с обычным JavaScript и любыми популярными фронтенд-фреймворками, такими как React, Vue или Angular.
ml5.js можно подключить несколькими способами:
<script src="https://cdn.jsdelivr.net/npm/ml5@latest/dist/ml5.min.js"></script>
npm install ml5
import * as ml5 from 'ml5';
После подключения библиотека готова к использованию с любым стандартным JavaScript-кодом или модульной системой.
const classifier = ml5.imageClassifier('MobileNet', () => {
console.log('Модель загружена');
});
const image = document.getElementById('myImage');
classifier.classify(image, (err, results) => {
if (err) {
console.error(err);
return;
}
console.log(results);
});
Особенности:
<img>, <video>,
<canvas>), что упрощает интеграцию в существующие
страницы.const video = document.getElementById('videoElement');
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
video.srcObject = stream;
video.play();
});
const poseNet = ml5.poseNet(video, () => {
console.log('PoseNet готов');
});
poseNet.on('pose', (results) => {
console.log(results);
});
Ключевые моменты:
on('pose', callback) позволяют подписываться на
данные модели в реальном времени.React управляет DOM через виртуальное дерево компонентов, поэтому для интеграции ml5.js лучше использовать рефы.
import React, { useRef, useEffect, useState } from 'react';
import * as ml5 from 'ml5';
function ImageClassifier() {
const imageRef = useRef(null);
const [results, setResults] = useState([]);
useEffect(() => {
const classifier = ml5.imageClassifier('MobileNet', () => {
if (imageRef.current) {
classifier.classify(imageRef.current, (err, res) => {
if (!err) setResults(res);
});
}
});
}, []);
return (
<div>
<img ref={imageRef} src="/example.jpg" alt="Example" />
<ul>
{results.map((r, i) => <li key={i}>{r.label}: {r.confidence.toFixed(2)}</li>)}
</ul>
</div>
);
}
Особенности интеграции:
useRef позволяет передавать DOM-элементы
в ml5.js без конфликтов с виртуальным DOM.В Vue основной подход аналогичен React, но используется реактивность и ref из Vue.
<template>
<div>
<img ref="myImage" src="/example.jpg" />
<ul>
<li v-for="(result, index) in results" :key="index">
{{ result.label }}: {{ result.confidence.toFixed(2) }}
</li>
</ul>
</div>
</template>
<script>
import * as ml5 from 'ml5';
import { ref, onMounted } from 'vue';
export default {
setup() {
const myImage = ref(null);
const results = ref([]);
onMounted(() => {
const classifier = ml5.imageClassifier('MobileNet', () => {
classifier.classify(myImage.value, (err, res) => {
if (!err) results.value = res;
});
});
});
return { myImage, results };
}
}
</script>
Примечания:
ref позволяет избежать
конфликтов с виртуальным деревом.Хотя ml5.js поддерживает колбэки, современные проекты чаще используют
промисы или async/await для чистоты кода.
async function classifyImage(imageElement) {
const classifier = await ml5.imageClassifier('MobileNet');
const results = await classifier.classify(imageElement);
console.log(results);
}
const image = document.getElementById('myImage');
classifyImage(image);
Преимущества:
ml5.js можно комбинировать с визуализационными библиотеками (D3.js, p5.js) для создания интерактивных приложений:
const poseNet = ml5.poseNet(video);
poseNet.on('pose', (poses) => {
poses.forEach(pose => {
pose.keypoints.forEach(point => {
ellipse(point.position.x, point.position.y, 10, 10); // p5.js
});
});
});
Особенности:
<canvas>, чтобы уменьшить нагрузку на DOM.requestAnimationFrame), чтобы не
перегружать CPU.ml5.js предоставляет простой и понятный интерфейс для интеграции машинного обучения в веб-приложения, при этом оставаясь полностью совместимой с vanilla JavaScript и популярными фронтенд-фреймворками. Правильное использование асинхронности, DOM-рефов и реактивных данных позволяет создавать масштабируемые и интерактивные приложения с минимальными усилиями.