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

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

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

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

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

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

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

Когда вы замораживаете слои в нейронная сетьВы предотвращаете обновление их параметровweights and biases) в процессе обучения. В 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 обычно состоит из основы (слои 0-9 в стандартных конфигурациях, таких как YOLOv5s/m/l/x), отвечающей за извлечение признаков, и головы (остальные слои), выполняющей обнаружение объектов.

# 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 аргумент в команде обучения. Этот аргумент задает индекс первого размороженный модуль; все модули до этого индекса будут иметь замороженные веса.

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

Заморозить весь хребет (слои с 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 гири (yolov5m.pt). Мы сравнили три сценария: обучение всех слоев (--freeze 0), замораживание позвоночника (--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 требования к памяти и общую нагрузку. Это делает трансферное обучение с замороженными слоями привлекательным вариантом при работе с ограниченными аппаратными ресурсами, позволяя обучать более крупные модели или использовать изображения большего размера, чем это было бы возможно в противном случае.

Доля памяти, выделенной GPU во время обучения Распределенная память GPU (%)

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

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

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

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

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

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

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

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

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

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



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

Комментарии