criado repositório jhonny-editor no Gitea adicionado script admin/deploy.command com commit automático atualizado admin/DEV-NOTES.md com template limpo Resumo: - 48 arquivos alterados - 26 novos - 19 modificados - 3 removidos 22 files changed, 658 insertions(+), 568 deletions(-) Arquivos: - AGENTS.md - admin/DEV-NOTES.md - admin/OpenCut.command - admin/commit.command - admin/deploy.command - admin/update.command - code/cep-plugin/index.html - code/cep-plugin/main.js - code/cep-plugin/styles.css - code/engine/ARQUITETURA.md - code/engine/arquitetura/README.md - code/engine/gerar_relatorio_timeline.py - code/engine/integracoes/apple_speech/apple_speech_transcriber.swift - code/engine/integracoes/apple_speech/provider_de_transcricao_apple.py - code/engine/integracoes/midia/__init__.py - code/engine/integracoes/whisper/provider_de_transcricao_local.py - code/engine/scanner/__init__.py - code/engine/scanner/coordenacao/__init__.py - code/engine/scanner/descoberta/__init__.py - code/engine/scanner/modelos.py - code/engine/scanner/transcricao_da_timeline.py - code/src/tools/discovery.ts - :memory:.ses - admin/Jhonny.command - admin/inativos/OpenCut.command - admin/inativos/update.command - code/docs/glossario-analise-emocional.md - code/docs/levantamento-apple-vision-e-apple-intelligence.md - code/docs/levantamento-ferramentas-analise-visual-local.md - code/engine/arquitetura/biblioteca-inteligente-de-videos.md - code/engine/executar_scanner.py - code/engine/integracoes/huggingface/ - code/engine/integracoes/midia/extracao_de_metadados.py - code/engine/integracoes/visual/ - code/engine/requirements-visual.txt - code/engine/scanner/configuracao_visual.py - code/engine/scanner/descoberta/descoberta_de_arquivos.py - code/engine/scanner/metadados.py - code/engine/scanner/relatorio_visual.py - code/engine/scanner/retakes/ - code/engine/scanner/visual.py - code/engine/testes/test_analise_visual_local.py - code/engine/testes/test_arquivos_e_metadados.py - code/engine/testes/test_provider_de_transcricao_apple.py - code/relatorios/analise-brools/ - code/relatorios/analise-visual/ - code/relatorios/audio/arquivos/ - code/relatorios/transcricao-timeline.md
162 lines
7.0 KiB
Markdown
162 lines
7.0 KiB
Markdown
# Análise visual local
|
|
|
|
## Configuração no painel
|
|
|
|
A configuração do Scanner é apresentada na aba **Scanner** do painel CEP em
|
|
`code/cep-plugin/`. O perfil salvo segue o contrato versionado de
|
|
`ConfiguracaoVisualDoScanner`; ele define amostragem, faixas, recursos Vision,
|
|
cenas, continuidade, reenquadramento e interpretação antes de montar os
|
|
adapters.
|
|
|
|
## Acesso à timeline do Premiere
|
|
|
|
Quando a análise precisar ler a timeline, a sequência ativa, as faixas ou os
|
|
clipes do Premiere, use sempre a classe existente
|
|
`engine.integracoes.premiere.leitura.AcessoAoEditor`. O módulo visual não deve
|
|
criar chamadas MCP, abrir processos do Premiere ou acessar o bridge diretamente.
|
|
|
|
O acesso deve seguir esta composição:
|
|
|
|
```python
|
|
from engine.integracoes.premiere.leitura import AcessoAoEditor, AcessoATimeline
|
|
from engine.scanner import DescobertaDaTimeline
|
|
from engine.integracoes.premiere.conversores import ConversorDeTimeline
|
|
|
|
acesso_ao_editor = AcessoAoEditor(AcessoATimeline(cliente_mcp))
|
|
descoberta = DescobertaDaTimeline(acesso_ao_editor, ConversorDeTimeline())
|
|
```
|
|
|
|
Depois, a timeline convertida entra no `ContextoDeAnalise` e o Scanner executa
|
|
`AnaliseVisualDaTimeline`. A classe de acesso isola o MCP e preserva a separação
|
|
entre a integração com o Premiere e os analyzers locais.
|
|
|
|
Não duplicar esse acesso em novos adapters ou analyzers. Para testes, injetar um
|
|
fake de `AcessoAoEditor`/`AcessoATimeline` ou usar uma timeline de domínio pronta.
|
|
|
|
## Captura para análise visual
|
|
|
|
A análise visual não exporta um frame renderizado pelo Premiere. Para cada clipe
|
|
de vídeo, o fluxo usa os campos retornados pelo MCP em `get_active_sequence`:
|
|
|
|
1. `sourceFile` identifica o arquivo original do `projectItem`.
|
|
2. `inPoint` e `outPoint` delimitam o trecho usado pelo clipe.
|
|
3. O extrator abre `sourceFile` localmente e amostra o primeiro frame do trecho,
|
|
usando `inPoint` como tempo inicial na origem.
|
|
4. Vision/OpenCV/ONNX recebem esse frame persistido, mantendo o timestamp de
|
|
origem; nenhum frame é exportado da timeline do Premiere.
|
|
|
|
Portanto, `start`/`end` são tempos da timeline e `inPoint`/`outPoint` são tempos
|
|
do arquivo original. Não misturar esses relógios ao analisar um clipe.
|
|
|
|
O Scanner usa apenas as interfaces em `contratos.py`. As bibliotecas externas
|
|
ficam em adapters concretos, para que possam ser habilitadas, substituídas ou
|
|
testadas isoladamente.
|
|
|
|
| Papel | Adapter |
|
|
| --- | --- |
|
|
| Extrair frames | `ExtratorDeQuadrosOpenCV` |
|
|
| Medir qualidade | `AnalisadorDeQualidadeOpenCV` |
|
|
| Rosto e olhos visíveis | `AnalisadorDeRostosOpenCV` |
|
|
| Composição e área para legendas | `AnalisadorDeComposicaoOpenCV` |
|
|
| Tremor/movimento de câmera | `AnalisadorDeTremorOpenCV` |
|
|
| Continuidade e frame congelado | `AnalisadorDeContinuidadeOpenCV` |
|
|
| Detectar objetos | `AnalisadorDeObjetosONNX` |
|
|
| Detectar pose e mãos | `AnalisadorDePoseMediaPipe` |
|
|
| OCR e faces macOS | `AnalisadorAppleVision` |
|
|
| Vision + Apple Intelligence (Swift isolado) | `AnalisadorAppleVisionNativo` |
|
|
| Similaridade temporal por feature print | `AnalisadorSequenciaAppleVisionNativo` |
|
|
| Extrair frames para Vision sem OpenCV | `ExtratorDeQuadrosFFmpeg` |
|
|
| Detectar cenas | `DetectorDeCenasPySceneDetect` |
|
|
|
|
`AnalisadorDeObjetosONNX` exige dois adapters específicos do modelo:
|
|
`preparar(imagem, entradas)` e `decodificar(saidas, quadro)`. Isso mantém os
|
|
detalhes de cada arquivo ONNX fora do Scanner e permite trocar de modelo sem
|
|
alterar a interface do domínio.
|
|
|
|
`AnalisadorDePoseMediaPipe` recebe caminhos explícitos para os arquivos `.task`
|
|
de pose e mãos. Os modelos ficam em `/Volumes/Merongo/SISTEMAS/MODELOSIA/mediapipe/`
|
|
e não são acoplados ao pacote Python. Ele executa em subprocesso: falhas nativas
|
|
do MediaPipe são contidas e retornam como indisponibilidade do adapter, sem
|
|
encerrar o processo do Scanner.
|
|
|
|
`AnalisadorDeRostosOpenCV` usa os arquivos locais
|
|
`haarcascade_frontalface_default.xml` e `haarcascade_eye.xml`. Quando a
|
|
distribuição do OpenCV não os incluir, forneça `diretorio_de_modelos` apontando
|
|
para a pasta que os contém.
|
|
|
|
`AnalisadorAppleVisionNativo` é a opção Apple recomendada. Seu runner Swift
|
|
executa faces/landmarks, qualidade facial, pessoas, pose, mãos, OCR,
|
|
classificação e estética de forma independente. A interpretação editorial pelo
|
|
`FoundationModels` só é criada a partir dessas evidências e é salva em separado.
|
|
Falhas nativas por recurso viram `diagnostico_apple_vision`, sem derrubar o
|
|
Scanner nem descartar os fatos que funcionaram.
|
|
|
|
Além de rostos, pessoas, pose, mãos, OCR, categorias e estética, o runner
|
|
Apple retorna códigos/QR, horizonte, retângulos, densidade de contornos,
|
|
ocupação da máscara de pessoas e similaridade visual entre frames. Os valores
|
|
são fatos normalizados; descrição, contexto e ação devem ser derivados depois,
|
|
a partir dessas evidências temporizadas.
|
|
|
|
## Montagem
|
|
|
|
```python
|
|
from engine.integracoes.visual import (
|
|
AnalisadorDeQualidadeOpenCV,
|
|
AnalisadorDeRostosOpenCV,
|
|
AnalisadorDeComposicaoOpenCV,
|
|
AnalisadorDeTremorOpenCV,
|
|
AnalisadorDeContinuidadeOpenCV,
|
|
DetectorDeCenasPySceneDetect,
|
|
ExtratorDeQuadrosOpenCV,
|
|
)
|
|
from engine.scanner.visual import DetectorDeCenas
|
|
|
|
detector = DetectorDeCenas(
|
|
ExtratorDeQuadrosOpenCV(intervalo_em_segundos=1.0, diretorio_de_cache=".frames"),
|
|
analisadores_de_frame=[
|
|
AnalisadorDeQualidadeOpenCV(), AnalisadorDeRostosOpenCV(),
|
|
AnalisadorDeComposicaoOpenCV(),
|
|
],
|
|
analisadores_de_sequencia=[
|
|
AnalisadorDeTremorOpenCV(), AnalisadorDeContinuidadeOpenCV(),
|
|
],
|
|
detectores_de_intervalo=[DetectorDeCenasPySceneDetect()],
|
|
)
|
|
```
|
|
|
|
Depois, passe esse `DetectorDeCenas` para `AnaliseVisualDaTimeline` ao montar o
|
|
`PipelineDoScanner`.
|
|
|
|
Para o caminho local padrão, a montagem pode ser reduzida a:
|
|
|
|
```python
|
|
from engine.scanner import AnaliseVisualDaTimeline, PipelineDoScanner, criar_detector_visual_local
|
|
|
|
pipeline = PipelineDoScanner([AnaliseVisualDaTimeline(criar_detector_visual_local())])
|
|
contexto = pipeline.executar(contexto)
|
|
```
|
|
|
|
O resultado fica em `contexto.caracteristicas_visuais` (por clipe),
|
|
`contexto.cenas_visuais` (cenas com observações) e `contexto.avisos`.
|
|
Quando OpenCV/FFmpeg ou outro adapter opcional não estiver disponível, o clipe
|
|
é marcado com `disponivel=False` e os demais continuam sendo processados.
|
|
|
|
## Montagem recomendada para Apple Vision
|
|
|
|
```python
|
|
from engine.scanner import AnaliseVisualDaTimeline, PipelineDoScanner, criar_detector_apple_vision
|
|
|
|
pipeline = PipelineDoScanner([
|
|
AnaliseVisualDaTimeline(criar_detector_apple_vision(intervalo_em_segundos=1.0)),
|
|
])
|
|
```
|
|
|
|
Esse detector extrai PNGs do arquivo original com FFmpeg, usando o intervalo
|
|
`inPoint`/`outPoint` do clipe, e não exporta imagens renderizadas pelo Premiere.
|
|
Ele também recua a amostra no fim de vídeos muito curtos quando não há um frame
|
|
decodificável exatamente no timestamp solicitado.
|
|
|
|
Os analyzers de sequência não tentam concluir a intenção de uma pessoa. Eles
|
|
retornam indícios temporais (`possivel_tremor`, `possivel_descontinuidade` e
|
|
`possivel_frame_congelado`) para que a camada editorial decida como tratá-los.
|