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

Обрезка моделей и разреженность в YOLOv5

📚 Это руководство объясняет, как применять обрезку в моделях YOLOv5 🚀 для создания более эффективных сетей при сохранении производительности.

Что такое обрезка модели?

Обрезка модели - это техника, используемая для уменьшения размера и сложности нейронных сетей путем удаления менее важных параметров (весов и связей). Этот процесс позволяет создать более эффективную модель с рядом преимуществ:

  • Уменьшенный размер модели для упрощения развертывания на устройствах с ограниченными ресурсами
  • Более высокая скорость умозаключений при минимальном влиянии на точность
  • Снижение потребления памяти и энергопотребления
  • Повышение общей эффективности приложений, работающих в режиме реального времени

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

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

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

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

Тестирование базовой производительности

Перед обрезкой установите базовую производительность для сравнения. Эта команда тестирует YOLOv5x на COCO val2017 при размере изображения 640 пикселей. yolov5x.pt это самая большая и точная модель из имеющихся. Другие варианты yolov5s.pt, yolov5m.pt и yolov5l.pt, или ваша собственная контрольная точка, полученная в результате обучения пользовательского набора данных ./weights/best.pt. Подробную информацию о всех доступных моделях см. в файле README таблица.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

Выход:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_hybrid=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00,  2.16it/s]
                 all       5000      36335      0.732      0.628      0.683      0.496
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- base speed

Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.507  # <--- base mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.689
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.552
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.381
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.630
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.682
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.731
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
Results saved to runs/val/exp

Примените обрезку к YOLOv5x (30 % разреженности)

Мы можем применить обрезку к модели, используя torch_utils.prune() команда. Чтобы протестировать обрезанную модель, мы обновляем val.py для обрезки YOLOv5x до 0,3 разреженности (30% весов установлены в ноль):

Скриншот, показывающий код для обрезки YOLOv5x до 30 % разреженности

30 % обрезков:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_hybrid=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
Pruning model...  0.3 global sparsity
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00,  2.19it/s]
                 all       5000      36335      0.724      0.614      0.671      0.478
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- prune speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.489  # <--- prune mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.677
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.537
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.370
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.612
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.664
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
Results saved to runs/val/exp3

Анализ результатов

Из полученных результатов можно сделать вывод:

  • Достигнуто 30 % разреженности: 30% весовых параметров модели в nn.Conv2d слои теперь равны нулю
  • Время вывода остается неизменным: Несмотря на обрезку, скорость обработки остается практически той же
  • Минимальное влияние на производительность: mAP немного снизился с 0,507 до 0,489 (снижение всего на 3,6%).
  • Уменьшение размера модели: Обрезанная модель требует меньше памяти для хранения

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

Тонкая настройка обрезанных моделей

Для достижения наилучших результатов обрезанные модели должны быть точно настроены после обрезки, чтобы восстановить точность. Это можно сделать следующим образом:

  1. Применение обрезки с желаемым уровнем разреженности
  2. Обучение обрезанной модели в течение нескольких эпох с меньшей скоростью обучения
  3. Оценка тонко настроенной обрезанной модели в сравнении с базовой моделью

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

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

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

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

YOLOv5 CI

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

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

Комментарии