Cargar YOLOv5 desde PyTorch Hub#
📚 Esta guía explica cómo cargar YOLOv5 🚀 desde PyTorch Hub en https://pytorch.org/hub/ultralytics_yolov5.
Antes de empezar#
Instala requirements.txt en un entorno Python>=3.8.0, incluido PyTorch>=1.8. Los modelos y los conjuntos de datos se descargan automáticamente desde la última versión de YOLOv5.
pip install -r https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txtNo es necesario clonar ultralytics/yolov5; PyTorch Hub obtiene el código automáticamente.
Cargar YOLOv5 con PyTorch Hub#
Ejemplo sencillo#
Este ejemplo carga un modelo YOLOv5s preentrenado desde PyTorch Hub como model y pasa una imagen para realizar la inferencia. 'yolov5s' es el modelo YOLOv5 más ligero y rápido. Para consultar los detalles de todos los modelos disponibles, revisa el README.
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Image
im = "https://ultralytics.com/images/zidane.jpg"
# Inference
results = model(im)
results.pandas().xyxy[0]
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tieEjemplo detallado#
Este ejemplo muestra la inferencia por lotes con fuentes de imagen PIL y OpenCV. results se puede imprimir en la consola, guardar en runs/hub, mostrar en pantalla en los entornos compatibles y devolver como tensores o dataframes de pandas.
import cv2
import torch
from PIL import Image
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Images
for f in "zidane.jpg", "bus.jpg":
torch.hub.download_url_to_file(f"https://ultralytics.com/images/{f}", f) # download 2 images
im1 = Image.open("zidane.jpg") # PIL image
im2 = cv2.imread("bus.jpg")[..., ::-1] # OpenCV image (BGR to RGB)
# Inference
results = model([im1, im2], size=640) # batch of images
# Results
results.print()
results.save() # or .show()
results.xyxy[0] # im1 predictions (tensor)
results.pandas().xyxy[0] # im1 predictions (pandas)
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tie
Para consultar todas las opciones de inferencia, revisa el método forward de AutoShape() de YOLOv5.
Configuración de la inferencia#
Los modelos YOLOv5 contienen varios atributos de inferencia, como el umbral de confianza, el umbral de IoU, etc., que se pueden establecer mediante:
model.conf = 0.25 # NMS confidence threshold
model.iou = 0.45 # NMS IoU threshold
model.agnostic = False # NMS class-agnostic
model.multi_label = False # NMS multiple labels per box
model.classes = None # (optional list) filter by class, i.e. = [0, 15, 16] for COCO persons, cats and dogs
model.max_det = 1000 # maximum number of detections per image
model.amp = False # Automatic Mixed Precision (AMP) inference
results = model(im, size=320) # custom inference sizeDispositivo#
Los modelos se pueden transferir a cualquier dispositivo después de crearlos:
model.cpu() # CPU
model.cuda() # GPU
model.to(device) # i.e. device=torch.device(0)Los modelos también se pueden crear directamente en cualquier device:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", device="cpu") # load on CPULas imágenes de entrada se transfieren automáticamente al dispositivo correcto del modelo antes de la inferencia.
Silenciar salidas#
Los modelos se pueden cargar de forma silenciosa con _verbose=False:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", _verbose=False) # load silentlyCanales de entrada#
Para cargar un modelo YOLOv5s preentrenado con 4 canales de entrada en lugar de los 3 predeterminados:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", channels=4)En este caso, el modelo estará compuesto por pesos preentrenados excepto la primera capa de entrada, que ya no tiene la misma forma que la capa de entrada preentrenada. La capa de entrada se inicializará con pesos aleatorios.
Número de clases#
Para cargar un modelo YOLOv5s preentrenado con 10 clases de salida en lugar de las 80 predeterminadas:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", classes=10)En este caso, el modelo estará compuesto por pesos preentrenados excepto las capas de salida, que ya no tienen la misma forma que las capas de salida preentrenadas. Las capas de salida se inicializarán con pesos aleatorios.
Forzar recarga#
Si tienes problemas con los pasos anteriores, establecer force_reload=True puede ayudar, ya que descarta la caché existente y fuerza una nueva descarga de la última versión de YOLOv5 desde PyTorch Hub. Las copias almacenadas en la caché se encuentran en ~/.cache/torch/hub; eliminar esa carpeta produce el mismo efecto.
model = torch.hub.load("ultralytics/yolov5", "yolov5s", force_reload=True) # force reloadInferencia de capturas de pantalla#
Para ejecutar la inferencia en la pantalla de tu equipo:
import torch
from PIL import ImageGrab
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Image
im = ImageGrab.grab() # take a screenshot
# Inference
results = model(im)Inferencia con varias GPU#
Los modelos YOLOv5 se pueden cargar en varias GPU en paralelo mediante inferencia con subprocesos:
import threading
import torch
def run(model, im):
"""Performs inference on an image using a given model and saves the output; model must support `.save()` method."""
results = model(im)
results.save()
# Models
model0 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=0)
model1 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=1)
# Inference
threading.Thread(target=run, args=[model0, "https://ultralytics.com/images/zidane.jpg"], daemon=True).start()
threading.Thread(target=run, args=[model1, "https://ultralytics.com/images/bus.jpg"], daemon=True).start()Entrenamiento#
Para cargar un modelo YOLOv5 para entrenamiento en lugar de inferencia, establece autoshape=False. Para cargar un modelo con pesos inicializados aleatoriamente (para entrenarlo desde cero), usa pretrained=False. En este caso, debes proporcionar tu propio script de entrenamiento. Como alternativa, consulta nuestro tutorial sobre el entrenamiento con datos personalizados de YOLOv5 para entrenar el modelo.
import torch
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False) # load pretrained
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False, pretrained=False) # load scratchResultados en Base64#
Para usar con servicios de API. Consulta el ejemplo de Flask REST API para obtener más información.
import base64
from io import BytesIO
from PIL import Image
results = model(im) # inference
results.ims # array of original images (as np array) passed to model for inference
results.render() # updates results.ims with boxes and labels
for im in results.ims:
buffered = BytesIO()
im_base64 = Image.fromarray(im)
im_base64.save(buffered, format="JPEG")
print(base64.b64encode(buffered.getvalue()).decode("utf-8")) # base64 encoded image with resultsResultados recortados#
Los resultados se pueden devolver y guardar como recortes de detecciones:
results = model(im) # inference
crops = results.crop(save=True) # cropped detections dictionaryResultados de Pandas#
Los resultados se pueden devolver como DataFrames de Pandas:
results = model(im) # inference
results.pandas().xyxy[0] # Pandas DataFramePandas Output (click to expand)
print(results.pandas().xyxy[0])
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tieResultados ordenados#
Los resultados se pueden ordenar por columna; por ejemplo, para ordenar de izquierda a derecha (eje x) la detección de los dígitos de una matrícula:
results = model(im) # inference
results.pandas().xyxy[0].sort_values("xmin") # sorted left-rightResultados en JSON#
Los resultados se pueden devolver en formato JSON una vez convertidos en dataframes de .pandas() mediante el método .to_json(). El formato JSON se puede modificar usando el argumento orient. Consulta la documentación de pandas .to_json() para obtener más información.
results = model(ims) # inference
results.pandas().xyxy[0].to_json(orient="records") # JSON img1 predictionsJSON Output (click to expand)
[
{
"xmin": 749.5,
"ymin": 43.5,
"xmax": 1148.0,
"ymax": 704.5,
"confidence": 0.8740234375,
"class": 0,
"name": "person"
},
{
"xmin": 433.5,
"ymin": 433.5,
"xmax": 517.5,
"ymax": 714.5,
"confidence": 0.6879882812,
"class": 27,
"name": "tie"
},
{
"xmin": 115.25,
"ymin": 195.75,
"xmax": 1096.0,
"ymax": 708.0,
"confidence": 0.6254882812,
"class": 0,
"name": "person"
},
{
"xmin": 986.0,
"ymin": 304.0,
"xmax": 1028.0,
"ymax": 420.0,
"confidence": 0.2873535156,
"class": 27,
"name": "tie"
}
]Modelos personalizados#
Este ejemplo carga con PyTorch Hub un modelo YOLOv5s personalizado, entrenado con VOC para 20 clases, 'best.pt'.
import torch
model = torch.hub.load("ultralytics/yolov5", "custom", path="path/to/best.pt") # local model
model = torch.hub.load("path/to/yolov5", "custom", path="path/to/best.pt", source="local") # local repoModelos TensorRT, ONNX y OpenVINO#
PyTorch Hub admite la inferencia con la mayoría de formatos de exportación de YOLOv5, incluidos los modelos entrenados de forma personalizada. Consulta el tutorial de exportación a TFLite, ONNX, CoreML y TensorRT para obtener más información sobre la exportación de modelos.
- TensorRT puede ser entre 2 y 5 veces más rápido que PyTorch en las pruebas de rendimiento con GPU.
- ONNX y OpenVINO pueden ser entre 2 y 3 veces más rápidos que PyTorch en las pruebas de rendimiento con CPU.
import torch
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.pt") # PyTorch
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.torchscript") # TorchScript
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.onnx") # ONNX
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_openvino_model/") # OpenVINO
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.engine") # TensorRT
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.mlmodel") # CoreML (macOS-only)
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.tflite") # TFLite
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_paddle_model/") # PaddlePaddleEntornos compatibles#
Ultralytics ofrece una variedad de entornos listos para usar, cada uno preinstalado con dependencias esenciales como CUDA, CUDNN, Python y PyTorch, para que puedas iniciar tus proyectos.
- Cuadernos de GPU gratuitos:
- Google Cloud: Guía de inicio rápido de GCP
- Amazon: Guía de inicio rápido de AWS
- Azure: Guía de inicio rápido de AzureML
- Docker: Guía de inicio rápido de Docker
Estado del proyecto#
Esta insignia indica que todas las pruebas de Integración continua (CI) de GitHub Actions de YOLOv5 se superan correctamente. 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 uniforme y fiable en macOS, Windows y Ubuntu, con pruebas que se realizan cada 24 horas y con cada nuevo commit.