Combinação de modelos YOLOv5#
📚 Este guia explica como usar a 🚀 combinação de modelos do Ultralytics YOLOv5 durante os testes e a inferência para melhorar o mAP e a Revocação.
A modelagem em conjunto é um processo no qual vários modelos diversificados são criados para prever um resultado, seja usando vários algoritmos de modelagem diferentes, seja usando diferentes conjuntos de dados de treino. O modelo em conjunto agrega então a previsão de cada modelo base e produz uma previsão final para os dados não vistos. A motivação para usar modelos em conjunto é reduzir o erro de generalização da previsão. Desde que os modelos base sejam diversificados e independentes, o erro de previsão do modelo diminui quando a abordagem de conjunto é usada. Essa abordagem procura aproveitar a sabedoria das multidões para fazer uma previsão. Embora o modelo em conjunto contenha vários modelos base, ele atua e apresenta o desempenho de um único modelo.
Antes de Começares#
Clona o repositório e instala o requirements.txt num ambiente Python>=3.8.0, incluindo PyTorch>=1.8. Os modelos e os conjuntos de dados são transferidos automaticamente a partir da versão mais recente do YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installTestar normalmente#
Antes de combinar os modelos, estabeleça o desempenho de referência de um único modelo. Este comando testa o YOLOv5x no COCO val2017 com tamanho de imagem de 640 píxeis. yolov5x.pt é o maior e mais preciso modelo disponível. Outras opções são yolov5s.pt, yolov5m.pt e yolov5l.pt, ou o seu próprio checkpoint resultante do treino num conjunto de dados personalizado ./weights/best.pt. Para obter detalhes sobre todos os modelos disponíveis, consulte a tabela de checkpoints pré-treinados.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --halfSaí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.826Testar o conjunto#
Vários modelos pré-treinados podem ser combinados durante os testes e a inferência, bastando acrescentar modelos adicionais ao argumento --weights em qualquer comando val.py ou detect.py existente. Este exemplo testa um conjunto de 2 modelos em conjunto:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --halfPode listar quantos checkpoints quiser, incluindo pesos personalizados como runs/train/exp5/weights/best.pt. O YOLOv5 executará automaticamente cada modelo, alinhará as previsões por imagem e calculará a média das saídas antes de executar a NMS.
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.844Inferência com conjunto#
Acrescente modelos adicionais ao argumento --weights para executar a inferência com o conjunto:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/imagesSaí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)
Vantagens da combinação de modelos#
A combinação de modelos com YOLOv5 oferece várias vantagens:
- Maior precisão: conforme demonstrado nos exemplos acima, combinar vários modelos aumenta o mAP de 0.504 para 0.515 e o mAR de 0.681 para 0.689.
- Melhor generalização: combinar modelos diversificados ajuda a reduzir o sobreajuste e melhora o desempenho em dados variados.
- Maior robustez: os conjuntos são normalmente mais robustos ao ruído e aos valores atípicos nos dados.
- Pontos fortes complementares: modelos diferentes podem ser excelentes na deteção de diferentes tipos de objetos ou em diferentes condições ambientais.
A principal desvantagem é o aumento do tempo de inferência, conforme mostrado nas métricas de velocidade (22.4 ms para um único modelo contra 39.5 ms para o conjunto).
Quando usar a combinação de modelos#
Considere usar a combinação de modelos nos seguintes cenários:
- Quando a precisão é mais importante do que a velocidade de inferência
- Para aplicações críticas nas quais os falsos negativos devem ser minimizados
- Ao processar imagens desafiantes com iluminação, oclusão ou escala variadas
- Durante competições ou avaliações comparativas nas quais é necessário o máximo desempenho
Para aplicações em tempo real com requisitos rigorosos de latência, a inferência com um único modelo pode ser mais adequada.
Ambientes suportados#
A Ultralytics disponibiliza vários ambientes prontos a utilizar, cada um com dependências essenciais pré-instaladas, como CUDA, CUDNN, Python e PyTorch, para iniciares os teus projetos.
- Notebooks GPU gratuitos:
- Google Cloud: Guia de início rápido do GCP
- Amazon: Guia de início rápido da AWS
- Azure: Guia de início rápido do 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 GitHub Actions do YOLOv5 estão a passar com sucesso. Estes testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspetos importantes: treino, validação, inferência, exportação e benchmarks. Garantem um funcionamento consistente e fiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e após cada novo commit.