Ultralytics YOLO27: Inscreve-te na lista de espera.
Get Started
Fundamentos de visão computacional·Escolhe uma tarefa·Aula 3/10
Aulainiciante

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.

Resultado

Leia as detecções YOLO26 no código e escolha conf e iou com base no custo de uma detecção perdida em comparação com um falso alarme.

Via rápida
Se já sabes orientar-te, aqui está a versão resumida.
  1. Cada detecção consiste em uma classe, uma caixa e uma pontuação de confiança.

  2. conf descarta caixas fracas (padrão: 0.25); iou determina quando o NMS trata duas caixas como duplicadas (padrão: 0.7).

  3. Detecções perdidas são caras? Diminua conf. Falsos alarmes são visíveis? Aumente-o.

  4. Objetos vizinhos desaparecendo? Aumente iou.

  5. A confiança classifica as caixas; não é uma probabilidade calibrada.

Prático

O que um detector retorna#

Detecções do Ultralytics YOLO no calçadão à beira-mar: pessoas, dois ciclistas, um cão e dois carros, cada um com uma caixa identificada pela classe e confiança

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; xyxy fornece 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:

AtributoFormatoUso típico
boxes.xyxyCoordenadas dos cantos em pixels (x1, y1, x2, y2)Recorte, desenho e regras de sobreposição
boxes.xywhCentro em pixels, mais largura e alturaFiltros de tamanho, movimento
boxes.xyxynCoordenadas dos cantos normalizadas entre 0 e 1Regras que funcionam com diferentes resoluções
boxes.xywhnCentro e tamanho normalizados entre 0 e 1Arquivos 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:

confCaixas em bus.jpg
0.107
0.255
0.505
0.754

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.

Interseção sobre união em uma ave: caixas previstas e de referência sobrepostas, além de máscaras correspondentes, com IoU como a sobreposição dividida pela união

iouCaixas em bus.jpgEfeito
0.35Rigoroso: caixas sobrepostas são mescladas
0.75Padrão
0.958Permissivo: 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 contagensVarra os valores de conf em imagens de validação e mantenha aquele com o menor erro de contagem
Vizinhos reais desaparecem em meio à multidãoAumente iou, por exemplo, de 0.7 → 0.8
O mesmo objeto recebe duas caixasReduza iou
As classes diferem em dificuldadeFaç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#

Interpretar a confiança como uma probabilidade

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.

Falta um dos dois vizinhos? Verifique o NMS

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.

Ajustar com base em uma única imagem

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#

FalhaO que está erradoSolução típica
Classe correta, caixa imprecisaLocalizaçãoRegras de caixa mais rigorosas e consistentes; valor maior de imgsz para objetos pequenos
Caixa correta, classe erradaClassificaçãoMais exemplos do par confundido ou mescle as classes
Nenhuma caixaRevocaçãoMais exemplos dessa condição: iluminação, tamanho, oclusão
Caixa no fundoPrecisãoImagens 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.

Experimente

Execute a solução com conf=0.05 e abra a imagem salva. Marque cada caixa abaixo de 0.5 como verdadeiro ou falso positivo e anote o motivo de cada falso positivo. Em seguida, anote o valor de conf que você usaria em produção para um contador de pedestres nesta câmera, com uma frase de justificativa.

Concluído quando
Você concluiu a aula quando todos estes critérios forem atendidos.
  • Você tem uma lista de todas as caixas abaixo de 0.5 em bus.jpg, cada uma marcada como verdadeiro ou falso positivo e acompanhada de um motivo.

  • Você anotou um valor de conf para um contador de pedestres e o erro contra o qual ele protege.

  • Você consegue explicar, usando a tabela de iou, por que aumentar iou faz reaparecer um vizinho suprimido.

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.

Próximos passos

A seguir: quando um retângulo não basta e você precisa do formato exato do objeto.

Entre para salvar seu progresso