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
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}\).
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.
Algoritmo de NMS (exactamente como se describe en el capítulo):
Ordenar las cajas por
scoredescendente (los empates mantienen el orden de lectura original).Seleccionar la caja de mayor puntuación entre las restantes; añadirla a la salida y eliminarla de la lista.
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.
Repetir (b)–(c) hasta que la lista de restantes esté vacía.
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, imprimirTotal 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\). |
%%writefile EP08_04.py
# Código PythonOverwriting 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.