Ансамблирование моделей 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)

Преимущества ансамблирования моделей
Объединение моделей с YOLOv5 предоставляет несколько преимуществ:
- Повышение точности: Как показано в примерах выше, объединение нескольких моделей повышает mAP с 0,504 до 0,515 и mAR с 0,681 до 0,689.
- Улучшенная генерализация: Объединение различных моделей помогает уменьшить переобучение и повышает производительность на разнообразных данных.
- Повышенная устойчивость: Ансамбли, как правило, более устойчивы к шуму и выбросам в данных.
- Взаимодополняющие сильные стороны: Различные модели могут превосходить другие при обнаружении различных типов объектов или в различных условиях окружающей среды.
Основным компромиссом является увеличение времени инференса, как показано в метриках скорости (22,4 мс для одной модели против 39,5 мс для ансамбля).
Когда следует использовать ансамблирование моделей
Рассмотрите возможность использования ансамбля моделей в следующих сценариях:
- Когда точность важнее скорости инференса
- Для критически важных приложений, где необходимо свести к минимуму ложные срабатывания
- При обработке сложных изображений с различным освещением, окклюзией или масштабом
- Во время соревнований или бенчмаркинга, где требуется максимальная производительность
Для приложений реального времени со строгими требованиями к задержке более подходящим может быть вывод с использованием одной модели.
Поддерживаемые среды
Ultralytics предоставляет ряд готовых к использованию сред, каждая из которых предварительно установлена с необходимыми зависимостями, такими как CUDA, CUDNN, Python и PyTorch, чтобы дать старт вашим проектам.
- Бесплатные блокноты GPU:
- Google Cloud: Краткое руководство по GCP
- Amazon: Краткое руководство по AWS
- Azure: Краткое руководство по AzureML
- Docker: Краткое руководство по Docker
Статус проекта
Этот значок указывает на то, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти тесты CI тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и бенчмарки. Они обеспечивают стабильную и надежную работу в macOS, Windows и Ubuntu, при этом тесты проводятся каждые 24 часа и при каждом новом коммите.