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

Ансамблирование моделей 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. В этом примере тестируется ансамбль из двух моделей:

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

Вы можете перечислить столько контрольных точек, сколько пожелаете, включая пользовательские веса, такие как runs/train/exp5/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/exp3/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/exp2
Done. (0.223s)

Результат вывода YOLO

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

Объединение моделей с 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 часа и при каждом новом коммите.



📅 Создано 2 года назад ✏️ Обновлено 1 день назад
glenn.jocher@ultralytics.comLaughing-qUltralyticsAssistantRizwanMunawar

Комментарии