--- license: apache-2.0 base_model: - lightonai/LightOnOCR-3-4B - Qwen/Qwen2.5-VL-7B-Instruct - Qwen/Qwen3-VL-8B-Instruct - Qwen/Qwen2.5-VL-3B-Instruct library_name: peft pipeline_tag: image-to-text tags: - vision-language - image-to-text - table-extraction - scientific-figures - markdown-table - lightonocr - qwen2.5-vl - qwen3-vl - lora - peft - icdar-metric-loss language: - pt - en metrics: - teds - cell_precision - cell_recall - cell_f1 - valid_table - icdar_rms - icdar_score --- # Sci-Image-Markdown: Extratores Multimodais de Tabelas Científicas (LoRA Adapters) Coleção oficial de LoRA Adapters de alta precisão desenvolvidos para o framework **sci-image-markdown**, especializados na transcrição visual direta de figuras científicas densas (espectroscopia, ALD/ALE, isotermas e cinética química) em tabelas estruturadas em formato **GitHub-Flavored Markdown**. Treinados com a **ICDAR Metric-Aware Loss v3** (Loss balanceada de proximidade numérica suave, penalidade de cardinalidade e ancoragem topológica TEDS). --- ## 🏆 Tabela Oficial do Leaderboard ICDAR 2026 (Task 2: Data Table Extraction) Avaliação rigorosa realizada sobre as **373 figuras científicas reais** do conjunto de teste independente oficial do desafio: | Posição | Modelo / Backbone | Método / Adaptação | Subpasta no Repo | Tabelas Válidas (`valid_table`) | RMS Numérico (`icdar_rms`) | Estrutura TEDS (`teds`) | Score Final ICDAR | Hardware Recomendado | | :---: | :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | 🥇 **1º** | **`LightOnOCR-3-4B`** *(Novo Recorde)* | **LoRA + Loss v3** | `lightonocr_3_4b/` | **98.39%** | **0.6212** | **0.4252** | **0.5232** 🏆 | ~8 GB VRAM | | 🥈 **2º** | **`Qwen2.5-VL-7B`** | **LoRA + Loss v2** | `qwen2_5_vl_7b/` | **99.73%** | **0.6026** | **0.4396** | **0.5211** 🚀 | ~14 GB VRAM | | 🥉 **3º** | **`Qwen2.5-VL-3B`** | **LoRA + Loss v1** | `root /` | **99.73%** | **0.5830** | **0.4068** | **0.4949** | < 8 GB VRAM | | **4º** | **`Qwen3-VL-8B`** | **LoRA + Loss v3** | `qwen3_vl_8b/` | **99.73%** | **0.6076** | **0.3668** | **0.4872** | ~16 GB VRAM | | *Ref* | *1º Colocado Oficial ICDAR 2026 (Peking)* | *Ensemble / Multi-VLM* | - | ~99.0% | 0.5810 | 0.4552 | 0.5181 | Multi-GPU Cluster | | *Ref* | *2º Colocado Oficial ICDAR 2026 (Samsung)* | *Prompting Especializado* | - | ~98.5% | 0.5230 | 0.3972 | 0.4601 | Multi-GPU Cluster | | *Base* | *Qwen2.5-VL-3B (Zero-Shot)* | *Sem Treinamento* | - | 88.74% | 0.4812 | 0.2316 | 0.3564 | < 8 GB VRAM | --- ## 📂 Organização dos Modelos no Repositório ``` lucasoc/sci-image-models/ ├── README.md # Visão geral e leaderboard comparativo ├── adapter_config.json # Adapter Qwen2.5-VL-3B (raiz) ├── adapter_model.safetensors # Pesos LoRA Qwen2.5-VL-3B ├── lightonocr_3_4b/ # 🏆 NOVO RECORDE ABSOLUTO (52.32%) │ ├── adapter_config.json │ ├── adapter_model.safetensors # 88 MB │ ├── test_report.json # Relatório completo de teste │ └── README.md ├── qwen2_5_vl_7b/ # SOTA Qwen2.5-VL-7B (52.11%) │ ├── adapter_config.json │ ├── adapter_model.safetensors # 177 MB │ ├── test_report.json │ └── README.md └── qwen3_vl_8b/ # Qwen3-VL-8B (48.72%) ├── adapter_config.json ├── adapter_model.safetensors # 176 MB ├── test_report.json └── README.md ``` --- ## 🚀 Como Executar Inferência ### 1. LightOnOCR-3-4B (Novo Campeão Absoluto - 52.32%) ```python import torch from PIL import Image from transformers import AutoProcessor, AutoModelForCausalLM from peft import PeftModel # Carregar processador e base model processor = AutoProcessor.from_pretrained("lucasoc/sci-image-models", subfolder="lightonocr_3_4b") base_model = AutoModelForCausalLM.from_pretrained( "lightonai/LightOnOCR-3-4B", torch_dtype=torch.float16, device_map="auto" ) model = PeftModel.from_pretrained(base_model, "lucasoc/sci-image-models", subfolder="lightonocr_3_4b") model.eval() ``` ### 2. Qwen2.5-VL-7B ou Qwen3-VL-8B ```python import torch from PIL import Image from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration from peft import PeftModel from qwen_vl_utils import process_vision_info # Para Qwen2.5-VL-7B use subfolder="qwen2_5_vl_7b" e base "Qwen/Qwen2.5-VL-7B-Instruct" # Para Qwen3-VL-8B use subfolder="qwen3_vl_8b" e base "Qwen/Qwen3-VL-8B-Instruct" subfolder = "qwen2_5_vl_7b" base_model_name = "Qwen/Qwen2.5-VL-7B-Instruct" processor = AutoProcessor.from_pretrained("lucasoc/sci-image-models", subfolder=subfolder) base_model = Qwen2_5_VLForConditionalGeneration.from_pretrained( base_model_name, torch_dtype=torch.float16, device_map="auto" ) model = PeftModel.from_pretrained(base_model, "lucasoc/sci-image-models", subfolder=subfolder) model.eval() # Processamento da figura image = Image.open("exemplo_grafico_cientifico.png").convert("RGB") messages = [ { "role": "user", "content": [ {"type": "image", "image": image}, {"type": "text", "text": "Extract all numerical data points from this scientific figure into a Markdown table."} ] } ] 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, return_tensors="pt").to("cuda") with torch.inference_mode(): outputs = model.generate(**inputs, max_new_tokens=1024) result = processor.batch_decode(outputs, skip_special_tokens=True)[0] print(result) ``` --- ## 🔬 Evolução das Funções de Perda (Loss Formulation) 1. **Loss v1 (Token-Weighted Static CE):** Ponderação de tokens numéricos (4.0x) e estruturais (3.0x). 2. **Loss v2 (Float-Proximity & Cardinality Surrogate Loss):** Penalidade suave por desvio percentual em números decodificados + multiplicador global de cardinalidade. 3. **Loss v3 (TEDS Topology & Directional Control):** Introdução de penalidade de colunas (`col_count_penalty_weight = 2.0`), reforço de cabeçalho (`header_weight = 4.5`) e terminação antecipada direcional sobre `` para evitar sobregeração de linhas vazias. Alcançou o recorde absoluto de **0.5232** com o LightOnOCR-3-4B. --- ## 📜 Citação & Repositório Oficial Repositório completo no GitHub: [lucasdocunha/sci-image-markdown](https://github.com/lucasdocunha/sci-image-markdown)