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

docs: atualiza metricas finais oficiais do conjunto de teste (373 figuras) e tempo de treino

Browse files
Files changed (1) hide show
  1. README.md +58 -52
README.md CHANGED
@@ -23,80 +23,85 @@ metrics:
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,7 +116,7 @@ adapter_id = "lucasoc/sci-image-models"
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,7 +134,7 @@ base_model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
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,18 +161,19 @@ with torch.inference_mode():
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)
 
 
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% | **99.73%** | **+10.99 pp** | **+0.00 pp** |
54
+ | **Precisao de Celulas (`cell_precision`)** | 21.08% | 21.37% | 39.58% | **48.32%** | **+27.24 pp** | **+8.74 pp** |
55
+ | **F1-Score de Celulas (`cell_f1`)** | 18.42% | 20.60% | 34.67% | **42.11%** | **+23.69 pp** | **+7.44 pp** |
56
+ | **Similaridade Estrutural (`TEDS`)** | 23.16% | 23.16% | 36.24% | **40.68%** | **+17.52 pp** | **+4.44 pp** |
57
+ | **ICDAR Numerical RMS** | 48.12% | 48.12% | 51.66% | **58.30%** | **+10.18 pp** | **+6.64 pp** |
58
+ | **ICDAR Score Composto** | 35.64% | 35.64% | 43.95% | **49.49%** | **+13.85 pp** | **+5.54 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
+ - **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)