Computer vision · football intelligence
Do vídeo para uma leitura tática estruturada
Uma base tecnológica que transforma transmissão de jogo em identidade, geometria, espaço e evidência para apoiar a decisão.
Capítulo
Enquadramento do Projeto
Fechar a distância entre vídeo abundante e evidência tática estruturada.
O vídeo mostra tudo, mas não entrega estado
Câmara não calibrada
Pan, zoom e cortes quebram qualquer geometria ingénua.
Oclusão e semelhança
Uma caixa num frame não é ainda uma identidade.
Bola intermitente
Pequena, rápida e frequentemente invisível.
- ≤ 23 pessoas
- ≤ 11 por equipa
- ≤ 1 GR por equipa
- ≤ 1 bola
- 1 identidade por pessoa
Capítulo
A Solução
Uma cadeia auditável que transforma perceção visual em estado tático e produtos para análise.
Nove etapas, uma direção
Capítulo
Dados
Os dados são um produto versionado, não um efeito secundário da inferência.
Quatro camadas preservam linhagem
Capítulo
Modelo
Um sistema híbrido: perceção aprendida, memória temporal e lógica determinística.
O modelo não é uma caixa. É um acordo entre três sistemas
Aprendido
- Detetor de pessoas
- Detetor dedicado de bola
- Detetor OBB para linhas
Temporal
- Foot-point / IoU em lote
- Consenso por track
- Kalman + RTS
Determinístico
- Topologia do campo
- Limites de plantel
- Regras de posse
Posições estáveis tornam a tática explicável
Posse
Jogador mais próximo, suavização e persistência em perdas curtas.
Fase
Bola nos 40% defensivos da equipa em posse.
Formação
Fisher–Jenks em profundidade, guarda-redes excluído.
Mudança
Histerese impede que um jogador isolado crie ruído.
Sucesso
Manter posse e transportar a bola além do meio-campo.
Capítulo
Demonstrações & Resultados
Prova visual, medições internas e limites de interpretação claramente assinalados.
Correções dirigidas melhoram clips concretos
Métricas internas e específicas dos clips indicados. Demonstram mecanismos de correção; não estimam a precisão global do produto.
258 fases revelam confrontos recorrentes
Frequência observada entre a primeira linha da equipa em posse e a primeira linha de pressão adversária.
Este benchmark descreve a distribuição das 258 fases derivadas; não mede a correção das classificações táticas.
Saber quando não sabemos é parte do produto
| Limitação | Limitada por | Próxima escalada |
|---|---|---|
| Bola ausente por vários segundos | Dados do detetor | Etiquetas multiestádio e retreino |
| GR com equipamento igual ao adversário | Física da cor | Âncora de posse ou baliza |
| Equipamentos escuros à noite | Física da cor | Configuração por jogo e calibração |
| Arranque sem contexto das equipas | Simetria | Primeiro frame validado de posse |
| Oclusão total | Dados do detetor | Retreino com oclusões e soft-NMS |
Agora
Cobertura de oclusões, bola e confiança por subsistema.
Seguinte
Retreino multijogo e testes adversariais por estádio.
Depois
Validação com analistas e pesquisa semântica de padrões.
Cada etapa tem um contrato de conclusão
Persistir primeiro
O resultado estrutural é escrito em JSONL antes de criar overlays ou vídeo.
write_jsonl(path, rows)Retomar barato
Se o JSONL existe e tem cobertura, a inferência pesada é ignorada.
exists() and not forceReprocessar seletivo
--redo-roles reutiliza pessoas e bola, sem nova passagem GPU.
rebuild_roles_and_render()Verificar estado
O verificador atual classifica a cobertura e saúde de roles. A completude dos quatro vídeos continua a ser um gate separado no roadmap.
verify_and_complete.pyHipóteses tornam-se experiências reversíveis
Âmbito
--game, --clip, --max-frames, --frame-stride e --no-video limitam custo.
Limiares
Pessoas 0,70 na passagem principal e 0,10 na recuperação. Bola 0,50. Caminhos centralizados em settings.py.
Interruptores
Cada correção pode ser desligada isoladamente, permitindo A/B por jogo.
JSONL mantém cada frame independente e auditável
{
"frame_idx": 150,
"roles": [{
"track_id": 17,
"bbox": [812, 306, 858, 431],
"team": "Sharjah",
"role": "TEAM",
"pitch": [34.8, 11.2]
}],
"role_counts": {"Sharjah": 9, "Ajman": 10, "GK:Sharjah": 1, "REFEREE": 1}
}Como o benchmark histórico evitava contaminação
Anotação só de leitura
A IA não sobrescrevia a anotação do operador.
Hash antes e depois
A avaliação abortava se qualquer anotação mudasse.
Separação por jogo
Frames vizinhos não atravessavam treino e validação.
Arranque sem contexto
O jogo reservado não fornecia informação prévia ao próprio arranque.
Promoção por critérios
Macro melhorava, categorias não degradavam e invariantes ficavam a zero.
Modelos especializados reduzem interferência
Pessoas
src/models/players/weights.ptPassagem 0,70 protege precisão; 0,10 recupera jogadores pequenos. Fusão por IoU, cor e corpo.
detect_people_and_ball()YOLOperson_merge.stage()fusão 70/10Bola
src/models/ball/weights.ptDetetor dedicado, filtro do relvado e seleção de um único candidato.
select_single_ball()≤1 bolaball_filter.stage()0,50Campo
src/models/lines/weights.ptO modelo OBB preserva orientação e tipo; a pose atual é resolvida a partir das linhas armazenadas.
run_pitch_lines()OBB tipadovalidate_typed_lines()topologiaRastreamento responde “quem continua a ser”
Associação
O rastreador em lote liga pontos dos pés e IoU e atravessa interrupções curtas com MAX_AGE=8.
Consenso
Cada track_id recebe equipa/papel pela maioria. A mediana de cor protege contra sombras.
Correção
Mudança sustentada divide o rasto; rastos transitórios são podados; excedentes são reparados.
Regras simples, mas temporalmente explícitas
Posse
A equipa do jogador mais próximo da bola reclama posse em espaço de imagem.
POSSESS_MAX_PXSuavização
Janela de maioria evita alternância em contactos e leituras instáveis.
POSSESS_SMOOTHConstrução
A bola deve estar na fração defensiva da equipa em posse.
BUILDUP_ZONELinhas
Fisher–Jenks divide defesa, meio e ataque; nenhuma linha excede cinco.
optimal_1d_partition()Produtos diferentes, uma única verdade
4+1 significa quatro vídeos derivados pelo pipeline, mais a transmissão original preservada.
Modelo em detalhe
Da perceção ao estado tático
Como calibração, identidade, bola e regras temporais transformam deteções em informação utilizável.
Três fronteiras evitam uma caixa negra
Perceção
pipeline/frames.pyDescodifica o vídeo uma vez e fixa frame, timestamp e FPS.
extract_raw_frames()JPEG + metadadosdetect_people_and_ball()YOLO 70/10run_pitch_lines()OBB tipadoEstado temporal
team_classification/roles_stage.pyTransforma observações independentes em identidades estáveis.
role_assignment.assign_clip()equipa · GR · árbitrotrack_consensus.consensus()maioria por IDprune_implausible_tracks()anti-fantasmaSemântica
pipeline/render_video.pyProjeta no campo e produz artefactos para análise.
render_video.stage()quatro derivadosbuild_tactical_viewer.py::detect_phasesfase + sucessoroles_stage.stage()orquestraçãoA pose combina evidência e controlo
Linhas armazenadas
O render atual resolve a pose a partir das linhas OBB tipadas já persistidas.
Lado e topologia
O controlo impõe um único lado de baliza e rejeita geometrias incoerentes.
Sanidade física
Homografias que projetam posições implausíveis fora do campo são rejeitadas.
Continuidade — risco aberto
last_H e suavização estabilizam a pose, mas a persistência ainda não tem limite temporal no processamento em lote.
Contrato atual
Cor relativa e física temporal corrigem o que um frame não sabe
Equipa
- Torso sem relva/oclusor
- Matiz ou luminosidade adaptativas
- Mediana por track
- Divisão em mudança sustentada
Bola
select_single_ball()- Gate >3 m/frame
- Kalman [x,y,vx,vy]
- Suavização RTS retrospetiva
Honestidade
- Detetada: token sólido
- Trajetória: interpola até 25 frames
- Interface: pode preencher até 75 frames
- Sem evidência: desvanece
Os avanços começaram como falhas concretas
Convenção de caixa errada
A margem RF-DETR aplicada ao YOLO aumentou a largura cerca de 2,5× e destruiu recall@IoU0.5.
0,03 → 0,35Projeções explosivas
O controlo físico e a orientação reduziram passos impossíveis que a suavização apenas escondia.
98 591 m → 9,7 mCor sob oclusão
Amostragem de torso, adaptação e mediana por track reduziram mismatch no clip Sharjah-1.
7,5% → 1,4%Jogadores ocluídos
A recuperação de baixa confiança elevou a cobertura média nos clips Al Dhafra-2/3.
12 → 20 / frameDa transmissão ao modelo tático





A imagem liga o que o treinador vê ao que o sistema mede

A tese em 30 segundos
O vídeo já contém a informação. A solução cria a camada que falta: estrutura, continuidade e contexto futebolístico para a tornar explorável.
Automatiza o primeiro passe analítico
Deteta campo, pessoas, bola, equipas e papéis antes de o analista entrar no detalhe.
Converte frames em estado temporal
Rastreamento e consenso reduzem oscilações e mantêm identidades ao longo do clip.
Produz várias leituras da mesma jogada
Transmissão anotada, planta 2D, Voronoi, convex hull e JSONL auditável.
É uma base, não uma caixa negra
Produtos intermédios, regras explícitas e limitações conhecidas suportam evolução controlada.
O ponto de partida
Um projeto multidisciplinar
Esta solução foi desenvolvida como projeto final do último módulo do Master em Big Data Aplicado ao Futebol, da UCAM.
O projeto teve como principal objetivo explorar as competências multidisciplinares do grupo, combinando conhecimento futebolístico, experiência prática e tecnologia. Partimos de algumas das limitações identificadas nos processos de preparação, planeamento e análise pós-jogo que fazem parte do quotidiano dos clubes de futebol.
A função que cresce
Analytics como amplificador
Neste contexto, os departamentos de analytics assumem uma importância crescente. Alguns clubes já dispõem de estruturas internas consolidadas, outros encontram-se em processo de criação dessas equipas e muitos recorrem a serviços especializados em regime de outsourcing. Independentemente do modelo adotado, o objetivo é comum: apoiar os clubes na redução de ineficiências e promover maior rigor, rapidez e qualidade na preparação e análise dos jogos. A utilização de ferramentas analíticas e de visão computacional permite acrescentar detalhe aos processos de observação e disponibilizar informação de forma mais célere e estruturada. Desta forma, o decisor pode concentrar-se no contributo mais relevante para o seu trabalho como o conhecimento futebolístico, a interpretação do jogo e a tomada de decisão.
Ambição com pragmatismo
Construir uma base
Tendo em consideração o tempo disponível e as limitações tecnológicas existentes, sabíamos que a solução desenvolvida não seria perfeita nem definitiva. Ainda assim, decidimos assumir o desafio de construir uma base que pudesse orientar e suportar o trabalho a desenvolver nos meses seguintes. Partimos, por isso, de uma premissa simples: “E porque não?”
A oportunidade
Democratizar a análise
O problema abordado é complexo e tem vindo a ser estudado por algumas das maiores empresas da indústria. Paralelamente, vários clubes investem milhares de euros no acesso a ferramentas desta natureza, procurando obter uma vantagem competitiva, ainda que reduzida, através da utilização de dados e tecnologia. Perante este cenário, decidimos apostar, experimentar e desafiar-nos a criar uma solução que possa contribuir para a democratização deste tipo de análise. Pretendemos desenvolver uma ferramenta flexível, acessível e adaptável, que permita a cada analista explorar diferentes dimensões do jogo de acordo com os seus objetivos, necessidades e conhecimento futebolístico.
O paradoxo do vídeo
Mostra tudo. Entrega pouco estado.
A riqueza visual existe, mas está presa num processo manual, fragmentado e difícil de pesquisar.
Ver
Localizar o momento relevante.
Pausar
Fixar jogadores e bola.
Anotar
Reconstruir posições e papéis.
Cruzar
Comparar clips sem estado comum.
Explicar
Voltar ao vídeo para validar.
Um núcleo comum. Diferentes decisões.
futebolística
Proposta de valor
Um pipeline de visão computacional que converte vídeo broadcast em estado tático rastreável.
Broadcast e planta, sincronizados
Posição coletiva sem perder o vídeo
Uma leitura imediata do território
A forma coletiva torna-se visível


Vídeo, mapa e fase na mesma superfície

Capítulo
Limitações & Próximo Passo
Como converter uma base demonstrável numa capacidade operacional de confiança.
Três ondas para converter protótipo em produto
Confiar
- Limitar temporalmente a persistência de
last_H - Restaurar testes e manifestos de execução
- Verificar os quatro derivados por clip
- Catálogo único para opções FTA_*
Generalizar
- PnLCalib/keypoints no processamento em lote
- Recuperar deteções da bola
- Validar âncoras de cor multiestádio
- Rastreamento com aparência / BoT-SORT
Operacionalizar
- Experiência de pesquisa por fase
- Perfis por modelo de jogo
- Exportação para o processo do analista
- Monitorização e versões
Critérios propostos — não resultados atuais
Quatro gates para decidir continuar
Completude técnica
Produzir todos os artefactos esperados nos clips selecionados.
Utilidade para o analista
Fases relevantes aceites ou corrigidas com baixa fricção.
Tempo até à primeira leitura
Comparar o processo assistido com a linha de base manual.
Integridade
Sem corrupção silenciosa; anotação de referência preservada.
Pedido aos decisores
Não decidir hoje se a solução está terminada. Decidir se a base demonstrada merece uma fase de produto orientada por casos de uso reais.
Escolher duas decisões prioritárias
Construção adversária, compactação ou revisão pós-jogo.
Nomear sponsor e analista parceiro
Validação semanal, critérios claros e feedback registado.
Disponibilizar o domínio de teste
Uma competição, oito jogos e quarenta clips.
Financiar a confiança
Um recurso ML, 0,2 FTE de analista, acesso a vídeo e capacidade GPU.
O vídeo
já sabe.
Falta
estruturá-lo.
Começámos com uma pergunta simples. Terminamos com uma base real, demonstrável e preparada para uma próxima decisão.
E porque não?