PDI+VC · Exercício de Programação

EP08_11 — 🔴 Classificação e Validação de Objetos com Gabarito de Bounding Box

8.14.11 EP08_11 🔴 Classificação e Validação de Objetos com Gabarito de Bounding Box

Neste exercício, o objetivo é processar uma imagem em tons de cinza contendo múltiplos objetos geométricos, extrair suas propriedades com mm.measure e validar as caixas delimitadoras (bounding boxes) detectadas em relação a um gabarito real (Ground Truth - GT) fornecido na entrada, utilizando a métrica IoU (Intersection over Union).

8.14.11.1 📋 Diretrizes de Implementação

  1. Leitura da Imagem: Ler as dimensões \(H \times W\) e a matriz \(H \times W\) de pixels da imagem em tons de cinza.
  2. Pipeline Morfológico: Binarizar a imagem via método de Otsu (mm.threshold) e renderizar a máscara binarizada resultante utilizando mm.drawImg.
  3. Leitura do Gabarito Real (Ground Truth):
  • Ler a quantidade \(G\) de caixas delimitadoras do gabarito.
  • Se \(G > 0\), ler \(G\) linhas contendo 5 valores cada: id xmin_norm ymin_norm xmax_norm ymax_norm.
  • Conversão de Coordenadas: As coordenadas do gabarito estão normalizadas na faixa \([0.0, 1.0]\). Para converter para pixels na grade da imagem:

\[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. Extração de Métricas e Cálculo de IoU:
  • Extrair as propriedades das instâncias com mm.measure(img_bin, precision=0.02).
  • Para cada bounding box detectada \((x, y, w, h)\), calcular a sobreposição IoU em relação às caixas do gabarito e definir hits = 1 se existir algum match com \(\text{IoU} \ge 0.50\), ou hits = 0 caso contrário.
  1. Saída: Ordenar as instâncias por posição (bbox[0], bbox[1]) e imprimir a tabela CSV com a coluna adicional hits.
    • Para ordenar, usar medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), com medidas = mm.measure(img).

8.14.11.2 🧠 Fundamentação Teórica e Conversão

Conceito Fórmula / Operação Descrição
BBox Detectada \((x, y, w, h)\) via mm.measure Caixa delimitadora calculada na grade discreta em pixels inteiros.
BBox Gabarito (GT) \((x_{\min}, y_{\min}, w, h)\) convertidos Caixa real fornecida na entrada em 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}})}\) Avalia a taxa de sobreposição das caixas. É considerada válida se \(\text{IoU} \ge 0.50\).
Status de Validação (hits) \(1\) se \(\max(\text{IoU}) \ge 0.50\), senão \(0\) Indicador binário de acerto do detector em relação ao gabarito.

8.14.11.3 📦 Especificação de Entrada e Saída (VPL)

Entrada:

  • Linha 1: Inteiros \(H\) e \(W\) (dimensões da matriz).
  • Próximas \(H\) linhas: \(W\) inteiros (\(0\) a \(255\)) representando a imagem em tons de cinza.
  • Linha \(H + 2\): Inteiro \(G\) (quantidade de caixas do gabarito verdadeiro).
  • Próximas \(G\) linhas: 5 valores numéricos por linha: id xmin_norm ymin_norm xmax_norm ymax_norm (onde as coordenadas são valores flutuantes entre \(0.0\) e \(1.0\)).

Saída:

  1. Matriz binarizada renderizada via mm.drawImg(img_bin).
  2. Cabeçalho CSV: id,area,perimeter,cx,cy,x,y,w,h,circularity,solidity,vertices,hits
  3. Uma linha CSV por objeto detectado contendo suas propriedades formatadas e o indicador hits (\(1\) ou \(0\)).

8.14.11.4 📌 Exemplos

Entrada Saída
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 e Comparação de IoU com Controles Independentes Validação BBox GT vs DET
MODO DE EXIBIÇÃO
EXIBIÇÃO DAS BOUNDING BOXES
LEGENDA DAS BBOXES:
Gabarito Real (GT)
Detecção Aceita (IoU ≥ 0.5)
Detecção Rejeitada (IoU < 0.5)
Sobreposição de BBoxes
VISUALIZAÇÃO DA MATRIZ DE PÍXEIS
MEDIDAS, CLASSIFICAÇÃO GEOMÉTRICA E COMPARAÇÃO IOU COM GABARITO
id classe area solidity vertices bbox det (x,y,w,h) bbox gt (x,y,w,h) IoU status (IoU ≥ 0.5)
Figura 8.25: Simulador EP08_11: Classificação Geométrica com Controles Independentes de Overlays BBox (GT e DET)
%%writefile EP08_11.py
# Código Python
Writing EP08_11.py
TestSuite("EP08_11.py").run()
✔️ EP08_11.cases já existe em casos/
📋 3 caso(s) carregado(s) de casos/EP08_11.cases

🔍 Testando Python: EP08_11.py
⚠️ EP08_11.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.