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

Colete dados representativos e de alta qualidade

Obtenha imagens de condições reais de implantação, mantenha os metadados de captura em cada nome de arquivo, acompanhe a cobertura em relação à especificação e amostre vídeos sem sobrecarregar o conjunto de dados.

A maioria das falhas de conjuntos de dados começa na coleta. Uma equipe captura exemplos nítidos com uma câmera durante uma semana, a validação apresenta ótimos resultados e o modelo falha no segundo local. A coleta define o limite máximo: nenhuma qualidade de rótulo, aumento de dados ou hiperparâmetro pode ensinar uma cena que nunca esteve no conjunto de dados.

Resultado

Crie um conjunto de dados cujos nomes de arquivo incluam câmera, dia e quadro, informe a cobertura em relação às cotas da sua especificação e reduza a amostragem de vídeos a quadros distintos.

Via rápida
Se já sabes orientar-te, aqui está a versão resumida.
  1. Capture imagens com as câmeras de produção em que o modelo será executado.

  2. Nomeie cada arquivo como camera_day_frame para que as etapas posteriores possam agrupá-lo e auditá-lo.

  3. Conte as imagens por câmera, dia e cenário em relação à especificação e colete as que faltam.

  4. Amostre o vídeo para manter apenas os quadros em que a cena mudou.

  5. Use imagens públicas, encenadas ou sintéticas apenas para preencher lacunas identificadas.

Prático

A variedade supera o volume#

Compare dois conjuntos de dados voltados à mesma implantação:

Conjunto de dadosResultado da validaçãoEm produção
10.000 quadros quase idênticos, uma câmera, apenas ao meio-diaAlto: os quadros de validação se parecem com os de treinamentoO desempenho cai com outra câmera e ao anoitecer
1.500 quadros distribuídos por 12 cenários da especificaçãoMais modestoMantém o desempenho, porque a produção se parece com os dados

A pontuação de validação do primeiro conjunto de dados é alta apenas porque a validação mede a única condição que ele cobre. Em produção, um modelo só é tão bom quanto o cenário com pior cobertura que encontra. Priorize a cobertura da especificação na coleta e deixe o volume em segundo lugar.

Escolha as fontes na ordem certa#

A maior parte do conjunto de dados deve vir da configuração real de produção. O guia de coleta e anotação de dados aborda cada fonte com mais detalhes:

FonteQuando ajudaQuando prejudica
Câmeras de produção, ao vivoMais próximas da implantaçãoLento; pode exigir acordos de compartilhamento de dados
Câmeras de produção, gravações arquivadasMuita variedade em pouco tempoAs gravações antigas podem não corresponder à configuração atual
Conjuntos de dados públicos (COCO, Open Images, VOC)Inicialização com classes comunsMudança de domínio em relação às suas cenas
Capturas encenadasCasos extremos específicos sob demandaLimpo demais; fácil confiar demais neles
Imagens sintéticas ou geradasRiscos e falhas raros que você não pode esperar acontecerO modelo pode aprender o estilo do gerador
Coleta de imagens na webVariedade a baixo custoQualidade inconsistente e risco relacionado a licenças

Use imagens encenadas, públicas e sintéticas para preencher lacunas específicas e identificadas na especificação, e acompanhe a proporção delas no conjunto de dados para medir se ajudam. Na Ultralytics Platform, Gerar imagens semelhantes adiciona variações geradas de uma imagem existente a um conjunto de dados, sem rótulos e prontas para anotação.

Inclua os metadados no nome do arquivo#

Cada imagem precisa ter, no mínimo, um ID da câmera, o dia da captura e um número de quadro ou clipe. Sem eles, você não pode dividir os dados por grupo mais tarde, rastrear uma regressão até sua origem ou coletar mais dados de um cenário sub-representado. O meio mais duradouro de armazenar essas informações é o nome do arquivo: cam2_2026-05-01_000124.jpg resiste a todas as ferramentas, exportações e carregamentos. A busca de conjuntos de dados da Ultralytics Platform encontra nomes de arquivos e metadados personalizados, mantendo essas chaves pesquisáveis após o carregamento.

Este script cria o conjunto de dados de prática usado no restante do curso. Ele copia as imagens rotuladas do COCO128 e as renomeia como se quatro câmeras as tivessem capturado ao longo de quatro dias, com cam1 coletada em excesso, como costuma acontecer com uma câmera conveniente:

import shutil
from pathlib import Path

from ultralytics.data.utils import check_det_dataset, img2label_paths

data = check_det_dataset("coco128.yaml")  # 128 COCO images stand in for your camera captures
out = Path("datasets/practice")
(out / "images").mkdir(parents=True, exist_ok=True)
(out / "labels").mkdir(parents=True, exist_ok=True)

for i, image in enumerate(sorted(Path(data["train"]).glob("*.jpg"))):
    camera = ("cam1", "cam1", "cam2", "cam3", "cam4")[i % 5]  # cam1 over-collected, like a real site
    name = f"{camera}_2026-05-0{i // 32 + 1}_{i:06d}"  # camera, capture day, frame number
    shutil.copy(image, out / "images" / f"{name}.jpg")
    label = Path(img2label_paths([str(image)])[0])
    if label.exists():
        shutil.copy(label, out / "labels" / f"{name}.txt")

print(len(list((out / "images").glob("*.jpg"))), "images written to", out)
128 images written to datasets/practice

Janela Novo conjunto de dados da Ultralytics Platform: arraste imagens, vídeos ou conjuntos de dados nos formatos YOLO, COCO ou NDJSON; depois defina o nome, o URL, a descrição, o tipo de tarefa, a licença, o desfoque de rostos e a visibilidade do conjunto de dados

O carregamento na Ultralytics Platform preserva esses nomes de arquivo. A janela de carregamento também aceita vídeos e conjuntos de dados inteiros, e suas configurações incluem o desfoque de rostos para proteger a privacidade.

Acompanhe a cobertura em relação à especificação#

Com os metadados nos nomes de arquivo, a cobertura pode ser contada. Defina as cotas com base na sua especificação e deixe que o script indique o que coletar a seguir:

from collections import Counter
from pathlib import Path

QUOTA = {"cam1": 30, "cam2": 30, "cam3": 30, "cam4": 30}  # images per camera, from your spec

images = sorted(Path("datasets/practice/images").glob("*.jpg"))
cameras = Counter(p.stem.split("_")[0] for p in images)
days = Counter(p.stem.split("_")[1] for p in images)

for camera, quota in QUOTA.items():
    gap = quota - cameras[camera]
    print(f"{camera}: {cameras[camera]:3d} / {quota}  {'ok' if gap <= 0 else f'collect {gap} more'}")
print("days:", dict(sorted(days.items())))
cam1:  52 / 30  ok
cam2:  26 / 30  collect 4 more
cam3:  25 / 30  collect 5 more
cam4:  25 / 30  collect 5 more
days: {'2026-05-01': 32, '2026-05-02': 32, '2026-05-03': 32, '2026-05-04': 32}

A regra de decisão: pare de coletar de qualquer fonte que tenha ultrapassado a cota e concentre o esforço nas lacunas. Aqui, cam1 já representa 40% das imagens. Mais uma semana de gravações dessa fonte aumentaria o volume, mas não acrescentaria cobertura.

Amostre vídeos sem sobrecarregar o conjunto de dados#

O vídeo é a fonte mais barata e a mais fácil de usar mal. A 30 quadros por segundo, um minuto produz 1.800 quadros quase idênticos, e rotular o mesmo momento duas vezes custa dinheiro e infla as métricas. Mantenha um quadro apenas quando a cena tiver mudado desde o último quadro mantido:

from pathlib import Path

import cv2

from ultralytics.utils.downloads import safe_download

video = "solutions_ci_demo.mp4"  # a short public demo clip; swap in your own footage
safe_download(f"https://github.com/ultralytics/assets/releases/download/v0.0.0/{video}")
Path("frames").mkdir(exist_ok=True)

cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS)
read = kept = 0
last = None
while True:
    ok, frame = cap.read()
    if not ok:
        break
    thumb = cv2.cvtColor(cv2.resize(frame, (64, 64)), cv2.COLOR_BGR2GRAY).astype(float)
    if last is None or abs(thumb - last).mean() > 10:  # keep a frame only when the scene has changed
        cv2.imwrite(f"frames/clip01_{read:06d}.jpg", frame)  # the clip ID stays in the filename
        kept, last = kept + 1, thumb
    read += 1

print(f"{read} frames at {fps:.0f} FPS -> {kept} kept")
62 frames at 30 FPS -> 6 kept

O clipe de dois segundos contém 62 quadros, mas apenas 6 momentos visualmente distintos. O script compara pequenas miniaturas em escala de cinza, por isso é rápido mesmo com horas de gravação. Aumente o limite de 10 para manter menos quadros de câmeras estáticas; diminua-o para cenas com movimentos rápidos. Distribua também o orçamento entre os clipes: 20 quadros de cada um de 50 clipes são melhores do que 1.000 quadros de um só clipe.

Os quadros de um clipe são uma amostra, não várias

Dois quadros separados por um segundo compartilham a iluminação, o fundo e, normalmente, os mesmos objetos. Se forem parar tanto no treinamento quanto na validação, o modelo será avaliado com imagens que, na prática, já viu. Inclua o ID do clipe em cada nome de arquivo para que Divida o conjunto de dados corretamente mantenha cada clipe agrupado.

Evita as armadilhas da recolha#

ArmadilhaSintomaSolução
Recolha numa única semanamAP de validação alto, mas falhas noutras estações ou turnosDistribui a recolha ao longo de semanas ou meses
Uma única câmaraFalha com a segunda câmaraRecolhe dados de cada tipo de câmara que implementares
Apenas dados encenadosFalha em cenários reais e desorganizadosMantém as imagens encenadas como uma pequena minoria controlada
Fotogramas duplicadosMétricas inflacionadas, trabalho de anotação desperdiçadoAmostra com base nas mudanças de cena; a Ultralytics Platform também ignora cópias exatas ao carregar
Um único operador ou turnoAspeto não planeado e desequilíbrio entre classesRecolhe dados de diferentes turnos, locais e pessoas
Casos raros em faltaNão deteta os eventos de segurança mais importantesRecolha direcionada, encenação ou complemento sintético

O viés é um problema de recolha, não de modelação: nenhum hiperparâmetro corrige a ausência de um grupo nos dados. O guia de recolha de dados apresenta quatro medidas: fontes diversificadas, representação equilibrada, auditorias regulares da cobertura e mitigação, como a sobreamostragem de grupos sub-representados.

Se as imagens contiverem rostos, matrículas ou outros dados pessoais, precisas de consentimento e de uma política de retenção antes de iniciar a recolha. A entrada do glossário sobre privacidade de dados é um bom ponto de partida, e Privacidade, regiões e conformidade explica como manter os dados na jurisdição correta com dataRegion.

Experimente

Executa make_practice_set.py e, em seguida, edita as quotas em coverage.py para corresponderem às tuas especificações (ou mantém as quotas de exemplo) e executa-o. No teu projeto real, muda o nome de 50 imagens recentes para seguirem o padrão camera_day_frame e calcula a mesma cobertura. Resultado: um relatório de cobertura e um plano de recolha que indiquem cada fonte acima da quota e cada lacuna, com a respetiva dimensão.

Concluído quando
Você concluiu a aula quando todos estes critérios forem atendidos.
  • O nome de cada ficheiro de imagem inclui uma câmara (ou fonte), o dia da recolha e um número de fotograma ou clipe.

  • Um relatório de cobertura compara a contagem de imagens por câmara, dia ou cenário com as quotas das especificações.

  • O vídeo é amostrado com base nas mudanças de cena, e os fotogramas selecionados mantêm o respetivo ID de clipe.

Mostrar solução

Para o conjunto de exemplo, o relatório de cobertura fornece um plano direto:

FonteContagem / quotaAção
cam152 / 30Para de recolher; já representa 40% de todas as imagens
cam226 / 30Recolhe mais 4
cam325 / 30Recolhe mais 5
cam425 / 30Recolhe mais 5

Cada câmara abrange os quatro dias, por isso as lacunas são por câmara, não por dia. Distribui as 14 novas imagens por pelo menos dois dias novos, para que acrescentem uma nova condição em vez de mais do mesmo período da tarde. Se uma câmara não puder preencher a sua lacuna (por exemplo, uma câmara que só capta imagens à noite), adiciona uma linha às especificações para a condição em falta e regista se esta é preenchida com imagens encenadas ou geradas, para que o efeito possa ser medido mais tarde.

Próximos passos

Com as imagens recolhidas, a próxima lição ensina-te a criar etiquetas consistentes logo à primeira.

Entre para salvar seu progresso