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

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 аргумент в команде обучения. Этот аргумент указывает индекс первого размороженный модуля; все модули до этого индекса будут иметь замороженные веса. Используйте model.model (a nn.Sequential) для проверки упорядочивания модулей, если вам нужно подтвердить, какие индексы соответствуют определенному блоку.

Заморозить только 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 при сравнении различных стратегий замораживанияСравнение mAP50 во время тренировки

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

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

Заморозка большего количества слоев существенно снижает требования к памяти 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 часа и при каждом новом коммите кода.



📅 Создано 2 года назад ✏️ Обновлено 1 день назад
glenn.jocher@ultralytics.comUltralyticsAssistantRizwanMunawar

Комментарии