Cómo funciona la detección de extremo a extremo en Ultralytics YOLO26#
YOLO26 entrena tanto una cabeza uno a muchos como una cabeza uno a uno. De forma predeterminada, la predicción y la validación usan la cabeza uno a muchos con supresión no máxima (NMS). Esta opción prioriza la precisión con los mismos pesos entrenados. Asigna nms=False para usar en su lugar la cabeza uno a uno, más rápida y sin NMS.
Un argumento controla la opción en predicción, validación, seguimiento, exportación y evaluación comparativa:
nms | Predicción y validación | Exportar |
|---|---|---|
None (predeterminado) | Cabeza uno a muchos; Ultralytics ejecuta NMS | Salidas sin procesar de la cabeza uno a muchos; el consumidor ejecuta NMS |
True | Igual que None | Cabeza uno a muchos con NMS integrado cuando es compatible |
False | Cabeza uno a uno sin supresión por IoU | Salidas uno a uno sin NMS cuando es compatible |
None significa que el modelo no incluye posprocesamiento opcional. No elimina el procesamiento habitual que convierte las salidas del modelo en resultados de predicción o métricas de validación. La clasificación, la segmentación semántica, la profundidad y los modelos sin cabezales de detección seleccionables mantienen el comportamiento nativo de su tarea.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.predict("image.jpg") # uno a muchos + NMS
metrics = model.val(data="coco.yaml") # uno a muchos + NMS
results = model.predict("image.jpg", nms=False) # activar la inferencia sin NMS
results = model.predict("image.jpg", nms=None) # volver a uno a muchos + NMS
model.export(format="onnx") # salidas sin procesar de uno a muchos
model.export(format="onnx", nms=True) # integrar NMS
model.export(format="onnx", nms=False) # salidas uno a uno sin NMSCómo funciona la detección de extremo a extremo#
Ambas cabezas comparten el backbone y el neck, y se optimizan durante el entrenamiento. La cabeza uno a muchos genera varias predicciones candidatas por objeto; NMS elimina las detecciones solapadas. La cabeza uno a uno aprende a generar una única predicción por objeto. Seleccionar la ruta de inferencia no desactiva la supervisión de ambas cabezas. Durante el entrenamiento, la validación usa la cabeza de inferencia seleccionada, por lo que la selección de checkpoints y la detención temprana se basan en las mismas predicciones que el despliegue.
| Cabezal | Salida de detección antes del procesamiento externo | Procesamiento |
|---|---|---|
| Uno a muchos (predeterminado) | (N, nc + 4, 8400) | Filtrado por confianza y NMS |
| Uno a uno | (N, 300, 6) | Filtrado por confianza; sin supresión por IoU |
Aquí, N es el tamaño del lote, nc es el número de clases y 8400 es el número de candidatos en imgsz=640. Las filas de detección uno a uno contienen [x1, y1, x2, y2, confidence, class_id]. Otras tareas de detección incluyen salidas adicionales:
| Tarea | Salida de extremo a extremo | Datos adicionales |
|---|---|---|
| Detección | (N, 300, 6) | — |
| Segmentación de instancias | (N, 300, 6 + nm) y (N, nm, H, W) | Coeficientes de máscara y prototipos |
| Pose | (N, 300, 57) | 17 puntos clave × 3 valores |
| OBB | (N, 300, 7) | Ángulo de rotación |
La fusión elimina las ramas de inferencia que no se utilizan y pliega las capas Conv y BatchNorm. Conserva el punto de control original del entrenamiento si necesitas cambiar de cabezal: la fusión no puede reconstruir una rama que ya se ha eliminado. Un modelo al que solo le queda el cabezal uno a uno conserva esa ruta disponible.
Salidas exportadas#
Los modelos de detección YOLOv8, YOLO11 y YOLO26 exportan predicciones sin procesar de uno a muchos de forma predeterminada. Exporta YOLO26 con nms=False para obtener detecciones sin NMS.
nms=None | nms=False | |
|---|---|---|
| Salida de detección | (N, nc + 4, 8400) | (N, 300, 6) |
| Formato de la caja | xywh | xyxy |
| Puntuaciones | Una puntuación por clase y candidato | Confianza e ID de clase por detección |
| Procesamiento externo | Filtrado por confianza y NMS | Filtrado por confianza |
nms=True también genera detecciones procesadas, pero utiliza el cabezal uno a muchos e integra la NMS tradicional. Resulta útil cuando el entorno de ejecución de despliegue debe recibir las detecciones sin implementar la supresión por su cuenta.
El grafo de un modelo exportado determina sus salidas. Pasar nms al cargarlo no reconstruye el grafo; exporta el punto de control de origen con el valor nms que quieras para seleccionar su ruta de salida. Ultralytics utiliza los metadatos del artefacto para evitar aplicar NMS dos veces.
Compatibilidad de los formatos de exportación#
ONNX, TensorRT, CoreML, OpenVINO y varios formatos más admiten exportaciones sin NMS. NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU y Qualcomm QNN recurren a la ruta uno a muchos cuando sus operadores no pueden admitir una salida de extremo a extremo. Las advertencias del formato explican este comportamiento alternativo.
- NMS integrada:
nms=Trueestá sujeta a las restricciones de tarea, precisión y formas dinámicas de cada formato. Los formatos que no admiten NMS integrada exportan salidas nativas para procesarlas externamente. - CoreML: La NMS integrada admite detección, segmentación y pose con formas estáticas. Usa
nms=Truepara los modelos de detección que necesitan el proceso de NMS de Xcode Preview. - MNN: La NMS integrada admite detección y pose con
dynamic=False. - IMX: La detección, la segmentación de instancias y la pose requieren NMS integrada, que se selecciona automáticamente.
- Hailo: YOLO26 utiliza tensores sin procesar con NMS en el host de forma predeterminada;
nms=Falseselecciona su ruta uno a uno. La detección con YOLOv8/YOLO11 utiliza HailoRT NMS. - Cuantización: Las versiones de TensorRT anteriores a la 8.5.0, TensorRT 10.3.0 INT8 en JetPack 6 y LiteRT INT8 o
w8a16recurren a salidas uno a muchos.
Consulta las guías de integración individuales para conocer los requisitos de hardware. Para obtener tensores de salida completos en FP16, usa nms=None; los índices de clase de extremo a extremo pueden mantener los tensores de salida en FP32 incluso cuando el modelo está cuantizado.
Equilibrio entre precisión y velocidad#
Los resultados publicados de YOLO26 en COCO muestran que el cabezal uno a muchos mejora el mAP de detección entre 0,6 y 0,8 puntos en las cinco escalas: por ejemplo, 40,9 frente a 40,1 para YOLO26n, y 57,5 frente a 56,9 para YOLO26x. El cabezal uno a uno evita el paso de NMS y prioriza la latencia. Estos resultados justifican la configuración predeterminada, pero no garantizan una mejora en todos los conjuntos de datos.
Las mediciones de velocidad sin NMS publicadas utilizan nms=False. Compara la precisión y la latencia con la misma selección de cabezal, tamaño de imagen, precisión y hardware.
Preguntas frecuentes#
Limita las detecciones que devuelven la predicción y la validación. En las exportaciones de extremo a extremo y con NMS integrada, el límite forma parte del grafo, así que debes volver a exportar para cambiarlo; la NMS integrada de detección de CoreML es la excepción y no tiene límite de detecciones. La salida de extremo a extremo puede contener menos candidatos si la imagen proporciona menos anclajes que
max_det.Sí, para
nms=Falseonms=Truecon el límite de detecciones predeterminado. La forma por sí sola no permite identificar qué cabezal se ha exportado. En cambio, una exportación de detección COCO sin procesar con la configuración predeterminada suele tener la forma(1, 84, 8400)enimgsz=640.Sí. El mismo argumento
nmsselecciona el cabezal de detección disponible para las tareas de detección, segmentación de instancias, pose y OBB. No sustituye la reconstrucción de máscaras, la decodificación de puntos clave, el tratamiento de cajas giradas, las probabilidades de clasificación, los mapas de clases semánticas ni la decodificación de profundidad.