feat: add proper README

This commit is contained in:
Thiago Sposito 2026-02-04 22:23:21 -03:00
parent edb31d2d31
commit 0d25b51be2
Signed by: thiago
GPG key ID: 3065EA73A976D430

137
README.md
View file

@ -1,66 +1,121 @@
# Table extraction from scrolling video # Extração de Tabelas de Vídeo com Scroll
Extract a table from a screen-recorded video: sample frames, OCR (Portuguese), align to column/row bounds from an SVG template, then merge and deduplicate into one CSV. Sistema automatizado para extrair tabelas de vídeos de gravação de tela que contêm tabelas com scroll vertical. Utiliza OCR em português, alinhamento baseado em template SVG e mesclagem inteligente para gerar um CSV final deduplicado.
## Inputs ## Visão Geral
| File | Role | Este projeto processa vídeos de gravação de tela que contêm tabelas com scroll, extraindo os dados através de:
|------|------|
| `video-data.webm` | Source video (scroll-down table). |
| `template.svg` | Annotation: rectangles under the image = column bounds; 28 rows. |
## Outputs 1. **Amostragem de frames**: Extrai frames do vídeo em intervalos regulares
2. **OCR**: Reconhece texto em português em cada frame
3. **Alinhamento**: Usa um template SVG para identificar colunas e linhas
4. **Correção heurística**: Aplica correções automáticas nos dados extraídos
5. **Mesclagem e deduplicação**: Combina todos os frames e remove duplicatas
| File / dir | Role | ## Requisitos
|------------|------|
| `result.csv` | Final table: 6 columns (Concessionária, Código, Rodovia/UF, km inicial, km final, Extensão), one row per segment, deduplicated. |
| `frames/` | Working: one PNG and one CSV per sampled frame (e.g. 0, 10, 20, …). |
| `llm-fixed-frames/` | Optional: copy of frame CSVs after manual/LLM fixes; sew from here instead of `frames/` if used. |
## Run (same chore again) - Python 3
- OpenCV (opencv4)
- NumPy
- Tesseract OCR (com suporte a português)
- FFmpeg
- Nix (para ambiente isolado, opcional)
**Fully automated (extract → fix → sew → result):** ## Estrutura do Projeto
### Arquivos de Entrada
| Arquivo | Descrição |
|---------|-----------|
| `video-data.webm` | Vídeo fonte contendo a tabela com scroll vertical |
| `template.svg` | Template de anotação: retângulos vermelhos definem as colunas (6 colunas), retângulos azuis definem as linhas (28 linhas) |
### Arquivos de Saída
| Arquivo/Diretório | Descrição |
|-------------------|-----------|
| `result.csv` | Tabela final com 6 colunas: Concessionária, Código, Rodovia/UF, km inicial, km final, Extensão. Uma linha por segmento, deduplicada. |
| `frames/` | Diretório de trabalho: contém um PNG e um CSV por frame amostrado (ex: 0, 10, 20, 30, ...) |
| `llm-fixed-frames/` | Diretório opcional: cópias dos CSVs dos frames após correções manuais ou via LLM. Use este diretório como entrada para `sew_csvs.py` se fizer correções manuais |
## Uso Rápido
### Execução Automatizada Completa
Para executar todo o pipeline (extração → correção → mesclagem → resultado):
```bash ```bash
nix-shell -p python3 python3Packages.opencv4 python3Packages.numpy python3Packages.pytesseract tesseract ffmpeg --run "./run.sh" nix-shell -p python3 python3Packages.opencv4 python3Packages.numpy python3Packages.pytesseract tesseract ffmpeg --run "./run.sh"
``` ```
Or with custom video / output dir: Ou com vídeo e diretório de saída customizados:
```bash ```bash
./run.sh path/to/video.webm my_frames ./run.sh caminho/para/video.webm meu_diretorio_frames
# result.csv is still written at project root # result.csv será escrito na raiz do projeto
``` ```
**If you do manual fixes:** copy `frames/*.csv` into `llm-fixed-frames/`, edit CSVs, then: ### Fluxo com Correções Manuais
```bash Se você precisar corrigir manualmente os CSVs extraídos:
python3 sew_csvs.py llm-fixed-frames result.csv
```
## Scripts (keep) 1. Copie os CSVs do diretório `frames/` para `llm-fixed-frames/`:
```bash
cp frames/*.csv llm-fixed-frames/
```
| Script | Role | 2. Edite os arquivos CSV em `llm-fixed-frames/` conforme necessário
|--------|------|
| `extract_frames_and_tables.py` | Sample video every N frames → PNGs; OCR (por) + SVG column/row bounds → one CSV per frame. |
| `fix_all_csvs.py` | Heuristic fixes on frame CSVs (strip, E→-, pipe→space, extensão from km). |
| `sew_csvs.py` | Merge frame CSVs in order, remove boundary overlap, deduplicate full rows, write result. |
| `svg_columns.py` | Parse column/row rectangles from template.svg. |
| `assign_cells.py` | Map word boxes to (col, row); merge cell text (col1 no space, others space). |
| `clean_csv_heuristics.py` | Per-row cleanup and extensão correction (used by fix_all_csvs). |
| `row_eq.py` | Row equality for sewing. |
## Not kept (removed) 3. Execute apenas a mesclagem usando o diretório corrigido:
```bash
python3 sew_csvs.py llm-fixed-frames result.csv
```
- `extract_table_frames.py` superseded by `extract_frames_and_tables.py`. ## Scripts do Projeto
- `extract_every_n_frames.py` logic folded into `extract_frames_and_tables.py`.
- `sewn.csv` superseded by `result.csv` (sew now writes result.csv and dedupes).
## Clean re-run ### Scripts Principais
To start from scratch: | Script | Função |
|--------|--------|
| `extract_frames_and_tables.py` | Extrai frames do vídeo a cada N frames, salva como PNG, executa OCR em português, alinha texto às colunas/linhas do template SVG e gera um CSV por frame |
| `fix_all_csvs.py` | Aplica correções heurísticas nos CSVs dos frames: remove espaços, converte "E" em "-", substitui pipes por espaços, calcula extensão a partir dos km |
| `sew_csvs.py` | Mescla os CSVs dos frames em ordem, remove sobreposição nas bordas, deduplica linhas completas e escreve o resultado final |
- Delete or clear `frames/` and optionally `llm-fixed-frames/`. ### Scripts Auxiliares
- Run `./run.sh` (or the manual-fix flow above).
`result.csv` is overwritten each run. | Script | Função |
|--------|--------|
| `svg_columns.py` | Parse dos retângulos de colunas e linhas do `template.svg` |
| `assign_cells.py` | Mapeia caixas de palavras para células (col, row); mescla texto das células (col1 sem espaço, outras com espaço) |
| `clean_csv_heuristics.py` | Limpeza por linha e correção de extensão (usado por `fix_all_csvs.py`) |
| `row_eq.py` | Função de igualdade de linhas para a mesclagem |
## Fluxo de Processamento
O pipeline completo segue estas etapas:
1. **Extração de Frames**: `extract_frames_and_tables.py` amostra o vídeo a cada 10 frames (padrão) e salva como PNG
2. **OCR e Alinhamento**: Para cada frame, executa OCR em português e alinha o texto às colunas/linhas definidas no `template.svg`
3. **Correção Heurística**: `fix_all_csvs.py` aplica correções automáticas nos dados extraídos
4. **Mesclagem**: `sew_csvs.py` combina todos os CSVs, remove sobreposições e deduplica linhas completas
5. **Resultado Final**: Gera `result.csv` com todos os dados consolidados
## Reiniciar do Zero
Para executar uma nova extração do zero:
1. Delete ou limpe os diretórios `frames/` e `llm-fixed-frames/` (se existirem)
2. Execute `./run.sh` (ou o fluxo de correção manual descrito acima)
**Nota**: `result.csv` é sobrescrito a cada execução.
## Estrutura das Colunas
O CSV final contém 6 colunas:
- **Concessionária**: Nome da concessionária
- **Código**: Código identificador
- **Rodovia/UF**: Rodovia e estado
- **km inicial**: Quilômetro inicial do segmento
- **km final**: Quilômetro final do segmento
- **Extensão**: Extensão calculada (km final - km inicial)