O erro que produz 10.000 imagens inúteis

A abordagem óbvia para transformar vídeo em dados de treinamento é extrair cada quadro. Parece completo. É quase a pior coisa que você pode fazer.

Quadros consecutivos de vídeo de 30 fps têm 33 milissegundos de intervalo. A menos que a câmera ou o assunto estejam se movendo rapidamente, o quadro 1.001 é quase idêntico ao quadro 1.000 – mesma pose, mesma iluminação, mesmo fundo, alguns pixels de diferença. Um conjunto de dados de 10.000 desses quadros não contém 10.000 exemplos. Ele contém talvez 300 situações distintas, cada uma repetida trinta vezes.

O que isso faz com o treinamento é específico e prejudicial. O custo da anotação aumenta com a contagem de imagens, então você paga trinta vezes mais pelas mesmas informações. O tempo de treinamento também aumenta. E o mais importante, se essas quase duplicatas terminarem em ambos os lados da divisão de treinamento/validação, o modelo efetivamente viu o conjunto de validação - você obtém uma pontuação de validação que não significa nada.

Então a primeira decisão não é uma configuração de ferramenta. É: quanto o conteúdo precisa mudar antes que um quadro seja considerado um novo exemplo?

Escolher o intervalo de amostragem

Deduza-o do movimento na cena, não da taxa de quadros de origem. Alguns pontos de partida de trabalho:

  • Câmera estática, assunto lento (vigilância, crescimento de uma planta, fila) — 1 quadro a cada 2 a 10 segundos. Qualquer coisa mais densa é redundante.
  • Câmera estática, assunto ativo (uma pessoa trabalhando em uma bancada, trânsito) — 1 quadro a cada 0,5–2 segundos.
  • Câmera em movimento (portátil, drone, câmera de painel) — 2–5 quadros por segundo. O plano de fundo muda continuamente, para que os quadros permaneçam distintos.
  • Ação rápida onde a própria pose é o rótulo (esporte, reconhecimento de gestos) — 5 a 15 quadros por segundo, mas apenas nos segmentos que contêm a ação.

A maneira de resolvê-la: extraia um segmento de teste de um minuto em alguns intervalos e observe os resultados lado a lado. Se você puder folheá-los e cada imagem lhe disser algo novo, o intervalo está certo. Se parecer um flipbook, amplie-o.

Faça a aritmética antes de extrair. Frames = duração × taxa alvo. Noventa minutos de filmagem a 1 quadro por segundo equivalem a 5.400 imagens – plausivelmente uma semana de anotação. A 1 quadro por 5 segundos é 1.080, o que equivale a alguns dias. Essa decisão vale cinco minutos de reflexão.

No extrator, o modo "Intervalo de tempo" calcula o intervalo em segundos diretamente e a contagem de quadros aparece conforme você digita — portanto, o número acima fica visível antes do commit, em vez de ser descoberto depois.

Configurações de extração importantes no futuro

Formato: PNG ou JPEG

A resposta honesta é que geralmente isso não importa tanto quanto as pessoas esperam, mas os casos em que isso acontece valem a pena saber.

Use PNG quando a tarefa é sensível a detalhes finos ou artefatos de compressão — detecção de defeitos em superfícies, trabalho adjacente a OCR, imagens médicas ou científicas, qualquer coisa onde você possa medir posteriormente valores de pixel. Use JPEG em 90–95% para detecção e classificação geral de objetos, onde os modelos são robustos à compactação moderada e a diferença de armazenamento é de cinco a dez vezes.

Uma regra de consistência, independentemente da escolha: não misture. Um conjunto de dados que é metade PNG e metade JPEG com qualidade variável fornece ao modelo um sinal espúrio, e os modelos são muito bons em encontrar sinais espúrios.

Resolução

Extrair na resolução de origem e reduzir a escala em seu pré-processamento pipeline, não no momento da extração. Você não pode recuperar detalhes descartados e, daqui a um ano, poderá querer cortes de 512 pixels da filmagem extraída em 224. O armazenamento é mais barato do que a reextração, especialmente se a filmagem de origem for arquivada em algum lugar inconveniente.

Nomeação

Nomes sequenciais com preenchimento de zeros, largos o suficiente para o maior conjunto que você já produziu. frame_00001.png, não frame_1.png. Ferramentas que classificam nomes de arquivos como texto ordenarão frame_10 antes frame_2, e se a ordem temporal for importante em qualquer lugar do pipeline, esse bug será sutil e difícil de detectar.

Inclua a fonte no caminho em vez do nome do arquivo, para que a proveniência sobreviva:

dataset/
                  raw/
                    cam01_2026-03-14/
                      frame_00001.png
                      frame_00002.png
                    cam02_2026-03-14/
                      frame_00001.png
                  splits/
                    train.txt
                    val.txt
                    test.txt

Manter a divisão como arquivos de texto listando caminhos - em vez de copiar fisicamente as imagens nos diretórios train/ e val/ - significa que você pode divida novamente sem copiar novamente e você poderá ver exatamente o que foi para onde.

A regra de divisão que realmente importa

Esta é a parte que vale a pena ler duas vezes, porque é a diferença entre um benchmark em que você pode confiar e outro em que não pode.

Dividir por vídeo de origem, nunca por quadro.

Se você embaralhar todos os quadros e fizer uma divisão aleatória de 80/20, os quadros do mesmo segundo do mesmo vídeo aparecerão em ambos os lados. O conjunto de validação é quase uma cópia do conjunto de treinamento, e a precisão da validação mede a memorização. Modelos treinados dessa maneira relatam rotineiramente 97-99% e depois falham em filmagens genuinamente novas, e a falha é desconcertante até que você observe como a divisão foi feita.

A abordagem correta: atribuir vídeos inteiros para treinamento, validação e teste. Se você tiver apenas um vídeo longo, divida-o por tempo em blocos contíguos (primeiros 70% de treinamento, próximos 15% de validação, últimos 15% de teste) e descarte alguns segundos de cada lado de cada limite para que nenhum par quase duplicado o ultrapasse.

Sempre que possível, vá além: mantenha a gravação inteira sessões, câmeras ou locais para o conjunto de teste. Isso mede se o modelo generaliza entre condições e não entre carimbos de data e hora, que é quase sempre a questão que realmente importa para você.

Trabalhar localmente e por que isso geralmente é importante aqui

Uma observação prática específica para este domínio: vídeos industriais e de pesquisa são frequentemente materiais que não podem ser carregados casualmente: gravações de pacientes, filmagens de pessoas que consentiram em um estudo e não em um serviço de nuvem, linhas de fabricação proprietárias, experimentos de pré-publicação.

extração baseada em navegador mantém o arquivo na máquina; nada é transferido, o que importa quando a restrição é uma aprovação ética ou um acordo de processamento de dados, e não uma preferência. Você pode confirmar isso em vez de confiar - carregue a página, desconecte-se da rede e extraia. Se ainda funcionar, nada iria a lugar nenhum. A método para verificar isso leva cerca de um minuto.

Seja igualmente claro quanto aos limites. Os quadros são mantidos na memória até o download, portanto, fontes longas precisam ser processadas em blocos de intervalo de tempo. Para um pipeline repetível em centenas de arquivos, um script FFmpeg local é a ferramenta certa — o navegador é para trabalho exploratório, para extrações únicas e para casos em que você deseja ver os quadros enquanto decide o intervalo.

Uma lista de verificação antes do início da anotação

A anotação é a etapa cara. Capturá-los antes de começar economiza muito tempo:

  1. Percorra 50 quadros aleatórios. Eles são visivelmente diferentes um do outro? Caso contrário, amplie o intervalo e extraia novamente - agora, não após a rotulagem.
  2. Verifique o equilíbrio da classe. A amostragem de tempo uniforme fornece quadros em proporção ao tempo que as coisas ficaram na tela, e não em proporção ao quanto você se preocupa com elas. Eventos raros precisam de extração direcionada de seus intervalos de tempo específicos.
  3. Remova os quadros mortos. Desbotamentos, molduras pretas nos cortes, reflexos de lente, a mão de alguém sobre a lente. Elas são barulhentas e custam tempo de anotação.
  4. Confirme se a divisão é por vídeo ou por bloco de tempo, não por quadro embaralhado.
  5. Registre a procedência. Arquivo fonte, intervalo, data de extração, formato e qualidade, junto com o conjunto de dados. Em seis meses você precisará reproduzi-lo ou ampliá-lo, e reconstruir "que intervalo eu usei" a partir das imagens é desagradável.

Nada disso é difícil. É apenas decidido antes da extração, e não descoberto após a anotação, o que é toda a diferença.