Ultralytics YOLO27: Inscreve-te na lista de espera.
Get Started
Aulainiciante

Defina a especificação do conjunto de dados

Planeje cenários, cotas, variabilidade, casos extremos e imagens de fundo antes da coleta, e dimensione o plano de acordo com as metas de volume da Ultralytics.

As equipes sem uma especificação acabam com 5.000 fotos diurnas bem iluminadas de uma única câmera e um modelo que falha ao anoitecer no primeiro dia em produção. Uma especificação do conjunto de dados é uma lista de compras de imagens: cada cenário que o modelo precisa lidar, quantas imagens são necessárias para cada um e quais casos raros devem ser superamostrados. Leva uma hora para escrevê-la e ela determina onde concentrar o esforço de coleta.

Resultado

Crie uma tabela de cenários com cotas que cubra as dimensões de variabilidade e os casos extremos, e meça o quanto qualquer conjunto de dados rotulado está distante das metas de volume de produção.

Via rápida
Se já sabes orientar-te, aqui está a versão resumida.
  1. Escreva os cenários em linhas: câmera, local, horário e condição, cada um com uma cota.

  2. Defina cotas com base em ≥1,500 imagens e ≥10,000 instâncias rotuladas por classe para produção.

  3. Dê a cada caso extremo conhecido sua própria linha e superamostre-o.

  4. Reserve de 0 a 10% das imagens como imagens de fundo sem objetos.

Prático

Onde a especificação se encaixa#

A especificação faz a ponte entre o objetivo e a câmera. Ela orienta a coleta e é a página à qual você volta quando o primeiro modelo não atinge sua meta:

O ciclo volta à especificação, não às configurações de treinamento: uma meta não atingida geralmente indica que a especificação não cobriu algum cenário. O guia sobre as etapas de um projeto de CV descreve o mesmo ciclo de vida.

Escreva os cenários em linhas#

Um cenário é uma combinação de condições de captura que o modelo precisa lidar. Linhas com cotas tornam as lacunas visíveis antes de alguém pegar uma câmera:

CenárioCâmerasLocaisHorário do diaCondiçãoCotaNotas
doca-diacam-1 a cam-4docas A–C08:00–17:00qualquer horário1,200horários de pico
doca-noitecam-1 a cam-4docas A–C22:00–04:00qualquer horário400iluminação de vapor de sódio, menos pessoas
carga-chuvacam-2, cam-3doca Bqualquer horáriosomente chuva200raro, mas crítico
empilhadosqualquer horárioqualquer horárioqualquer horáriopaletes com mais de 2 de altura150oculta as pessoas atrás deles
fundoqualquer horárioqualquer horárioqualquer horáriodoca vazia150sem objetos, sem rótulos

Um cenário que você não consegue descrever por escrito é um cenário que o modelo não verá no treinamento e será justamente o que falhará em produção.

Dimensione a especificação de acordo com as metas de volume#

As dicas da Ultralytics para obter os melhores resultados de treinamento apresentam regras práticas para produção:

MetaRecomendação
Imagens por classe≥ 1,500
Instâncias rotuladas por classe≥ 10,000
Imagens de fundo (sem rótulos)0–10% do conjunto de dados; o COCO tem cerca de 1%
VariedadeDiferentes horários, estações do ano, condições meteorológicas, iluminação, ângulos, fontes e câmeras

Esses são os patamares para um modelo de produção. Algumas centenas de objetos rotulados por classe bastam para começar a experimentar, e o primeiro modelo é a maneira mais rápida de descobrir quais cenários precisam de mais dados. Para saber o quanto um conjunto de dados está distante desse patamar, faça a contagem. Este script funciona com o COCO128, um recorte do COCO com 128 imagens que é baixado automaticamente:

from collections import Counter
from pathlib import Path

from ultralytics.data.utils import IMG_FORMATS, check_det_dataset, img2label_paths

IMAGES_PER_CLASS, INSTANCES_PER_CLASS = 1500, 10_000  # Ultralytics production targets

data = check_det_dataset("coco128.yaml")  # downloads COCO128 (~7 MB) on first run; swap in your data YAML
images = [p for p in Path(data["train"]).rglob("*.*") if p.suffix[1:].lower() in IMG_FORMATS]
image_count, instance_count, background = Counter(), Counter(), 0
for label in map(Path, img2label_paths([str(p) for p in images])):
    classes = [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []
    instance_count.update(classes)
    image_count.update(set(classes))
    background += not classes

print(f"{len(images)} images, {background} background ({background / len(images):.0%}, target 0-10%)")
print(f"{'class':>12} {'images':>7} {'instances':>10} {'of target':>10}")
ranked = instance_count.most_common()
for cls, n in ranked[:3] + ranked[-3:]:  # best and worst covered classes
    coverage = min(image_count[cls] / IMAGES_PER_CLASS, n / INSTANCES_PER_CLASS)
    print(f"{data['names'][cls]:>12} {image_count[cls]:>7} {n:>10} {coverage:>10.1%}")

never_labeled = [name for i, name in data["names"].items() if i not in instance_count]
print(f"{len(never_labeled)} classes in names with zero labels: {never_labeled[:4]} ...")
128 images, 2 background (2%, target 0-10%)
       class  images  instances  of target
      person      61        254       2.5%
         car      12         46       0.5%
         cup      10         36       0.4%
        bear       1          1       0.0%
      banana       1          1       0.0%
        skis       1          1       0.0%
9 classes in names with zero labels: ['fire hydrant', 'parking meter', 'sheep', 'cow'] ...

Como interpretar o resultado:

  • Cobertura é o menor valor entre a proporção de imagens e a proporção de instâncias, pois uma classe precisa de ambas. Mesmo person, a classe com melhor cobertura, atinge apenas 2.5% do patamar de produção.
  • Classes com uma única instância (bear, banana, skis) não podem ser aprendidas nem avaliadas. No seu conjunto de dados, colete mais exemplos dessas classes ou remova-as da v1.
  • As classes sem rótulos estão listadas no YAML, mas nunca são desenhadas. Ainda assim, o modelo dedica capacidade a prevê-las. Remova-as de names ou colete exemplos delas antes do treinamento.

Cubra as dimensões de variabilidade#

Detecção com Ultralytics YOLO em um calçadão à beira-mar: pessoas e ciclistas perto da câmera, um cachorro e carros a diferentes distâncias, cada um com uma caixa rotulada e uma pontuação de confiança

Um único quadro já reúne pessoas próximas e distantes, bicicletas, um cachorro e carros. Uma especificação real precisa planejar deliberadamente essa variedade. Para cada dimensão, registre se a especificação a cobre ou por que ela não se aplica; linhas vazias correspondem a cenários que você só descobrirá em produção:

DimensãoExemplos
HorárioDia, noite, amanhecer, anoitecer
ClimaSol, céu encoberto, chuva, neblina, neve
IluminaçãoClara, fraca, ofuscamento, sombras fortes, fontes mistas
CâmeraModelo, lente, altura de montagem, campo de visão
GeografiaLocais, cidades, países
Pessoas e operadoresTurnos, equipes, uniformes, equipamentos de proteção
Variantes de produtoSKUs, revisões de embalagem, cores
Tamanho do objetoPróximo e grande, a média distância, distante e pequeno
OclusãoNítida, parcial, intensa, atrás de vidro
Estado dos equipamentosLentes sujas ou embaçadas, paletes danificados, marcações de piso desgastadas

A variedade importa mais do que o volume: 1.500 imagens distribuídas por estas linhas valem mais do que 5.000 de uma única câmera ao meio-dia.

Planeje imagens de fundo e casos extremos#

Imagens de fundo são quadros sem objetos rotulados, como uma doca vazia. Elas ensinam ao modelo que não há nada ali e reduzem os falsos positivos.

Como uma imagem de fundo é armazenada

No formato Ultralytics YOLO, uma imagem de fundo é simplesmente uma imagem com um arquivo de rótulos vazio ou sem arquivo de rótulos. O treinamento conta ambas na linha de varredura (… 1200 images, 90 backgrounds, 0 corrupt). Confira esse número em relação à sua meta de 0–10% antes da primeira época.

Casos extremos incluem oclusão intensa, objetos cortados pela borda do quadro, orientações incomuns, objetos empilhados e objetos parecidos, como um mastro de empilhadeira ao lado de uma coluna de aço. Reserve uma linha de cota para cada um.

A frequência natural deixa os casos extremos sem dados suficientes

Se 1 quadro em 200 mostra uma pessoa atrás de paletes empilhados, um conjunto de dados coletado na frequência natural terá cerca de 7 desses quadros em 1.500, muito pouco para o modelo aprender. Faça uma sobreamostragem intencional dos casos extremos: as cotas deles devem ser muito maiores que sua proporção nas filmagens reais.

A especificação não precisa estar completa

Você não vai pensar em todos os cenários no papel. Deixe a especificação quase certa, treine rapidamente um primeiro modelo e use os erros dele para revelar os cenários que você não previu.

Experimente

Elabore uma tabela de cenários para o seu projeto com 5–10 linhas, cada uma com uma cota numérica, além de uma linha para imagens de fundo e uma linha para cada caso extremo conhecido. Revise a tabela com alguém que trabalhe no local de implantação e adicione todos os cenários que essa pessoa mencionar. Em seguida, execute volume_gap.py em quaisquer dados rotulados que você já tenha (ou no COCO128) e anote as classes com melhor e pior cobertura. Entregável: spec.md com a tabela e os números de cobertura.

Concluído quando
Você concluiu a aula quando todos estes critérios forem atendidos.
  • A tabela de cenários tem pelo menos 5 linhas, cada uma com uma cota numérica, além de linhas para imagens de fundo e casos extremos.

  • Pelo menos 5 das 10 dimensões de variação estão cobertas ou foram explicitamente descartadas.

  • A soma das cotas atinge pelo menos as metas de imagens e instâncias por classe, ou a diferença está documentada como uma exceção da v1.

Mostrar solução

As cotas são definidas com base na meta de instâncias, não apenas na meta de imagens. Suponha que um contador de estacionamento tenha duas classes e que as imagens do projeto-piloto tenham, em média, 3 carros e 0,5 caminhões por imagem:

ClasseInstâncias por imagemImagens necessárias para 10.000 instânciasImagens necessárias para o mínimo de 1.500 imagensPlano
car3.0≈ 3,3001,5003.300 imagens
truck0.5≈ 20,0001,500Captura direcionada na entrada de carga, onde os caminhões são 10× mais comuns

Os carros estão cobertos pelas imagens comuns. Para os caminhões, seriam necessárias 20.000 imagens aleatórias, então a especificação adiciona uma linha de cenário dedicada (entrada de carga, dias úteis das 06:00 às 10:00), em vez de coletar seis vezes mais imagens de tudo. Adicione uma linha de imagens de fundo de cerca de 5% (estacionamento vazio à noite) e linhas de casos extremos para cobertura de neve e caminhões parcialmente fora do quadro.

Próximos passos

Com a especificação pronta, a próxima lição coleta imagens que realmente a preencham.

Entre para salvar seu progresso