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

Adicione e prepare os dados

Verifique um conjunto de dados localmente antes do upload, selecione quadros de vídeo de forma intencional e deixe um conjunto de dados da Platform pronto logo na primeira tentativa.

O erro mais barato em um conjunto de dados é aquele que você detecta antes do upload. Os rótulos Pascal VOC são ignorados silenciosamente, imagens com menos de 28 pixels são rejeitadas e um vídeo de 30 minutos se transforma em apenas 100 quadros, a maioria mostrando uma cena vazia. Nesta lição, você fará uma verificação de dois minutos antes do upload, selecionará os quadros de vídeo intencionalmente e interpretará os sinais de processamento da Platform para que seus dados de treinamento cheguem completos.

Resultado

Você consegue verificar um conjunto de dados local antes do upload, reduzir um vídeo longo aos quadros que vale a pena rotular e criar um conjunto de dados da Platform que exiba o selo Ready.

Via rápida
Se já sabes orientar-te, aqui está a versão resumida.
  1. Execute a verificação antes do upload: contagens de imagens e rótulos por divisão, imagens muito pequenas ou grandes, arquivos não compatíveis e rótulos VOC.

  2. Em Annotate, clique em New Dataset; escolha a origem, o tipo de tarefa e a visibilidade Privada.

  3. Selecione previamente os quadros de vídeos longos: a Platform mantém no máximo 100 quadros por vídeo.

  4. Consulte as abas Errors e Charts; em seguida, clique no selo até ele indicar Ready.

Prático

Crie o conjunto de dados#

Página de perfil da Ultralytics Platform mostrando a aba Conjuntos de dados, com cartões de conjuntos de dados e um botão Novo conjunto de dados

Abra Annotate na barra lateral e clique em New Dataset. A caixa de diálogo solicita uma origem, um nome, o tipo de tarefa, uma licença opcional, o desfoque de rostos e a visibilidade:

Caixa de diálogo Novo conjunto de dados da Ultralytics Platform com abas de origem Upload, URL, Cloud e On Premise, uma área para arrastar e soltar arquivos que lista os formatos aceitos e os limites de tamanho, além dos controles Tipo de tarefa, Licença, Desfocar rostos e Visibilidade

FonteUse quandoPlano
UploadOs arquivos estão no seu computador: imagens, vídeos, arquivos compactados ou exportações NDJSONTodas
URLExiste um link público .zip, .tar, .tar.gz, .tgz ou .ndjson; a Platform faz o download no servidorTodas
CloudOs dados já estão no Google Cloud Storage, Amazon S3 ou Azure Blob Storage e devem permanecer láPro, Enterprise
No localOs pixels nunca podem sair dos seus computadoresEnterprise

Regra de decisão: faça upload de uma cópia para este curso. Os conjuntos de dados Cloud e On Premise mantêm os pixels fora da Platform; por isso, a anotação inteligente, o agrupamento, a clonagem e os instantâneos de versões não estão disponíveis para eles.

O tipo de tarefa determina quais ferramentas e modelos aparecem. A Platform oferece suporte às sete tarefas do Ultralytics YOLO:

TarefaComo rotular
DetecçãoRetângulo ou anotação inteligente com SAM e YOLO
SegmentaçãoPolígono ou anotação inteligente com SAM e YOLO
SemânticaPolígono ou anotação inteligente com SAM e YOLO; máscaras PNG podem ser importadas diretamente
PosePontos-chave em esqueletos integrados ou personalizados; modelos YOLO de pose para anotação inteligente
OBBCaixa orientada ou anotação inteligente com SAM e YOLO
ClassificaçãoSeletor de classe na barra lateral
ProfundidadeSem desenho: carrega imagens com mapas de profundidade correspondentes (apenas carregamento ou URL)

Exemplo prático: verifica o conjunto de dados antes de o carregar#

A Platform aceita imagens JPEG, PNG, WebP, BMP, TIFF, HEIC, AVIF, JP2, DNG e MPO de até 50 MB e com pelo menos 28 px no lado menor, e lê rótulos YOLO, COCO, LabelMe, NDJSON do Ultralytics ou Labelbox e máscaras semânticas PNG. O XML Pascal VOC é detectado, mas não é importado. Este script verifica um conjunto de dados YOLO local de acordo com essas regras; neste caso, o conjunto de dados público medical pills:

from collections import Counter
from pathlib import Path

from PIL import Image

from ultralytics.data.utils import check_det_dataset

ACCEPTED = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff", ".heic", ".avif", ".jp2", ".dng", ".mpo"}
data = check_det_dataset("medical-pills.yaml")  # your local dataset YAML
root = Path(data["path"])

problems = Counter()
for split in ("train", "val", "test"):
    if not data.get(split):
        continue
    files = [p for p in Path(data[split]).rglob("*") if p.is_file()]
    images = [p for p in files if p.suffix.lower() in ACCEPTED]
    labeled = 0
    for img in images:
        label = Path(str(img).replace("images", "labels")).with_suffix(".txt")
        labeled += label.exists() and label.stat().st_size > 0
        if min(Image.open(img).size) < 28:
            problems["under 28 px (rejected)"] += 1
        if img.stat().st_size > 50 * 1024**2:
            problems["over 50 MB (rejected)"] += 1
    problems["unsupported files (skipped)"] += len(files) - len(images)
    print(f"{split:<5} {len(images):>4} images, {labeled:>4} labeled, {len(images) - labeled:>3} background")
problems["Pascal VOC .xml labels (not imported)"] += len(list(root.rglob("*.xml")))
print("classes:", data["names"])
print("problems:", {k: v for k, v in problems.items() if v} or "none")
train   92 images,   92 labeled,   0 background
val     23 images,   23 labeled,   0 background
classes: {0: 'pill'}
problems: none

O que os resultados te dizem:

  • Contagens por divisão. As imagens nas pastas train/, val/ e test/ mantêm essa divisão ao serem carregadas, por isso estes são os números que a Platform vai mostrar. Se a linha val não aparecer, a Platform vai criar uma divisão de validação aleatória para ti (vê o problema abaixo).
  • Imagens de fundo (sem ficheiro de rótulos) são aceitáveis em quantidade moderada; ensinam ao modelo como é «não há nada aqui». Centenas delas geralmente significam que os rótulos não foram exportados.
  • problems: none significa que todas as imagens serão processadas. Qualquer contagem aqui representa um ficheiro que vai parar ao separador Errors ou que não vai chegar de todo.

Compacta a pasta do conjunto de dados num ficheiro ZIP com o respetivo data.yaml e arrasta o arquivo para a galeria. A Platform deteta automaticamente o formato, guarda cada imagem idêntica apenas uma vez e pergunta se queres Ignorar, Manter ambas ou Substituir quando um carregamento coincide com imagens que já estão no conjunto de dados.

Exemplo prático: experimenta um vídeo antes de a Platform o fazer#

A Platform extrai 1 fotograma por segundo de cada vídeo e mantém no máximo 100 fotogramas, aumentando o intervalo para clips com mais de 100 segundos:

Duração do clipFotogramas mantidosIntervalo
60 segundos601 segundo
100 segundos1001 segundo
30 minutos (54 000 fotogramas a 30 fps)10018 segundos

Isto serve para uma análise rápida, mas falha na maioria dos projetos reais: uma gravação de um turno de 30 minutos transforma-se em 100 fotogramas, na sua maioria de um corredor vazio. Extrai tu mesmo fotogramas de vídeos longos e carrega-os:

Para uma amostragem uniforme, o FFmpeg é suficiente:

mkdir -p frames
ffmpeg -i source.mp4 -vf fps=1 frames/%06d.jpg

Para uma amostragem orientada por eventos, deixa um modelo Ultralytics YOLO pré-treinado manter apenas os fotogramas que contêm o teu objeto:

from pathlib import Path

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # or your latest fine-tune
out = Path("frames")
out.mkdir(exist_ok=True)

source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
seen = kept = 0
for i, result in enumerate(model.predict(source, stream=True, vid_stride=5, classes=[0], conf=0.5, verbose=False)):
    seen += 1
    if len(result.boxes):  # keep only frames where a person was detected
        cv2.imwrite(str(out / f"frame_{i:05d}.jpg"), result.orig_img)
        kept += 1
print(f"Kept {kept} of {seen} sampled frames")
Kept 12 of 12 sampled frames

vid_stride=5 analisa um em cada cinco fotogramas, classes=[0] restringe a deteção a pessoas e conf=0.5 ignora previsões pouco fiáveis. Este clip de demonstração movimentado tem pessoas em todos os fotogramas amostrados; numa gravação de uma cena quase vazia, a fração de fotogramas mantidos diminui drasticamente, assim como o custo da anotação. Aumenta vid_stride até os fotogramas mantidos consecutivos deixarem de parecer idênticos.

Interpreta os indicadores de processamento da Platform#

Após o carregamento, a Platform valida, normaliza (as imagens com mais de 4 096 px são redimensionadas), cria miniaturas, analisa os rótulos e calcula estatísticas. Verifica três locais:

Página do conjunto de dados da Ultralytics Platform com o separador Errors aberto, mostrando um aviso de que não foi possível processar 1 imagem e uma linha da tabela com a mensagem Não foi possível ler o ficheiro de imagem e uma sugestão de correção

  • O separador Errors só aparece quando há ficheiros que não foram processados: ficheiros danificados, formatos não suportados, imagens com menos de 28 px ou modos de cor CMYK e indexado, cada um com uma sugestão de correção. Exporta-os novamente ou carrega-os outra vez.
  • O separador Charts mostra a distribuição das divisões, as principais classes, as dimensões das imagens, os tamanhos dos ficheiros, as localizações das anotações, os tamanhos das caixas e os objetos por imagem. Procura uma classe que apareça poucas vezes, imagens minúsculas ou caixas concentradas num canto.
  • O emblema no cabeçalho do conjunto de dados mostra Ready quando o processamento termina e o conjunto de dados tem pelo menos uma imagem train, uma imagem val ou test e uma imagem anotada. Clica em Not Ready para ver qual condição está em falta.

Separador Charts da Ultralytics Platform no conjunto de dados medical-pills, com gráficos de rosca para Split Distribution e Top Classes e histogramas para Image Dimensions e Image File Size

Começa com um conjunto de dados público#

Caixa de diálogo Clone Dataset da Ultralytics Platform para um conjunto de dados público de equipamentos de proteção individual para construção, com campos para o novo nome, slug do URL, descrição, tipo de tarefa, licença e um controlo de visibilidade

Ainda não tens dados? A página Explore apresenta conjuntos de dados oficiais e da comunidade. Clone Dataset copia imagens, anotações e classes para o teu espaço de trabalho, conta para o teu armazenamento e mantém por predefinição a visibilidade pública da origem; por isso, muda o controlo na caixa de diálogo se fores adicionar algo sensível.

Armadilhas#

Rótulos Pascal VOC desaparecem sem aviso

Sintoma: o envio é concluído, mas todas as imagens chegam sem rótulos. Solução: a Platform detecta XML Pascal VOC e não o importa. Primeiro, converta para rótulos YOLO .txt ou JSON COCO; a verificação prévia ao envio conta os arquivos .xml para que você perceba o problema antes de enviar.

A divisão automática de validação mistura quadros de vídeo

Sintoma: a mAP de validação é excelente, mas o modelo implantado não é. Solução: se um envio sem divisão selecionada deixar val vazio, a Platform move aleatoriamente cerca de 20% das imagens de treino para val. Para quadros de vídeo, isso coloca quadros quase idênticos nas duas divisões. Em vez disso, envie com as pastas train/ e val/ divididas por vídeo ou câmera (lição 4).

As ferramentas de anotação estão ausentes

Sintoma: você não encontra a ferramenta de polígonos ou os pontos-chave. Solução: o tipo de tarefa determina as ferramentas. Altere-o no cabeçalho do conjunto de dados; cada imagem armazena rótulos para todas as tarefas, então mudar de tarefa oculta os rótulos das outras tarefas em vez de excluí-los.

Experimente

Executa preflight.py no teu próprio conjunto de dados (ou em medical pills) e corrige todos os problemas que indicar. Depois, cria um conjunto de dados privado na Platform, carrega o conjunto de dados e um vídeo e prevê, com base na tabela, quantos fotogramas o vídeo vai gerar antes de verificares a galeria.

Concluído quando
Você concluiu a aula quando todos estes critérios forem atendidos.
  • preflight.py indica problems: none no conjunto de dados que carregaste.

  • A contagem de imagens da galeria corresponde ao número das tuas imagens mais os fotogramas de vídeo que previstes.

  • O cabeçalho do conjunto de dados mostra Ready, ou anotaste exatamente qual condição está em falta.

Mostrar solução

Resposta do exemplo prático: medical pills e um vídeo de 4 minutos gravado por uma câmara de linha. Verificação antes do carregamento: 92 imagens de treino e 23 de validação, todas anotadas e sem problemas. Vídeo: 240 segundos excedem 100, por isso o intervalo aumenta para ceil(240 / 100) = 3 segundos e a Platform mantém 80 fotogramas (um aos 0 s, 3 s, …, 237 s). Contagem esperada na galeria: 92 + 23 + 80 = 195 imagens. Os fotogramas do vídeo chegam sem rótulos e são colocados na divisão selecionada no filtro da galeria; seleciona Train antes de largares o vídeo para os manteres fora de val. O emblema mostra Ready porque existem imagens de treino, de validação e anotadas. Se tivesses carregado apenas o vídeo, o emblema mostraria Not Ready: ainda não haveria nenhuma imagem anotada.

Próximos passos

A seguir, vais pré-anotar imagens com um modelo e medir quanto trabalho de revisão é gerado por cada limiar de confiança.

Entre para salvar seu progresso