Aumentación durante la prueba (TTA)

📚 Esta guía explica cómo utilizar la Aumentación durante la prueba (TTA) durante el test y la inferencia para obtener mejores resultados de mAP y Recall con YOLOv5 🚀.

Antes de empezar

Clona el repositorio e instala requirements.txt en un entorno Python>=3.8.0, incluyendo PyTorch>=1.8. Los modelos y datasets se descargan automáticamente desde la última versión de YOLOv5.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Prueba normal

Antes de probar TTA, queremos establecer un rendimiento base con el cual comparar. Este comando prueba YOLOv5x en COCO val2017 con un tamaño de imagen de 640 píxeles. yolov5x.pt es el modelo más grande y preciso disponible. Otras opciones son yolov5s.pt, yolov5m.pt y yolov5l.pt, o tu propio punto de control tras entrenar un conjunto de datos personalizado ./weights/best.pt. Para obtener detalles sobre todos los modelos disponibles, consulta nuestra documentación de YOLOv5.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

Salida:

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

Prueba con TTA

Añade --augment a cualquier comando existente de val.py para habilitar TTA y aumenta el tamaño de la imagen en aproximadamente un 30% para obtener mejores resultados. Ten en cuenta que la inferencia con TTA habilitado normalmente tardará entre 2 y 3 veces más que la inferencia normal, ya que las imágenes se voltean de izquierda a derecha y se procesan en 3 resoluciones diferentes, con las salidas combinadas antes de NMS. Parte de la reducción de velocidad se debe simplemente a los tamaños de imagen más grandes (832 frente a 640), mientras que otra parte se debe a las operaciones de TTA reales, así que asegúrate de que tu GPU tenga suficiente margen de memoria antes de aumentar --img.

python val.py --weights yolov5x.pt --data coco.yaml --img 832 --augment --half

Salida:

val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=832, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=True, 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...
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  /pytorch/c10/core/TensorImpl.h:1156.)
  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
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, 2885.61it/s]
val: New cache created: ../datasets/coco/val2017.cache
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [07:29<00:00,  2.86s/it]
                 all       5000      36335      0.718      0.656      0.695      0.503
Speed: 0.2ms pre-process, 80.6ms inference, 2.7ms NMS per image at shape (32, 3, 832, 832)  # <--- TTA speed

Evaluating pycocotools mAP... saving runs/val/exp-2/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.516  # <--- TTA mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.701
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.562
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.361
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.564
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.656
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.388
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.640
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.696  # <--- TTA mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.553
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.744
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.833

Inferencia con TTA

La inferencia TTA en detect.py funciona de forma idéntica a la de val.py: simplemente añade --augment a cualquier comando existente de detect.py:

python detect.py --weights yolov5s.pt --img 832 --source data/images --augment

Salida:

YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Downloading https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt to yolov5s.pt...
100% 14.1M/14.1M [00:00<00:00, 81.9MB/s]

Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 /content/yolov5/data/images/bus.jpg: 832x640 4 persons, 1 bus, 1 fire hydrant, Done. (0.029s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 480x832 3 persons, 3 ties, Done. (0.024s)
Results saved to runs/detect/exp
Done. (0.156s)
YOLOv5 test time augmentations

TTA en PyTorch Hub

TTA está integrado automáticamente en todos los modelos de YOLOv5 PyTorch Hub y se puede acceder a él pasando augment=True en el momento de la inferencia.

import torch

# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")  # or yolov5m, yolov5x, custom

# Images
img = "https://ultralytics.com/images/zidane.jpg"  # or file, PIL, OpenCV, numpy, multiple

# Inference
results = model(img, augment=True)  # <--- TTA inference

# Results
results.print()  # or .show(), .save(), .crop(), .pandas(), etc.

Personalización

Puedes personalizar las operaciones de TTA aplicadas en el método forward_augment() de YOLOv5.

Beneficios de la Aumentación durante la prueba

La Aumentación durante la prueba ofrece varias ventajas clave para las tareas de detección de objetos:

  • Mayor precisión: Como se demuestra en los resultados anteriores, TTA aumenta el mAP de 0.504 a 0.516 y el mAR de 0.681 a 0.696.
  • Mejor detección de objetos pequeños: TTA mejora especialmente la detección de objetos pequeños, con un AP de área pequeña que mejora de 0.351 a 0.361.
  • Mayor robustez: Al probar múltiples variaciones de cada imagen, TTA reduce el impacto del ángulo de visión, la iluminación y otros factores ambientales.
  • Implementación sencilla: Solo requiere añadir el flag --augment a los comandos existentes.

El inconveniente es un mayor tiempo de inferencia, lo que hace que TTA sea más adecuado para aplicaciones donde se prioriza la precisión sobre la velocidad.

Entornos compatibles

Ultralytics ofrece una gama de entornos listos para usar, cada uno preinstalado con dependencias esenciales como CUDA, CUDNN, Python y PyTorch, para poner en marcha tus proyectos.

Estado del proyecto

YOLOv5 CI

Esta insignia indica que todas las pruebas de Integración Continua (CI) de GitHub Actions de YOLOv5 se están superando con éxito. Estas pruebas de CI comprueban rigurosamente la funcionalidad y el rendimiento de YOLOv5 en varios aspectos clave: entrenamiento, validación, inferencia, exportación y benchmarks. Garantizan un funcionamiento coherente y fiable en macOS, Windows y Ubuntu, con pruebas realizadas cada 24 horas y con cada nuevo commit.

Comentarios