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

Трансферное обучение с замороженными слоями в YOLOv5

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

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

Клонируйте репозиторий и установите файл requirements.txt в Python.8.0 в среду, включая PyTorch.8. Модели и наборы данных загружаются автоматически из последнейверсии YOLOv5 .

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

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

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

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

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

Чтобы эффективно замораживать определенные части модели, полезно понимать структуру слоев. Вы можете просмотреть имена всех модулей с помощью:

for k, v in model.named_parameters():
    print(k)

"""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 состоит из магистрали (слои 0-9) и головы (остальные слои):

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13
    # ... remaining head layers

Варианты замораживания

Заморозить только заднюю линию

Заморозить только основу (слои 0-9), что полезно для адаптации модели к новым классам при сохранении изученных возможностей извлечения признаков:

python train.py --freeze 10

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

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

Заморозить всю модель, за исключением слоев свертки с конечным выходом в модуле Detect:

python train.py --freeze 24

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

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

Мы обучили YOLOv5m на наборе данных VOC, используя различные стратегии замораживания, начиная с официальных предварительно обученных весов COCO:

python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

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

Результаты показывают, что замораживание слоев ускоряет обучение, но несколько снижает итоговую точность:

Результаты тренировки по замораживанию mAP50

Результаты тренировки по замораживанию mAP50-95

Результаты таблицы

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

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

Обучение GPU процент выделенной памяти

Обучение GPU процент использования памяти

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

Замораживание слоев в трансферном обучении особенно полезно в таких сценариях, как:

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

Более подробную информацию о методах трансферного обучения и их применении см. в глоссарии трансферного обучения.

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

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

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

YOLOv5 CI

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

📅 Создано 1 год назад ✏️ Обновлено 8 дней назад

Комментарии