Фильтрация классов объектов

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


Основные понятия

В контексте ml5.js под классом объекта понимается метка, присваиваемая модели распознавания изображения для конкретного объекта на изображении. Модель, например ImageClassifier, при обработке изображения возвращает массив объектов с информацией:

  • label — название класса (например, “кошка”, “стул”, “машина”).
  • confidence — вероятность принадлежности к данному классу (число от 0 до 1).

Пример структуры результата классификации:

[
  { label: "кошка", confidence: 0.92 },
  { label: "собака", confidence: 0.05 },
  { label: "стол", confidence: 0.03 }
]

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


Инициализация модели

Для начала работы создается экземпляр классификатора:

const classifier = ml5.imageClassifier('MobileNet', modelLoaded);

function modelLoaded() {
  console.log('Модель загружена');
}

MobileNet — предобученная модель, способная распознавать более 1000 категорий объектов.


Принцип фильтрации

Фильтрация классов объектов реализуется двумя основными способами:

  1. Фильтрация по названию класса Позволяет оставить только интересующие метки. Для этого используется метод filter массива результатов:

    classifier.classify(image, (err, results) => {
      if (err) {
        console.error(err);
        return;
      }
    
      const filteredResults = results.filter(item =>
        item.label === "кошка" || item.label === "собака"
      );
    
      console.log(filteredResults);
    });

    В данном примере сохраняются только объекты класса “кошка” и “собака”.

  2. Фильтрация по порогу уверенности Иногда важно исключить объекты с низкой вероятностью распознавания:

    const threshold = 0.7;
    
    const confidentResults = results.filter(item => item.confidence >= threshold);
    
    console.log(confidentResults);

    Этот подход позволяет минимизировать ложные срабатывания и работать только с надежными предсказаниями.


Комбинированная фильтрация

На практике чаще используется комбинация фильтрации по классу и вероятности. Это позволяет создавать точные и надежные системы распознавания:

const selectedClasses = ["кошка", "собака"];
const confidenceThreshold = 0.8;

const finalResults = results.filter(item =>
  selectedClasses.includes(item.label) && item.confidence >= confidenceThreshold
);

console.log(finalResults);

Фильтрация в реальном времени

Для видео-потоков или камер фильтрация осуществляется в цикле draw или при обработке кадра из видео:

function classifyVideoFrame() {
  classifier.classify(video, (err, results) => {
    if (err) {
      console.error(err);
      return;
    }

    const filtered = results.filter(item =>
      item.label === "человек" && item.confidence >= 0.85
    );

    if (filtered.length > 0) {
      console.log("Обнаружен человек:", filtered[0]);
    }

    requestAnimationFrame(classifyVideoFrame);
  });
}

classifyVideoFrame();

Такой подход позволяет строить системы мониторинга объектов, где важны только определенные классы с высокой точностью распознавания.


Практические советы

  • Для динамически меняющихся фильтров можно использовать массив интересующих классов и обновлять его без пересоздания модели.
  • Для больших наборов классов рекомендуется комбинировать фильтрацию по именам и вероятности, чтобы минимизировать шум.
  • При работе с видео важно учитывать нагрузку на браузер: фильтрацию и обработку рекомендуется делать асинхронно или с использованием requestAnimationFrame для плавной визуализации.
  • ml5.js возвращает результаты в порядке убывания вероятности, поэтому часто достаточно проверять первые 1–3 элемента массива для быстрого решения о наличии нужного класса.

Расширенные возможности

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

Фильтрация классов объектов является фундаментальной техникой при построении систем распознавания изображений в браузере, позволяя управлять точностью, скоростью и направленностью анализа данных.