Ultralytics YOLO27:
Get Started

Руководство по настройке модели в YAML#

Файл конфигурации модели YAML служит архитектурным чертежом нейросетей Ultralytics. В нём определяется, как соединяются слои, какие параметры использует каждый модуль и как масштабируется вся сеть для моделей разных размеров.

Model YAML configuration workflow.

Структура конфигурации#

Файлы моделей YAML состоят из трёх основных разделов, которые вместе определяют архитектуру.

Раздел параметров#

В разделе параметров задаются глобальные характеристики модели и правила масштабирования:

# Parameters
nc: 80 # number of classes
scales: # compound scaling constants [depth, width, max_channels]
    n: [0.50, 0.25, 1024] # nano: shallow layers, narrow channels
    s: [0.50, 0.50, 1024] # small: shallow depth, standard width
    m: [0.50, 1.00, 512] # medium: moderate depth, full width
    l: [1.00, 1.00, 512] # large: full depth and width
    x: [1.00, 1.50, 512] # extra-large: maximum performance
kpt_shape: [17, 3] # pose models only
  • nc задаёт количество классов, которые предсказывает модель.
  • scales задают составные коэффициенты масштабирования, которые изменяют глубину и ширину модели, а также максимальное количество каналов, чтобы создавать варианты разных размеров — от nano до extra-large.
  • kpt_shape применяется к моделям поз. Для (x, y) ключевых точек можно задать [N, 2], а для (x, y, visibility) — [N, 3].
Сократи дублирование с помощью `scales`

Параметр scales позволяет создавать модели разных размеров на основе одного базового файла YAML. Например, при загрузке yolo26n.yaml Ultralytics считывает базовый файл yolo26.yaml и применяет коэффициенты масштабирования n (depth=0.50, width=0.25), чтобы создать вариант nano.

`nc` и `kpt_shape` зависят от набора данных

Если в наборе данных указаны другие nc или kpt_shape, Ultralytics автоматически переопределит конфигурацию модели во время выполнения, чтобы она соответствовала файлу YAML набора данных.

Архитектура backbone и head#

Архитектура модели состоит из разделов backbone (извлечение признаков) и head (специализированная для задачи часть):

nc: 80

backbone:
    # [from, repeats, module, args]
    - [-1, 1, Conv, [64, 3, 2]] # 0: Initial convolution
    - [-1, 1, Conv, [128, 3, 2]] # 1: Downsample
    - [-1, 3, C2f, [128, True]] # 2: Feature processing

head:
    - [-1, 1, nn.Upsample, [None, 2, nearest]] # 3: Upsample
    - [[-1, 0], 1, Concat, [1]] # 4: Spatially compatible skip connection
    - [-1, 3, C2f, [256]] # 5: Process features
    - [[5], 1, Detect, [nc]] # 6: Detection layer

Индексы слоёв продолжаются от backbone к head, а объединяемые карты признаков должны иметь одинаковые пространственные размеры.

Формат описания слоя#

Все слои задаются по единому шаблону: [from, repeats, module, args]

КомпонентНазначениеПримеры
fromВходные соединения-1 (предыдущий слой), 6 (слой 6), [4, 6, 8] (несколько входов)
repeatsКоличество повторений1 (один раз), 3 (повторить 3 раза)
moduleТип модуляConv, C2f, TorchVision, Detect
argsАргументы модуля[64, 3, 2] (каналы, ядро, шаг)

Схемы соединений#

Поле from задаёт гибкие схемы передачи данных по всей сети:

- [-1, 1, Conv, [64, 3, 2]]    # Takes input from previous layer
Индексация слоёв

Нумерация слоёв начинается с 0. Отрицательные индексы указывают на предыдущие слои (-1 = предыдущий слой), а положительные — на определённые слои по их позиции.

Повторение модуля#

Параметр repeats позволяет создавать более глубокие участки сети:

- [-1, 3, C2f, [128, True]] # Creates 3 consecutive C2f blocks
- [-1, 1, Conv, [64, 3, 2]] # Single convolution layer

Фактическое количество повторений умножается на коэффициент масштабирования глубины из конфигурации размера модели.

Доступные модули#

Модули сгруппированы по функциям и определены в каталоге модулей Ultralytics. В таблицах ниже приведены часто используемые модули по категориям; в исходном коде доступно ещё много других модулей:

Базовые операции#

МодульНазначениеИсточникАргументы
ConvСвёртка + BatchNorm + функция активацииconv.py[out_ch, kernel, stride, pad, groups]
nn.UpsampleПространственное увеличение разрешенияPyTorch[size, scale_factor, mode]
nn.IdentityОперация без измененийPyTorch[]

Составные блоки#

МодульНазначениеИсточникАргументы
C2fУзкое место CSP с двумя свёрткамиblock.py[out_ch, shortcut, groups, expansion]
SPPFБыстрый пространственный пирамидальный пуллингblock.py[out_ch, kernel_size]
ConcatКонкатенация по каналамconv.py[dimension]

Специализированные модули#

МодульНазначениеИсточникАргументы
TorchVisionЗагрузка любой модели torchvisionblock.py[out_ch, model_name, weights, unwrap, truncate, split]
IndexИзвлечение заданного тензора из спискаconv.py[out_ch, index]
DetectГолова детекции YOLOhead.py[nc]
Полный список модулей

Здесь приведена часть доступных модулей. Полный список модулей и их параметров смотри в каталоге модулей.

Расширенные возможности#

Интеграция с TorchVision#

Модуль TorchVision позволяет без проблем использовать любую модель TorchVision в качестве backbone:

from ultralytics import YOLO

# Модель с backbone ConvNeXt
model = YOLO("convnext_backbone.yaml")
results = model.train(data="imagenet10", epochs=100)
Признаки разных масштабов

Задай для последнего параметра значение True, чтобы получить промежуточные карты признаков для детекции на разных масштабах.

Модуль Index для выбора признаков#

При использовании моделей, которые возвращают несколько карт признаков, модуль Index выбирает нужные выходы:

nc: 80

backbone:
    - [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, True]] # Multi-output
head:
    - [0, 1, Index, [192, 4]] # Select 4th feature map (192 channels)
    - [0, 1, Index, [384, 6]] # Select 6th feature map (384 channels)
    - [0, 1, Index, [768, 8]] # Select 8th feature map (768 channels)
    - [[1, 2, 3], 1, Detect, [nc]] # Multi-scale detection

Система разрешения модулей#

Для настройки важно понимать, как Ultralytics находит и импортирует модули:

Поиск модулей#

Ultralytics использует трёхуровневую систему в parse_model:

# Основная логика разрешения
m = (
    getattr(torch.nn, m[3:])
    if m.startswith("nn.")
    else getattr(__import__("torchvision").ops, m[16:])
    if m.startswith("torchvision.ops.")
    else globals()[m]
)  # получить модуль
  1. Модули PyTorch: имена, начинающиеся с 'nn.' → пространство имён torch.nn
  2. Операции TorchVision: имена, начинающиеся с 'torchvision.ops.' → пространство имён torchvision.ops
  3. Модули Ultralytics: все остальные имена → глобальное пространство имён через импорты

Цепочка импорта модулей#

Стандартные модули становятся доступными благодаря импортам в tasks.py:

from ultralytics.nn.modules import (  # noqa: F401
    SPPF,
    C2f,
    Conv,
    Detect,
    # ... и многие другие модули
    Index,
    TorchVision,
)

Интеграция пользовательских модулей#

Изменение исходного кода#

Изменение исходного кода — самый гибкий способ интегрировать пользовательские модули, но он может быть непростым. Чтобы определить и использовать пользовательский модуль, выполни следующие шаги:

  1. Установи Ultralytics в режиме разработки с помощью клонирования Git, как описано в руководстве по быстрому старту.

  2. Определи свой модуль в ultralytics/nn/modules/block.py:

    class CustomBlock(nn.Module):
        """Custom block with Conv-BatchNorm-ReLU sequence."""
    
        def __init__(self, c1, c2):
            """Initialize CustomBlock with input and output channels."""
            super().__init__()
            self.layers = nn.Sequential(nn.Conv2d(c1, c2, 3, 1, 1), nn.BatchNorm2d(c2), nn.ReLU())
    
        def forward(self, x):
            """Forward pass through the block."""
            return self.layers(x)
  3. Сделай свой модуль доступным на уровне пакета в ultralytics/nn/modules/__init__.py:

    from .block import CustomBlock  # noqa makes CustomBlock available as ultralytics.nn.modules.CustomBlock
  4. Добавь импорты в ultralytics/nn/tasks.py:

    from ultralytics.nn.modules import CustomBlock  # noqa
  5. Добавь модуль в base_modules в parse_model(). Модули из этого набора автоматически получают входное и выходное количество каналов:

    base_modules = frozenset(
        {
            # Существующие модули...
            CustomBlock,
        }
    )
  6. Используй модуль в YAML-файле модели:

    # custom_model.yaml
    nc: 1
    backbone:
        - [-1, 1, CustomBlock, [64]]
    head:
        - [-1, 1, Classify, [nc]]
  7. Проверь FLOPs, чтобы убедиться, что прямой проход работает:

    from ultralytics import YOLO
    
    model = YOLO("custom_model.yaml", task="classify")
    model.info()  # если работает, должно выводиться ненулевое значение FLOPs

Примеры конфигураций#

Базовая модель обнаружения#

# Simple YOLO detection model
nc: 80
scales:
    n: [0.33, 0.25, 1024]

backbone:
    - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C2f, [128, True]] # 2
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C2f, [256, True]] # 4
    - [-1, 1, SPPF, [256, 5]] # 5

head:
    - [-1, 1, Conv, [256, 3, 1]] # 6
    - [[6], 1, Detect, [nc]] # 7

Модель с бэкбоном TorchVision#

# ConvNeXt backbone with YOLO head
nc: 80

backbone:
    - [-1, 1, TorchVision, [768, convnext_tiny, DEFAULT, True, 2, True]]

head:
    - [0, 1, Index, [192, 4]] # P3 features
    - [0, 1, Index, [384, 6]] # P4 features
    - [0, 1, Index, [768, 8]] # P5 features
    - [[1, 2, 3], 1, Detect, [nc]] # Multi-scale detection

Модель классификации#

# Simple classification model
nc: 1000

backbone:
    - [-1, 1, Conv, [64, 7, 2, 3]]
    - [-1, 1, nn.MaxPool2d, [3, 2, 1]]
    - [-1, 4, C2f, [64, True]]
    - [-1, 1, Conv, [128, 3, 2]]
    - [-1, 8, C2f, [128, True]]

head:
    - [-1, 1, Classify, [nc]]

Classify уже выполняет адаптивное усреднение по пространственным измерениям.

Рекомендации#

Советы по проектированию архитектуры#

Начинай с простого: сначала используй проверенные архитектуры, и только потом вноси изменения. Бери готовые конфигурации YOLO за основу и модифицируй их постепенно, а не создавай всё с нуля.

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

Следи за каналами: размеры каналов связанных слоёв должны совпадать. Выходное число каналов (c2) одного слоя должно совпадать с входным числом каналов (c1) следующего слоя в последовательности.

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

Выбирай подходящий масштаб: подбирай масштаб модели с учётом вычислительных ограничений. Используй nano (n) для периферийных устройств, small (s) для сбалансированной производительности, а более крупные масштабы (m, l, x) — для максимальной точности.

Особенности производительности#

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

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

Блоки-узкие места: снижают вычислительные затраты, сохраняя выразительность модели. Такие модули, как C2f, используют меньше параметров, чем стандартные свёртки, и при этом сохраняют способность обучаться на признаках.

Многоуровневые признаки: необходимы для обнаружения объектов разных размеров на одном изображении. Используй шаблоны пирамидальной сети признаков (FPN) с несколькими головами обнаружения на разных масштабах.

Устранение неполадок#

Распространённые проблемы#

ПроблемаПричинаРешение
KeyError: 'ModuleName'Модуль не импортированДобавь импорты в tasks.py
Несоответствие размерности каналовНеверное описание argsПроверь совместимость входных и выходных каналов
AttributeError: 'int' object has no attributeНеверный тип аргументаПроверь документацию модуля, чтобы узнать правильные типы аргументов
Не удаётся построить модельНедопустимая ссылка fromУбедись, что указанные слои существуют

Советы по отладке#

При разработке пользовательских архитектур систематическая отладка помогает выявлять проблемы на раннем этапе:

Для тестирования используй Identity Head

Замени сложные головы на nn.Identity, чтобы локализовать проблемы бэкбона:

nc: 1
backbone:
    - [-1, 1, CustomBlock, [64]]
head:
    - [-1, 1, nn.Identity, []] # Pass-through for debugging

Так можно напрямую проверить выходные данные бэкбона:

import torch

from ultralytics import YOLO

model = YOLO("debug_model.yaml", task="detect")
output = model.model(torch.randn(1, 3, 640, 640))
print(f"Output shape: {output.shape}")  # Should match expected dimensions

Проверка архитектуры модели

Проверка количества FLOPs и вывод каждого слоя также могут помочь найти проблемы в пользовательской конфигурации модели. У корректной модели количество FLOPs должно быть ненулевым. Если оно равно нулю, вероятно, проблема связана с прямым проходом. Простой прямой проход должен показать точную ошибку.

from ultralytics import YOLO

# Build model with verbose output to see layer details
model = YOLO("debug_model.yaml", task="detect", verbose=True)

# Check model FLOPs. Failed forward pass causes 0 FLOPs.
model.info()

# Inspect individual layers
for i, layer in enumerate(model.model.model):
    print(f"Layer {i}: {layer}")

Проверка шаг за шагом

  1. Начни с минимума: сначала протестируй максимально простую архитектуру
  2. Добавляй постепенно: наращивай сложность, добавляя слои по одному
  3. Проверяй размерности: убедись, что каналы и пространственные размеры совместимы
  4. Проверяй масштабирование: протестируй разные масштабы модели (n, s, m)

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

  • Задай параметр nc в начале YAML-файла так, чтобы он соответствовал числу классов в наборе данных.

    nc: 5 # 5 classes
  • Да. Можно использовать любой поддерживаемый модуль, в том числе бэкбоны TorchVision, или определить собственный пользовательский модуль и импортировать его, как описано в разделе Интеграция пользовательского модуля.

  • Используй раздел scales в YAML-файле, чтобы задать коэффициенты масштабирования глубины, ширины и максимального числа каналов. При загрузке базового YAML-файла с указанием масштаба в имени файла (например, yolo26n.yaml) модель автоматически применит эти коэффициенты.

  • Этот формат задаёт способ построения каждого слоя:

    • from: источник (источники) входных данных
    • repeats: количество повторений модуля
    • module: тип слоя
    • args: аргументы модуля
  • Проверь, что выходное число каналов одного слоя совпадает с ожидаемым входным числом каналов следующего. Используй print(model.model.model), чтобы проверить архитектуру модели.

  • Проверь исходный код в каталоге ultralytics/nn/modules, чтобы найти все доступные модули и их аргументы.

  • Определи модуль в исходном коде, импортируй его, как показано в разделе Изменение исходного кода, и укажи его имя в YAML-файле.

  • Да, для загрузки весов из предварительно обученной контрольной точки можно использовать model.load("path/to/weights"). Однако загрузятся только веса слоёв, которые совпадают.

  • Используй model.info(), чтобы проверить, что количество FLOPs не равно нулю. У корректной модели количество FLOPs должно быть ненулевым. Если оно равно нулю, следуй советам из раздела Советы по отладке, чтобы найти проблему.

Комментарии