Обучение классификатора поверх MobileNet

Для работы с ml5.js необходим браузер с поддержкой JavaScript. Библиотека подключается через CDN, что упрощает интеграцию в веб-проекты. Основное подключение выглядит следующим образом:

<script src="https://cdnjs.cloudflare.com/ajax/libs/ml5/0.12.2/ml5.min.js"></script>

После подключения создаётся объект ml5, предоставляющий доступ к различным моделям машинного обучения, включая предобученные нейросети, такие как MobileNet.

Инициализация MobileNet

MobileNet — это легковесная сверточная нейросеть, обученная на большом наборе изображений (ImageNet). Она способна распознавать объекты и предоставляет возможности для дополнительного обучения (transfer learning).

let featureExtractor;
let classifier;
let video;

function setup() {
    noCanvas();
    video = createCapture(VIDEO);
    video.size(320, 240);

    featureExtractor = ml5.featureExtractor('MobileNet', modelReady);
    classifier = featureExtractor.classification(video, videoReady);
}

Ключевые моменты:

  • ml5.featureExtractor('MobileNet') создаёт объект для извлечения признаков (feature extraction) из изображения.
  • classification(video) создаёт классификатор на основе этих признаков.
  • Функции modelReady и videoReady вызываются после загрузки модели и запуска видеопотока.

Добавление данных для обучения

Обучение классификатора требует примеров для каждой категории. Каждое изображение, захваченное с камеры или загруженное, добавляется с соответствующей меткой.

function addExample(label) {
    classifier.addImage(label);
}

Особенности процесса:

  • Метка (label) — это строка, идентифицирующая категорию.
  • Рекомендуется добавлять большое количество разнообразных примеров для устойчивого обучения.
  • Каждое изображение проходит предварительную обработку MobileNet, что уменьшает требования к вычислительным ресурсам.

Настройка процесса обучения

После добавления данных запускается обучение классификатора. ml5.js предоставляет метод train, который принимает обратный вызов для отслеживания прогресса.

function trainModel() {
    classifier.train((lossValue) => {
        if (lossValue) {
            console.log('Loss: ' + lossValue);
        } else {
            console.log('Обучение завершено');
        }
    });
}

Важные моменты:

  • Параметр lossValue показывает текущую ошибку модели. При уменьшении значения модель становится точнее.
  • Обучение на небольших данных требует меньше времени, но может приводить к переобучению.
  • Для больших наборов данных обучение может занимать заметное время, поэтому важно визуализировать прогресс.

Использование обученной модели для предсказаний

После завершения обучения классификатор способен предсказывать метки для новых изображений.

function classifyImage() {
    classifier.classify((err, result) => {
        if (err) {
            console.error(err);
        } else {
            console.log(result);
        }
    });
}

Особенности:

  • result содержит массив объектов с меткой (label) и вероятностью (confidence).
  • Можно реализовать автоматическое классифицирование видеопотока в реальном времени, вызывая classify в цикле.

Сохранение и загрузка модели

Для повторного использования обученной модели ml5.js предоставляет функции сохранения и загрузки.

function saveModel() {
    classifier.save();
}

function loadModel() {
    classifier.load('model.json', () => {
        console.log('Модель загружена');
    });
}

Особенности:

  • Модель сохраняется в формате JSON с дополнительными весами.
  • Позволяет переносить модель между проектами и обучать её на новом наборе данных без повторного сбора примеров.

Рекомендации по оптимизации

  • Минимизировать размер входных изображений для повышения скорости обучения.
  • Добавлять разнообразные примеры для каждой категории, чтобы модель не была чувствительна к фону или освещению.
  • Использовать video.hide() при работе с видео, чтобы визуально не отображать поток, если он не нужен для интерфейса.
  • Настроить количество эпох и learning rate через параметры featureExtractor для тонкой настройки обучения.

Работа с асинхронностью

Все ключевые операции ml5.js выполняются асинхронно: загрузка модели, обучение, классификация. Для плавной работы интерфейса важно использовать обратные вызовы или промисы, чтобы не блокировать основной поток браузера.

featureExtractor.load().then(() => {
    console.log('Feature Extractor готов');
});

Интеграция с интерфейсом

Обучение классификатора MobileNet удобно сочетать с HTML-кнопками:

<button oncl ick="addExample('Кошка')">Добавить Кошку</button>
<button oncl ick="trainModel()">Начать обучение</button>
<button oncl ick="classifyImage()">Классифицировать</button>

Это позволяет создавать интерактивные проекты, где пользователи могут собирать данные, обучать модель и получать предсказания в реальном времени.

Все шаги от инициализации MobileNet до получения предсказаний обеспечивают полный цикл работы с классификацией изображений в ml5.js, позволяя строить проекты с собственными датасетами без глубокого погружения в архитектуру нейросетей.