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