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

EP08_04 — 🟢 IoU e Supressão de Não-Máximos (NMS)

8.14.4 EP08_04 🟢 IoU e Supressão de Não-Máximos (NMS)

A figura desta seção mostrou o efeito da Supressão de Não-Máximos sobre um conjunto de caixas produzidas por um detector do tipo sliding window: múltiplas detecções redundantes por objeto foram reduzidas a uma única caixa por objeto. Você foi encarregado de reimplementar, byte a byte, as duas funções que produziram aquele resultado — calcular_iou e supressao_nao_maximos — para confirmar, com suas próprias mãos, exatamente os números que o capítulo apresentou.

8.14.4.1 📋 Diretrizes de Implementação

  1. Entrada: Ler o inteiro \(N\) (número de caixas) e o real \(\tau\) (limiar de IoU). Em seguida, ler \(N\) linhas, cada uma com cinco reais \(x_{min}\ y_{min}\ x_{max}\ y_{max}\ \text{score}\).

  2. Interseção sobre União: Para duas caixas \(A\) e \(B\), \[ \mathrm{IoU}(A,B) = \frac{\text{área}(A \cap B)}{\text{área}(A \cup B)}, \] com área de interseção nula quando as caixas não se sobrepõem.

  3. Algoritmo de NMS (exatamente como descrito no capítulo):

    1. Ordene as caixas por score decrescente (empates mantêm a ordem de leitura original).

    2. Selecione a caixa de maior pontuação entre as restantes; adicione-a à saída e remova-a da lista.

    3. Descarte, da lista restante, todas as caixas cujo IoU com a caixa selecionada seja maior ou igual a \(\tau\) — apenas as caixas com \(\mathrm{IoU} < \tau\) permanecem candidatas.

    4. Repita (b)–(c) até que a lista de restantes esteja vazia.

  4. Saída: Para cada caixa mantida, na ordem em que foi selecionada, imprimir seu índice original (posição de leitura, a partir de \(0\)) e seu score, com 2 casas decimais. Ao final, imprimir Total mantidas: X.

8.14.4.2 📌 Restrições Computacionais

  • Atenção ao sentido do limiar: ao contrário do que se poderia supor, uma caixa é suprimida quando \(\mathrm{IoU} \ge \tau\) (não apenas quando \(\mathrm{IoU} > \tau\)) — siga exatamente esse critério, o mesmo do código de referência do capítulo.
  • Índices originais: a saída referencia a posição de leitura de cada caixa na entrada, não sua posição após a ordenação por score.
  • Área sem soma de 1 pixel: use área \(= (x_{max}-x_{min}) \times (y_{max}-y_{min})\), exatamente como no capítulo (sem o ajuste “+1” às vezes usado em outras convenções).

8.14.4.3 🧠 Fundamentação Teórica

Elemento Papel no pós-processamento
IoU Quantifica a sobreposição espacial entre duas caixas delimitadoras
Sliding window (Haar Cascade) Produz tipicamente várias detecções sobrepostas para o mesmo objeto, em posições e escalas próximas
Limiar \(\tau\) Controla a agressividade da supressão: baixo demais funde objetos próximos; alto demais deixa passar redundâncias
Ordenação por score Garante que, entre caixas redundantes, a de maior confiança sempre sobrevive

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

Entrada:

  • Linha 1: Inteiro \(N\) e real \(\tau\).
  • Próximas \(N\) linhas: cinco reais \(x_{min}\ y_{min}\ x_{max}\ y_{max}\ \text{score}\).

Saída:

  • Uma linha por caixa mantida, na ordem de seleção: índice score (score com 2 casas decimais).
  • Última linha: Total mantidas: X.

8.14.4.5 📌 Exemplos

Entrada Saída Observação
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 mantidas: 2
Exatamente o exemplo da figura do capítulo: 5 caixas redundantes (2 objetos) tornam-se 2 detecções finais. O IoU entre a 1ª e a 2ª caixas é \(\approx 0{,}775\), bem acima de \(\tau=0{,}4\).
🎮 Simulador EP08_04: IoU e Supressão de Não-Máximos (NMS) Supressão se IoU ≥ τ
3
0.40
A caixa azul (score maior) já foi selecionada. Ajuste a sobreposição e o limiar τ para verificar a supressão da caixa vermelha (candidata).
–
Figura 8.18: Simulador EP08_04: IoU e Supressão de Não-Máximos
%%writefile EP08_04.py
# Código Python
Writing EP08_04.py
TestSuite("EP08_04.py").run()
✔️ EP08_04.cases já existe em casos/
📋 6 caso(s) carregado(s) de casos/EP08_04.cases

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