Что такое YOLO?

Прежде чем мы углубимся в детали создания системы обнаружения объектов в реальном времени, давайте начнём с основ. YOLO, что расшифровывается как «You Only Look Once» («вы смотрите только один раз»), — это революционный алгоритм обнаружения объектов, разработанный Джозефом Редмоном и Али Фархади в 2015 году. В отличие от своих предшественников, YOLO обрабатывает всё изображение за один проход, что делает его невероятно быстрым и эффективным. Этот одностадийный детектор использует свёрточную нейронную сеть (CNN), чтобы предсказать как класс, так и местоположение объектов на изображении.

Как работает YOLO

Чтобы понять, почему YOLO так эффективен, давайте разберём его рабочий процесс:

  • Разделение сетки: YOLO делит входное изображение на сетку ячеек. Каждая ячейка отвечает за прогнозирование наличия объекта и координат ограничивающего прямоугольника.
  • Прогнозирование ограничивающих прямоугольников: для каждой ячейки YOLO генерирует несколько ограничивающих рамок, каждая из которых имеет показатель достоверности, указывающий, насколько модель уверена, что рамка окружает объект.
  • Классификация классов: наряду с ограничивающими рамками YOLO предсказывает класс объекта внутри каждой рамки.
  • Окончательное предсказание: после всех прогнозов YOLO выбирает ограничивающую рамку с наивысшим уровнем достоверности и соответствующий класс объекта в качестве окончательного прогноза.

Вот упрощённая блок-схема, иллюстрирующая этот процесс:

graph TD
    A("Входное изображение") -->|Разделить на сетку|B(Ячейки сетки)
    B -->|Предсказать ограничивающие прямоугольники|C(Ограничивающие прямоугольники с показателями достоверности)
    C -->|Классифицировать объекты|D(Прогнозы классов)
    D -->|Выбрать наивысший показатель достоверности|E(Окончательный прогноз)
    E -->|Выход| B("Обнаруженные объекты с ограничивающими прямоугольниками и классами")

Настройка среды

Прежде чем начать кодирование, вам необходимо настроить среду. Вот шаги, которые необходимо выполнить:

Зависимости

Вам потребуются следующие зависимости:

  • OpenCV 4.2.0 или новее;
  • Python 3.6 или новее;
  • NumPy.

Вы можете установить их с помощью pip:

pip install numpy opencv-python

Загрузка весов и конфигураций YOLO

Необходимо загрузить предварительно обученные веса и конфигурации YOLO. Вот как вы можете это сделать:

  • Загрузите yolov3.weights и yolov3-tiny.weights и поместите их в папку с названием weights.
  • Загрузите yolov3.cfg и yolov3-tiny.cfg и поместите их в папку с названием cfg.

Эти файлы можно найти в различных репозиториях или скачать с официального сайта YOLO.

Реализация YOLO на Python

Вот пошаговое руководство по реализации YOLO на Python с использованием OpenCV:

Загрузка модели YOLO

Сначала необходимо загрузить модель YOLO с помощью модуля DNN OpenCV:

import cv2
import numpy as np

# Загрузить модель YOLOv3
net = cv2.dnn.readNet("weights/yolov3.weights", "cfg/yolov3.cfg")

Загрузка классов

Затем загрузите классы набора данных COCO, на котором обучается YOLO:

classes = []
with open("coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]

Обнаружение объектов в реальном времени

Пример того, как выполнять обнаружение объектов в реальном времени с помощью веб-камеры:

# Инициализировать веб-камеру
cap = cv2.VideoCapture(0)

while True:
    # Считать кадр с веб-камеры
    ret, frame = cap.read()

    if not ret:
        break

    # Получить высоту и ширину кадра
    height, width, _ = frame.shape

    # Создать блоб из кадра
    blob = cv2.dnn.blobFromImage(frame, 1/255, (416, 416), swapRB=True, crop=False)

    # Установить входные данные для модели YOLO
    net.setInput(blob)

    # Получить выходные слои
    output_layers = net.getUnconnectedOutLayersNames()

    # Пропустить вперёд, чтобы получить обнаружения
    outputs = net.forward(output_layers)

    # Хранить обнаруженные ограничивающие рамки, классы и показатели достоверности
    boxes = []
    class_ids = []
    confidences = []

    for output in outputs:
        for detection in output:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]

            if confidence > 0.5:
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                class_ids.append(class_id)
                confidences.append(float(confidence))

    # Применить подавление немаксимального значения, чтобы подавить перекрывающиеся рамки
    indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    if len(indices) > 0:
        for i in indices.flatten():
            x, y = (boxes[i][0], boxes[i][1])
            w, h = (boxes[i][2], boxes[i][3])

            # Нарисовать ограничивающую рамку
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

            # Вывести метку класса
            cv2.putText(frame, f"{classes[class_ids[i]]} {confidences[i]:.2f}", (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    # Показать вывод
    cv2.imshow('Frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Освободить захват и закрыть все окна
cap.release()
cv2.destroyAllWindows()

Этот скрипт будет захватывать видео с вашей веб-камеры, обнаруживать объекты в реальном времени и отображать ограничивающие рамки вместе с метками классов.

Реальные приложения

Возможности YOLO в режиме реального времени делают его универсальным инструментом для различных приложений:

  • Видеонаблюдение: YOLO может использоваться для мониторинга и обнаружения объектов в режиме реального времени, что делает его идеальным для систем безопасности.
  • Автономное вождение: в беспилотных автомобилях YOLO может помочь обнаружить пешеходов, автомобили и другие объекты на дороге.
  • Робототехника: YOLO можно интегрировать в роботов, чтобы они могли обнаруживать и взаимодействовать с объектами в своей среде.

Вот диаграмма последовательности, показывающая, как YOLO может использоваться в системе автономного вождения:

sequenceDiagram participant Камера как Камера participant YOLO как Модель YOLO participant Автомобиль как Автономный автомобиль participant Дорога как Дорожная среда Камера->>YOLO: Захват кадра YOLO->>YOLO: Обработка кадра YOLO->>Автомобиль: Отправка обнаружений (ограничивающие рамки, классы) Автомобиль->>Дорога: Регулировка рулевого управления и скорости на основе обнаружений

Заключение

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

Помните, ключ к овладению YOLO — практика и терпение. Так что дерзайте, погружайтесь в код и наблюдайте, как волшебство обнаружения объектов в реальном времени разворачивается перед вашими глазами.