YOLO: принцип работы и реализация в ml5.js

Основы YOLO

YOLO (You Only Look Once) — это алгоритм детекции объектов в изображениях и видео, который отличается высокой скоростью и сравнительно хорошей точностью. В отличие от классических методов, использующих двухступенчатую обработку (выделение регионов и классификация каждого региона), YOLO рассматривает детекцию как задачу регрессии. Входное изображение делится на сетку (S S), и для каждой ячейки предсказываются:

  • Координаты ограничивающих рамок (bounding boxes) объектов.
  • Вероятности принадлежности объектов к классам.
  • Доверительные оценки наличия объекта в ячейке.

Особенность YOLO заключается в единовременной обработке изображения, что позволяет значительно ускорить процесс детекции.

Архитектура и принцип работы

YOLO основан на сверточной нейронной сети (CNN). Ключевые элементы архитектуры:

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

Принцип работы YOLO в реальном времени:

  1. Изображение масштабируется до фиксированного размера.
  2. Сеть обрабатывает изображение за один проход.
  3. На выходе получаются координаты и классы всех предполагаемых объектов.
  4. Применяется Non-Maximum Suppression (NMS), чтобы удалить пересекающиеся рамки с низкой вероятностью.

Применение YOLO в ml5.js

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

Подключение и инициализация

Для использования YOLO необходимо подключить библиотеку ml5.js:

<script src="https://cdn.jsdelivr.net/npm/ml5@latest/dist/ml5.min.js"></script>

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

let yolo;

function setup() {
  yolo = ml5.YOLO('https://teachablemachine.withgoogle.com/models/YOLO_MODEL/model.json', modelReady);
}

function modelReady() {
  console.log('YOLO модель загружена и готова к работе');
}

Здесь YOLO_MODEL заменяется ссылкой на предобученную модель YOLO или на локальный путь к JSON-модели.

Детекция объектов на изображении

После загрузки модели можно выполнять детекцию:

let img;

function preload() {
  img = loadImage('example.jpg');
}

function detect() {
  yolo.detect(img, function(err, results) {
    if (err) {
      console.error(err);
      return;
    }
    console.log(results);
    drawResults(results);
  });
}

function drawResults(results) {
  results.forEach(result => {
    noFill();
    stroke(0, 255, 0);
    rect(result.x, result.y, result.width, result.height);
    textSize(16);
    fill(255, 0, 0);
    text(result.label + ' ' + nf(result.confidence, 0, 2), result.x + 5, result.y + 20);
  });
}

Каждый объект в массиве results содержит:

  • x, y, width, height — координаты рамки.
  • label — название класса объекта.
  • confidence — вероятность обнаружения объекта.
Детекция объектов в видео

YOLO в ml5.js также поддерживает детекцию в реальном времени через камеру:

let video;

function setup() {
  createCanvas(640, 480);
  video = createCapture(VIDEO);
  video.size(640, 480);
  video.hide();
  yolo = ml5.YOLO('https://teachablemachine.withgoogle.com/models/YOLO_MODEL/model.json', modelReady);
}

function modelReady() {
  detectVideo();
}

function detectVideo() {
  yolo.detect(video, function(err, results) {
    if (err) {
      console.error(err);
      return;
    }
    drawVideoResults(results);
    detectVideo();
  });
}

function drawVideoResults(results) {
  image(video, 0, 0);
  results.forEach(result => {
    noFill();
    stroke(0, 255, 0);
    rect(result.x, result.y, result.width, result.height);
    textSize(16);
    fill(255, 0, 0);
    text(result.label + ' ' + nf(result.confidence, 0, 2), result.x + 5, result.y + 20);
  });
}

Обработка видео выполняется рекурсивно, что обеспечивает непрерывную детекцию в реальном времени.

Оптимизация и настройки

  • Изменение порога уверенности. Можно фильтровать объекты с низкой вероятностью:
results.filter(r => r.confidence > 0.5);
  • Масштабирование изображения. Для ускорения работы модели можно уменьшить размер входного изображения.
  • Non-Maximum Suppression встроен в ml5.js, но важно учитывать, что перекрывающиеся объекты могут быть объединены, если уверенность низкая.

Применение YOLO в проектах

YOLO в ml5.js подходит для:

  • Систем наблюдения и мониторинга.
  • Интерактивных веб-приложений с детекцией жестов и объектов.
  • Игровых проектов с распознаванием реальных предметов.
  • Образовательных проектов, демонстрирующих работу нейронных сетей в браузере.

Особенность ml5.js — легкая интеграция с HTML5 Canvas и p5.js, что позволяет строить визуальные интерфейсы с интерактивной визуализацией обнаруженных объектов.

Преимущества использования ml5.js с YOLO

  • Простая установка и подключение через CDN.
  • Работа полностью в браузере без серверной обработки.
  • Доступ к предобученным моделям без необходимости изучать тонкости TensorFlow.js.
  • Поддержка как изображений, так и потокового видео.
  • Возможность быстрого прототипирования проектов с компьютерным зрением.

YOLO в сочетании с ml5.js предоставляет мощный инструмент для распознавания объектов в реальном времени с минимальными усилиями по настройке модели и кода.