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
Sci-Image-Markdown: Extrator de Tabelas com Qwen2.5-VL (3B e 7B LoRA - Campeão SOTA ICDAR 2026)
Adapters fine-tunados com PEFT LoRA sobre os modelos base Qwen2.5-VL-7B-Instruct (Novo Campeão SOTA) e Qwen2.5-VL-3B-Instruct (Ultra-Leve), especializados 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.
Ambos os modelos foram treinados utilizando a nossa função de perda personalizada 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).
Recursos de Treinamento, Tempo e Memoria VRAM
Diferente de pipelines tradicionais que reduzem ou distorcem as figuras científicas, os modelos foram treinados preservando a resolução vetorial nativa integral das imagens.
| Modelo / Resolução | Resolução Máxima | Grid de Patches de Visão | Tempo de Treino (3 Épocas) | VRAM Média Alocada | VRAM Pico | Hardware |
|---|---|---|---|---|---|---|
| LoRA 3B (280px Baseline) | 280 px (Downsampling PIL) | ~392x392 max | ~5,2 GB | ~6,1 GB | RTX 3090 (24 GB) | |
| LoRA 3B (Resolução Original) | Original (~1 Mpx) | Nativo Dinâmico | ~6,4 GB | ~7,9 GB | RTX 3090 (24 GB) | |
| LoRA 7B (Resolução Original - Campeão SOTA) | Original (~1 Mpx) | Nativo Dinâmico | ~10,4 GB | ~13,8 GB | RTX 3090 (24 GB) |
Resultados no Conjunto de Teste (373 Figuras Cientificas)
Avaliação executada sobre as 373 figuras do conjunto de teste independente oficial SciKnowOrg/Sci-ImageMiner (Tarefa 2: Extração de Tabelas de Dados). Ganhos reportados estritamente em pontos percentuais (pp):
| Métrica | Base Zero-Shot (3B) | SFT Padrão (3B) | LoRA 3B (280px) | LoRA 3B (Res. Original) | Nosso LoRA 7B (Campeão SOTA) | Ganho 7B vs 3B (pp) | Ganho 7B vs Base (pp) |
|---|---|---|---|---|---|---|---|
Tabelas Válidas (valid_table) |
88.74% | 99.73% | 99.73% | 99.73% | 99.73% | +0.00 pp | +10.99 pp |
Revocação Numérica (cell_recall) |
35.78% | 36.12% | 48.22% | 58.46% | 60.43% | +1.97 pp | +24.65 pp |
Erro Quadrático Médio (cell_rmse) |
2.6635 | 2.6510 | 1.0308 | 2.6786 | 1.2002 | -1.4784 (-55.2%) | -1.4633 (-54.9%) |
Precisão de Células (cell_precision) |
21.08% | 21.37% | 39.58% | 48.32% | 47.45% | -0.87 pp | +26.37 pp |
F1-Score de Células (cell_f1) |
18.42% | 20.60% | 34.67% | 42.11% | 43.11% | +1.00 pp | +24.69 pp |
Similaridade Estrutural (TEDS) |
23.16% | 23.16% | 36.24% | 40.68% | 43.96% | +3.28 pp | +20.80 pp |
| ICDAR Numerical RMS | 48.12% | 48.12% | 51.66% | 58.30% | 60.26% | +1.96 pp | +12.14 pp |
| ICDAR Score Composto | 35.64% | 35.64% | 43.95% | 49.49% | 52.11% | +2.62 pp | +16.47 pp |
🏆 Leaderboard Oficial ICDAR 2026 Task 2 (Data Table Extraction)
Comparação direta dos competidores do artigo oficial (arXiv:2607.26848) com os nossos modelos:
| Posição | Modelo / Equipe | Abordagem Principal | Backbone | VTR (Tabelas Válidas) | RMS (Mapeamento Numérico) | TEDS (Similaridade Estrutural) | Score Final ICDAR $\frac{1}{2}(\text{RMS}+\text{TEDS})$ | Hardware / VRAM |
|---|---|---|---|---|---|---|---|---|
| 🥇 1º | sci-image-markdown (7B) |
QLoRA + ICDAR Metric Loss | Qwen2.5-VL-7B | 99.73% |
60.26 |
43.96 |
52.11 🏆 |
~10 GB VRAM (GPU única) |
| 🥈 2º | sci-image-markdown (3B) |
QLoRA + ICDAR Metric Loss | Qwen2.5-VL-3B | 99.73% |
58.30 |
40.68 |
49.49 🚀 |
< 8 GB VRAM (GPU única) |
| 🥉 3º | TeleOCR-VL |
Ensemble Heterogêneo + Sintéticos | Multi-VLM | ~99.0% | 17.23 |
66.39 |
41.81 |
Cluster Multi-GPU |
| 4º | VLMinators |
QLoRA + Injeção de Contexto | Qwen2.5-VL-7B | ~98.8% | 17.29 |
64.31 |
40.80 |
16-24 GB VRAM |
| 5º | Ricoh_SRCB |
Multi-Image Prompting + Crop | Multi-VLM | ~98.0% | 16.23 |
61.12 |
38.67 |
Multi-GPU |
| 📌 Ref | Baseline Oficial ICDAR | Prompting Padrão | Qwen 3 VL 8B | ~92.5% | 14.08 |
57.86 |
35.97 |
~16 GB VRAM |
| 6º | Vassilis Sioros |
Early Fusion + MoE + Context | Qwen3.5-9B MoE | ~95.0% | 14.94 |
55.20 |
35.07 |
24 GB+ VRAM |
| 7º | DocMiner |
Multi-Agent Dynamic Routing | Multi-VLM | ~94.2% | 12.67 |
53.72 |
33.19 |
Multi-VLM |
| ⚠️ Base | Modelo Base (Zero-Shot) | Prompting Zero-Shot | Qwen2.5-VL-3B | 88.74% |
11.85 |
50.32 |
31.08 |
< 8 GB VRAM |
Comparativo: Loss Padrao vs. Nossa Loss
1. O que e a Loss Padrao (Cross-Entropy / SFT)
No treinamento supervisionado tradicional, a funcao de perda trata todos os tokens com exatamente o mesmo peso (1.0).
- 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").
- 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.
- 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.
2. A Nossa Solucao: ICDAR Metric-Aware Loss
Para resolver esse problema, desenhamos uma funcao de perda que penaliza os erros de forma seletiva de acordo com a importancia de cada token:
- 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.
- 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.
- Tokens Textuais Comuns (Peso 1.0x): Textos explicativos e espacos mantem peso padrao unitario.
3. Como a Loss atua no LoRA
No treinamento com PEFT QLoRA, os pesos do modelo base 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, etc.) sao atualizadas:
- 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.
- 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.
- Maximizacao do Orcamento de Parametros: A nossa loss impede que esse orcamento reduzido de parametros seja gasto com linguagem natural trivial, canalizando praticamente todo o aprendizado para a precisao numerica e integridade estrutural.
Como Usar para Inferencia
Instalacao das Dependencias
pip install torch transformers peft qwen-vl-utils pillow torchvision bitsandbytes
Exemplo em Python (Suporte a 7B SOTA ou 3B Leve)
import torch
from PIL import Image
from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration, BitsAndBytesConfig
from peft import PeftModel
from qwen_vl_utils import process_vision_info
# Escolha o modelo:
# - Campeão SOTA (7B): "Qwen/Qwen2.5-VL-7B-Instruct" com subfolder="qwen2_5_vl_7b"
# - Ultra-Leve (3B): "Qwen/Qwen2.5-VL-3B-Instruct" com subfolder=None
USE_7B = True
if USE_7B:
base_model_id = "Qwen/Qwen2.5-VL-7B-Instruct"
adapter_id = "lucasoc/sci-image-models"
subfolder = "qwen2_5_vl_7b"
else:
base_model_id = "Qwen/Qwen2.5-VL-3B-Instruct"
adapter_id = "lucasoc/sci-image-models"
subfolder = None
# 1. Carregar processador
processor = AutoProcessor.from_pretrained(
adapter_id,
subfolder=subfolder if subfolder else None
)
# 2. Carregar modelo base em 4-bit NF4
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
base_model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
base_model_id,
quantization_config=bnb_config,
torch_dtype=torch.float16,
device_map="auto"
)
# 3. Carregar o adapter LoRA
if subfolder:
model = PeftModel.from_pretrained(base_model, adapter_id, subfolder=subfolder)
else:
model = PeftModel.from_pretrained(base_model, adapter_id)
model.eval()
# 4. Processar imagem em resolucao original
image_path = "grafico_cientifico.png"
image = Image.open(image_path).convert("RGB")
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": image},
{"type": "text", "text": "Extract all numerical data points from this scientific figure panel into a Markdown table with clear column headers."}
]
}
]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, _ = process_vision_info(messages)
inputs = processor(text=[text], images=image_inputs, padding=True, return_tensors="pt").to("cuda")
with torch.inference_mode():
generated_ids = model.generate(**inputs, max_new_tokens=1024, temperature=0.0)
generated_ids_trimmed = [
out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)[0]
print("--- Tabela Markdown Extraida ---")
print(output_text)
Detalhes de Treinamento
- Modelos:
Qwen2.5-VL-7B-Instruct(Campeão SOTA) eQwen2.5-VL-3B-Instruct(Leve) - Metodo de Adaptacao: 4-bit QLoRA ($r=16, \alpha=32, \text{dropout}=0.05$)
- Resolucao: Original nativa (sem downsampling previo, ate ~1 Megapixel por imagem)
- Otimizador:
paged_adamw_8bitcom Cosine Annealing e taxa de aprendizado $1 \times 10^{-4}$ - Funcao de Perda: ICDAR Metric-Aware Loss com surrogate diferenciavel para metricas de tabela
- Hardware: NVIDIA GeForce RTX 3090 (24 GB VRAM)
- Tempo de Treinamento 7B: 1 hora e 20 minutos (273 passos em 3 epocas)
- Tempo de Treinamento 3B: 1 hora e 38 minutos (273 passos em 3 epocas)
- Codigo Fonte Oficial: sci-image-markdown no GitHub
- Downloads last month
- 25
Model tree for lucasoc/sci-image-models
Base model
Qwen/Qwen2.5-VL-3B-Instruct