Downloads · 30 days
25
100% of all-time downloads
lucasoc/sci-image-models
sci-image-models is a image-to-text model from lucasoc. Use it when you need a caption or text from an image. It is set up for peft. The card lists the license as apache-2.0.
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 reso…
Downloads · 30 days
25
100% of all-time downloads
All-time downloads
25
Public
Repo size
41 MB
Likes
0
Public
Click a slice to open those files.
.safetensors14.8 MB · 56%
From the Hugging Face model README
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.
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).
Diferente de pipelines tradicionais que reduzem ou distorcem as figuras cientificas, este modelo foi treinado preservando a resolucao vetorial nativa integral das imagens.
| Modo / Resolucao | Resolucao Maxima | Grid de Patches de Visao | Tempo de Treino (3 Epocas) | VRAM Media Alocada | VRAM Pico |
|---|---|---|---|---|---|
| Resolucao Reduzida (Baseline) | 280 px (Downsampling PIL) | ~392x392 max | ~28 min (~1.680s) | ~5,2 GB | ~6,1 GB |
| Resolucao Original Nativa (Este Modelo) | Original (Sem downsampling) | Ate 1003520 pixels (~1 MP) | 1h 38m 57s (5.937s) | ~17,2 GB | ~18,5 GB |
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_8bite 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.
Avaliacao no benchmark oficial SciKnowOrg/Sci-ImageMiner (Tarefa 2: Extracao de Tabelas de Dados). Ganhos reportados estritamente em pontos percentuais (pp):
| Metrica | Base Zero-Shot | SFT Padrao | LoRA 280px (Anterior) | Nosso LoRA (Resolucao Original) | Ganho vs Base (pp) | Ganho vs 280px (pp) |
|---|---|---|---|---|---|---|
Tabelas Validas (valid_table) | 88.74% | 99.73% | 99.73% | 99.73% | +10.99 pp | +0.00 pp |
Precisao de Celulas (cell_precision) | 21.08% | 21.37% | 39.58% | 48.32% | +27.24 pp | +8.74 pp |
F1-Score de Celulas (cell_f1) | 18.42% | 20.60% | 34.67% | 42.11% | +23.69 pp | +7.44 pp |
Similaridade Estrutural (TEDS) | 23.16% | 23.16% | 36.24% | 40.68% | +17.52 pp | +4.44 pp |
| ICDAR Numerical RMS | 48.12% | 48.12% | 51.66% | 58.30% | +10.18 pp | +6.64 pp |
| ICDAR Score Composto | 35.64% | 35.64% | 43.95% | 49.49% | +13.85 pp | +5.54 pp |
No treinamento supervisionado tradicional, a funcao de perda trata todos os tokens com exatamente o mesmo peso (1.0).
Para resolver esse problema, desenhamos uma funcao de perda que penaliza os erros de forma seletiva de acordo com a importancia de cada token:
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:
pip install torch transformers peft qwen-vl-utils pillow torchvision bitsandbytes
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
model_id = "Qwen/Qwen2.5-VL-3B-Instruct"
adapter_id = "lucasoc/sci-image-models"
# 1. Carregar processador
processor = AutoProcessor.from_pretrained(adapter_id)
# 2. Carregar modelo base em 4-bit (compativel com GPUs a partir de 6GB para inferencia)
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(
model_id,
quantization_config=bnb_config,
torch_dtype=torch.float16,
device_map="auto"
)
# 3. Carregar o adapter LoRA treinado
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 the plotted quantitative data into a clean Markdown table with 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)
Qwen/Qwen2.5-VL-3B-Instructpaged_adamw_8bit com Cosine Annealing e taxa de aprendizado $1 \times 10^{-4}$