PDI+VC · Ejercicio de Programación

EP08_04 — 🟢 IoU y Supresión de No Máximos (NMS)

8.14.4 EP08_04 🟢 IoU y Supresión de No Máximos (NMS)

La figura de esta sección mostró el efecto de la Supresión de No Máximos sobre un conjunto de cajas producidas por un detector tipo sliding window: múltiples detecciones redundantes por objeto se redujeron a una única caja por objeto. Se le ha encargado reimplementar, byte a byte, las dos funciones que produjeron ese resultado — calcular_iou y supresion_no_maximos — para confirmar, con sus propias manos, exactamente los números que el capítulo presentó.

8.14.4.1 📋 Directrices de Implementación

  1. Entrada: Leer el entero \(N\) (número de cajas) y el real \(\tau\) (umbral de IoU). A continuación, leer \(N\) líneas, cada una con cinco reales \(x_{min}\ y_{min}\ x_{max}\ y_{max}\ \text{score}\).

  2. Intersección sobre Unión: Para dos cajas \(A\) y \(B\), \[ \mathrm{IoU}(A,B) = \frac{\text{área}(A \cap B)}{\text{área}(A \cup B)}, \] con área de intersección nula cuando las cajas no se superponen.

  3. Algoritmo de NMS (exactamente como se describe en el capítulo):

    1. Ordenar las cajas por score descendente (los empates mantienen el orden de lectura original).

    2. Seleccionar la caja de mayor puntuación entre las restantes; añadirla a la salida y eliminarla de la lista.

    3. Descartar, de la lista restante, todas las cajas cuyo IoU con la caja seleccionada sea mayor o igual a \(\tau\) — solo las cajas con \(\mathrm{IoU} < \tau\) permanecen como candidatas.

    4. Repetir (b)–(c) hasta que la lista de restantes esté vacía.

  4. Salida: Para cada caja mantenida, en el orden en que fue seleccionada, imprimir su índice original (posición de lectura, a partir de \(0\)) y su score, con 2 decimales. Al final, imprimir Total mantenidas: X.

8.14.4.2 📌 Restricciones Computacionales

  • Atención al sentido del umbral: al contrario de lo que se podría suponer, una caja es suprimida cuando \(\mathrm{IoU} \ge \tau\) (no solo cuando \(\mathrm{IoU} > \tau\)) — seguir exactamente ese criterio, el mismo del código de referencia del capítulo.
  • Índices originales: la salida hace referencia a la posición de lectura de cada caja en la entrada, no a su posición después de la ordenación por score.
  • Área sin suma de 1 píxel: usar área \(= (x_{max}-x_{min}) \times (y_{max}-y_{min})\), exactamente como en el capítulo (sin el ajuste “+1” a veces usado en otras convenciones).

8.14.4.3 🧠 Fundamentación Teórica

Elemento Papel en el postprocesamiento
IoU Cuantifica la superposición espacial entre dos cajas delimitadoras
Sliding window (Haar Cascade) Produce típicamente varias detecciones superpuestas para el mismo objeto, en posiciones y escalas cercanas
Umbral \(\tau\) Controla la agresividad de la supresión: demasiado bajo fusiona objetos cercanos; demasiado alto deja pasar redundancias
Ordenación por score Garantiza que, entre cajas redundantes, la de mayor confianza siempre sobrevive

8.14.4.4 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Entero \(N\) y real \(\tau\).
  • Siguientes \(N\) líneas: cinco reales \(x_{min}\ y_{min}\ x_{max}\ y_{max}\ \text{score}\).

Salida:

  • Una línea por caja mantenida, en el orden de selección: índice score (score con 2 decimales).
  • Última línea: Total mantenidas: X.

8.14.4.5 📌 Ejemplos

Entrada Salida Observación
5 0.4
50 50 150 150 0.90
60 55 155 145 0.75
58 60 160 150 0.60
300 300 400 420 0.95
310 305 395 415 0.70
3 0.95
0 0.90
Total mantenidas: 2
Exactamente el ejemplo de la figura del capítulo: 5 cajas redundantes (2 objetos) se convierten en 2 detecciones finales. El IoU entre la 1.ª y la 2.ª cajas es \(\approx 0{,}775\), muy por encima de \(\tau=0{,}4\).
🎮 Simulador EP08_04: IoU y Supresión de No-Máximos (NMS) Supresión si IoU ≥ τ
3
0.40
La caja azul (puntaje mayor) ya fue seleccionada. Ajuste la superposición y el umbral τ para verificar la supresión de la caja roja (candidata).
–
Figura 8.18: Simulador EP08_04: IoU y Supresión de No-Máximos
%%writefile EP08_04.py
# Código Python
Overwriting EP08_04.py
TestSuite("EP08_04.py").run()
✔️ EP08_04.cases ya existe en casos/
📋 6 caso(s) cargado(s) de casos/EP08_04.cases

🔍 Probando Python: EP08_04.py
⚠️ EP08_04.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.