Unlimited-OCR : Analyse de documents longue durée en un seul passage par Baidu

Unlimited-OCR de Baidu permet l'analyse en un seul passage de longs documents et PDF avec une seule passe avant, supportant jusqu'à 32 000 tokens de contexte.

Qu'est-ce qu'Unlimited-OCR ?

Unlimited-OCR est un nouveau modèle OCR open source de Baidu qui vise à repousser les limites de l'analyse de documents — il cible spécifiquement l'analyse longue durée en un seul passage. Contrairement aux systèmes OCR traditionnels qui traitent les pages une par une ou utilisent des fenêtres glissantes, Unlimited-OCR peut prendre un document entier de plusieurs pages (ou une image unique haute résolution) et produire une sortie textuelle structurée en une seule passe avant.

C'est une avancée significative pour la compréhension de documents, en particulier pour les contenus longs comme les articles de recherche, les contrats juridiques ou les rapports multipages.

Pourquoi c'est important

La plupart des pipelines OCR divisent les documents en pages ou régions individuelles, les traitent indépendamment, puis recombinent les résultats. Cette approche présente plusieurs inconvénients :

  • Perte de contexte : Les informations s'étendant sur plusieurs pages sont perdues.
  • Inférence lente : Chaque page nécessite un appel de modèle séparé.
  • Pipeline complexe : Vous avez besoin de logique de détection, d'ordonnancement et de fusion des pages.

Unlimited-OCR résout ces problèmes en acceptant plusieurs images (ou un PDF converti en images) et en générant une sortie cohérente unique. Le modèle supporte une longueur de contexte de 32 768 tokens, ce qui est suffisant pour couvrir des dizaines de pages denses.

Fonctionnalités clés

  • Analyse longue durée en un seul passage : Alimentez plusieurs pages à la fois, obtenez une sortie unique.
  • Deux modes d'inférence : gundam (basé sur le recadrage, taille d'image 640px) pour les images uniques avec des détails fins, et base (taille d'image 1024px) pour l'analyse multipage ou PDF.
  • Support vLLM et SGLang : Déployez avec des moteurs d'inférence de qualité production.
  • Open source : Licence MIT, disponible sur GitHub et Hugging Face.
  • Contexte 32K : Gère les longs documents sans troncature.

Comment utiliser Unlimited-OCR

Démarrage rapide avec Transformers

La façon la plus simple de commencer est avec Hugging Face Transformers. Voici un exemple minimal :

import torch
from transformers import AutoModel, AutoTokenizer

model_name = 'baidu/Unlimited-OCR'

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(
    model_name,
    trust_remote_code=True,
    use_safetensors=True,
    torch_dtype=torch.bfloat16,
)
model = model.eval().cuda()

# Analyse d'image unique (mode gundam pour haute définition)
model.infer(
    tokenizer,
    prompt='<image>analyse de document.',
    image_file='votre_image.jpg',
    output_path='./sortie',
    base_size=1024, image_size=640, crop_mode=True,
    max_length=32768,
    no_repeat_ngram_size=35, ngram_window=128,
    save_results=True,
)

Analyse multipage / PDF

Pour les documents multipages, convertissez chaque page en image et utilisez infer_multi :

import fitz  # PyMuPDF

def pdf_to_images(pdf_path, dpi=300):
    doc = fitz.open(pdf_path)
    mat = fitz.Matrix(dpi / 72, dpi / 72)
    paths = []
    for i, page in enumerate(doc):
        out = f'page_{i+1:04d}.png'
        page.get_pixmap(matrix=mat).save(out)
        paths.append(out)
    doc.close()
    return paths

model.infer_multi(
    tokenizer,
    prompt='<image>Analyse multipage.',
    image_files=pdf_to_images('votre_doc.pdf', dpi=300),
    output_path='./sortie',
    image_size=1024,
    max_length=32768,
    no_repeat_ngram_size=35, ngram_window=1024,
    save_results=True,
)

Déploiement avec vLLM

Pour la production, vLLM est le moteur d'inférence recommandé. Baidu fournit des images Docker pré-construites :

# Par défaut (CUDA 13.0)
docker pull vllm/vllm-openai:unlimited-ocr

# Pour les GPU Hopper (CUDA 12.9)
docker pull vllm/vllm-openai:unlimited-ocr-cu129

Suivez ensuite la recette officielle : https://recipes.vllm.ai/baidu/Unlimited-OCR

Déploiement SGLang

SGLang est également supporté. Configurez l'environnement et démarrez le serveur :

uv venv --python 3.12
source .venv/bin/activate
uv pip install wheel/sglang-0.0.0.dev11416+g92e8bb79e-py3-none-any.whl
uv pip install kernels==0.11.7
uv pip install pymupdf==1.27.2.2

python -m sglang.launch_server \
    --model baidu/Unlimited-OCR \
    --served-model-name Unlimited-OCR \
    --attention-backend fa3 \
    --page-size 1 \
    --mem-fraction-static 0.8 \
    --context-length 32768 \
    --enable-custom-logit-processor \
    --disable-overlap-schedule \
    --skip-server-warmup \
    --host 0.0.0.0 \
    --port 10000

Envoyez ensuite des requêtes via l'API compatible OpenAI :

import requests

response = requests.post(
    "http://127.0.0.1:10000/v1/chat/completions",
    json={
        "model": "Unlimited-OCR",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "analyse de document."},
                    {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
                ]
            }
        ],
        "temperature": 0,
        "images_config": {"image_mode": "gundam"},
        "custom_logit_processor": "DeepseekOCRNoRepeatNGramLogitProcessor",
        "custom_params": {"ngram_size": 35, "window_size": 128},
        "stream": True,
    },
    timeout=1200,
    stream=True,
)

Performances et benchmarks

Bien que le README ne contienne pas de benchmarks détaillés, l'architecture du modèle est conçue pour l'analyse longue durée. La longueur de contexte de 32K et le paramètre no_repeat_ngram_size (réglé à 35) aident à éviter les répétitions dans les sorties longues — un problème courant dans les modèles autorégressifs.

Le mode gundam utilise une approche basée sur le recadrage avec image_size=640, idéale pour les images uniques où les détails fins sont importants (par exemple, une page dense de texte). Le mode base utilise image_size=1024 sans recadrage, mieux adapté aux documents multipages où la mise en page globale est importante.

Comparaison avec DeepSeek-OCR

Unlimited-OCR se positionne explicitement comme poussant "DeepSeek-OCR un peu plus loin". Les principales améliorations semblent être :

  • Contexte plus long : 32K tokens contre les modèles précédents.
  • Support multipage : Gestion native de plusieurs images en un seul passage.
  • Prêt pour la production : Support vLLM et SGLang dès le départ.
  • Open source : Licence MIT, entièrement reproductible.

Cas d'utilisation

  • Analyse d'articles de recherche : Alimentez un PDF entier, obtenez du texte structuré.
  • Analyse de documents juridiques : Contrats, accords et formulaires.
  • Traitement de factures et reçus : Traitement par lots de documents.
  • Numérisation de documents historiques : Documents longs avec mises en page complexes.
  • Pipelines RAG : Utilisez Unlimited-OCR comme analyseur de documents avant l'indexation.

Pour commencer

  1. Clonez le dépôt : git clone https://github.com/baidu/Unlimited-OCR
  2. Installez les dépendances : pip install torch transformers pillow pymupdf
  3. Exécutez l'inférence avec les exemples ci-dessus.
  4. Pour la production, utilisez les images Docker vLLM.

Conclusion

Unlimited-OCR est une solution pratique et open source pour l'analyse de documents longue durée en un seul passage. Son support pour les entrées multipages, le contexte 32K et les moteurs d'inférence de qualité production en fait un choix solide pour les développeurs construisant des pipelines de compréhension de documents. La licence MIT et le soutien actif de la communauté (plus de 13k étoiles sur GitHub) suggèrent qu'il continuera d'évoluer.

Si vous travaillez sur l'OCR, l'analyse de documents ou les pipelines RAG, c'est un projet qui mérite d'être essayé.

Source

baidu/Unlimited-OCR : Unlimited OCR Works : Bienvenue dans l'ère de l'analyse longue durée en un seul passage.