Ultralytics YOLO27: Inscreve-te na lista de espera.
Get Started
Crie com a Ultralytics Platform·Crie o conjunto de dados·Aula 3/10
Aulaintermediário

Anotação inteligente e rotulagem em lote

Escolhe um modelo de rotulagem e um limiar de confiança medindo o trabalho de revisão; depois, executa a anotação em lote e verifica-a através da taxa de edição.

Desenhar caixas à mão permite anotar talvez 100 imagens por hora; rever boas pré-anotações pode ser várias vezes mais rápido. Mas, com um limiar de confiança incorreto, um modelo de rotulagem pode dar mais trabalho do que aquele que poupa, e um modelo cujas previsões não são revistas ensina os seus próprios erros ao modelo seguinte. Nesta lição, medimos o trabalho de revisão para cada limiar usando dados reais anotados, para que escolhas o limiar com base em números e não num palpite.

Resultado

Podes medir quantas eliminações e redesenhos um modelo de rotulagem provoca em cada limiar de confiança, escolher o mais económico, executar a anotação em lote com esse limiar e calcular a taxa de edição da tua revisão.

Via rápida
Se já sabes orientar-te, aqui está a versão resumida.
  1. Prime S no editor: SAM para formas rotuladas com um clique, YOLO ou modelos com indicação de classes para imagens completas.

  2. Testa vários níveis de confiança em imagens anotadas e escolhe o limiar com menos edições por imagem.

  3. Executa More actions > Batch Annotation; é guardada uma versão do conjunto de dados antes de começar.

  4. Revê cada imagem, guarda uma segunda versão e calcula a taxa de edição com Compare versions.

Prático

Três formas de pré-anotar#

No editor de anotações, o modo Draw (V) é manual e o modo Smart (S) permite que um modelo proponha rótulos:

Editor de anotações da Ultralytics Platform no conjunto de dados medical-pills, com os botões Draw e Smart na barra de ferramentas e caixas azuis desenhadas sobre comprimidos numa embalagem blister

FamíliaComo funcionaTarefasCusto
SAM (SAM 2.1 Tiny a Large, SAM 3, SAM 3.1 predefinido)Clica num objeto para criar uma máscara; clica fora para adicionar, dentro para subtrair; A ativa ou desativa a aplicação automáticaDeteção, segmentação, semântica, OBBGratuito
YOLO (modelos oficiais ou teus)Predict adiciona as deteções do modelo; Map classes alinha as classes do modelo com as do conjunto de dados; as duplicações com IoU de 0.7 ou superior são ignoradasDeteção, segmentação, semântica, OBB, poseGratuito no editor
Com indicação de classes (Moondream 3.1 predefinido, YOLOE-26x, SAM 3 Text e outros)Encontra na imagem os nomes das classes do conjunto de dados; os modelos de fornecedores pagos são executados com a tua própria chave APIConjuntos de dados de deteção com 1–200 classesModelos alojados gratuitos

Editor de anotações da Ultralytics Platform no modo Smart, com um modelo YOLO e um botão Predict na barra de ferramentas, acima das caixas dos comprimidos na imagem

O SAM requer um clique por objeto e gera formas mais precisas. As previsões do modelo requerem um clique por imagem e a sua qualidade depende do modelo; por isso, o resto desta lição é dedicado a escolher e ajustar esse modelo.

Escolhe o modelo de rotulagem#

Mesmo um modelo v0 fraco, treinado com 100–200 anotações manuais, é melhor do que começar do zero e, na versão v1, costuma ser um parceiro útil de aprendizagem ativa. O desempenho dos modelos com indicação de classes varia muito conforme o domínio: alguns que encontram quase tudo em fotografias do dia a dia não detetam a maioria dos objetos em imagens de PCB, raios X ou retalho; por isso, verifica dez previsões antes de confiar num modelo.

Exemplo prático: mede o trabalho de revisão por limiar#

O limiar de confiança determina em que os revisores gastam o seu tempo: se for demasiado baixo, eliminam caixas falsas; se for demasiado alto, desenham as caixas que o modelo não detetou. Mede-o em imagens que já têm rótulos corretos; neste caso, as 128 imagens anotadas de COCO128, usando um YOLO26n pré-treinado como modelo de rotulagem:

from pathlib import Path

import torch

from ultralytics import YOLO
from ultralytics.data.utils import check_det_dataset
from ultralytics.utils.metrics import box_iou
from ultralytics.utils.ops import xywhn2xyxy

data = check_det_dataset("coco128.yaml")  # 128 labeled images, downloaded on first use
images = sorted(Path(data["train"]).glob("*.jpg"))
results = YOLO("yolo26n.pt").predict(images, conf=0.05, verbose=False)  # your labeling model

def review_work(result, image, conf):
    """Return (kept, delete, draw): correct pre-labels, false positives to delete, missed objects to draw."""
    label = Path(str(image).replace("images", "labels")).with_suffix(".txt")
    lines = label.read_text().splitlines() if label.exists() else []  # no label file = background image
    gt = torch.tensor([[float(x) for x in line.split()] for line in lines]).reshape(-1, 5)
    h, w = result.orig_shape
    gt_boxes, gt_cls = xywhn2xyxy(gt[:, 1:], w=w, h=h), gt[:, 0]
    boxes = result.boxes[result.boxes.conf >= conf]
    iou = box_iou(boxes.xyxy, gt_boxes) * (boxes.cls[:, None] == gt_cls[None])  # IoU with same-class boxes only
    matched = set()
    for row in iou:  # greedily match each prediction to its best unmatched ground-truth box
        for j in row.argsort(descending=True).tolist():
            if row[j] >= 0.5 and j not in matched:
                matched.add(j)
                break
    return len(matched), len(boxes) - len(matched), len(gt) - len(matched)

print("conf  kept  delete  draw  edits/image")
for conf in (0.1, 0.25, 0.4, 0.5, 0.7):
    kept, delete, draw = (sum(t) for t in zip(*(review_work(r, i, conf) for r, i in zip(results, images))))
    print(f"{conf:<5} {kept:>4} {delete:>7} {draw:>5} {(delete + draw) / len(images):>12.1f}")
conf  kept  delete  draw  edits/image
0.1    590     490   339          6.5
0.25   468     138   461          4.7
0.4    386      58   543          4.7
0.5    328      35   601          5.0
0.7    230       6   699          5.5

Como funciona e o que indica:

  1. O modelo faz previsões uma vez com um conf=0.05 baixo; depois, cada limiar filtra as mesmas previsões, pelo que o teste é rápido.
  2. review_work associa cada previsão a uma caixa de referência da mesma classe com IoU igual ou superior a 0.5. As previsões não associadas são caixas que um revisor elimina; os objetos de referência não associados são objetos que um revisor desenha.
  3. O número de edições por imagem atinge o mínimo entre 0.25 e 0.4 (4.7). Abaixo desse intervalo, as eliminações disparam; acima, são as deteções em falta que disparam.
  4. Mesmo no melhor limiar, os revisores desenham cerca de 3.6 caixas por imagem, porque a longa cauda de objetos pequenos do COCO é difícil de detetar para um modelo nano.

Regras de decisão: escolhe o limiar com menos edições por imagem. Se desenhar predominar em todos os limiares, o modelo de rotulagem é demasiado fraco para os dados, por isso usa um modelo maior ou o teu modelo ajustado. Se eliminar predominar mesmo em 0.5, o modelo confunde classes parecidas; verifica a matriz de confusão antes de anotar mais dados. No teu próprio projeto, testa os limiares com o teu modelo ajustado em 50–100 imagens que já anotaste.

Executa a anotação em lote#

A anotação em lote executa um modelo YOLO ou com indicação de classes em todo o conjunto de dados. Abre-a em More actions > Batch Annotation ou seleciona Annotate all na notificação após uma previsão no editor:

Caixa de diálogo Batch Annotation da Ultralytics Platform com Moondream 3.1 selecionado, pré-visualizações de previsões de exemplo em seis fotografias de trabalhadores, um controlo Include annotated images e um custo estimado de $0.05

  1. Escolhe o modelo. Os conjuntos de dados de deteção abrem com Moondream 3.1 selecionado; muda para o teu modelo ajustado ou modelo YOLO.
  2. Num modelo YOLO, define a confiança para o limiar escolhido no teste (o valor predefinido é 0.25) e o IoU (0.7) e verifica as pré-visualizações de exemplo.
  3. Deixa Include annotated images desativado para rotular apenas imagens sem rótulos.
  4. Verifica o Estimated Cost ($1.00 por cada 1 000 imagens, mínimo de $0.01) e clica em Start.

Ao iniciar uma execução, é guardada primeiro uma versão do conjunto de dados para que possas restaurar o estado anterior à execução. Stop mantém e cobra as imagens processadas até esse momento.

Revê e mede a taxa de edição#

As previsões são guardadas como anotações normais, por isso nada indica que ainda não foram revistas. Filtra por classe para verificar primeiro as classes raras e ordena por Annotations em ordem crescente (prováveis deteções em falta) e decrescente (cenas congestionadas, onde as caixas se fundem). Em seguida, cria uma versão, abre Compare versions no separador Versions e escolhe v_auto como versão From:

ContagemSignificado
AdicionadasObjetos que o modelo não detetou, mais a cópia corrigida de cada caixa ajustada
RemovidasFalsos positivos, mais a versão original de cada caixa ajustada
Taxa de edição(adicionadas + removidas) ÷ anotações em v_auto; é um limite superior, porque uma caixa ajustada conta duas vezes

Acompanha a taxa de edição de cada lote. Uma taxa crescente é o primeiro sinal de que as novas imagens se afastaram do que o modelo de rotulagem conhece. A lição sobre boas práticas de anotação aborda guias de rotulagem e concordância entre revisores.

Armadilhas#

Treinar com previsões não revisadas

Sintoma: cada novo treinamento obtém praticamente a mesma pontuação, e os mesmos objetos continuam sem ser detectados. Solução: pré-rótulos não revisados incorporam os erros sistemáticos do modelo de rotulagem ao conjunto de dados como se fossem verdade: uma classe parecida, uma borda de caixa habitualmente imprecisa, objetos que o modelo nunca detecta. Revise cada imagem antes que ela entre em uma versão de treinamento.

Confiar em um modelo orientado por classes em um domínio específico

Sintoma: a anotação em lote termina, mas a maioria dos objetos continua sem rótulo. Solução: primeiro, execute o modelo no editor com dez imagens representativas. Se ele não detectar mais do que alguns objetos, rotule manualmente um conjunto inicial e treine uma v0.

As classes do modelo e do conjunto de dados não correspondem

Sintoma: as caixas previstas exibem nomes de classe incorretos. Solução: quando as classes do modelo diferem das do conjunto de dados, a etapa Mapear classes associa cada classe do modelo a uma classe do conjunto de dados ou a ignora. Faça o mapeamento com cuidado: um mapeamento incorreto renomeia todas as caixas dessa classe.

Experimente

Execute threshold_sweep.py com o teu modelo de anotação em 50–100 imagens que já anotaste e escolhe o limiar que exigir menos edições por imagem. Executa a Anotação em lote nesse limiar em pelo menos 50 imagens sem anotação, revê todas, guarda uma versão e calcula a taxa de edição com Comparar versões.

Concluído quando
Você concluiu a aula quando todos estes critérios forem atendidos.
  • Tens uma tabela de varredura do teu modelo de anotação e um limiar escolhido, com a respetiva justificação.

  • Todas as imagens pré-anotadas foram revistas, e duas versões delimitam a revisão.

  • Calculaste a taxa de edição e identificaste o erro mais comum do modelo de anotação.

Mostrar solução

Exemplo prático: a varredura escolhe 0.35 para um ajuste fino de inspeção de comprimidos. A Anotação em lote guarda v4 com 1,240 anotações. Após a revisão, Comparar versões v4 → v5 mostra 96 adicionadas e 152 removidas, pelo que a taxa de edição é (96 + 152) ÷ 1,240 = 20%. O número de remoções superior ao de adições indica excesso de previsões: ao inspecionar as caixas removidas, vê-se que o modelo assinala como comprimidos os reflexos das embalagens blister. Daí resultam duas ações: aumentar a confiança um nível (0.35 → 0.45) para o próximo lote e confirmar que a taxa diminui; e adicionar 30 imagens revistas de embalagens brilhantes à próxima versão de treino, para que o ajuste fino aprenda a distinguir os casos.

Próximos passos

Já tens as etiquetas. A seguir, vais provar que não há fugas entre as divisões do conjunto de dados e congelar uma versão.

Entre para salvar seu progresso