Перейти к содержанию

Transfer Learning с замороженными слоями в YOLOv5

📚 В этом руководстве объясняется, как заморозить слои YOLOv5 🚀 при реализации трансферного обучения. Трансферное обучение — это мощный метод машинного обучения (ML), который позволяет быстро переобучить модель на новых данных без переобучения всей сети с нуля. Замораживая веса начальных слоев и обновляя только параметры более поздних слоев, можно значительно снизить требования к вычислительным ресурсам и время обучения. Однако этот подход может незначительно повлиять на конечную точность модели.

Прежде чем начать

Сначала клонируйте репозиторий YOLOv5 и установите необходимые зависимости, перечисленные в requirements.txt. Убедитесь, что у вас есть Python>=3.8.0 среда с PyTorch>=1.8 установлен. Предварительно обученный моделей и необходимые datasets будет автоматически загружен из последней версии YOLOv5 релиз.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

Как работает заморозка слоев

Когда вы замораживаете слои в нейронная сеть, вы предотвращаете обновление их параметров (весов и смещений) в процессе обучения. В PyTorch это достигается путем установки requires_grad атрибут тензоров слоя в False. Следовательно, градиенты не вычисляются для этих слоев во время обратное распространение, что экономит вычислительные ресурсы и память.

Вот как YOLOv5 реализует заморозку слоев в своем скрипте обучения:

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

Изучение архитектуры модели

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

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

Архитектура YOLOv5 обычно состоит из backbone (слои 0-9 в стандартных конфигурациях, таких как YOLOv5s/m/l/x), отвечающего за извлечение признаков, и head (остальные слои), который выполняет обнаружение объектов.

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

Параметры заморозки

Вы можете контролировать, какие слои заморожены, используя --freeze аргумент в команде обучения. Этот аргумент указывает индекс первого размороженный модуль; все модули до этого индекса будут иметь замороженные веса.

Заморозить только Backbone

Чтобы заморозить всю базовую сеть (слои с 0 по 9), что часто делается при адаптации модели к новым классам объектов, сохраняя при этом общие возможности извлечения признаков, полученные из большого набора данных, такого как COCO:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

Эта стратегия эффективна, когда ваш целевой набор данных имеет схожие визуальные признаки низкого уровня (грани, текстуры) с исходными данными обучения (например, COCO), но содержит другие категории объектов.

Заморозка всех слоев, кроме финальных слоев обнаружения

Чтобы заморозить почти всю сеть, оставив только последние выходные сверточные слои (часть Detect модуль, обычно последний модуль, например, модуль 24 в YOLOv5s) обучаемый:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

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

Сравнение производительности

Чтобы проиллюстрировать эффект замораживания слоев, мы обучили YOLOv5m на Датасет Pascal VOC на 50 эпох, начиная с официального COCO, предварительно обученного weights (yolov5m.pt). Мы сравнили три сценария: обучение всех слоев (--freeze 0), заморозке backbone (--freeze 10), и заморозке всех слоев, кроме последних слоев обнаружения (--freeze 24).

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10

Результаты точности

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

Результаты обучения mAP50, сравнивающие различные стратегии заморозки Сравнение mAP50 во время обучения

Результаты обучения mAP50-95, сравнивающие различные стратегии заморозки Сравнение mAP50-95 во время обучения

Таблица, суммирующая результаты производительности Сводная таблица показателей производительности

Использование ресурсов

Заморозка большего количества слоев существенно снижает требования к памяти GPU и общую загрузку. Это делает transfer learning с замороженными слоями привлекательным вариантом при работе с ограниченными аппаратными ресурсами, позволяя обучать более крупные модели или использовать изображения большего размера, чем это было бы возможно в противном случае.

Процент выделенной памяти GPU во время обучения Выделено памяти GPU (%)

Процент использования памяти GPU во время обучения Использование GPU (%)

Когда следует использовать заморозку слоев

Замораживание слоев во время transfer learning особенно выгодно в нескольких ситуациях:

  1. Ограниченные вычислительные ресурсы: Если у вас есть ограничения по памяти GPU или вычислительной мощности.
  2. Небольшие наборы данных: Когда целевой набор данных значительно меньше исходного набора данных предварительного обучения, заморозка помогает предотвратить переобучение.
  3. Быстрое прототипирование: Когда вам нужно быстро адаптировать существующую модель к новой задаче или области для первоначальной оценки.
  4. Схожие области признаков: Если низкоуровневые признаки в вашем новом наборе данных очень похожи на признаки в наборе данных, на котором была предварительно обучена модель.

Узнайте больше о нюансах transfer learning в нашей статье глоссария и рассмотрите такие методы, как настройка гиперпараметров, для оптимизации производительности.

Поддерживаемые среды

Ultralytics предлагает различные готовые к использованию среды с необходимыми зависимостями, такими как CUDA, CuDNN, Python и PyTorch, предустановленными.

Статус проекта

Статус непрерывной интеграции YOLOv5

Этот значок подтверждает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно оценивают функциональность и производительность YOLOv5 по ключевым операциям: обучение, валидация, вывод, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу в macOS, Windows и Ubuntu, запускаясь автоматически каждые 24 часа и при каждом новом коммите кода.



📅 Создано 1 год назад ✏️ Обновлено 4 месяца назад

Комментарии