Трансферное обучение с замороженными слоями в 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-95 во время тренировки
Сводная таблица показателей эффективности
Использование ресурсов
Замораживание большего количества слоев существенно снижает GPU требования к памяти и общую нагрузку. Это делает трансферное обучение с замороженными слоями привлекательным вариантом при работе с ограниченными аппаратными ресурсами, позволяя обучать более крупные модели или использовать изображения большего размера, чем это было бы возможно в противном случае.
Распределенная память GPU (%)
Использование GPU (%)
Когда использовать замораживание слоев
Замораживание слоев при обучении переносу особенно полезно в нескольких ситуациях:
- Ограниченные вычислительные ресурсы: Если вы ограничены в памяти GPU или вычислительной мощности.
- Небольшие наборы данных: Когда целевой набор данных значительно меньше исходного набора данных для предварительного обучения, замораживание помогает избежать чрезмерной подгонки.
- Быстрое прототипирование: Когда необходимо быстро адаптировать существующую модель к новой задаче или области для первоначальной оценки.
- Схожие домены признаков: Если низкоуровневые признаки в новом наборе данных очень похожи на признаки в наборе данных, на котором была предварительно обучена модель.
Узнайте больше о тонкостях трансферного обучения в нашем глоссарии и рассмотрите такие методы, как настройка гиперпараметров для оптимизации производительности.
Поддерживаемые среды
Ultralytics предлагает различные готовые к использованию среды с такими необходимыми зависимостями, как CUDA, CuDNN, Pythonи PyTorch предустановлены.
- Бесплатные блокноты GPU:
- Google Облако: Руководство по быстрому запуску GCP
- Amazon: Руководство по быстрому запуску AWS
- Azure: Руководство по быстрому запуску AzureML
- Docker: Руководство по быстрому запуску Docker
Статус проекта
Этот значок подтверждает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно оценивают функциональность и производительность YOLOv5 во всех ключевых операциях: обучение, проверка, вывод, экспорт и контрольные показатели. Они обеспечивают последовательную и надежную работу на macOS, Windows и Ubuntu, автоматически запускаясь каждые 24 часа и при каждом новом коммите кода.