Ансамблирование моделей YOLOv5

📚 Это руководство объясняет, как использовать Ultralytics YOLOv5 🚀 для ансамблирования моделей во время тестирования и вывода для улучшения mAP и Recall.

Из ансамблевого обучения:

Ансамблевое моделирование — это процесс, при котором создается несколько разнообразных моделей для прогнозирования результата, либо с использованием множества различных алгоритмов моделирования, либо с использованием разных наборов обучающих данных. Ансамблевая модель затем объединяет прогнозы каждой базовой модели и выдает один итоговый прогноз для ранее не встречавшихся данных. Мотивацией для использования ансамблевых моделей является снижение ошибки обобщения прогноза. Пока базовые модели разнообразны и независимы, ошибка прогнозирования модели уменьшается при использовании ансамблевого подхода. Этот подход ищет «мудрость толпы» при составлении прогноза. Несмотря на то, что ансамблевая модель содержит внутри несколько базовых моделей, она действует и работает как единая модель.

Перед началом

Клонируй репозиторий и установи 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. Подробности обо всех доступных моделях см. в таблице предобученных чекпоинтов.

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

Вывод:

val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients

val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
val: New cache created: ../datasets/coco/val2017.cache
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00,  1.05it/s]
                 all       5000      36335      0.746      0.626       0.68       0.49
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640)  # <--- baseline speed

Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.504  # <--- baseline mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.688
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.546
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.382
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.628
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.681  # <--- baseline mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826

Тестирование ансамбля

Несколько предобученных моделей можно объединить в ансамбль во время тестирования и вывода, просто добавив дополнительные модели к аргументу --weights в любой существующей команде val.py или detect.py. В этом примере тестируется ансамбль из 2 моделей:

  • YOLOv5x
  • YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half

Ты можешь перечислить столько чекпоинтов, сколько хочешь, включая пользовательские веса, такие как runs/train/exp-5/weights/best.pt. YOLOv5 автоматически запустит каждую модель, выровняет прогнозы по каждому изображению и усреднит результаты перед выполнением NMS.

Вывод:

val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients  # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients  # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']  # Ensemble notice

val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00,  1.52s/it]
                 all       5000      36335      0.747      0.637      0.692      0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640)  # <--- ensemble speed

Evaluating pycocotools mAP... saving runs/val/exp-3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.515  # <--- ensemble mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.699
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.557
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.387
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.638
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.689  # <--- ensemble mAR
 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.743
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844

Вывод ансамбля

Добавь дополнительные модели к аргументу --weights для выполнения вывода ансамбля:

python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images

Вывод:

YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']

image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp-2
Done. (0.223s)
YOLO inference result

Преимущества ансамблирования моделей

Ансамблирование моделей с YOLOv5 предлагает несколько преимуществ:

  1. Улучшенная точность: Как показано в примерах выше, ансамблирование нескольких моделей повышает mAP с 0.504 до 0.515, а mAR с 0.681 до 0.689.
  2. Лучшая обобщающая способность: Комбинирование разнообразных моделей помогает уменьшить переобучение и улучшает производительность на различных данных.
  3. Повышенная надежность: Ансамбли, как правило, более устойчивы к шуму и выбросам в данных.
  4. Взаимодополняющие сильные стороны: Разные модели могут лучше справляться с обнаружением различных типов объектов или работать лучше в разных условиях окружающей среды.

Основным компромиссом является увеличение времени вывода, что видно по показателям скорости (22.4 мс для одной модели против 39.5 мс для ансамбля).

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

Рассмотри возможность использования ансамблирования моделей в следующих сценариях:

  • Когда точность важнее скорости вывода
  • Для критически важных приложений, где необходимо минимизировать количество ложноотрицательных результатов
  • При обработке сложных изображений с разным освещением, окклюзиями или масштабом
  • Во время соревнований или бенчмаркинга, где требуется максимальная производительность

Для приложений реального времени со строгими требованиями к задержке вывод одной модели может быть более подходящим.

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

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

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

YOLOv5 CI

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

Комментарии