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.
Perguntas frequentes#
Qualquer número. Lista todos os pontos de verificação após
--weights, por exemplo--weights yolov5x.pt yolov5l6.pt runs/train/exp/weights/best.pt. O tempo de inferência aumenta aproximadamente em proporção ao número de modelos.Sim. As previsões são concatenadas antes de NMS, por isso cada modelo deve ser treinado na mesma lista de classes na mesma ordem. Os tamanhos de entrada e as arquiteturas podem diferir.
Sim. Adiciona
--augmentao mesmo comandoval.pyoudetect.pypara aplicar TTA a cada modelo no conjunto.A criação de conjuntos é gerida pelo módulo PyTorch
Ensembleemmodels/experimental.py, pelo que se aplica apenas a pontos de verificação.pt. Exporta cada modelo separadamente se precisares de ficheiros ONNX ou TensorRT.