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

EP09_06 — 🔴 Pipeline Integrado: Da Detecção à Medição do Mundo Real

9.10.6 EP09_06 🔴 Pipeline Integrado: Da Detecção à Medição do Mundo Real

Este exercício final integra os dois exercícios de detecção e o princípio de fotogrametria apresentado na seção “Fotogrametria e Referência de Escala” — exatamente o mesmo cálculo implementado na figura de medição por referência de escala deste capítulo. O cenário reproduz uma situação realista: um detector (Faster R-CNN ou YOLO) gera várias caixas candidatas sobrepostas para o mesmo objeto de interesse; após filtrá-las por NMS, a caixa sobrevivente de maior confiança é usada, junto de uma caixa de referência de largura real conhecida (como o cartão de \(8{,}56\) cm), para estimar as dimensões reais do objeto detectado.

9.10.6.1 📋 Diretrizes de Implementação

  1. Referência conhecida: Ler o valor real \(L_{ref}\) (largura real do objeto de referência, em cm) e, em seguida, os quatro reais \(x_1\ y_1\ x_2\ y_2\) de sua caixa delimitadora em pixels (já conhecida, sem necessidade de detecção).
  2. Candidatas do objeto a medir: Ler o inteiro \(N\) (número de caixas candidatas produzidas pelo detector para o objeto de interesse) e o limiar real \(\tau\); em seguida, ler as \(N\) linhas de caixas candidatas, cada uma com \(x_1\ y_1\ x_2\ y_2\ \text{score}\).
  3. Etapa 1 — NMS: Aplique exatamente o algoritmo de Supressão de Não-Máximos do EP09_04 às \(N\) caixas candidatas, usando o limiar \(\tau\), para eliminar detecções redundantes do mesmo objeto.
  4. Etapa 2 — Seleção da caixa final: Após o NMS, a caixa de maior score entre as mantidas é a detecção final do objeto (a entrada garante que todas as caixas candidatas correspondem a um único objeto físico, portanto a primeira caixa selecionada pelo NMS já é o resultado final).
  5. Etapa 3 — Medição por referência de escala: Calcule a razão \(\text{cm/pixel} = L_{ref} / \text{largura da referência em pixels}\) e aplique-a tanto à largura quanto à altura (em pixels) da caixa final do objeto, obtendo suas dimensões reais estimadas em centímetros.
  6. Saída: Primeiro, uma linha por caixa mantida após o NMS (mesmo formato do EP09_04): índice score. Em seguida, a linha Total mantidas: X. Por fim, a linha Objeto: L x A cm, onde \(L\) e \(A\) são a largura e a altura estimadas do objeto, cada uma com 2 casas decimais.

9.10.6.2 📌 Restrições Computacionais

  • Reaproveite o NMS do EP09_04 integralmente — mesma regra de desempate, mesmo critério de supressão (\(\text{IoU} > \tau\)).
  • A referência não passa por NMS: sua caixa é dada diretamente, sem candidatas concorrentes.
  • Razão única para largura e altura: assim como na figura de fotogrametria do capítulo, a mesma razão cm/pixel (derivada da largura da referência) é aplicada tanto à largura quanto à altura do objeto — não há calibração vertical separada.

9.10.6.3 🧠 Fundamentação Teórica

Etapa Conceito do capítulo
Múltiplas caixas candidatas Saída bruta de um detector como o Faster R-CNN ou o YOLO, antes do pós-processamento
NMS (EP09_04) Filtra as detecções redundantes, preservando apenas a mais confiável para o objeto
Referência de escala conhecida Mesmo princípio do cartão de \(8{,}56\) cm usado na seção “Fotogrametria e Referência de Escala”
Conversão pixel → centímetro Regra de três simples: \(\text{cm/pixel} = L_{ref} / w_{ref\_px}\), aplicada à caixa final do objeto

9.10.6.4 🧩 Métodos do morph.py que podem ajudar

  • mm.IoU(boxA, boxB) — a mesma função sugerida no EP09_04, aqui reaproveitada dentro da etapa de NMS deste pipeline integrado (lembre-se da conversão de formato: \(w = x_2-x_1\), \(h = y_2-y_1\)).
  • Se você já resolveu o EP09_04 encapsulando a NMS em uma função própria, este é o momento ideal de reaproveitar esse código — a integração de módulos já testados individualmente é exatamente a prática de engenharia que este exercício quer reforçar.

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

Entrada:

  • Linha 1: Real \(L_{ref}\).
  • Linha 2: \(x_1\ y_1\ x_2\ y_2\) da caixa de referência.
  • Linha 3: Inteiro \(N\) e real \(\tau\).
  • Próximas \(N\) linhas: \(x_1\ y_1\ x_2\ y_2\ \text{score}\) das caixas candidatas do objeto.

Saída:

  • Uma linha por caixa mantida após o NMS: índice score.
  • Linha seguinte: Total mantidas: X.
  • Última linha: Objeto: L x A cm.

9.10.6.6 📌 Exemplos

Entrada Saída Observação
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 mantidas: 2
Objeto: 13.45 x 9.17 cm
A caixa 1 é suprimida por sobrepor fortemente a caixa 0; a detecção final do objeto é a caixa 0.
🎮 Simulador: Pipeline Integrado — Detecção à Medição 🔴 Fotogrametria
Caixa selecionada Caixa suprimida Referência Objeto final
8.56
0.50
Padrão
🎯 Visualização do Pipeline
📋 Pipeline Passo a Passo
Figura 9.48: Simulador EP09_06: Pipeline Integrado — Detecção à Medição do Mundo Real
%%writefile EP09_06.py
# Código Python
Writing EP09_06.py
TestSuite("EP09_06.py").run()
✔️ EP09_06.cases já existe em casos/
📋 3 caso(s) carregado(s) de casos/EP09_06.cases

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