PDI+VC · Ejercicio de Programación

EP08_11 — 🔴 Clasificación y Validación de Objetos con Plantilla de Bounding Box

8.14.11 EP08_11 🔴 Clasificación y Validación de Objetos con Plantilla de Bounding Box

En este ejercicio, el objetivo es procesar una imagen en tonos de gris que contiene múltiples objetos geométricos, extraer sus propiedades con mm.measure y validar las cajas delimitadoras (bounding boxes) detectadas en relación con una plantilla real (Ground Truth - GT) proporcionada en la entrada, utilizando la métrica IoU (Intersection over Union).

8.14.11.1 📋 Directrices de Implementación

  1. Lectura de la Imagen: Leer las dimensiones \(H \times W\) y la matriz \(H \times W\) de píxeles de la imagen en tonos de gris.
  2. Pipeline Morfológico: Binarizar la imagen mediante el método de Otsu (mm.threshold) y renderizar la máscara binarizada resultante utilizando mm.drawImg.
  3. Lectura de la Plantilla Real (Ground Truth):
  • Leer la cantidad \(G\) de cajas delimitadoras de la plantilla.
  • Si \(G > 0\), leer \(G\) líneas que contienen 5 valores cada una: id xmin_norm ymin_norm xmax_norm ymax_norm.
  • Conversión de Coordenadas: Las coordenadas de la plantilla están normalizadas en el rango \([0.0, 1.0]\). Para convertir a píxeles en la cuadrícula de la imagen:

\[x_{\min} = \lfloor \text{xmin\_norm} \times W \rfloor, \quad y_{\min} = \lfloor \text{ymin\_norm} \times H \rfloor\]

\[w = \lfloor \text{xmax\_norm} \times W \rfloor - x_{\min}, \quad h = \lfloor \text{ymax\_norm} \times H \rfloor - y_{\min}\]

  1. Extracción de Métricas y Cálculo de IoU:
  • Extraer las propiedades de las instancias con mm.measure(img_bin, precision=0.02).
  • Para cada bounding box detectada \((x, y, w, h)\), calcular la superposición IoU respecto a las cajas de la plantilla y definir hits = 1 si existe alguna coincidencia con \(\text{IoU} \ge 0.50\), o hits = 0 en caso contrario.
  1. Salida: Ordenar las instancias por posición (bbox[0], bbox[1]) e imprimir la tabla CSV con la columna adicional hits.
    • Para ordenar, usar medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), con medidas = mm.measure(img).

8.14.11.2 🧠 Fundamentación Teórica y Conversión

Concepto Fórmula / Operación Descripción
BBox Detectada \((x, y, w, h)\) vía mm.measure Caja delimitadora calculada en la cuadrícula discreta en píxeles enteros.
BBox Plantilla (GT) \((x_{\min}, y_{\min}, w, h)\) convertidos Caja real proporcionada en la entrada en coordenadas relativas \([0.0, 1.0]\).
IoU (Intersection over Union) \(\text{IoU} = \frac{\text{Área}(B_{\text{DET}} \cap B_{\text{GT}})}{\text{Área}(B_{\text{DET}} \cup B_{\text{GT}})}\) Evalúa la tasa de superposición de las cajas. Se considera válida si \(\text{IoU} \ge 0.50\).
Estado de Validación (hits) \(1\) si \(\max(\text{IoU}) \ge 0.50\), sino \(0\) Indicador binario de acierto del detector respecto a la plantilla.

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

Entrada:

  • Línea 1: Enteros \(H\) y \(W\) (dimensiones de la matriz).
  • Siguientes \(H\) líneas: \(W\) enteros (\(0\) a \(255\)) que representan la imagen en tonos de gris.
  • Línea \(H + 2\): Entero \(G\) (cantidad de cajas de la plantilla verdadera).
  • Siguientes \(G\) líneas: 5 valores numéricos por línea: id xmin_norm ymin_norm xmax_norm ymax_norm (donde las coordenadas son valores flotantes entre \(0.0\) y \(1.0\)).

Salida:

  1. Matriz binarizada renderizada vía mm.drawImg(img_bin).
  2. Encabezado CSV: id,area,perimeter,cx,cy,x,y,w,h,circularity,solidity,vertices,hits
  3. Una línea CSV por objeto detectado que contiene sus propiedades formateadas y el indicador hits (\(1\) o \(0\)).

8.14.11.4 📌 Ejemplos

Entrada Salida
10 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 180 0 0 0 0 0 0 0 0 180 180 180 0 0 0 0 0
0 0 180 180 180 0 0 0 0 0 0 0 180 180 180 0 0 0 0 0
0 0 0 180 0 0 0 0 0 0 0 0 180 180 180 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2
1 0.10 0.30 0.25 0.60
2 0.60 0.30 0.75 0.60
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
id area perimeter cx cy x y w h circularity solidity vertices hits
1 2.0 5.7 3.0 4.0 2 3 3 3 0.79 1.000 4 1
2 4.0 8.0 13.0 4.0 12 3 3 3 0.79 1.000 4 1
🧮 Simulador EP08_11: Bounding Boxes y Comparación de IoU con Controles Independientes Validación BBox GT vs DET
MODO DE VISUALIZACIÓN
VISUALIZACIÓN DE LAS BOUNDING BOXES
LEYENDA DE LAS BBOXES:
Plantilla Real (GT)
Detección Aceptada (IoU ≥ 0.5)
Detección Rechazada (IoU < 0.5)
Superposición de BBoxes
VISUALIZACIÓN DE LA MATRIZ DE PÍXELES
MEDIDAS, CLASIFICACIÓN GEOMÉTRICA Y COMPARACIÓN IOU CON PLANTILLA
id clase area solidez vértices bbox det (x,y,w,h) bbox gt (x,y,w,h) IoU estado (IoU ≥ 0.5)
Figura 8.25: Simulador EP08_11: Clasificación Geométrica con Controles Independientes de Overlays BBox (GT y DET)
%%writefile EP08_11.py
# Código Python
Overwriting EP08_11.py
TestSuite("EP08_11.py").run()
✔️ EP08_11.cases ya existe en casos/
📋 3 caso(s) cargado(s) de casos/EP08_11.cases

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