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
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}\).
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.
Algoritmo de NMS (exatamente como descrito no capítulo):
Ordene as caixas por
scoredecrescente (empates mantêm a ordem de leitura original).Selecione a caixa de maior pontuação entre as restantes; adicione-a à saída e remova-a da lista.
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.
Repita (b)–(c) até que a lista de restantes esteja vazia.
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, imprimirTotal 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\). |
%%writefile EP08_04.py
# Código PythonWriting 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.