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.
Prático
A variedade supera o volume#
Compare dois conjuntos de dados voltados à mesma implantação:
| Conjunto de dados | Resultado da validação | Em produção |
|---|---|---|
| 10.000 quadros quase idênticos, uma câmera, apenas ao meio-dia | Alto: os quadros de validação se parecem com os de treinamento | O desempenho cai com outra câmera e ao anoitecer |
| 1.500 quadros distribuídos por 12 cenários da especificação | Mais modesto | Manté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:
| Fonte | Quando ajuda | Quando prejudica |
|---|---|---|
| Câmeras de produção, ao vivo | Mais próximas da implantação | Lento; pode exigir acordos de compartilhamento de dados |
| Câmeras de produção, gravações arquivadas | Muita variedade em pouco tempo | As gravações antigas podem não corresponder à configuração atual |
| Conjuntos de dados públicos (COCO, Open Images, VOC) | Inicialização com classes comuns | Mudança de domínio em relação às suas cenas |
| Capturas encenadas | Casos extremos específicos sob demanda | Limpo demais; fácil confiar demais neles |
| Imagens sintéticas ou geradas | Riscos e falhas raros que você não pode esperar acontecer | O modelo pode aprender o estilo do gerador |
| Coleta de imagens na web | Variedade a baixo custo | Qualidade 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
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 keptO 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.
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#
| Armadilha | Sintoma | Solução |
|---|---|---|
| Recolha numa única semana | mAP de validação alto, mas falhas noutras estações ou turnos | Distribui a recolha ao longo de semanas ou meses |
| Uma única câmara | Falha com a segunda câmara | Recolhe dados de cada tipo de câmara que implementares |
| Apenas dados encenados | Falha em cenários reais e desorganizados | Mantém as imagens encenadas como uma pequena minoria controlada |
| Fotogramas duplicados | Métricas inflacionadas, trabalho de anotação desperdiçado | Amostra com base nas mudanças de cena; a Ultralytics Platform também ignora cópias exatas ao carregar |
| Um único operador ou turno | Aspeto não planeado e desequilíbrio entre classes | Recolhe dados de diferentes turnos, locais e pessoas |
| Casos raros em falta | Não deteta os eventos de segurança mais importantes | Recolha direcionada, encenação ou complemento sintético |
Viés e consentimento#
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.
Mostrar solução
Para o conjunto de exemplo, o relatório de cobertura fornece um plano direto:
| Fonte | Contagem / quota | Ação |
|---|---|---|
cam1 | 52 / 30 | Para de recolher; já representa 40% de todas as imagens |
cam2 | 26 / 30 | Recolhe mais 4 |
cam3 | 25 / 30 | Recolhe mais 5 |
cam4 | 25 / 30 | Recolhe 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.