Ultralytics YOLO27: Únete a la lista de espera.
Get Started
Entrena tu primer modelo YOLO·Predecir·Lección 2/10
Lecciónprincipiante

Predecir una imagen

Ejecuta un modelo YOLO26 preentrenado desde Python, lee las clases, las confianzas y las cajas en píxeles de los resultados, y ajusta los argumentos que resuelven la mayoría de los casos en los que no se detecta un objeto.

Todo uso real de un detector —contar existencias en una estantería, recortar caras para difuminarlas o enviar cajas a una API JSON— empieza por leer correctamente el objeto de resultado. Si te equivocas en un detalle, como indexar los nombres de clase con un tensor, la aplicación se bloqueará con la primera imagen.

Un modelo YOLO26 de detección preentrenado ya conoce las 80 clases de COCO. En esta lección ejecutarás el modo de predicción desde Python, extraerás de los resultados todos los campos útiles y aprenderás qué argumento cambiar cuando haya detecciones omitidas, duplicadas o de objetos pequeños. Más adelante, tu propio modelo entrenado devolverá el mismo objeto de resultado.

Resultado

Puedes escribir un script de Python que ejecute YOLO26 en imágenes e imprima el nombre de la clase, la confianza y la caja en píxeles de cada detección, y sabes qué argumento resuelve cada tipo de detección omitida.

Vía rápida
Si ya tienes experiencia, aquí tienes un resumen.
  1. Cárgalo una vez: model = YOLO('yolo26n.pt'); después, result = model(source)[0].

  2. Recorre result.boxes; conviértelo con int(box.cls), float(box.conf), box.xyxy[0].tolist().

  3. Asocia los índices de clase con sus nombres usando result.names[int(box.cls)].

  4. Ajusta conf, iou, imgsz y classes en cada llamada.

Práctico

Predice e imprime todas las detecciones#

Detecciones de Ultralytics YOLO en un paseo marítimo: cajas con etiquetas y puntuaciones de confianza alrededor de personas, bicicletas, un perro y coches

Al llamar al modelo con una fuente, se ejecuta el modo de predicción y se devuelve una lista con un objeto Results por imagen. Si solo hay una imagen, lee results[0].

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")

result = results[0]
for box in result.boxes:
    name = result.names[int(box.cls)]
    conf = float(box.conf)
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    print(f"{name:>8} {conf:.2f}  ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")

result.save("bus_annotated.jpg")

Salida real de predict.py, después de la línea de registro habitual:

     bus 0.88  (0, 230) -> (803, 751)
  person 0.87  (49, 398) -> (240, 902)
  person 0.86  (223, 405) -> (345, 861)
  person 0.85  (670, 395) -> (810, 880)
  person 0.65  (0, 553) -> (60, 871)

Cómo leerla:

  • bus 0.88: nombre de clase y confianza. Las cajas están ordenadas por confianza, de mayor a menor.
  • (0, 230) -> (803, 751): esquinas superior izquierda e inferior derecha en píxeles de la imagen original de 810×1080, con el origen en la esquina superior izquierda. Puedes recortar o dibujar directamente con estas coordenadas.
  • person 0.65 en (0, 553): una quinta persona, cortada por el borde izquierdo, obtiene una puntuación más baja. Los objetos parciales suelen tenerla.

result.save() escribe la imagen anotada; result.show() la abre en una ventana.

Qué contiene un resultado#

Todas las tareas devuelven el mismo tipo Results; solo cambian los campos que se rellenan. Consulta todos los campos disponibles en la guía de uso de Python.

AtributoContiene
boxesDetecciones: píxeles xyxy, formato normalizado de centro xywhn, conf, cls y id cuando se usa seguimiento
masks, keypoints, obb, probsSalidas de los modelos de segmentación, pose, OBB y clasificación (None para un modelo de detección)
namesDiccionario de índice de clase → nombre de clase
orig_img, orig_shapeLa imagen de entrada como matriz NumPy y su alto × ancho
speedTiempo de preprocesamiento, inferencia y posprocesamiento en ms
path, save_dirDe dónde procede la entrada y dónde se escribieron las salidas

Para la detección de objetos, normalmente solo necesitas boxes, las cajas delimitadoras. result.summary() devuelve las mismas detecciones como una lista de diccionarios simples, lista para una API JSON.

Ajusta la predicción#

Los valores predeterminados sirven para la mayoría de las imágenes. Si no es así, cambia un argumento cada vez:

Problema que observasParámetroPredeterminadoQué cambiar
Detecciones omitidas: un objeto visible no tiene cajaconf0.25Bájalo, por ejemplo, 0.1
Falsos positivos: aparecen cajas donde no hay nadaconf0.25Súbelo, por ejemplo, 0.5
Dos cajas para un mismo objetoiou0.7Bájalo: el umbral de solapamiento (IoU) de NMS para fusionar duplicados
No se detectan objetos pequeños y lejanosimgsz640Súbelo, por ejemplo, 1280 (se redondea a un múltiplo de 32)
Solo importan algunas clasesclassestodasPor ejemplo, classes=[0] para personas
Hardware incorrectodeviceautomáticocpu, mps o un índice de GPU como 0

La confianza cambia el resultado, no solo la cantidad. En la misma imagen de un autobús:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0])  # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1)  # 5 personas, 1 autobús, 1 señal de stop

Con conf=0.1, el modelo también informa de una señal de stop sobre la que no estaba seguro. Bajar conf es la forma más rápida de ver lo que el modelo casi ha detectado. Encontrarás todos los demás argumentos en la referencia de configuración.

Si una predicción no devuelve resultados, sigue estos pasos:

Ejecuta el modelo en varias imágenes#

Pasa una lista, una carpeta o un patrón glob como "photos/*.jpg". El valor predeterminado de Predict es batch=1; establece batch para procesar varias imágenes a la vez, lo que es mucho más rápido en una GPU:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
    print(result.path, len(result.boxes), result.verbose())
image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,

Evita estos errores#

Indexar nombres con un tensor

Síntoma: KeyError: tensor([5.]). Causa: box.cls y box.conf son tensores de PyTorch, y result.names es un diccionario con claves int. Solución: conviértelos primero: result.names[int(box.cls)], float(box.conf), box.xyxy[0].tolist().

Cargar el modelo en cada llamada

Síntoma: una función auxiliar que llama a YOLO("yolo26n.pt") dentro de la función se ejecuta lentamente. En la CPU de un portátil, volver a cargar el modelo para cada imagen tardó 71 ms, frente a 25 ms con el modelo cargado una sola vez. Solución: crea el modelo una vez al iniciar y reutilízalo con cada imagen.

¿Cientos de imágenes o cualquier vídeo? Procésalos en flujo

model(list_or_folder) recopila todos los objetos Results en memoria antes de devolverlos. Para carpetas grandes y vídeos, pasa stream=True y recorre el generador: los resultados llegan de uno en uno. La lección sobre vídeo lo explica en profundidad.

Pruébalo

Escribe top3.py: carga yolo26n.pt una vez, ejecútalo con bus.jpg, zidane.jpg y una foto propia, e imprime el número de detecciones de cada imagen y las tres clases con mayor confianza. Después, vuelve a ejecutar la imagen con menos detecciones en conf=0.1 y escribe una frase sobre lo que ha aparecido.

Cuándo se considera terminado
Has terminado la lección cuando se cumplen todas estas condiciones.
  • El script imprime el número de detecciones y las tres clases principales con sus confianzas para cada imagen, sin un KeyError.

  • Has comparado una imagen en conf=0.25 y conf=0.1 y has anotado qué ha cambiado.

  • Sabes qué argumento cambiarías para las detecciones omitidas, las cajas duplicadas y los objetos pequeños.

Mostrar solución
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]

for result in model(images, verbose=False):
    top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
    print(f"{result.path}: {len(result.boxes)} detections")
    for d in top3:
        print(f"  {d['name']:>8} {d['confidence']:.2f}")
image0.jpg: 5 detections
       bus 0.90
    person 0.85
    person 0.85
image1.jpg: 3 detections
    person 0.89
    person 0.79
       tie 0.59

summary() ya devuelve nombres simples y números decimales, así que no hay que convertir tensores. Las confianzas difieren ligeramente de predict.py porque las imágenes de una lista se rellenan hasta alcanzar una forma común. Con conf=0.1, bus.jpg añade una señal de stop.

Qué viene después

Has usado el modelo más pequeño. Ahora decide qué tamaño de YOLO26 debería entrenar y desplegar tu proyecto.