Non-Maximum Suppression (NMS)
A supressão de não máximos (NMS) remove caixas sobrepostas duplicadas para que cada objeto tenha apenas uma detecção. Saiba como funciona, como ajustá-la e conheça os modelos sem NMS.
A supressão não máxima (NMS) é a etapa de pós-processamento que transforma as previsões brutas e sobrepostas de um detector em uma caixa por objeto. Um modelo denso de detecção de objetos atribui pontuações a milhares de caixas delimitadoras candidatas por imagem, e várias candidatas vizinhas costumam ser ativadas para o mesmo objeto, com posições e pontuações ligeiramente diferentes. A NMS mantém a caixa de maior confiança em cada grupo de caixas sobrepostas e suprime as demais, usando a interseção sobre união (IoU) para decidir quais caixas se sobrepõem o suficiente para serem consideradas duplicatas.
Como funciona a supressão não máxima#
A NMS gulosa, a versão padrão, primeiro descarta as candidatas abaixo de um limiar de confiança e ordena as restantes por pontuação. Em seguida, mantém a caixa de maior pontuação, remove todas as caixas restantes cuja IoU com ela ultrapasse o limiar de IoU e repete o processo com a melhor caixa restante até não sobrar nenhuma. Normalmente, os detectores executam essa etapa uma vez por classe, de modo que uma caixa de pessoa nunca suprime uma caixa de bicicleta sobreposta.
A nms do torchvision implementa a NMS gulosa para uma classe e retorna os índices das caixas mantidas, ordenados por pontuação.
import torch
from torchvision.ops import nms
# Caixas candidatas como [x1, y1, x2, y2], cada uma com uma pontuação de confiança
boxes = torch.tensor(
[
[100, 100, 200, 200], # A
[105, 105, 195, 195], # B: quase duplicada de A (IoU 0.81)
[300, 300, 400, 400], # C: um objeto separado
],
dtype=torch.float32,
)
scores = torch.tensor([0.90, 0.80, 0.95])
# Suprime qualquer caixa cuja IoU com uma caixa mantida de pontuação mais alta ultrapasse 0.5
keep = nms(boxes, scores, iou_threshold=0.5)
print(keep.tolist())A saída é [2, 0]: a caixa C é mantida primeiro porque tem a pontuação mais alta, a caixa A é mantida porque não se sobrepõe a C, e a caixa B é removida porque sua IoU com A é 0.81.
Ajuste dos limiares#
O limiar de confiança remove candidatas fracas antes do início da supressão. O limiar de IoU define o grau de sobreposição considerado uma duplicata. Quando é baixo demais, dois objetos reais próximos, como pessoas em uma multidão, são fundidos em uma única detecção e a revocação diminui. Quando é alto demais, caixas duplicadas permanecem e a precisão diminui. A NMS independente de classe permite que qualquer caixa suprima outra, independentemente da classe, removendo rótulos duplicados quando o modelo atribui a um objeto duas classes semelhantes, como "carro" e "caminhão".
Limitações da NMS#
- Cenas lotadas: um único limiar de IoU fixo não consegue distinguir uma caixa duplicada de um segundo objeto que realmente se sobrepõe ao primeiro; assim, objetos muito ocluídos são suprimidos.
- Heurística fixa: o limiar é definido manualmente, fica fora da rede treinada e não é aprendido a partir dos dados.
- Latência e implantação: o loop guloso é executado após a rede, e seu custo aumenta com o número de candidatas, o que acrescenta latência de inferência. Formatos de exportação que não conseguem incorporar a NMS ao grafo do modelo geram candidatas brutas, e o aplicativo precisa executar a NMS por conta própria.
Variantes da NMS e detecção sem NMS#
A Soft-NMS reduz as pontuações das caixas sobrepostas em função do grau de sobreposição, em vez de removê-las, o que permite recuperar mais objetos em multidões. A DIoU-NMS, proposta junto com a perda Distance-IoU, também considera a distância entre os centros das caixas; assim, é menos provável que caixas com centros distantes sejam suprimidas.
Os detectores de ponta a ponta eliminam completamente essa etapa. O DETR é treinado com correspondência húngara um a um entre previsões e rótulos, então cada objeto recebe exatamente uma previsão, e o YOLOv10 trouxe uma cabeça um para um aos modelos YOLO em tempo real. O YOLO26 treina os dois tipos de cabeça e aplica NMS por padrão, porque sua cabeça de um para muitos obtém uma pontuação ligeiramente maior: 40,9 contra 40,1 de mAP50-95 no COCO para YOLO26n. Passar nms=False seleciona a cabeça um para um, que gera no máximo 300 caixas finais por imagem sem uma etapa de NMS, como mostra o guia de detecção de ponta a ponta para predição e exportação.










