Архитектура Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) — мощный алгоритм обнаружения объектов, разработанный Ultralytics. В этой статье подробно рассматриваются архитектура YOLOv5, стратегии аугментации данных, методы обучения и способы вычисления функции потерь. Это подробное описание поможет улучшить практическое применение обнаружения объектов в разных областях, включая видеонаблюдение, автономные транспортные средства и распознавание изображений.
1. Структура модели#
Архитектура YOLOv5 состоит из трёх основных частей:
- Базовая сеть: основная часть сети. В YOLOv5 базовая сеть построена на основе структуры
CSPDarknet53, модификации архитектуры Darknet, использовавшейся в предыдущих версиях. - Шея: эта часть соединяет базовую сеть и голову. В YOLOv5 используются структуры
SPPF(быстрый пространственный пирамидальный пуллинг) иPANet(сеть агрегации путей). - Голова: эта часть отвечает за формирование итогового результата. Для этого YOLOv5 использует
YOLOv3 Head.
Структура модели показана на изображении ниже. Подробное описание структуры модели приведено в models/yolov5l.yaml.

В YOLOv5 появились заметные улучшения по сравнению с предыдущими версиями:
- Структура
Focus, использовавшаяся в предыдущих версиях, заменена структурой6x6 Conv2d. Это изменение повышает эффективность #4825. - Структура
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.207807064056396482. Методы аугментации данных#
В YOLOv5 применяются различные методы аугментации данных, чтобы улучшить способность модели к обобщению и уменьшить переобучение. К ним относятся:
-
Мозаичная аугментация: метод обработки изображений, который объединяет четыре обучающих изображения в одно, помогая моделям обнаружения объектов лучше работать с объектами разных масштабов и положений.

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

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

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

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

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

3. Стратегии обучения#
В YOLOv5 применяется несколько продвинутых стратегий обучения для повышения производительности модели. К ним относятся:
- Многошкальное обучение: во время обучения входные изображения случайным образом масштабируются в диапазоне от 0,5 до 1,5 от исходного размера.
- AutoAnchor: Эта стратегия оптимизирует исходные анкерные рамки, чтобы они соответствовали статистическим характеристикам рамок истинной разметки в пользовательских данных.
- Планировщик Warmup и косинусного изменения LR: Метод изменения скорости обучения для повышения производительности модели.
- Экспоненциальное скользящее среднее (EMA): Стратегия, использующая усреднённые значения параметров за предыдущие шаги для стабилизации процесса обучения и снижения ошибки обобщения.
- Обучение с пониженной точностью: Метод выполнения операций в формате половинной точности, который снижает потребление памяти и повышает скорость вычислений.
- Эволюция гиперпараметров: Стратегия автоматической настройки гиперпараметров для достижения оптимальной производительности. Подробнее см. в руководстве «Эволюция гиперпараметров».
4. Дополнительные возможности#
4.1 Вычисление функции потерь#
Функция потерь в YOLOv5 вычисляется как комбинация трёх отдельных компонентов:
- Потери классификации (BCE Loss): потери на основе бинарной кросс-энтропии, измеряющие ошибку задачи классификации.
- Потери объектности (BCE Loss): ещё один вариант потерь на основе бинарной кросс-энтропии, который вычисляет ошибку определения наличия объекта в конкретной ячейке сетки.
- Потери локализации (CIoU Loss): потери на основе полного IoU, измеряющие ошибку локализации объекта в ячейке сетки.
Общая функция потерь представлена формулой:
4.2 Балансировка функции потерь#
Потери объектности на трёх слоях предсказаний (P3, P4, P5) имеют разные веса. Весовые коэффициенты равны [4.0, 1.0, 0.4] соответственно. Такой подход позволяет учитывать предсказания на разных масштабах пропорционально их вкладу в общую функцию потерь.
4.3 Устранение чувствительности к сетке#
Архитектура YOLOv5 вносит несколько важных изменений в стратегию предсказания рамок по сравнению с более ранними версиями YOLO. В YOLOv2 и YOLOv3 координаты рамок предсказывались напрямую с помощью функции активации последнего слоя.
Однако в YOLOv5 формулу предсказания координат рамки изменили, чтобы снизить чувствительность к сетке и не допустить предсказания моделью неограниченных размеров рамок.
Обновлённые формулы расчёта предсказанной ограничивающей рамки:
Сравни смещение центральной точки до и после масштабирования. Диапазон смещения центральной точки меняется с (0, 1) на (-0.5, 1.5). Поэтому смещение может легко принимать значения 0 или 1.
Сравни коэффициент масштабирования высоты и ширины (относительно анкера) до и после изменения. В исходных уравнениях рамок yolo/darknet есть серьёзный недостаток: ширина и высота ничем не ограничены, поскольку вычисляются просто как out=exp(in). Это опасно: может привести к неконтролируемому росту градиентов, нестабильности, потерям NaN и в итоге к полному срыву обучения. Подробнее см. в этом обсуждении.
4.4 Формирование целевых значений#
Формирование целевых значений в YOLOv5 крайне важно для эффективности обучения и точности модели. Этот процесс включает назначение рамок истинной разметки соответствующим ячейкам сетки на выходной карте и сопоставление рамок с подходящими анкерными рамками.
Этот процесс состоит из следующих шагов:
- Вычисли отношение размеров рамки истинной разметки к размерам каждого шаблона анкера.
- Если вычисленное отношение не превышает пороговое значение, сопоставь рамку истинной разметки с соответствующим анкером.
- Назначь сопоставленный анкер подходящим ячейкам. Учти, что из-за изменения смещения центральной точки рамку истинной разметки можно назначить более чем одному анкеру: диапазон смещения центральной точки меняется с (0, 1) на (-0.5, 1.5), что позволяет сопоставлять больше вариантов.
Таким образом, процесс формирования целевых значений гарантирует, что каждый объект истинной разметки правильно назначается и сопоставляется во время обучения, помогая YOLOv5 эффективнее обучаться обнаружению объектов.
Заключение#
YOLOv5 — важный этап в развитии обнаружения объектов в реальном времени. Архитектурные решения, стратегии обучения и инженерные усовершенствования обеспечивают высокую производительность и эффективность по сравнению с более ранними версиями YOLO.
К основным улучшениям YOLOv5 относятся динамическая архитектура, широкий набор методов аугментации данных, инновационные стратегии обучения, а также важные изменения в вычислении функции потерь и формировании целевых значений. Все эти нововведения значительно повышают точность и эффективность обнаружения объектов, сохраняя при этом высокую скорость — отличительную черту моделей 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). Расширенный диапазон смещения также позволяет назначить рамку двум соседним ячейкам сетки. Таким образом, один объект может создавать несколько положительных целевых значений, что ускоряет сходимость.