Entenda a detecção de objetos
Leia a saída de um detector — classe, caixa e confiança — e defina os limiares de confiança e IoU com base no custo de cada erro.
A maioria dos sistemas de visão em produção são sistemas de detecção com lógica adicional: contadores, rastreadores, alertas por zona e desfoque para privacidade. Quando um deles se comporta de forma inesperada, geralmente a causa não é o modelo, mas um limiar que ninguém escolheu intencionalmente. Saiba exatamente o que um detector retorna e quais são os dois controles que moldam essa lista, e você conseguirá depurar quase tudo o que for construído sobre ele.
Prático
O que um detector retorna#

Cada etiqueta nessa imagem corresponde a uma linha de saída: um nome de classe, uma confiança e a caixa que a delimita. Um modelo de detecção retorna exatamente essa lista:
- Classe — um índice inteiro associado a um nome por meio de
result.names(0éperson,5ébus). - Caixa — quatro números que localizam o objeto;
xyxyfornece os cantos superior esquerdo e inferior direito em pixels. - Confiança — uma pontuação de 0 a 1 usada para classificar e filtrar detecções.
Contagem, alertas, rastreamento e desfoque são recursos que você implementa com código sobre essas linhas.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
for box in result.boxes:
name = result.names[int(box.cls)]
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")bus conf=0.88 box=(0, 230, 803, 751)
person conf=0.87 box=(49, 398, 240, 902)
person conf=0.86 box=(223, 405, 345, 861)
person conf=0.85 box=(670, 395, 810, 880)
person conf=0.65 box=(0, 553, 60, 871)Linha por linha: a caixa do ônibus começa em x=0 porque o ônibus ultrapassa a borda esquerda; três pessoas têm pontuações entre 0.85 e 0.87; a quarta pessoa, cortada pela borda esquerda, tem apenas 0.65 — o modelo vê metade de um corpo. É normal que objetos truncados tenham baixa confiança, e esse é o primeiro ponto em que um limiar faz diferença.
Cada caixa está disponível em quatro formatos; use aquele que seu código subsequente espera:
| Atributo | Formato | Uso típico |
|---|---|---|
boxes.xyxy | Coordenadas dos cantos em pixels (x1, y1, x2, y2) | Recorte, desenho e regras de sobreposição |
boxes.xywh | Centro em pixels, mais largura e altura | Filtros de tamanho, movimento |
boxes.xyxyn | Coordenadas dos cantos normalizadas entre 0 e 1 | Regras que funcionam com diferentes resoluções |
boxes.xywhn | Centro e tamanho normalizados entre 0 e 1 | Arquivos de rótulos YOLO |
De candidatos a uma lista final#
Internamente, o modelo atribui pontuações a muitas caixas candidatas por objeto. Dois filtros as transformam na lista exibida:
Filtro de confiança. conf descarta caixas abaixo de um limiar; o padrão de previsão é 0.25. Na imagem do ônibus, a contagem muda rapidamente:
conf | Caixas em bus.jpg |
|---|---|
| 0.10 | 7 |
| 0.25 | 5 |
| 0.50 | 5 |
| 0.75 | 4 |
Filtro de duplicatas. A supressão não máxima (NMS) mantém a caixa com maior confiança e descarta outras caixas da mesma classe que se sobreponham a ela em mais de iou (padrão: 0.7). A sobreposição é medida como interseção sobre união: a área compartilhada dividida pela área combinada.

iou | Caixas em bus.jpg | Efeito |
|---|---|---|
| 0.3 | 5 | Rigoroso: caixas sobrepostas são mescladas |
| 0.7 | 5 | Padrão |
| 0.95 | 8 | Permissivo: quase duplicatas permanecem |
Escolha os limiares com base no custo dos erros#
| Se… | Então… |
|---|---|
| Uma falha de detecção custa caro (alertas de segurança, defeitos) | Reduza conf e aceite alguns falsos alarmes |
| Um falso alarme fica visível para os usuários (pesquisa, marcação) | Aumente conf |
| Você informa contagens | Varra os valores de conf em imagens de validação e mantenha aquele com o menor erro de contagem |
| Vizinhos reais desaparecem em meio à multidão | Aumente iou, por exemplo, de 0.7 → 0.8 |
| O mesmo objeto recebe duas caixas | Reduza iou |
| As classes diferem em dificuldade | Faça previsões com o menor valor de conf de que você precisa e depois filtre por classe no código |
O monitoramento de segurança em armazéns é o caso clássico para um limiar baixo; o modo Predict lista todos os argumentos de inferência.
Armadilhas#
Sintoma: "o modelo tem 88% de certeza de que isto é um ônibus", com limiares escolhidos por intuição. Solução: trate a confiança como uma pontuação de classificação. No YOLO26, uma única pontuação cobre tanto "há um objeto" quanto "é desta classe", e ela não é calibrada — escolha o limiar com base nos dados de validação, não no significado do número.
Quando duas pessoas ficam lado a lado, suas caixas se sobrepõem muito, e o NMS pode apagar uma pessoa real como "duplicata". Aumente iou e a segunda caixa volta. O YOLO26 também inclui uma cabeça end-to-end que não precisa de NMS; passe nms=False para usá-la.
Sintoma: um limiar que parece perfeito na imagem de demonstração falha na câmera real. Solução: teste vários limiares em um conjunto de validação da câmera de implantação; uma única imagem só mostra o que os controles fazem.
Quatro maneiras de errar#
| Falha | O que está errado | Solução típica |
|---|---|---|
| Classe correta, caixa imprecisa | Localização | Regras de caixa mais rigorosas e consistentes; valor maior de imgsz para objetos pequenos |
| Caixa correta, classe errada | Classificação | Mais exemplos do par confundido ou mescle as classes |
| Nenhuma caixa | Revocação | Mais exemplos dessa condição: iluminação, tamanho, oclusão |
| Caixa no fundo | Precisão | Imagens com exemplos negativos difíceis do que enganou o modelo |
Duas listas agilizam o diagnóstico: verdadeiros positivos com baixa confiança (o modelo está incerto sobre objetos reais) e falsos positivos com alta confiança (ele tem certeza sobre algo errado). Cada lista aponta para correções diferentes.
Mostrar solução
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]
for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
name, conf = result.names[int(box.cls)], float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")0.88 bus (0, 230, 803, 751)
0.87 person (49, 398, 240, 902)
0.86 person (223, 405, 345, 861)
0.85 person (670, 395, 810, 880)
0.65 person (0, 553, 60, 871)
0.18 person (0, 600, 40, 871)
0.12 stop sign (0, 252, 35, 326)
0.08 handbag (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag (225, 634, 291, 705)Todas as caixas abaixo de 0.5 são falsos positivos. O valor 0.18 de person duplica a pessoa com valor 0.65, cortada na borda esquerda. O valor 0.12 de stop sign corresponde a uma placa de trânsito real com a classe errada. As bolsas e o skate estão sobre mãos e sapatos. Todos os objetos reais têm pontuação acima de 0.6, então conf=0.5 mantém as quatro pessoas e elimina todo o ruído para um contador de pedestres — ele evita a contagem dupla. Confirme isso em um conjunto de validação da câmera real antes de colocar em produção: a pessoa cortada, com pontuação 0.65, mostra como objetos reais podem ficar perto do limite.