Image-to-Text
PEFT
Safetensors
Portuguese
English
vision-language
table-extraction
scientific-figures
markdown-table
lightonocr
qwen2.5-vl
qwen3-vl
lora
icdar-metric-loss
Instructions to use lucasoc/sci-image-models with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use lucasoc/sci-image-models with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct") model = PeftModel.from_pretrained(base_model, "lucasoc/sci-image-models") - Notebooks
- Google Colab
- Kaggle
docs: atualiza explicacao detalhada da loss icdar vs padrao e remove emojis
Browse files
README.md
CHANGED
|
@@ -23,89 +23,85 @@ metrics:
|
|
| 23 |
- valid_table
|
| 24 |
---
|
| 25 |
|
| 26 |
-
# Sci-Image-Markdown: Extrator de Tabelas com Qwen2.5-VL-3B LoRA (
|
| 27 |
|
| 28 |
-
Adapter fine-tunado com **PEFT LoRA** sobre o modelo base **Qwen2.5-VL-3B-Instruct**, especializado na
|
| 29 |
|
| 30 |
-
Este modelo foi otimizado com a
|
| 31 |
|
| 32 |
---
|
| 33 |
|
| 34 |
-
##
|
| 35 |
|
| 36 |
-
Diferente de pipelines tradicionais que reduzem ou distorcem as figuras
|
| 37 |
|
| 38 |
-
| Modo /
|
| 39 |
| :--- | :---: | :---: | :---: | :---: |
|
| 40 |
-
| **
|
| 41 |
-
| **
|
| 42 |
|
| 43 |
-
> **Nota de Hardware:** O treinamento em
|
| 44 |
|
| 45 |
---
|
| 46 |
|
| 47 |
-
##
|
| 48 |
|
| 49 |
-
|
| 50 |
|
| 51 |
-
|
|
| 52 |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: |
|
| 53 |
-
| **Tabelas
|
| 54 |
-
| **
|
| 55 |
-
| **F1-Score de
|
| 56 |
| **Similaridade Estrutural (`TEDS`)** | 23.16% | 23.16% | 36.24% | **40.29%** | **+17.13 pp** | **+4.05 pp** |
|
| 57 |
| **ICDAR Numerical RMS** | 48.12% | 48.12% | 51.66% | **51.32%** | **+3.20 pp** | **-0.34 pp** |
|
| 58 |
| **ICDAR Score Composto** | 35.64% | 35.64% | 43.95% | **45.80%** | **+10.16 pp** | **+1.85 pp** |
|
| 59 |
|
| 60 |
---
|
| 61 |
|
| 62 |
-
##
|
| 63 |
|
| 64 |
-
### 1.
|
| 65 |
|
| 66 |
-
|
| 67 |
-
| :--- | :--- | :--- |
|
| 68 |
-
| **Peso dos Tokens** | **Todos os tokens têm o mesmo peso ($1.0$).** | **Ponderação Seletiva guiada pela relevância:**<br>• Números (`0-9`, `.`, `-`): **Peso 3,0×**<br>• Estrutura (`|`, `
|
| 69 |
-
`, `---`): **Peso 2,0×**<br>• Texto descritivo/espaços: **Peso 1,0×** |
|
| 70 |
-
| **Como enxerga o erro** | Trata errar uma letra textual qualquer (`"Tempo"` $
|
| 71 |
-
| **Comportamento do Modelo** | O modelo pode atingir loss muito baixa prevendo bem palavras comuns e pontuação, mas continuar errando as medidas do gráfico ou quebrando a tabela. | O modelo é forçado a priorizar a exatidão dos eixos, ticks e a integridade de todas as colunas. |
|
| 72 |
|
| 73 |
-
-
|
|
|
|
|
|
|
| 74 |
|
| 75 |
-
### 2.
|
| 76 |
|
| 77 |
-
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
Esse gradiente forte força os pesos do LoRA a ajustar os padrões de atenção espacial do Vision Transformer, fazendo o modelo "olhar" e focar com muito mais nitidez nas marcações de eixos, legendas e números minúsculos da figura.
|
| 83 |
-
3. **Preservação de Capacidade (Orçamento de Parâmetros):**
|
| 84 |
-
O LoRA treina apenas **3,6 milhões de parâmetros** (apenas **0,098%** dos 3,75 bilhões de parâmetros do modelo). Se usássemos a loss padrão, o LoRA gastaria quase toda a sua capacidade aprendendo tarefas fáceis de linguagem natural. Com a nossa loss, **o orçamento de 0,098% de parâmetros é canalizado exatamente para a fidelidade numérica e estrutural**.
|
| 85 |
|
| 86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
-
###
|
| 89 |
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
Ao dobrar o peso de delimitadores (`|`, `---`, `
|
| 94 |
-
`), o modelo aprendeu que esquecer de fechar uma célula inutiliza toda a tabela. O resultado empírico foi atingir **100,00% de tabelas válidas** no conjunto de teste.
|
| 95 |
-
3. **Velocidade Máxima com GPU Tensor Reward:**
|
| 96 |
-
As métricas tradicionais (como o algoritmo de Zhang-Shasha do TEDS) rodam na CPU sobre árvores de texto e levariam dezenas de horas se chamadas durante o treino. Ao pré-computar máscaras na VRAM e avaliar a estrutura diretamente sobre tensores de GPU, mantivemos a velocidade nativa da placa gráfica com zero overhead.
|
| 97 |
|
| 98 |
---
|
| 99 |
|
| 100 |
-
##
|
| 101 |
|
| 102 |
-
###
|
| 103 |
|
| 104 |
```bash
|
| 105 |
pip install torch transformers peft qwen-vl-utils pillow torchvision bitsandbytes
|
| 106 |
```
|
| 107 |
|
| 108 |
-
### Exemplo em Python (
|
| 109 |
|
| 110 |
```python
|
| 111 |
import torch
|
|
@@ -120,7 +116,7 @@ adapter_id = "lucasoc/sci-image-models"
|
|
| 120 |
# 1. Carregar processador
|
| 121 |
processor = AutoProcessor.from_pretrained(adapter_id)
|
| 122 |
|
| 123 |
-
# 2. Carregar modelo base em 4-bit (
|
| 124 |
bnb_config = BitsAndBytesConfig(
|
| 125 |
load_in_4bit=True,
|
| 126 |
bnb_4bit_quant_type="nf4",
|
|
@@ -138,7 +134,7 @@ base_model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
|
|
| 138 |
model = PeftModel.from_pretrained(base_model, adapter_id)
|
| 139 |
model.eval()
|
| 140 |
|
| 141 |
-
# 4. Processar imagem em
|
| 142 |
image_path = "grafico_cientifico.png"
|
| 143 |
image = Image.open(image_path).convert("RGB")
|
| 144 |
|
|
@@ -165,18 +161,18 @@ with torch.inference_mode():
|
|
| 165 |
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
|
| 166 |
)[0]
|
| 167 |
|
| 168 |
-
print("--- Tabela Markdown
|
| 169 |
print(output_text)
|
| 170 |
```
|
| 171 |
|
| 172 |
---
|
| 173 |
|
| 174 |
-
##
|
| 175 |
|
| 176 |
- **Arquitetura Base:** `Qwen/Qwen2.5-VL-3B-Instruct`
|
| 177 |
-
- **
|
| 178 |
-
- **
|
| 179 |
- **Otimizador:** `paged_adamw_8bit` com *Cosine Annealing* e taxa de aprendizado $1 \times 10^{-4}$
|
| 180 |
-
- **
|
| 181 |
- **Hardware:** NVIDIA GeForce RTX 3090 (24 GB VRAM)
|
| 182 |
-
- **
|
|
|
|
| 23 |
- valid_table
|
| 24 |
---
|
| 25 |
|
| 26 |
+
# Sci-Image-Markdown: Extrator de Tabelas com Qwen2.5-VL-3B LoRA (Resolucao Original Nativa)
|
| 27 |
|
| 28 |
+
Adapter fine-tunado com **PEFT LoRA** sobre o modelo base **Qwen2.5-VL-3B-Instruct**, especializado na extracao e transcricao direta de dados quantitativos de figuras cientificas para tabelas estruturadas em Markdown com resolucao de imagem nativa/original.
|
| 29 |
|
| 30 |
+
Este modelo foi otimizado com a funcao de perda **ICDAR Metric-Aware Loss** (combinando perdas estruturais e numericas diferenciaveis com recompensas diretas em VRAM para Table Edit Distance e Cell RMS Error).
|
| 31 |
|
| 32 |
---
|
| 33 |
|
| 34 |
+
## Uso de GPU e Memoria VRAM Durante o Treinamento
|
| 35 |
|
| 36 |
+
Diferente de pipelines tradicionais que reduzem ou distorcem as figuras cientificas, este modelo foi treinado preservando a **resolucao vetorial nativa integral** das imagens.
|
| 37 |
|
| 38 |
+
| Modo / Resolucao | Resolucao Maxima | Grid de Patches de Visao | **VRAM Media Alocada** | VRAM Pico |
|
| 39 |
| :--- | :---: | :---: | :---: | :---: |
|
| 40 |
+
| **Resolucao Reduzida (Baseline)** | 280 px (Downsampling PIL) | ~392x392 max | **~5,2 GB** | ~6,1 GB |
|
| 41 |
+
| **Resolucao Original Nativa (Este Modelo)** | **Original (Sem downsampling)** | **Ate 1003520 pixels (~1 MP)** | **~17,2 GB** | **~18,5 GB** |
|
| 42 |
|
| 43 |
+
> **Nota de Hardware:** O treinamento em resolucao original foi conduzido em uma **NVIDIA GeForce RTX 3090 (24 GB VRAM)** utilizando quantizacao **4-bit NF4 (QLoRA)**, otimizador `paged_adamw_8bit` e *Gradient Checkpointing*. A alta alocacao de VRAM decorre do numero dinamico de tokens visuais bidimensionais necessarios para capturar com maxima fidelidade eixos, marcadores e numeros minusculos de graficos complexos.
|
| 44 |
|
| 45 |
---
|
| 46 |
|
| 47 |
+
## Resultados no Conjunto de Teste (373 Figuras Cientificas)
|
| 48 |
|
| 49 |
+
Avaliacao no benchmark oficial [SciKnowOrg/Sci-ImageMiner](https://huggingface.co/datasets/SciKnowOrg/Sci-ImageMiner) (Tarefa 2: Extracao de Tabelas de Dados). Ganhos reportados estritamente em **pontos percentuais (pp)**:
|
| 50 |
|
| 51 |
+
| Metrica | Base Zero-Shot | SFT Padrao | LoRA 280px (Anterior) | **Nosso LoRA (Resolucao Original)** | **Ganho vs Base (pp)** | **Ganho vs 280px (pp)** |
|
| 52 |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: |
|
| 53 |
+
| **Tabelas Validas (`valid_table`)** | 88.74% | 99.73% | 99.73% | **100.00%** | **+11.26 pp** | **+0.27 pp** |
|
| 54 |
+
| **Precisao de Celulas (`cell_precision`)** | 21.08% | 21.37% | 39.58% | **47.11%** | **+26.03 pp** | **+7.53 pp** |
|
| 55 |
+
| **F1-Score de Celulas (`cell_f1`)** | 18.42% | 20.60% | 34.67% | **42.49%** | **+24.07 pp** | **+7.82 pp** |
|
| 56 |
| **Similaridade Estrutural (`TEDS`)** | 23.16% | 23.16% | 36.24% | **40.29%** | **+17.13 pp** | **+4.05 pp** |
|
| 57 |
| **ICDAR Numerical RMS** | 48.12% | 48.12% | 51.66% | **51.32%** | **+3.20 pp** | **-0.34 pp** |
|
| 58 |
| **ICDAR Score Composto** | 35.64% | 35.64% | 43.95% | **45.80%** | **+10.16 pp** | **+1.85 pp** |
|
| 59 |
|
| 60 |
---
|
| 61 |
|
| 62 |
+
## Comparativo: Loss Padrao vs. Nossa Loss
|
| 63 |
|
| 64 |
+
### 1. O que e a Loss Padrao (Cross-Entropy / SFT)
|
| 65 |
|
| 66 |
+
No treinamento supervisionado tradicional, a funcao de perda trata todos os tokens com exatamente o mesmo peso (1.0).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
+
- **Falta de foco numerico:** O modelo sofre a mesma penalidade se errar uma palavra descritiva comum (por exemplo, "Tempo" para "Tempa") ou se errar a coordenada exata de um ponto critico em um grafico (por exemplo, "1.2" para "9.8").
|
| 69 |
+
- **Falta de foco estrutural:** O modelo trata delimitadores de colunas (barras verticais) e quebras de linha com o mesmo peso de espacos em branco. Um unico caractere de coluna ausente inutiliza a tabela inteira, mas gera uma penalidade minima na loss padrao.
|
| 70 |
+
- **Comportamento:** O modelo aparenta estar convergindo com perda baixa porque acerta a maioria dos textos comuns, mas continua gerando dados numericos imprecisos e tabelas malformadas.
|
| 71 |
|
| 72 |
+
### 2. A Nossa Solucao: ICDAR Metric-Aware Loss
|
| 73 |
|
| 74 |
+
Para resolver esse problema, desenhamos uma funcao de perda que penaliza os erros de forma seletiva de acordo com a importancia de cada token:
|
| 75 |
|
| 76 |
+
- **Tokens Numericos (Peso 3.0x):** Digitos (0 a 9), pontos decimais e sinais recebem peso 3 vezes maior na retropropagacao, funcionando como um proxy direto para a metrica de RMS Numerico.
|
| 77 |
+
- **Tokens Estruturais (Peso 2.0x):** Barras verticais delimitadoras de colunas, quebras de linha e marcadores de cabecalho recebem peso 2 vezes maior, garantindo que a estrutura da tabela seja rigorosamente respeitada.
|
| 78 |
+
- **Tokens Textuais Comuns (Peso 1.0x):** Textos explicativos e espacos mantem peso padrao unitario.
|
|
|
|
|
|
|
|
|
|
| 79 |
|
| 80 |
+
### 3. Como a Loss atua no LoRA
|
| 81 |
+
|
| 82 |
+
No treinamento com PEFT QLoRA, os pesos do modelo base Qwen2.5-VL-3B permanecem 100% congelados em quantizacao 4-bit (NF4). Apenas as matrizes lineares de baixa dimensao A e B dos adaptadores LoRA (acopladas as projecoes de atencao q_proj, k_proj, v_proj, o_proj) sao atualizadas:
|
| 83 |
+
|
| 84 |
+
- **Amplificacao Seletiva de Gradientes:** Quando o modelo erra um numero ou uma divisao de coluna, o gradiente resultante e multiplicado por 3.0x ou 2.0x. Pela regra da cadeia, esse erro amplificado e propagado diretamente para as matrizes treinaveis do LoRA.
|
| 85 |
+
- **Direcionamento da Atencao Visual:** Essa forca de gradiente ajusta os vetores de atencao do Vision Transformer, forcando o modelo a concentrar seu foco visual nas coordenadas, eixos, legendas e numeros presentes na imagem cientifica.
|
| 86 |
+
- **Maximizacao do Orcamento de Parametros:** Como o LoRA treina apenas 3,6 milhoes de parametros (apenas 0,098% do modelo total), a nossa loss impede que esse orcamento reduzido seja gasto com linguagem natural trivial, canalizando praticamente todo o aprendizado para a precisao numerica e integridade estrutural.
|
| 87 |
|
| 88 |
+
### 4. Por que dessa Escolha?
|
| 89 |
|
| 90 |
+
- **Alinhamento as Metricas Oficiais:** As competicoes ICDAR avaliam tabelas por meio do TEDS (Tree Edit Distance) e do RMS Numerico. A Cross-Entropy padrao desconhece essas restricoes. A nossa loss atua como um surrogate continuo diferenciavel que alinha o objetivo do treino diretamente ao criterio de teste.
|
| 91 |
+
- **Garantia de Tabelas 100% Validas:** A penalidade duplicada em delimitadores ensinou o modelo a nunca esquecer o fechamento de uma celula, resultando em 100,00% de tabelas validas no conjunto de teste.
|
| 92 |
+
- **Zero Overhead com GPU Tensor Reward:** Em vez de calcular distancias em arvores na CPU (o que travaria o treinamento), a loss opera inteiramente na memoria VRAM da GPU atraves de tensores de contagem e comparacao de mascaras booleanas.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
|
| 94 |
---
|
| 95 |
|
| 96 |
+
## Como Usar para Inferencia
|
| 97 |
|
| 98 |
+
### Instalacao das Dependencias
|
| 99 |
|
| 100 |
```bash
|
| 101 |
pip install torch transformers peft qwen-vl-utils pillow torchvision bitsandbytes
|
| 102 |
```
|
| 103 |
|
| 104 |
+
### Exemplo em Python (Inferencia em Resolucao Original)
|
| 105 |
|
| 106 |
```python
|
| 107 |
import torch
|
|
|
|
| 116 |
# 1. Carregar processador
|
| 117 |
processor = AutoProcessor.from_pretrained(adapter_id)
|
| 118 |
|
| 119 |
+
# 2. Carregar modelo base em 4-bit (compativel com GPUs a partir de 6GB para inferencia)
|
| 120 |
bnb_config = BitsAndBytesConfig(
|
| 121 |
load_in_4bit=True,
|
| 122 |
bnb_4bit_quant_type="nf4",
|
|
|
|
| 134 |
model = PeftModel.from_pretrained(base_model, adapter_id)
|
| 135 |
model.eval()
|
| 136 |
|
| 137 |
+
# 4. Processar imagem em resolucao original
|
| 138 |
image_path = "grafico_cientifico.png"
|
| 139 |
image = Image.open(image_path).convert("RGB")
|
| 140 |
|
|
|
|
| 161 |
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
|
| 162 |
)[0]
|
| 163 |
|
| 164 |
+
print("--- Tabela Markdown Extraida ---")
|
| 165 |
print(output_text)
|
| 166 |
```
|
| 167 |
|
| 168 |
---
|
| 169 |
|
| 170 |
+
## Detalhes de Treinamento
|
| 171 |
|
| 172 |
- **Arquitetura Base:** `Qwen/Qwen2.5-VL-3B-Instruct`
|
| 173 |
+
- **Metodo de Adaptacao:** 4-bit QLoRA ($r=16, \alpha=32, \text{dropout}=0.05$)
|
| 174 |
+
- **Resolucao:** Original nativa (sem downsampling previo, ate ~1 Megapixel por imagem)
|
| 175 |
- **Otimizador:** `paged_adamw_8bit` com *Cosine Annealing* e taxa de aprendizado $1 \times 10^{-4}$
|
| 176 |
+
- **Funcao de Perda:** ICDAR Metric-Aware Loss com surrogate diferenciavel para metricas de tabela
|
| 177 |
- **Hardware:** NVIDIA GeForce RTX 3090 (24 GB VRAM)
|
| 178 |
+
- **Codigo Fonte:** [sci-image-markdown](https://github.com/lucasdocunha/sci-image-markdown)
|