PDI+VC · Ejercicio de Programación

EP09_06 — 🔴 Pipeline Integrado: De la Detección a la Medición del Mundo Real

9.10.6 EP09_06 🔴 Pipeline Integrado: De la Detección a la Medición del Mundo Real

Este ejercicio final integra los dos ejercicios de detección y el principio de fotogrametría presentado en la sección “Fotogrametría y Referencia de Escala” — exactamente el mismo cálculo implementado en la figura de medición por referencia de escala de este capítulo. El escenario reproduce una situación realista: un detector (Faster R-CNN o YOLO) genera varias cajas candidatas superpuestas para el mismo objeto de interés; tras filtrarlas por NMS, la caja superviviente de mayor confianza se usa, junto con una caja de referencia de ancho real conocido (como la tarjeta de \(8{,}56\) cm), para estimar las dimensiones reales del objeto detectado.

9.10.6.1 📋 Directrices de Implementación

  1. Referencia conocida: Leer el valor real \(L_{ref}\) (ancho real del objeto de referencia, en cm) y, a continuación, los cuatro reales \(x_1\ y_1\ x_2\ y_2\) de su caja delimitadora en píxeles (ya conocida, sin necesidad de detección).
  2. Candidatas del objeto a medir: Leer el entero \(N\) (número de cajas candidatas producidas por el detector para el objeto de interés) y el umbral real \(\tau\); a continuación, leer las \(N\) líneas de cajas candidatas, cada una con \(x_1\ y_1\ x_2\ y_2\ \text{score}\).
  3. Etapa 1 — NMS: Aplicar exactamente el algoritmo de Supresión de No Máximos del EP09_04 a las \(N\) cajas candidatas, usando el umbral \(\tau\), para eliminar detecciones redundantes del mismo objeto.
  4. Etapa 2 — Selección de la caja final: Tras el NMS, la caja de mayor score entre las mantenidas es la detección final del objeto (la entrada garantiza que todas las cajas candidatas corresponden a un único objeto físico, por lo que la primera caja seleccionada por el NMS ya es el resultado final).
  5. Etapa 3 — Medición por referencia de escala: Calcular la razón \(\text{cm/pixel} = L_{ref} / \text{ancho de la referencia en píxeles}\) y aplicarla tanto al ancho como a la altura (en píxeles) de la caja final del objeto, obteniendo sus dimensiones reales estimadas en centímetros.
  6. Salida: Primero, una línea por caja mantenida tras el NMS (mismo formato del EP09_04): índice score. A continuación, la línea Total mantenidas: X. Finalmente, la línea Objeto: L x A cm, donde \(L\) y \(A\) son el ancho y la altura estimados del objeto, cada uno con 2 decimales.

9.10.6.2 📌 Restricciones Computacionales

  • Reutilizar el NMS del EP09_04 íntegramente — misma regla de desempate, mismo criterio de supresión (\(\text{IoU} > \tau\)).
  • La referencia no pasa por NMS: su caja se da directamente, sin candidatas competidoras.
  • Razón única para ancho y altura: así como en la figura de fotogrametría del capítulo, la misma razón cm/pixel (derivada del ancho de la referencia) se aplica tanto al ancho como a la altura del objeto — no hay calibración vertical separada.

9.10.6.3 🧠 Fundamentación Teórica

Etapa Concepto del capítulo
Múltiples cajas candidatas Salida bruta de un detector como el Faster R-CNN o el YOLO, antes del posprocesamiento
NMS (EP09_04) Filtra las detecciones redundantes, preservando solo la más confiable para el objeto
Referencia de escala conocida Mismo principio de la tarjeta de \(8{,}56\) cm usado en la sección “Fotogrametría y Referencia de Escala”
Conversión píxel → centímetro Regla de tres simple: \(\text{cm/pixel} = L_{ref} / w_{ref\_px}\), aplicada a la caja final del objeto

9.10.6.4 🧩 Métodos del morph.py que pueden ayudar

  • mm.IoU(boxA, boxB) — la misma función sugerida en el EP09_04, aquí reutilizada dentro de la etapa de NMS de este pipeline integrado (recuerde la conversión de formato: \(w = x_2-x_1\), \(h = y_2-y_1\)).
  • Si ya resolvió el EP09_04 encapsulando el NMS en una función propia, este es el momento ideal de reutilizar ese código — la integración de módulos ya probados individualmente es exactamente la práctica de ingeniería que este ejercicio quiere reforzar.

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

Entrada:

  • Línea 1: Real \(L_{ref}\).
  • Línea 2: \(x_1\ y_1\ x_2\ y_2\) de la caja de referencia.
  • Línea 3: Entero \(N\) y real \(\tau\).
  • Siguientes \(N\) líneas: \(x_1\ y_1\ x_2\ y_2\ \text{score}\) de las cajas candidatas del objeto.

Salida:

  • Una línea por caja mantenida tras el NMS: índice score.
  • Línea siguiente: Total mantenidas: X.
  • Última línea: Objeto: L x A cm.

9.10.6.6 📌 Ejemplos

Entrada Salida Observación
8.56
30 200 170 288
3 0.5
250 100 470 250 0.92
255 105 468 245 0.88
600 600 650 650 0.40
0 0.9200
2 0.4000
Total mantenidas: 2
Objeto: 13.45 x 9.17 cm
La caja 1 se suprime por superponerse fuertemente a la caja 0; la detección final del objeto es la caja 0.
🎮 Simulador: Pipeline Integrado — Detección a Medición 🔴 Fotogrametría
Caja seleccionada Caja suprimida Referencia Objeto final
8.56
0.50
Estándar
🎯 Visualización del Pipeline
📋 Pipeline Paso a Paso
Figura 9.48: Simulador EP09_06: Pipeline Integrado — Detección a la Medición del Mundo Real
%%writefile EP09_06.py
# Código Python
Overwriting EP09_06.py
TestSuite("EP09_06.py").run()
✔️ EP09_06.cases ya existe en casos/
📋 3 caso(s) cargado(s) de casos/EP09_06.cases

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