9.10.4 EP09_04 🟡 Interseção sobre União (IoU) e Supressão de Não-Máximos (NMS)
Modelos de detecção de objetos podem produzir várias caixas delimitadoras candidatas para um mesmo objeto, com diferentes posições e pontuações de confiança. A etapa de pós-processamento responsável por eliminar essas detecções redundantes é a Supressão de Não-Máximos (NMS), cuja operação fundamental utiliza a métrica de Interseção sobre União (IoU).
A NMS utiliza essa medida para decidir quais caixas devem ser mantidas. Em geral, a caixa com maior confiança é selecionada primeiro; em seguida, caixas que apresentam IoU acima de um determinado limiar com a caixa selecionada são consideradas redundantes e removidas. O processo é repetido até que não restem caixas candidatas.
Neste exercício, você deverá implementar o algoritmo de NMS do zero, calculando a IoU entre caixas e aplicando sucessivamente o critério de seleção e supressão para produzir o conjunto final de detecções.
9.10.4.1 📋 Diretrizes de Implementação
Entrada: Ler o inteiro \(N\) (número de caixas candidatas) e o limiar real \(\tau\) (limiar de IoU para supressão), na mesma linha.
Caixas: Ler \(N\) linhas, cada uma com cinco valores reais:
x1 y1 x2 y2 scoreem que \((x_1,y_1)\) representa o canto superior esquerdo, \((x_2,y_2)\) o canto inferior direito e
scorea pontuação de confiança.Interseção sobre União: Para duas caixas \(A\) e \(B\),
\[ IoU(A,B)= \frac{\operatorname{Área}(A\cap B)} {\operatorname{Área}(A\cup B)}. \]
A área de interseção deve ser calculada a partir da sobreposição dos intervalos em \(x\) e \(y\). Se não houver sobreposição, a área de interseção é zero.
Algoritmo guloso de NMS:
Ordene as caixas por
scoredecrescente. Em caso de empate, mantenha a ordem original de leitura.Selecione a caixa de maior pontuação entre as caixas restantes e adicione-a ao conjunto de saída.
Calcule o IoU entre a caixa selecionada e todas as caixas ainda restantes. Suprima as caixas para as quais
\[ \text{IoU} > \tau. \]
- Repita os passos (b) e (c) até que não restem caixas.
Saída: Para cada caixa mantida, na ordem em que foi selecionada, imprimir seu índice original (posição de leitura, começando em \(0\)) e seu
score, formatado com 4 casas decimais. Ao final, imprimir:Total mantidas: X
9.10.4.2 📌 Restrições Computacionais
- Supressão estrita: apenas caixas com \(\text{IoU} > \tau\) são suprimidas. Caixas com \(\text{IoU}=\tau\) são mantidas.
- Índices originais: a saída referencia a posição em que cada caixa foi lida na entrada (começando em \(0\)), e não sua posição após a ordenação.
- Ordenação estável: em caso de
scoreiguais, deve ser preservada a ordem original de leitura. - Retângulos alinhados aos eixos: todas as caixas são especificadas por dois cantos, com \(x_1 < x_2\) e \(y_1 < y_2\) garantidos na entrada.
- Coordenadas e pontuações: os valores reais podem ser positivos ou negativos, conforme os limites definidos pela entrada, mas as dimensões das caixas são sempre positivas.
9.10.4.3 🧠 Fundamentação Teórica
| Elemento | Papel no pós-processamento de detecção |
|---|---|
| IoU | Quantifica a sobreposição espacial entre duas caixas; \(\text{IoU}=1\) para caixas idênticas e \(\text{IoU}=0\) para caixas sem sobreposição |
| Ordenação por confiança | Faz com que a caixa de maior score seja analisada primeiro |
| Limiar \(\tau\) | Define a quantidade de sobreposição necessária para que uma caixa seja considerada redundante |
| Supressão | Remove caixas que apresentam grande sobreposição com uma caixa já selecionada |
| Caixas distantes | Possuem IoU próximo de zero e, em geral, não são suprimidas por essa regra |
9.10.4.4 🧩 Métodos do morph.py que podem ajudar
mm.IoU(boxA, boxB)— calcula a métrica de IoU, mas espera as caixas no formato \((x,y,w,h)\), isto é, canto superior esquerdo, largura e altura. A entrada deste exercício utiliza o formato \((x_1,y_1,x_2,y_2)\). A conversão é direta:\[ w=x_2-x_1,\qquad h=y_2-y_1. \]
O uso dessa função é opcional. O objetivo principal do exercício é implementar corretamente o processo de seleção e supressão da NMS.
9.10.4.5 📦 Especificação de Entrada e Saída (VPL)
Entrada:
- Linha 1: inteiro \(N\) e real \(\tau\).
- Próximas \(N\) linhas: \(x_1\ y_1\ x_2\ y_2\ \text{score}\).
Saída:
- Uma linha por caixa mantida, na ordem de seleção:
índice score. - Última linha:
Total mantidas: X.
%%writefile EP09_04.py
# Código PythonWriting EP09_04.py
TestSuite("EP09_04.py").run()✔️ EP09_04.cases já existe em casos/
📋 3 caso(s) carregado(s) de casos/EP09_04.cases
🔍 Testando Python: EP09_04.py
⚠️ EP09_04.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.