Ultralytics YOLO27: Запишись в список ожидания.
Начать

Архитектура Ultralytics YOLOv5#

YOLOv5 (v6.0/6.1) — алгоритм обнаружения объектов, разработанный Ultralytics. В этой статье рассматриваются архитектура YOLOv5, стратегии аугментации данных, методики обучения и способы вычисления функции потерь. Понимание этих аспектов поможет применять обнаружение объектов в таких областях, как видеонаблюдение, автономные транспортные средства и распознавание изображений.

1. Структура модели#

Архитектура YOLOv5 состоит из трёх основных частей:

  • Backbone: основная часть сети. В YOLOv5 backbone построен на структуре CSPDarknet53, модификации архитектуры Darknet, использовавшейся в предыдущих версиях.
  • Шея: эта часть соединяет базовую сеть и голову. В YOLOv5 используются структуры SPPF (быстрый пространственный пирамидальный пуллинг) и PANet (сеть агрегации путей).
  • Head: эта часть отвечает за формирование итогового результата. Для этого в YOLOv5 используется YOLOv3 Head.

Структура модели показана на изображении ниже. Подробное описание структуры модели приведено в models/yolov5l.yaml.

Архитектура YOLOv5: базовая сеть, шея и голова

В YOLOv5 появились заметные улучшения по сравнению с предыдущими версиями:

  1. Структура Focus, использовавшаяся в предыдущих версиях, заменена структурой 6x6 Conv2d. Это изменение повышает эффективность #4825.
  2. Структура SPP заменена на SPPF. Это изменение более чем вдвое увеличивает скорость обработки при сохранении того же результата.

Для проверки скорости SPP и SPPF можно использовать следующий код:

Пример профилирования скорости SPP и SPPF (нажми, чтобы открыть)
import time

import torch
from torch import nn

class SPP(nn.Module):
    def __init__(self):
        """Initializes an SPP module with three different sizes of max pooling layers."""
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        """Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)

class SPPF(nn.Module):
    def __init__(self):
        """Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        """Applies sequential max pooling and concatenates results with input tensor."""
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)

def main():
    """Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"SPP time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"SPPF time: {time.time() - t_start}")

if __name__ == "__main__":
    main()

Результат:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

2. Методы аугментации данных#

В YOLOv5 применяются различные методы аугментации данных, чтобы улучшить способность модели к обобщению и уменьшить переобучение. К ним относятся:

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

    Мозаичная аугментация данных YOLOv5: объединение четырёх изображений

  • Аугментация Copy-Paste: метод аугментации данных, при котором экземпляры объектов копируются с использованием их масок сегментации и вставляются на обучающие изображения для создания новых обучающих примеров.

    Аугментация копированием и вставкой в YOLOv5 для сегментации экземпляров

  • Случайные аффинные преобразования: случайные повороты, масштабирование, перемещение и сдвиг изображений.

    Случайные аффинные преобразования YOLOv5 для обучения

  • Аугментация MixUp: метод создания составных изображений путём линейного комбинирования двух изображений и соответствующих им меток.

    Аугментация данных MixUp в YOLOv5: смешивание двух изображений

  • Albumentations: библиотека аугментации изображений, поддерживающая широкий спектр методов аугментации.

  • Аугментация HSV: случайное изменение оттенка, насыщенности и значения яркости изображений.

    Примеры аугментации цветового пространства HSV в YOLOv5

  • Случайное горизонтальное отражение: метод аугментации, при котором изображения случайным образом отражаются по горизонтали.

    Случайное горизонтальное отражение при аугментации в YOLOv5

3. Стратегии обучения#

YOLOv5 применяет несколько стратегий обучения для повышения качества модели. К ним относятся:

  • Многошкальное обучение: во время обучения входные изображения случайным образом масштабируются в диапазоне от 0,5 до 1,5 от исходного размера.
  • AutoAnchor: эта стратегия оптимизирует исходные якорные блоки, чтобы они соответствовали статистическим характеристикам эталонных рамок в твоих пользовательских данных.
  • Планировщик Warmup и косинусного изменения LR: Метод изменения скорости обучения для повышения производительности модели.
  • Экспоненциальное скользящее среднее (EMA): Стратегия, использующая усреднённые значения параметров за предыдущие шаги для стабилизации процесса обучения и снижения ошибки обобщения.
  • Обучение с пониженной точностью: метод выполнения операций в формате половинной точности, который снижает потребление памяти и повышает скорость вычислений.
  • Эволюция гиперпараметров: Стратегия автоматической настройки гиперпараметров для достижения оптимальной производительности. Подробнее см. в руководстве «Эволюция гиперпараметров».

4. Дополнительные возможности#

4.1 Вычисление функции потерь#

Функция потерь в YOLOv5 вычисляется как комбинация трёх отдельных компонентов:

  • Потери классификации (BCE Loss): потери на основе бинарной кросс-энтропии, измеряющие ошибку задачи классификации.
  • Потери объектности (BCE Loss): ещё один вариант потерь на основе бинарной кросс-энтропии, который вычисляет ошибку определения наличия объекта в конкретной ячейке сетки.
  • Функция потерь локализации (CIoU Loss): полная функция потерь IoU, измеряющая ошибку локализации объекта внутри ячейки сетки.

Общая функция потерь представлена формулой:

Формула общей функции потерь YOLOv5

4.2 Балансировка функции потерь#

Потери объектности на трёх слоях предсказаний (P3, P4, P5) имеют разные веса. Весовые коэффициенты равны [4.0, 1.0, 0.4] соответственно. Такой подход позволяет учитывать предсказания на разных масштабах пропорционально их вкладу в общую функцию потерь.

Формула балансировки потерь объектности YOLOv5

4.3 Устранение чувствительности к сетке#

Архитектура YOLOv5 вносит несколько важных изменений в стратегию предсказания рамок по сравнению с более ранними версиями YOLO. В YOLOv2 и YOLOv3 координаты рамок предсказывались напрямую с помощью функции активации последнего слоя.

Формула предсказания координаты x ограничивающей рамки Формула предсказания координаты y ограничивающей рамки Формула предсказания ширины ограничивающей рамки Формула предсказания высоты ограничивающей рамки

YOLOv5 grid computation

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

Обновлённые формулы расчёта предсказанной ограничивающей рамки:

Обновлённая формула координаты x ограничивающей рамки YOLOv5 Обновлённая формула координаты y ограничивающей рамки YOLOv5 Обновлённая формула ширины ограничивающей рамки YOLOv5 Обновлённая формула высоты ограничивающей рамки YOLOv5

Сравни смещение центральной точки до и после масштабирования. Диапазон смещения центральной точки изменяется с (0, 1) на (-0.5, 1.5). Благодаря этому смещение легче может достигать 0 или 1.

YOLOv5 grid scaling

Сравни коэффициент масштабирования высоты и ширины (относительно якоря) до и после корректировки. В исходных уравнениях рамок YOLO/Darknet есть серьёзный недостаток. Ширина и высота ничем не ограничены, поскольку вычисляются просто как out=exp(in). Это опасно: могут возникнуть неограниченный рост градиентов, нестабильность, потери NaN и, в конечном итоге, полный срыв обучения.

YOLOv5 unbounded scaling

4.4 Формирование целевых значений#

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

Этот процесс состоит из следующих шагов:

  • Вычисли отношение размеров рамки истинной разметки к размерам каждого шаблона анкера.

Формула отношения ширины рамки истинной разметки к ширине анкера

Формула отношения высоты рамки истинной разметки к высоте анкера

Формула максимального отношения ширины

Формула максимального отношения высоты

Формула общего максимального отношения

Формула порога сопоставления анкеров

YOLOv5 IoU computation
  • Если вычисленное отношение не превышает пороговое значение, сопоставь рамку истинной разметки с соответствующим анкером.
YOLOv5 grid overlap
  • Назначь сопоставленный анкер подходящим ячейкам. Учти, что из-за изменения смещения центральной точки рамку истинной разметки можно назначить более чем одному анкеру: диапазон смещения центральной точки меняется с (0, 1) на (-0.5, 1.5), что позволяет сопоставлять больше вариантов.
YOLOv5 anchor selection

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

Заключение#

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

Основные улучшения YOLOv5 включают доработки архитектуры, такие как stem 6x6 Conv2d и SPPF, широкий набор методов аугментации данных, стратегии обучения, например AutoAnchor и EMA, а также изменения в вычислении функции потерь и построении целевых значений. В совокупности они повышают точность и эффективность обнаружения объектов, сохраняя скорость, которой известны модели YOLO.

Часто задаваемые вопросы#

  • Базовая сеть CSPDarknet53 извлекает признаки, блок SPPF и шея PANet объединяют их на разных масштабах, а голова в стиле YOLOv3 предсказывает рамки, объектность и классы с шагами 8, 16 и 32. Полный список слоёв приведён в models/yolov5l.yaml.

  • SPPF последовательно выполняет три операции максимальной субдискретизации с окном 5x5, а не запускает параллельно операции с окнами 5x5, 9x9 и 13x13. Результат математически идентичен, но вычисления выполняются более чем в два раза быстрее, как показывает приведённый выше фрагмент кода профилирования.

  • Исходное смещение YOLO не могло принимать значения ровно 0 или 1, поэтому было трудно предсказывать объекты, расположенные на границах сетки. Масштабирование сигмоиды до диапазона (-0.5, 1.5) устраняет эту чувствительность к сетке, а возведение 2σ в квадрат для ширины и высоты ограничивает предсказания четырьмя размерами анкера и предотвращает неконтролируемый рост градиентов, возникавший при использовании неограниченной экспоненты.

  • Сопоставляются все анкеры, у которых отношения ширины и высоты к рамке не превышают anchor_t (по умолчанию 4.0). Расширенный диапазон смещения также позволяет назначить рамку двум соседним ячейкам сетки. Таким образом, один объект может создавать несколько положительных целевых значений, что ускоряет сходимость.

Комментарии

Задай вопрос, поделись результатами или помоги кому-нибудь.