Introduction
Dans les pipelines d’ingestion documentaire et de RAG (Retrieval-Augmented Generation), l’étape d’OCR (Optical Character Recognition) constitue fréquemment un goulot d’étranglement majeur. Deux compromis insatisfaisants s’imposent souvent en production : d’un côté, Tesseract, certes léger et installable partout sur CPU, mais dont la précision s’effondre sur les mises en page complexes et les documents inclinés ; de l’autre, des modèles lourds basés sur PyTorch ou des architectures de vision-langage (VLM) qui imposent des dépendances CUDA volumineuses, plusieurs gigaoctets de VRAM et des coûts d’infrastructure élevés.
Le projet open-source Indra OCR, développé par Datalab et accessible sur https://github.com/datalab-to/indra, apporte une réponse pragmatique à cette problématique. Conçu autour d’un ensemble de modèles ONNX totalisant à peine 7,3 millions de paramètres (dont un modèle principal de reconnaissance latine d’environ 1,25 million de paramètres), Indra s’exécute nativement sur CPU. Il offre un débit impressionnant sans faire l’impasse sur la restitution structurelle (Markdown, boîtes englobantes, ordre de lecture).
Architecture et fonctionnement du pipeline
Indra fait l’économie d’un framework d’entraînement complet à l’inférence. L’outil repose directement sur onnxruntime, éliminant la dépendance à PyTorch en runtime. Le téléchargement initial des modèles depuis Hugging Face pèse environ 76 Mo (environ 30 Mo de réseaux de neurones ONNX et 46 Mo de modèles de langage légers servant à lever les ambiguïtés textuelles sur les lignes difficiles).
Le traitement d’un document suit un pipeline modulaire optimisé pour le multithreading CPU :
Plusieurs points architecturaux méritent une attention particulière :
- Approche hybride sur les PDF numériques : Si un PDF contient déjà une couche texte exploitable, Indra la préserve et n’applique la reconnaissance optique qu’aux éléments purement graphiques ou manquants. Cela réduit drastiquement la charge CPU sur les documents hybrides (contrats signés, factures scannées contenant des en-têtes vectoriels).
- Gestion géométrique tolérante : Le modèle prend en charge nativement les scans tournés à 90°, 180° ou inclinés jusqu’à 45 degrés, évitant ainsi d’intercaler une étape de deskew lourde via OpenCV en prétraitement.
- Analyse de layout granulaire : Contrairement aux OCR ligne à ligne traditionnels, Indra classe chaque région détectée (titres, paragraphes, éléments de liste, cellules de tableau, légendes, en-têtes de page) et reconstruit un ordre de lecture logique, facilitant le découpage ultérieur en chunks pour les bases vectorielles.
Évaluation des performances et benchmarks
Indra a été évalué sur le benchmark OmniParseBench face aux solutions historiques du marché. Le gain de vélocité sur architecture x86/ARM multi-cœur est particulièrement marqué par rapport à PaddleOCR ou Tesseract.
| Métrique / Caractéristique | Tesseract (v5) | PaddleOCR (PP-StructureV3) | Indra OCR (Datalab) |
|---|---|---|---|
| Score global OmniParseBench | 19.3 | 58.4 | 66.7 (71.4 avec --math) |
| Débit (machine 32 vCPU) | ~2,9 pages/s | ~4,4 pages/s | ~44 pages/s |
| Latence moyenne (4 vCPU) | ~1 200 ms / page | ~2 100 ms / page | ~210 ms / page |
| Dépendances d’inférence | Binaire C++ natif | Python + PyTorch/PaddlePaddle | Python + ONNX Runtime |
| Poids total des modèles | ~25 Mo (par langue) | ~300 Mo - 1 Go | ~76 Mo (global) |
| Support de l’écriture manuscrite | Très faible | Modéré | 25.2% (OmniParseBench) |
| Support multilingue | Nécessite des packs séparés | Modèles dédiés par script | 80+ langues unifiées |
Le débit d’environ 44 pages par seconde sur un serveur standard à 32 cœurs permet d’envisager des traitements massifs de backlogs documentaires (plusieurs millions de pages) sur des instances spot ou bare-metal dépourvues de cartes graphiques dédiées.
Mise en œuvre pratique et outillage
L’installation ne nécessite aucun compilateur spécifique ou runtime CUDA. L’environnement Python 3.10+ s’installe directement via le gestionnaire de paquets standard.
# Installation de base pour l'inférence CLI
pip install indra-ocr
# Installation optionnelle avec le support Tesseract (utile pour comparer les sorties)
pip install "indra-ocr[tesseract]"
Traitement individuel et sorties structurées
Pour intégrer l’outil dans un pipeline de scraping ou d’indexation, la sortie standard peut être directement redirigée vers un fichier Markdown, ou sérialisée au format JSON pour conserver les coordonnées spatiales :
# Extraction simple d'un PDF vers la sortie standard au format Markdown
indra-ocr document_technique.pdf > rapport.md
# Extraction avec géométrie complète (bounding boxes, layout blocks, indices de confiance)
indra-ocr plan_scan.png --format json -o layout_data.json
Le JSON résultant expose une structure hiérarchique où chaque bloc textuel est typé (title, paragraph, table, etc.) avec son polygone de délimitation normalisé et le score de confiance associé.
Traitement par lots (Batch) en production
La commande CLI gère nativement le parallélisme multiprocessus sans nécessiter l’écriture d’un script Python externe :
# Traitement récursif de tous les PDF d'un répertoire sur l'ensemble des cœurs disponibles
indra-ocr /data/incoming/*.pdf --out /data/processed/ --format markdown
Inspection visuelle locale
Indra intègre un visualiseur web léger, particulièrement pratique en phase de recette ou d’audit qualité sur des documents difficiles (manuscrit, formulaires bruités) :
# Démarrage du serveur web local sur le port 8765
indra-ocr-viewer
L’interface permet de superposer visuellement les zones identifiées par l’analyseur de layout, de vérifier l’ordre de lecture détecté et de basculer entre la vue brute, le Markdown généré et le JSON des boîtes englobantes.
Considérations de licence et périmètre d’exploitation
L’analyse juridique et opérationnelle d’Indra nécessite de bien distinguer le code source des poids neuronaux :
- Code source : distribué sous licence permissive Apache 2.0. L’intégration dans des chaînes de traitement internes ou des logiciels propriétaires ne pose aucune difficulté de redistribution.
- Poids des modèles : soumis à une licence adaptée OpenRAIL-M. L’usage est libre et gratuit pour la recherche, l’usage personnel, ainsi que pour les entreprises et startups réalisant moins de 20 millions de dollars de chiffre d’affaires ou de levées de fonds. Une restriction explicite interdit toutefois de commercialiser un service d’API concurrent direct de la plateforme managée de Datalab.
Pour les cas extrêmes (dégradations physiques sévères du support papier, formules mathématiques très denses, formulaires manuscrits complexes), Datalab oriente vers son modèle propriétaire Chandra, disponible via leur API managée. Pour la majorité des besoins d’archivage documentaire, d’analyse de factures et d’alimentation de bases RAG, le modèle open-weight d’Indra couvre largement les spécifications requises.
| Commande | Description |
|---|---|
`pip install indra-ocr`
| Installe le moteur Indra et ONNX Runtime sans dépendance GPU. |
`indra-ocr input.pdf`
| Traite un PDF et renvoie le Markdown propre sur la sortie standard. |
`indra-ocr scan.png --format json`
| Extrait le texte avec les boîtes de layout et scores de confiance. |
`indra-ocr *.pdf --out ./dist/`
| Exécute l'OCR en parallèle sur tous les CPU disponibles vers un dossier. |
`indra-ocr document.pdf --math`
| Active l'inférence des modèles spécialisés pour les notations mathématiques. |
`indra-ocr-viewer`
| Lance le serveur web local sur http://localhost:8765 pour inspecter les boîtes. |
En conclusion
Indra comble un vide réel dans l’écosystème open-source : celui d’un OCR moderne, conscient de la structure du document, capable d’extraire directement du Markdown tout en conservant une empreinte mémoire minime et une vitesse d’exécution élevée sur CPU standard. C’est une brique idéale pour fiabiliser et accélérer les pipelines d’ingestion documentaire sans gonfler les coûts d’infrastructure GPU.
Si vous voulez plus d’information sur l’infrastructure vous pouvez voir mon repo à ce sujet : https://github.com/ravindrajob/InfraAtHome
