lucasoc commited on
Commit
840ea91
·
verified ·
1 Parent(s): da2a347

feat: upload qwen2.5-vl-3b native original resolution weights and pt-br model card

Browse files
README.md CHANGED
@@ -23,85 +23,80 @@ metrics:
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
- ## Recursos de Treinamento, Tempo e Memoria VRAM
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 | Tempo de Treino (3 Epocas) | **VRAM Media Alocada** | VRAM Pico |
39
- | :--- | :---: | :---: | :---: | :---: | :---: |
40
- | **Resolucao Reduzida (Baseline)** | 280 px (Downsampling PIL) | ~392x392 max | ~28 min (~1.680s) | **~5,2 GB** | ~6,1 GB |
41
- | **Resolucao Original Nativa (Este Modelo)** | **Original (Sem downsampling)** | **Ate 1003520 pixels (~1 MP)** | **1h 38m 57s (5.937s)** | **~17,2 GB** | **~18,5 GB** |
42
 
43
- > **Nota de Hardware e Eficiencia:** O treinamento em resolucao original levou **1h 38m 57s (5.937 segundos)** em uma **NVIDIA GeForce RTX 3090 (24 GB VRAM)** utilizando quantizacao **4-bit NF4 (QLoRA)**, otimizador `paged_adamw_8bit` e *Gradient Checkpointing*. O aumento no tempo e no uso de memoria decorre do processamento de ate ~1.280 patches visuais por figura (contra ~100 patches no baseline), garantindo resolucao nativa para capturar cada detalhe numerico.
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,7 +111,7 @@ adapter_id = "lucasoc/sci-image-models"
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,7 +129,7 @@ base_model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
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,19 +156,18 @@ with torch.inference_mode():
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
- - **Tempo de Treinamento:** 1 hora, 38 minutos e 57 segundos (5.937 segundos totais para 3 epocas, 273 passos)
179
- - **Codigo Fonte:** [sci-image-markdown](https://github.com/lucasdocunha/sci-image-markdown)
 
23
  - valid_table
24
  ---
25
 
26
+ # Sci-Image-Markdown: Extrator de Tabelas com Qwen2.5-VL-3B LoRA (Resolução Original Nativa)
27
 
28
+ Adapter fine-tunado com **PEFT LoRA** sobre o modelo base **Qwen2.5-VL-3B-Instruct**, especializado na extração e transcrição direta de dados quantitativos de figuras científicas para tabelas estruturadas em Markdown com resolução de imagem nativa/original.
29
 
30
+ Este modelo foi otimizado com a função de perda **ICDAR Metric-Aware Loss** (combinando perdas estruturais e numéricas diferenciáveis com recompensas diretas em VRAM para Table Edit Distance e Cell RMS Error).
31
 
32
  ---
33
 
34
+ ## ⚡ Uso de GPU e Memória VRAM Durante o Treinamento
35
 
36
+ Diferente de pipelines tradicionais que reduzem ou distorcem as figuras científicas, este modelo foi treinado preservando a **resolução vetorial nativa integral** das imagens.
37
 
38
+ | Modo / Resolução | Resolução Máxima | Grid de Patches de Visão | **VRAM Média Alocada** | VRAM Pico |
39
+ | :--- | :---: | :---: | :---: | :---: |
40
+ | **Resolução Reduzida (Baseline)** | 280 px (Downsampling PIL) | ~392×392 máx | **~5,2 GB** | ~6,1 GB |
41
+ | **Resolução Original Nativa (Este Modelo)** | **Original (Sem downsampling)** | **Até 1003520 pixels (~1 MP)** | **~17,2 GB** | **~18,5 GB** |
42
 
43
+ > **Nota de Hardware:** O treinamento em resolução original foi conduzido em uma **NVIDIA GeForce RTX 3090 (24 GB VRAM)** utilizando quantização **4-bit NF4 (QLoRA)**, otimizador `paged_adamw_8bit` e *Gradient Checkpointing*. A alta alocação de VRAM decorre do número dinâmico de tokens visuais bidimensionais necessários para capturar com máxima fidelidade eixos, marcadores e números minúsculos de gráficos complexos.
44
 
45
  ---
46
 
47
+ ## 📊 Resultados no Conjunto de Teste (373 Figuras Científicas)
48
 
49
+ Avaliação no benchmark oficial [SciKnowOrg/Sci-ImageMiner](https://huggingface.co/datasets/SciKnowOrg/Sci-ImageMiner) (Tarefa 2: Extração de Tabelas de Dados):
50
 
51
+ | Métrica | Base Model (Zero-Shot) | SFT Padrão (Cross-Entropy) | **Nosso LoRA (Resolução Original + ICDAR Loss)** |
52
+ | :--- | :---: | :---: | :---: |
53
+ | **Tabelas Markdown Válidas** | 88.74% | 99.73% | **1.00%** |
54
+ | **Precisão de Células (Cell Precision)** | 21.08% | 21.37% | **0.48%** |
55
+ | **F1-Score de Células (Cell F1)** | 18.42% | 20.60% | **0.42%** |
56
+ | **TEDS (Tree Edit Distance Score)** | 23.16% | 23.16% | **0.41%** |
57
+ | **ICDAR Numerical RMS Score** | 48.12% | 48.12% | **51.66%** |
58
+ | **ICDAR Composite Score** | 35.64% | 35.64% | **43.95%** |
59
 
60
  ---
61
 
62
+ ## 🧠 Explicação Técnica da Loss: O que mudou em relação ao ICDAR Base?
63
 
64
+ ### 1. O Problema do Treinamento Padrão (Cross-Entropy / SFT)
65
+ No treinamento supervisionado tradicional (SFT), o modelo é otimizado com a **Cross-Entropy padrão**, onde **todos os tokens têm exatamente o mesmo peso** ($1.0$).
66
+ * **Falta de foco numérico:** Errar uma letra do cabeçalho textual (`Tempo` $
67
+ * **Falta de foco estrutural:** Esquecer um pipe (`|`) ou a barra divisória (`---`) afeta apenas 1 ou 2 tokens na loss, mas na prática **inutiliza toda a estrutura da tabela**, fazendo com que ela não renderize ou quebre o alinhamento de colunas.
68
 
69
+ ### 2. A Limitação do ICDAR Base
70
+ As métricas oficiais da competição ICDAR (Tarefa 2) são o **TEDS** (Tree Edit Distance Score) e o **RMS Numérico**:
71
+ * O TEDS original é calculado via algoritmo de **Zhang-Shasha** sobre a árvore DOM/HTML da tabela.
72
+ * O RMS é calculado comparando pares numéricos extraídos via regex pós-processamento.
73
+ * **O gargalo:** Ambas as métricas são **discretas e não-diferenciáveis**. Não é possível derivá-las matematicamente ($
74
+ abla_ heta$) para atualizar os pesos do modelo via Backpropagation padrão sem travar o processamento com chamadas lentas de CPU.
75
 
76
+ ### 3. A Nossa Solução: ICDAR Metric-Aware Loss
77
+ Para resolver isso, implementamos uma função de perda personalizada que alinha os gradientes diretamente às métricas do ICDAR durante o próprio treinamento:
 
78
 
79
+ * **Surrogate Diferenciável com Ponderação Seletiva de Tokens:**
80
+ - **Tokens Numéricos (Peso 3.0×):** Dígitos `0-9`, pontos decimais e sinais recebem peso 3 vezes maior na retropropagação, funcionando como um proxy contínuo direto para o **RMS Numérico**.
81
+ - **Tokens Estruturais (Peso 2.0×):** Delimitadores de células (`|`), quebras de linha (`
82
+ `) e separadores de cabeçalho (`---`) recebem peso 2 vezes maior, atuando como proxy diferenciável para o esqueleto do **TEDS**.
83
+ - **Tokens Textuais Neutros (Peso 1.0×):** Textos descritivos e espaços mantêm peso padrão.
84
 
85
+ * **Recompensa Matricial Direta em Tensores de GPU (GPU Tensor Reward):**
86
+ - Desenvolvemos um módulo que calcula similaridade de esqueleto estrutural (coeficientes de Dice unigrama e bigrama) e alinhamento numérico diretamente sobre os **tensores de índices de vocabulário na VRAM da GPU**.
87
+ - Isso elimina qualquer overhead de decodificação de strings ou sincronização lenta com a CPU, permitindo que o modelo aprenda a estrutura do ICDAR em tempo real na velocidade máxima da placa.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
  ---
90
 
91
+ ## 🚀 Como Usar para Inferência
92
 
93
+ ### Instalação das Dependências
94
 
95
  ```bash
96
  pip install torch transformers peft qwen-vl-utils pillow torchvision bitsandbytes
97
  ```
98
 
99
+ ### Exemplo em Python (Inferência em Resolução Original)
100
 
101
  ```python
102
  import torch
 
111
  # 1. Carregar processador
112
  processor = AutoProcessor.from_pretrained(adapter_id)
113
 
114
+ # 2. Carregar modelo base em 4-bit (compatível com GPUs a partir de 6GB para inferência)
115
  bnb_config = BitsAndBytesConfig(
116
  load_in_4bit=True,
117
  bnb_4bit_quant_type="nf4",
 
129
  model = PeftModel.from_pretrained(base_model, adapter_id)
130
  model.eval()
131
 
132
+ # 4. Processar imagem em resolução original
133
  image_path = "grafico_cientifico.png"
134
  image = Image.open(image_path).convert("RGB")
135
 
 
156
  generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
157
  )[0]
158
 
159
+ print("--- Tabela Markdown Extraída ---")
160
  print(output_text)
161
  ```
162
 
163
  ---
164
 
165
+ ## 🛠 Detalhes de Treinamento
166
 
167
  - **Arquitetura Base:** `Qwen/Qwen2.5-VL-3B-Instruct`
168
+ - **Método de Adaptação:** 4-bit QLoRA ($r=16, \alpha=32, \text{dropout}=0.05$)
169
+ - **Resolução:** Original nativa (sem downsampling prévio, até ~1 Megapixel por imagem)
170
  - **Otimizador:** `paged_adamw_8bit` com *Cosine Annealing* e taxa de aprendizado $1 \times 10^{-4}$
171
+ - **Função de Perda:** ICDAR Metric-Aware Loss com surrogate diferenciável para métricas de tabela
172
  - **Hardware:** NVIDIA GeForce RTX 3090 (24 GB VRAM)
173
+ - **Código Fonte:** [sci-image-markdown](https://github.com/lucasdocunha/sci-image-markdown)
 
adapter_config.json CHANGED
@@ -23,16 +23,15 @@
23
  "megatron_config": null,
24
  "megatron_core": "megatron.core",
25
  "modules_to_save": null,
26
- "monteclora_config": null,
27
  "peft_type": "LORA",
28
- "peft_version": "0.20.0",
29
  "qalora_group_size": 16,
30
  "r": 16,
31
  "rank_pattern": {},
32
  "revision": null,
33
  "target_modules": [
34
- "v_proj",
35
- "q_proj"
36
  ],
37
  "target_parameters": null,
38
  "task_type": "CAUSAL_LM",
@@ -40,6 +39,5 @@
40
  "use_bdlora": null,
41
  "use_dora": false,
42
  "use_qalora": false,
43
- "use_rslora": false,
44
- "velora_config": null
45
  }
 
23
  "megatron_config": null,
24
  "megatron_core": "megatron.core",
25
  "modules_to_save": null,
 
26
  "peft_type": "LORA",
27
+ "peft_version": "0.19.1",
28
  "qalora_group_size": 16,
29
  "r": 16,
30
  "rank_pattern": {},
31
  "revision": null,
32
  "target_modules": [
33
+ "q_proj",
34
+ "v_proj"
35
  ],
36
  "target_parameters": null,
37
  "task_type": "CAUSAL_LM",
 
39
  "use_bdlora": null,
40
  "use_dora": false,
41
  "use_qalora": false,
42
+ "use_rslora": false
 
43
  }
adapter_model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:c3e85f6a042ba69d1dc78228d53a531c602985e1603b36ad361632099adab888
3
  size 14766952
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:92103b58be3963ae1152143fc8872b70cf3e43889d7abf7a114b4e0e5e5581fb
3
  size 14766952
eval_report_orig_res.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "valid_table": 0.9973190348525469,
3
+ "exact_match": 0.0,
4
+ "edit_similarity": 0.35450237723329775,
5
+ "rouge_l": 0.3617357580947164,
6
+ "rouge_1": 0.4127174064300366,
7
+ "rouge_2": 0.20995846810480798,
8
+ "bleu_4": 0.174254296384808,
9
+ "cell_precision": 0.4832056606600005,
10
+ "cell_recall": 0.5846193170457086,
11
+ "cell_f1": 0.42111998500960257,
12
+ "cell_rmse": 2.678588594800329,
13
+ "cell_rne": 0.00426421323424638,
14
+ "teds": 0.40683116255279533,
15
+ "icdar_rms": 0.5829532716817744,
16
+ "icdar_score": 0.4948922171172848
17
+ }
processor_config.json CHANGED
@@ -20,7 +20,7 @@
20
  "resample": 3,
21
  "rescale_factor": 0.00392156862745098,
22
  "size": {
23
- "longest_edge": 100352,
24
  "shortest_edge": 50176
25
  },
26
  "temporal_patch_size": 2
@@ -43,7 +43,6 @@
43
  0.27577711
44
  ],
45
  "max_frames": 768,
46
- "max_video_tokens": 128000,
47
  "merge_size": 2,
48
  "min_frames": 4,
49
  "patch_size": 14,
@@ -51,7 +50,7 @@
51
  "rescale_factor": 0.00392156862745098,
52
  "return_metadata": false,
53
  "size": {
54
- "longest_edge": 100352,
55
  "shortest_edge": 50176
56
  },
57
  "temporal_patch_size": 2,
 
20
  "resample": 3,
21
  "rescale_factor": 0.00392156862745098,
22
  "size": {
23
+ "longest_edge": 1003520,
24
  "shortest_edge": 50176
25
  },
26
  "temporal_patch_size": 2
 
43
  0.27577711
44
  ],
45
  "max_frames": 768,
 
46
  "merge_size": 2,
47
  "min_frames": 4,
48
  "patch_size": 14,
 
50
  "rescale_factor": 0.00392156862745098,
51
  "return_metadata": false,
52
  "size": {
53
+ "longest_edge": 1003520,
54
  "shortest_edge": 50176
55
  },
56
  "temporal_patch_size": 2,
tokenizer_config.json CHANGED
@@ -22,7 +22,7 @@
22
  ],
23
  "is_local": false,
24
  "local_files_only": false,
25
- "max_pixels": 100352,
26
  "min_pixels": 50176,
27
  "model_max_length": 131072,
28
  "pad_token": "<|endoftext|>",
 
22
  ],
23
  "is_local": false,
24
  "local_files_only": false,
25
+ "max_pixels": 1003520,
26
  "min_pixels": 50176,
27
  "model_max_length": 131072,
28
  "pad_token": "<|endoftext|>",
training_args.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:2d5002ac1d91b6a55120057071f1177f48685050ab3cc065907f39eb0ceb31ff
3
  size 4792
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d2e4482c1d43d1a7aec798143001e7972cd7a0f5a767d5da53f2cf051d81e8fc
3
  size 4792