Entender la detección de objetos
Interpreta los resultados de un detector —clase, caja y confianza— y fija los umbrales de confianza e IoU según el coste de cada error.
La mayoría de los sistemas de visión en producción son sistemas de detección con lógica añadida: contadores, sistemas de seguimiento, alertas por zonas y desenfoques de privacidad. Cuando uno falla, la causa no suele ser el modelo, sino un umbral que nadie eligió deliberadamente. Si sabes exactamente qué devuelve un detector y qué dos parámetros dan forma a esa lista, podrás depurar casi cualquier sistema construido sobre él.
Práctico
Qué devuelve un detector#

Cada etiqueta de esa imagen corresponde a una fila de resultados: un nombre de clase, una confianza y la caja que la rodea. Un modelo de detección devuelve exactamente esa lista:
- Clase — un índice entero asociado a un nombre mediante
result.names(0esperson,5esbus). - Caja — cuatro números que localizan el objeto;
xyxyproporciona las esquinas superior izquierda e inferior derecha en píxeles. - Confianza — una puntuación de 0 a 1 que se usa para ordenar y filtrar las detecciones.
Contar, generar alertas, hacer seguimiento y aplicar desenfoques son tareas que programas sobre estas filas.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
for box in result.boxes:
name = result.names[int(box.cls)]
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")bus conf=0.88 box=(0, 230, 803, 751)
person conf=0.87 box=(49, 398, 240, 902)
person conf=0.86 box=(223, 405, 345, 861)
person conf=0.85 box=(670, 395, 810, 880)
person conf=0.65 box=(0, 553, 60, 871)Línea por línea: la caja del autobús empieza en x=0 porque el autobús se sale por el borde izquierdo; tres personas obtienen puntuaciones de 0.85–0.87; la cuarta persona, cortada por el borde izquierdo, solo obtiene 0.65: el modelo ve medio cuerpo. Es normal que los objetos cortados tengan una confianza baja, y ese es el primer caso en el que influye un umbral.
Cada caja se presenta en cuatro formatos; usa el que espere tu código posterior:
| Atributo | Formato | Uso habitual |
|---|---|---|
boxes.xyxy | Coordenadas de las esquinas en píxeles (x1, y1, x2, y2) | Recortar, dibujar y aplicar reglas de solapamiento |
boxes.xywh | Centro en píxeles, más anchura y altura | Filtros por tamaño y movimiento |
boxes.xyxyn | Coordenadas de las esquinas normalizadas entre 0 y 1 | Reglas que se mantienen aunque cambie la resolución |
boxes.xywhn | Centro y tamaño normalizados entre 0 y 1 | Archivos de etiquetas YOLO |
De las candidatas a la lista final#
Internamente, el modelo puntúa muchas cajas candidatas por objeto. Dos filtros las convierten en la lista que ves:
Filtro de confianza. conf descarta las cajas por debajo de un umbral; el valor predeterminado para las predicciones es 0.25. En la imagen del autobús, el recuento cambia rápidamente:
conf | Cajas en bus.jpg |
|---|---|
| 0.10 | 7 |
| 0.25 | 5 |
| 0.50 | 5 |
| 0.75 | 4 |
Filtro de duplicados. La supresión no máxima (NMS) conserva la caja con mayor confianza y descarta las demás cajas de la misma clase que se solapen con ella en más de iou (valor predeterminado: 0.7). El solapamiento se mide como intersección sobre unión: el área compartida dividida entre el área combinada.

iou | Cajas en bus.jpg | Efecto |
|---|---|---|
| 0.3 | 5 | Estricto: las cajas superpuestas se fusionan |
| 0.7 | 5 | Predeterminado |
| 0.95 | 8 | Permisivo: los casi duplicados se conservan |
Elige los umbrales según el coste de los errores#
| Si… | Entonces… |
|---|---|
| Un falso negativo sale caro (alertas de seguridad, defectos) | Reduce conf y acepta algunas falsas alarmas |
| Los usuarios ven las falsas alarmas (búsqueda, etiquetado) | Aumenta conf |
| Informas de recuentos | Prueba varios valores de conf con imágenes de validación y quédate con el que tenga el menor error de recuento |
| Los objetos reales cercanos desaparecen entre la multitud | Aumenta iou, por ejemplo, de 0.7 a 0.8 |
| El mismo objeto obtiene dos cajas | Reduce iou |
| La dificultad varía según la clase | Predice con el valor más bajo de conf que necesites y, después, filtra por clase en el código |
La supervisión de seguridad en almacenes es el caso clásico de umbral bajo; el modo Predict enumera todos los argumentos de inferencia.
Errores habituales#
Síntoma: «el modelo está un 88 % seguro de que es un autobús» y umbrales elegidos por intuición. Solución: trata la confianza como una puntuación de clasificación. En YOLO26, una puntuación abarca tanto «hay un objeto» como «es de esta clase», y no está calibrada: elige el umbral a partir de los datos de validación, no del significado del número.
Cuando dos personas están hombro con hombro, sus cajas se solapan mucho y NMS puede eliminar a una persona real como «duplicada». Aumenta iou y aparecerá la segunda caja. YOLO26 también incluye un cabezal integral que no necesita NMS; pásale nms=False para usarlo.
Síntoma: un umbral que parece perfecto en la imagen de demostración falla con la cámara real. Solución: prueba distintos umbrales en un conjunto de validación procedente de la cámara de despliegue; una sola imagen solo te muestra cómo funcionan los controles.
Cuatro formas de equivocarse#
| Fallo | Qué falla | Solución habitual |
|---|---|---|
| Clase correcta, caja imprecisa | Localización | Reglas de anotación de cajas más estrictas y coherentes; un valor mayor de imgsz para objetos pequeños |
| Caja correcta, clase incorrecta | Clasificación | Más ejemplos del par de clases que se confunde o fusiona las clases |
| No aparece ninguna caja | Exhaustividad | Más ejemplos de esa situación: iluminación, tamaño, oclusión |
| Caja sobre el fondo | Precisión | Imágenes con ejemplos negativos difíciles de aquello que confundió al modelo |
Dos listas agilizan el diagnóstico: los verdaderos positivos con baja confianza (el modelo duda de objetos reales) y los falsos positivos con alta confianza (está seguro de algo incorrecto). Cada lista apunta a soluciones distintas.
Mostrar solución
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]
for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
name, conf = result.names[int(box.cls)], float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")0.88 bus (0, 230, 803, 751)
0.87 person (49, 398, 240, 902)
0.86 person (223, 405, 345, 861)
0.85 person (670, 395, 810, 880)
0.65 person (0, 553, 60, 871)
0.18 person (0, 600, 40, 871)
0.12 stop sign (0, 252, 35, 326)
0.08 handbag (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag (225, 634, 291, 705)Todas las cajas por debajo de 0.5 son falsos positivos. El valor 0.18 de person duplica a la persona con una puntuación de 0.65, cortada por el borde izquierdo. El valor 0.12 de stop sign corresponde a una señal de tráfico real con la clase equivocada. Los bolsos y el monopatín están sobre manos y zapatos. Todos los objetos reales superan 0.6, así que conf=0.5 conserva a las cuatro personas y elimina todo el ruido al contar peatones: evita contar a alguien dos veces. Antes de ponerlo en producción, compruébalo con un conjunto de validación de la cámara real: la persona truncada con una puntuación de 0.65 demuestra lo cerca que pueden estar los objetos reales del umbral.