Agregação de Modelos YOLOv5
📚 Este guia explica como usar o model ensembling (combinação de modelos) do Ultralytics YOLOv5 🚀 durante o teste e a inferência para melhorar o mAP e o Recall.
A modelagem em conjunto é um processo onde vários modelos diversos são criados para prever um resultado, seja usando muitos algoritmos de modelagem diferentes ou usando diferentes conjuntos de dados de treino. O modelo de conjunto agrega então a previsão de cada modelo base e resulta numa previsão final para os dados não vistos. A motivação para usar modelos de conjunto é reduzir o erro de generalização da previsão. Desde que os modelos base sejam diversos e independentes, o erro de previsão do modelo diminui quando a abordagem de conjunto é usada. A abordagem procura a sabedoria das multidões ao fazer uma previsão. Mesmo que o modelo de conjunto tenha vários modelos base dentro do modelo, ele atua e funciona como um único modelo.
Antes de Começar
Clone o repositório e instale os requirements.txt num ambiente Python>=3.8.0, incluindo PyTorch>=1.8. Os modelos e os conjuntos de dados são descarregados automaticamente a partir da última versão do YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Testar Normalmente
Antes do ensembling, estabeleça o desempenho de linha de base de um único modelo. Este comando testa o YOLOv5x no COCO val2017 no tamanho de imagem de 640 pixels. yolov5x.pt
é o maior e mais preciso modelo disponível. Outras opções são yolov5s.pt
, yolov5m.pt
e yolov5l.pt
, ou seu próprio checkpoint do treinamento de um conjunto de dados personalizado ./weights/best.pt
. Para obter detalhes sobre todos os modelos disponíveis, consulte o tabela de checkpoints pré-treinados.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
Saída:
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
Teste de Ensemble
Vários modelos pré-treinados podem ser combinados em tempo de teste e inferência, simplesmente anexando modelos extras ao --weights
argumento em qualquer comando val.py ou detect.py existente. Este exemplo testa um conjunto de 2 modelos juntos:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half
Saída:
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
Inferência em Conjunto
Anexe modelos extras ao --weights
argumento para executar a inferência ensemble:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images
Saída:
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)
Benefícios do Ensembling de Modelos
A combinação de modelos com YOLOv5 oferece diversas vantagens:
- Precisão Aprimorada: Conforme demonstrado nos exemplos acima, a combinação de vários modelos aumenta o mAP de 0,504 para 0,515 e o mAR de 0,681 para 0,689.
- Melhor Generalização: A combinação de diversos modelos ajuda a reduzir o overfitting e melhora o desempenho em dados variados.
- Robustez Aprimorada: Os ensembles são normalmente mais robustos a ruídos e outliers nos dados.
- Pontos Fortes Complementares: Diferentes modelos podem se destacar na detecção de diferentes tipos de objetos ou em diferentes condições ambientais.
A principal desvantagem é o aumento do tempo de inferência, como mostrado nas métricas de velocidade (22,4ms para modelo único vs. 39,5ms para ensemble).
Quando usar o Ensembling de Modelos
Considere usar o ensembling de modelos nestes cenários:
- Quando a precisão é mais importante do que a velocidade de inferência
- Para aplicações críticas onde falsos negativos devem ser minimizados
- Ao processar imagens desafiadoras com iluminação, oclusão ou escala variadas
- Durante competições ou benchmarking onde o desempenho máximo é necessário
Para aplicações em tempo real com requisitos de latência rigorosos, a inferência de modelo único pode ser mais apropriada.
Ambientes suportados
A Ultralytics oferece uma variedade de ambientes prontos para uso, cada um pré-instalado com dependências essenciais como CUDA, CUDNN, Python e PyTorch, para dar o pontapé inicial em seus projetos.
- Notebooks GPU Gratuitos:
- Google Cloud: Guia de Início Rápido do GCP
- Amazon: Guia de Início Rápido AWS
- Azure: Guia de Início Rápido AzureML
- Docker: Guia de Início Rápido do Docker
Estado do Projeto
Este selo indica que todos os testes de Integração Contínua (CI) das Ações do GitHub YOLOv5 estão sendo aprovados com sucesso. Esses testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspectos principais: treinamento, validação, inferência, exportação e benchmarks. Eles garantem uma operação consistente e confiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e a cada novo commit.