Что такое 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 может использоваться в системе автономного вождения:
Заключение
Создание системы обнаружения объектов в реальном времени с YOLO одновременно сложно и полезно. Благодаря своему подходу к одностадийному обнаружению и возможностям работы в реальном времени YOLO выделяется как мощный инструмент в области компьютерного зрения. Следуя шагам, изложенным в этом руководстве, вы сможете реализовать YOLO в своих проектах и исследовать его огромный потенциал в различных реальных приложениях.
Помните, ключ к овладению YOLO — практика и терпение. Так что дерзайте, погружайтесь в код и наблюдайте, как волшебство обнаружения объектов в реальном времени разворачивается перед вашими глазами.