Validación de modelos con Ultralytics YOLO#
Introducción#
La validación es un paso fundamental en el flujo de trabajo del aprendizaje automático, ya que permite evaluar la calidad de los modelos entrenados. El modo Val de Ultralytics YOLO26 ofrece un conjunto sólido de herramientas y métricas para evaluar el rendimiento de los modelos de detección de objetos. Esta guía es un recurso completo para aprender a usar el modo Val de forma eficaz y asegurarte de que tus modelos sean precisos y fiables.
Consulta la vista previa de YOLO27, aún no publicada para ver los resultados preliminares de validación.
Ver: Tutorial sobre los modos de Ultralytics: validación
¿Por qué validar con Ultralytics YOLO?#
Estas son las ventajas de usar el modo Val de YOLO26:
- Precisión: Obtén métricas precisas como mAP50, mAP75 y mAP50-95 para evaluar tu modelo de forma exhaustiva.
- Comodidad: Aprovecha las funciones integradas que recuerdan los ajustes del entrenamiento y simplifican el proceso de validación.
- Flexibilidad: Valida tu modelo con los mismos conjuntos de datos o con otros distintos, y con tamaños de imagen iguales o diferentes.
- Ajuste de hiperparámetros: Usa las métricas de validación para ajustar tu modelo y mejorar su rendimiento.
Características principales del modo Val#
Estas son las funcionalidades destacadas que ofrece el modo Val de YOLO26:
- Ajustes automatizados: Los modelos recuerdan sus configuraciones de entrenamiento para facilitar la validación.
- Compatibilidad con varias métricas: Evalúa tu modelo mediante diversas métricas de precisión.
- CLI y API de Python: Elige entre la interfaz de línea de comandos y la API de Python según tus preferencias para la validación.
- Compatibilidad de datos: Funciona sin problemas tanto con los conjuntos de datos usados durante el entrenamiento como con conjuntos de datos personalizados.
- Los modelos YOLO26 recuerdan automáticamente sus ajustes de entrenamiento, así que
yolo val model=path/to/best.ptoYOLO("path/to/best.pt").val()valida con el tamaño de imagen del entrenamiento y el conjunto de datos original. Si se usan pesos oficiales, se recurre al conjunto de datos predeterminado de la tarea; pasadatapara anularlo.
Ejemplos de uso#
Valida la precisión de un modelo YOLO26n entrenado. No hacen falta argumentos, ya que model conserva el data y los argumentos del entrenamiento como atributos del modelo: path/to/best.pt valida con el conjunto de datos con el que se entrenó. Los pesos oficiales registran una ruta al conjunto de datos de entrenamiento que no existe en tu equipo, por lo que recurren al coco8.yaml predeterminado de la tarea y muestran una advertencia. Pasa data para validar con otro conjunto de datos. Consulta la sección Argumentos más abajo para ver la lista completa de argumentos de validación.
En Windows, puede aparecer un RuntimeError al iniciar la validación como script. Añade un bloque if __name__ == "__main__": antes del código de validación para solucionarlo.
from ultralytics import YOLO
# Cargar un modelo
model = YOLO("yolo26n.pt") # carga un modelo oficial
model = YOLO("path/to/best.pt") # cargar un modelo personalizado
# Valida el modelo
metrics = model.val() # no hacen falta argumentos; se recuerdan el conjunto de datos y los ajustes
metrics.box.map # map50-95
metrics.box.map50 # map50
metrics.box.map75 # map75
metrics.box.maps # una lista que contiene mAP50-95 para cada categoría
metrics.box.image_metrics # diccionario de métricas por imagen con precisión, exhaustividad, F1, TP, FP y FNArgumentos para la validación de modelos YOLO#
Al validar modelos YOLO, puedes ajustar varios argumentos para optimizar el proceso de evaluación. Estos argumentos controlan aspectos como el tamaño de la imagen de entrada, el procesamiento por lotes y los umbrales de rendimiento. A continuación se detalla cada argumento para ayudarte a personalizar los ajustes de validación de forma eficaz.
| Argumento | Tipo | Predeterminado | Descripción |
|---|---|---|---|
data | str | None | Especifica la ruta al YAML del conjunto de datos (p. ej., coco8.yaml), que debe incluir la ruta a los datos de validación. Para la clasificación, en cambio, se usa un directorio de conjunto de datos o el nombre de un conjunto de datos integrado (p. ej., imagenet10). |
imgsz | int | 640 | Define el tamaño de las imágenes de entrada. Todas las imágenes se redimensionan a estas dimensiones antes del procesamiento. Los tamaños mayores pueden mejorar la precisión en objetos pequeños, pero aumentan el tiempo de cálculo. |
batch | int | 16 | Establece el número de imágenes por lote. Los valores más altos aprovechan mejor la memoria de la GPU, pero requieren más VRAM. Ajústalo según los recursos de hardware disponibles. |
save_json | bool | False | Si True, guarda los resultados en un archivo JSON para analizarlos más adelante, integrarlos con otras herramientas o enviarlos a servidores de evaluación como COCO. En conjuntos de datos de detección, también evalúa las predicciones con faster-coco-eval e informa del mAP para objetos pequeños, medianos y grandes; durante el entrenamiento, estos valores se registran como metrics/mAP_small(B), metrics/mAP_medium(B) y metrics/mAP_large(B) en results.csv. |
conf | float | 0.001 | Establece el umbral mínimo de confianza para las detecciones. Los valores más bajos aumentan la exhaustividad, pero pueden introducir más falsos positivos. Las curvas de precisión-exhaustividad, el mAP y las matrices de confusión de detección usan este valor; un conf más alto, como 0.25, genera una matriz más parecida a la salida de predicción, pero puede reducir el mAP. La precisión y la exhaustividad resumidas usan la confianza de F1 máximo, por lo que pueden diferir de los valores derivados de confusion_matrix.png. El valor predeterminado para la validación OBB es 0.01 para reducir el uso de memoria. |
iou | float | 0.7 | Establece el umbral de intersección sobre unión para la supresión no máxima. Controla la eliminación de detecciones duplicadas. |
max_det | int | 300 | Limita el número máximo de detecciones por imagen. Para detect, segment, pose y OBB, si se mantiene en 300, se aumenta hasta el número más alto de objetos etiquetados en la partición validada cuando una imagen supera ese límite, con una advertencia; cualquier otro valor se mantiene, con una advertencia de que la exhaustividad puede quedar limitada si una imagen lo supera. |
quantize | int o str | None | Precisión de validación: 16/"fp16" y 32/"fp32"/sin definir seleccionan el cálculo FP16 o FP32 para los modelos PyTorch y TorchScript; los demás formatos calculan con la precisión que determinen su artefacto y entorno de ejecución. Con 16, OpenVINO sigue redondeando la entrada a FP16 en el cliente y volviéndola a ampliar a FP32, sin cambiar la precisión de cálculo del entorno de ejecución. La cuantización INT8/PTQ se configura durante la exportación y, después, se usa al validar el modelo exportado. Sustituye la marca obsoleta half. |
device | str | None | Especifica el dispositivo para la validación (cpu, cuda:0, npu, npu:0, etc.). Con None, selecciona automáticamente el mejor dispositivo disponible. Puedes especificar varios dispositivos CUDA separándolos con comas. |
dnn | bool | False | Si True, usa el módulo DNN de OpenCV para la inferencia de modelos ONNX, como alternativa a los métodos de inferencia de PyTorch. |
plots | bool | True | Si se establece en True, genera y guarda gráficos que comparan las predicciones con la verdad de referencia, matrices de confusión y curvas PR para evaluar visualmente el rendimiento del modelo. |
classes | list[int] | None | Especifica una lista de ID de clase que se van a evaluar. Es útil para filtrar y centrarse solo en determinadas clases durante la evaluación. |
rect | bool | True | Si True, usa inferencia rectangular para el procesamiento por lotes, lo que reduce el relleno y puede aumentar la velocidad y la eficiencia al procesar las imágenes con su relación de aspecto original. Se ignora durante la validación depth, que estira cada imagen a un cuadrado fijo de imgsz en lugar de añadir relleno. |
split | str | 'val' | Determina qué partición del conjunto de datos se usa para la validación (val, test o train). Permite elegir con flexibilidad el segmento de datos para evaluar el rendimiento. |
fraction | float, int o list | 1.0 | Subconjunto de la partición validada. Con una lista [train, val, test], se aplica la entrada que coincida con split (1 = partición completa; los enteros superiores a 1 = número de imágenes; las entradas omitidas corresponden a la partición completa). Un valor escalar solo se aplica con split=train; val y test usan entonces la partición completa. |
project | str | None | Nombre del directorio del proyecto donde se guardan los resultados de validación. Ayuda a organizar los resultados de distintos experimentos o modelos. |
name | str | None | Nombre de la ejecución de validación. Se usa para crear un subdirectorio dentro de la carpeta del proyecto, donde se guardan los registros y resultados de validación. |
verbose | bool | True | Si True, muestra información detallada durante el proceso de validación, incluidas las métricas por clase, el progreso de los lotes y más información de depuración. |
save_txt | bool | False | Si True, guarda los resultados de detección en archivos de texto, uno por imagen. Es útil para realizar análisis adicionales, posprocesamiento personalizado o integraciones con otros sistemas. |
save_conf | bool | False | Si True, incluye valores de confianza en los archivos de texto guardados cuando se activa save_txt, lo que proporciona resultados más detallados para el análisis y el filtrado. |
workers | int | 8 | Número de subprocesos de trabajo para cargar datos. Los valores más altos pueden acelerar el preprocesamiento, pero aumentar el uso de la CPU. Si se establece en 0, se usa el hilo principal, lo que puede ser más estable en algunos entornos. |
augment | bool | False | Activa el aumento en tiempo de prueba (TTA) durante la validación, lo que puede mejorar la precisión de detección a costa de la velocidad de inferencia al ejecutar la inferencia con versiones transformadas de la entrada. Solo está disponible para modelos PyTorch de Ultralytics. |
agnostic_nms | bool | False | Activa la supresión no máxima independiente de la clase, que suprime los cuadros solapados con puntuaciones más bajas sin tener en cuenta la clase predicha. Es útil en aplicaciones centradas en instancias. Con la inferencia sin NMS (nms=False en YOLO26 o YOLOv10), solo impide que la misma detección aparezca con varias etiquetas de clase (duplicados con IoU=1.0); no suprime cuadros distintos según el umbral de IoU. |
single_cls | bool | False | Trata todas las clases como una sola durante la validación. Es útil para evaluar el rendimiento del modelo en tareas de detección binaria o cuando las diferencias entre clases no son importantes. |
visualize | bool | False | Visualiza la verdad de referencia, los verdaderos positivos, los falsos positivos y los falsos negativos de cada imagen. Es útil para depurar e interpretar el modelo. |
show_labels | bool | True | Muestra las etiquetas de clase en las visualizaciones de validación cuando visualize=True. Configúralo en False para ver las coincidencias y los errores con más claridad. |
show_conf | bool | True | Muestra las puntuaciones de confianza en las visualizaciones de validación cuando visualize=True. Configúralo en False para ver las coincidencias y los errores con más claridad. |
compile | bool o str | False | Activa la compilación de grafos torch.compile de PyTorch 2.x con backend='inductor'. Acepta True → "default" para activarla, False → para desactivarla o un modo de cadena como "default", "reduce-overhead", "max-autotune-no-cudagraphs". Si no es compatible, vuelve al modo eager y muestra una advertencia. |
channels_last | bool | None | Usa el formato de memoria channels_last (NHWC) para la validación nativa de PyTorch. None lo activa automáticamente en CPU x86 con Linux y Windows, compatible con oneDNN y PyTorch 1.13 o posterior; False lo desactiva y True lo solicita en dispositivos CPU x86 o CUDA compatibles. ARM64, MPS, las versiones anteriores de PyTorch, las CPU sin oneDNN y los formatos exportados no cambian; durante el entrenamiento, la validación mantiene la disposición del modelo de entrenamiento. |
nms | bool, opcional | None | Por defecto, ejecuta inferencia uno a varios con NMS (None o True). Configura False para usar el cabezal uno a uno sin NMS cuando esté disponible. Consulta la guía de detección de extremo a extremo para obtener más información. |
Cada uno de estos ajustes desempeña un papel fundamental en el proceso de validación y permite evaluar los modelos YOLO de forma personalizable y eficiente. Si adaptas estos parámetros a tus necesidades y recursos concretos, podrás lograr el mejor equilibrio entre precisión y rendimiento.
Ejemplo de validación con argumentos#
Ver: Cómo exportar los resultados de validación de modelos a CSV, JSON, SQL, DataFrame de Polars y mucho más
Los siguientes ejemplos muestran cómo validar un modelo YOLO con argumentos personalizados en Python y CLI.
from ultralytics import YOLO
# Cargar un modelo
model = YOLO("yolo26n.pt")
# Personaliza los ajustes de validación
metrics = model.val(data="coco8.yaml", imgsz=640, batch=16, conf=0.25, iou=0.7, device="0")También puedes guardar los resultados de ConfusionMatrix en distintos formatos mediante el código proporcionado.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.val(data="coco8.yaml", plots=True)
print(results.confusion_matrix.to_df())La validación almacena las métricas de precisión, exhaustividad, F1, TP, FP y FN por imagen (con un umbral de IoU de 0.5) para todas las tareas, excepto clasificación. Puedes acceder a ellas mediante results.box.image_metrics para detección y OBB, results.seg.image_metrics para segmentación y results.pose.image_metrics para pose, una vez finalizada la validación.
from ultralytics import YOLO
# Cargar un modelo
model = YOLO("yolo26n.pt")
# Valida y accede a las métricas por imagen
results = model.val(data="coco8.yaml")
# image_metrics es un diccionario que usa los nombres de archivo de imagen como claves
print(results.box.image_metrics)
# Output: {'image1.jpg': {'precision': 0.85, 'recall': 0.92, 'f1': 0.88, 'tp': 17, 'fp': 3, 'fn': 1}, ...}
# Accede a las métricas de una imagen concreta
results.box.image_metrics["image1.jpg"] # {'precision': 0.85, 'recall': 0.92, 'f1': 0.88, 'tp': 17, 'fp': 3, 'fn': 1}Cada entrada de image_metrics contiene las siguientes claves:
| Clave | Descripción |
|---|---|
precision | Puntuación de precisión de la imagen (tp / (tp + fp)). |
recall | Puntuación de exhaustividad de la imagen (tp / (tp + fn)). |
f1 | Media armónica de la precisión y la exhaustividad. |
tp | Número de verdaderos positivos de la imagen. |
fp | Número de falsos positivos de la imagen. |
fn | Número de falsos negativos de la imagen. |
Esta función está disponible para las tareas de detección, segmentación, pose y OBB.
El objeto de métricas devuelto también incluye métodos de exportación para análisis posteriores:
| Método | Tipo de retorno | Descripción |
|---|---|---|
summary() | List[Dict[str, Any]] | Convierte los resultados de validación en un diccionario resumido. |
to_df() | DataFrame | Devuelve los resultados de validación como un DataFrame de Polars estructurado. |
to_csv() | str | Exporta los resultados de validación en formato CSV y devuelve la cadena CSV. |
to_json() | str | Exporta los resultados de validación en formato JSON y devuelve la cadena JSON. |
Para obtener más información, consulta la documentación de la clase DataExportMixin.
Qué hacer a continuación#
¿Te convencen las métricas? Exporta el modelo a un formato de despliegue. Si la precisión no es la adecuada, vuelve atrás y entrena de nuevo con hiperparámetros distintos o más datos de entrenamiento.
Preguntas frecuentes#
Para validar tu modelo YOLO26, puedes usar el modo Val que ofrece Ultralytics. Por ejemplo, con la API de Python puedes cargar un modelo y ejecutar la validación así:
from ultralytics import YOLO # Cargar un modelo model = YOLO("yolo26n.pt") # Valida el modelo metrics = model.val() print(metrics.box.map) # map50-95También puedes usar la interfaz de línea de comandos (CLI):
yolo detect val model=yolo26n.pt data=coco8.yamlPara personalizarlo más, puedes ajustar varios argumentos, como
imgsz,batchyconf, tanto en Python como en CLI. Consulta la sección Argumentos para la validación de modelos YOLO para ver la lista completa de parámetros.La validación de modelos YOLO26 proporciona varias métricas clave para evaluar el rendimiento del modelo. Entre ellas se incluyen:
- mAP50 (precisión media con un umbral de IoU de 0.5)
- mAP75 (precisión media con un umbral de IoU de 0.75)
- mAP50-95 (precisión media en varios umbrales de IoU, del 0.5 al 0.95)
Con la API de Python, puedes acceder a estas métricas así:
metrics = model.val() # se supone que `model` ya está cargado print(metrics.box.map) # mAP50-95 print(metrics.box.map50) # mAP50 print(metrics.box.map75) # mAP75 print(metrics.box.maps) # lista de mAP50-95 para cada categoría print(metrics.box.image_metrics) # diccionario de métricas por imagen con precisión, exhaustividad, F1, TP, FP y FNPara evaluar el rendimiento por completo, es fundamental revisar todas estas métricas. Para obtener más información, consulta Características principales del modo Val.
Usar Ultralytics YOLO para la validación ofrece varias ventajas:
- Precisión: YOLO26 ofrece métricas de rendimiento precisas, como mAP50, mAP75 y mAP50-95.
- Comodidad: Los modelos recuerdan sus ajustes de entrenamiento, lo que simplifica la validación.
- Flexibilidad: Puedes validar con los mismos conjuntos de datos o con otros distintos, y con tamaños de imagen iguales o diferentes.
- Ajuste de hiperparámetros: Las métricas de validación ayudan a ajustar los modelos y mejorar su rendimiento.
Estas ventajas garantizan que tus modelos se evalúen a fondo y puedan optimizarse para obtener mejores resultados. Descubre más sobre estas ventajas en la sección Por qué validar con Ultralytics YOLO.
Sí, puedes validar tu modelo YOLO26 con un conjunto de datos personalizado. Especifica el argumento
datacon la ruta al archivo YAML de tu conjunto de datos, que debe incluir la ruta a los datos de validación. Para clasificación, en cambio, se indica un directorio de conjunto de datos o el nombre de un conjunto de datos integrado (p. ej.,imagenet10).NotaLa validación se realiza con los nombres de clase propios del modelo, que puedes consultar mediante
model.namesy que pueden diferir de los definidos por el propio conjunto de datos.Ejemplo en Python:
from ultralytics import YOLO # Cargar un modelo model = YOLO("yolo26n.pt") # Valida con un conjunto de datos personalizado metrics = model.val(data="path/to/your/custom_dataset.yaml") print(metrics.box.map) # map50-95Ejemplo con CLI:
yolo val model=yolo26n.pt data=path/to/your/custom_dataset.yamlPara ver más opciones de personalización durante la validación, consulta la sección Ejemplo de validación con argumentos.
Para guardar los resultados de validación en un archivo JSON, puedes establecer el argumento
save_jsonenTrueal ejecutar la validación. Puedes hacerlo tanto con la API de Python como con CLI.Ejemplo en Python:
from ultralytics import YOLO # Cargar un modelo model = YOLO("yolo26n.pt") # Guarda los resultados de validación en JSON metrics = model.val(save_json=True)Ejemplo con CLI:
yolo val model=yolo26n.pt save_json=TrueEn los conjuntos de datos de detección,
save_json=Truetambién indica la mAP de objetos pequeños, medianos y grandes mediantefaster-coco-eval. Consulta Argumentos para la validación de modelos YOLO para obtener más información.