La technologie pour convertir rapidement des PDF en Markdown avec une grande précision
(github.com/VikParuchuri)- Marker est un outil d’intelligence documentaire qui convertit rapidement et avec précision non seulement les PDF, mais aussi les images, documents PPTX, DOCX, XLSX, HTML et EPUB en Markdown, JSON, chunks et HTML
- Il prend en charge le formatage des tableaux, formulaires, équations, mathématiques inline, liens, références et blocs de code, ainsi que l’extraction et l’enregistrement des images et la suppression d’artefacts comme les en-têtes et pieds de page
- Pour améliorer la précision, il peut utiliser un LLM avec
--use_llm; la valeur par défaut estgemini-2.0-flash, et il est possible de choisir Gemini, Ollama, Claude, OpenAI, Azure OpenAI, etc. - Dans les benchmarks, Marker a enregistré en moyenne 2.83837 secondes par page PDF unique, un score heuristique de 95.6709 et un score LLM de 4.23916 ; en mode batch sur H100, un débit de 25 pages/second est attendu
- Python 3.10+ et PyTorch sont requis ; le code est sous licence GPL, et les poids des modèles sont sous une licence AI Pubs OpenRAIL-M modifiée avec gratuité pour la recherche, l’usage personnel et les startups de moins de $2M
Documents et formats de sortie pris en charge par Marker
- Marker convertit les documents en Markdown, JSON, chunks et HTML
- Les formats d’entrée incluent PDF, images, PPTX, DOCX, XLSX, HTML et EPUB, avec prise en charge des documents dans toutes les langues
- Éléments documentaires pris en charge :
- tableaux, formulaires, équations, mathématiques inline
- liens, références, blocs de code
- extraction et enregistrement des images
- suppression des en-têtes, pieds de page et autres artefacts
- Il peut être étendu avec son propre formatage et sa propre logique
- En fournissant un schéma JSON, il peut effectuer une extraction structurée ; cette fonctionnalité est en bêta
- Il fonctionne sur GPU, CPU et MPS
Plateforme managée Datalab
- La plateforme managée Datalab exécute le dernier modèle open source Chandra
- Chandra est présenté comme plus précis que Marker, avec par défaut aucune conservation des données, ainsi que SOC 2 Type 2 et un BAA personnalisé
- Le service de traitement par lots pour les workloads à grand volume a déjà traité plus de 200M pages par semaine
- À l’inscription, $5 de crédits gratuits sont offerts, ainsi qu’un playground public
- Une licence est nécessaire pour l’auto-hébergement commercial, et les licences on-premise font l’objet d’une demande séparée
Performances et mode hybride avec LLM
- Marker présente des résultats de benchmark favorables face à des services cloud comme Llamaparse et Mathpix ainsi qu’à d’autres outils open source
- Les résultats complets de performance dans le README sont basés sur l’exécution en série de pages PDF uniques
- En mode batch, il est plus rapide, avec un débit attendu de 25 pages/second sur H100
- Pour une précision maximale, un LLM peut être utilisé avec le flag
--use_llm- fusion de tableaux sur plusieurs pages
- traitement des mathématiques inline
- amélioration du formatage des tableaux
- extraction de valeurs depuis des formulaires
- Le mode hybride LLM obtient une meilleure précision sur le benchmark de tableaux que Marker seul ou Gemini Flash seul
Installation et usage de base
- Python 3.10+ et PyTorch sont requis
- Installation centrée sur les PDF :
pip install marker-pdf - Pour traiter d’autres formats que le PDF, il faut installer des dépendances supplémentaires
pip install marker-pdf[full] - Conversion d’un fichier unique :
marker_single /path/to/file.pdf - Conversion de plusieurs fichiers par dossier :
marker /path/to/input/folder - Conversion sur plusieurs GPU :
NUM_DEVICES=4 NUM_WORKERS=15 marker_chunk_convert ../pdf_in ../md_outNUM_DEVICESest le nombre de GPU à utiliser et doit être supérieur ou égal à 2NUM_WORKERSest le nombre de processus parallèles par GPU
Principales options CLI
--page_range TEXT: spécifie les numéros et plages de pages à traiter--output_format [markdown|json|html|chunks]: spécifie le format de sortie--output_dir PATH: spécifie le répertoire d’enregistrement des fichiers de sortie--paginate_output: ajoute les numéros de page et des séparateurs à la sortie--use_llm: améliore la précision avec un LLM--force_ocr: force l’application de l’OCR à l’ensemble du document et formate aussi correctement les mathématiques inline--block_correction_prompt: spécifie un prompt pour corriger la sortie de Marker en mode LLM--strip_existing_ocr: supprime le texte OCR existant et relance l’OCR avec surya--redo_inline_math: améliore la qualité de conversion des mathématiques inline avec--use_llm--disable_image_extraction: n’extrait pas les images depuis le PDF--converter_cls: permet de choisir le convertisseur par défautmarker.converters.pdf.PdfConverterou le convertisseur dédié aux tableauxmarker.converters.table.TableConverter--llm_service: spécifie le service LLM lors de l’utilisation de--use_llm; la valeur par défaut estmarker.services.gemini.GoogleGeminiService--workers: spécifie le nombre de workers de conversion simultanés- chaque worker utilise jusqu’à 5GB de VRAM, avec une moyenne de 3.5GB de VRAM
API Python et manipulation interne des blocs
- Il est possible de convertir directement en Python avec
PdfConverterfrom marker.converters.pdf import PdfConverter from marker.models import create_model_dict from marker.output import text_from_rendered converter = PdfConverter( artifact_dict=create_model_dict(), ) rendered = converter("FILEPATH") text, _, images = text_from_rendered(rendered) - En sortie Markdown,
renderedpossède les attributsmarkdown,metadata,images - En sortie JSON,
renderedpossèdechildren,block_type,metadata ConfigParserpermet de configurer le format de sortie, les processors, les renderers, le service LLM, etc.- Les documents sont structurés en arbre de pages et de blocs, et chaque page peut contenir à son tour des blocs
contained_blockspermet d’extraire programmatiquement uniquement certains blocs, comme les formulaires
Types de convertisseurs
PdfConverter: convertisseur par défaut pour convertir un PDF completTableConverter: extrait et convertit uniquement les tableaux- avec
force_layout_block=Table, il évite la détection de mise en page et suppose que toutes les pages sont des tableaux - avec
output_format=json, il est aussi possible d’obtenir les bounding box des cellules
- avec
OCRConverter: exécute uniquement l’OCR- avec
--keep_chars, il conserve les caractères individuels et leurs bounding box
- avec
ExtractionConverter: convertisseur d’extraction structurée en bêta- il faut d’abord configurer le service LLM
- il renvoie les valeurs extraites en sortie JSON
- en passant
original_markdownd’une exécution précédente commeexisting_markdown, il est possible d’éviter le reparsing du document
Formats de sortie
- Sortie Markdown :
- liens d’images
- tableaux formatés
- équations LaTeX encadrées par
$$ - blocs de code avec triple backticks
- exposants pour les notes de bas de page
- Sortie HTML :
- images avec balises
img - équations avec balises
<math> - code avec balises
pre
- images avec balises
- Sortie JSON :
- les pages sont représentées sous forme de liste, chaque page étant un bloc du schéma interne de Marker
- elle contient les clés
id,block_type,html,polygon,children - les blocs enfants ajoutent
section_hierarchyetimages - la structure des blocs est arborescente
- Sortie Chunks :
- similaire au JSON, mais tout est aplati dans une liste unique
- inclut le HTML complet de chaque bloc, ce qui permet un chunking flexible pour le RAG
- Tous les formats de sortie renvoient
metadatatable_of_contents, une table des matières PDF calculéepage_stats, qui contient la méthode d’extraction de texte et le nombre de blocs par page
Services LLM pris en charge
- Services sélectionnables avec
--use_llm:- Gemini : utilise par défaut l’API Gemini developer et requiert
--gemini_api_key - Google Vertex : requiert
--vertex_project_idet la spécification demarker.services.vertex.GoogleVertexService - Ollama : utilise un modèle local avec
--ollama_base_urlet--ollama_model - Claude : nécessite
--claude_api_keyet--claude_model_name - OpenAI : prend en charge les endpoints compatibles OpenAI avec
--openai_api_key,--openai_model,--openai_base_url - Azure OpenAI : nécessite
--azure_endpoint,--azure_api_key,--deployment_name
- Gemini : utilise par défaut l’API Gemini developer et requiert
Architecture interne et points d’extension
- Marker fonctionne comme un pipeline de modèles de deep learning
- extraction du texte, avec OCR si nécessaire
- détection de la mise en page des pages et de l’ordre de lecture
- nettoyage et formatage de chaque bloc
- amélioration de la qualité via un LLM si nécessaire
- fusion des blocs et post-traitement du texte complet
- Les étapes liées à l’OCR et à la mise en page utilisent surya
- Le formatage des équations s’appuie sur texify
- Composants clés :
Providers: fournissent les informations à partir de fichiers source comme les PDFBuilders: créent les blocs initiaux du document et remplissent le texteProcessors: traitent certains blocs spécifiques, comme le formateur de tableauxRenderers: rendent les blocs dans le format de sortieSchema: classes pour tous les types de blocsConverters: exécutent l’ensemble du pipeline end-to-end
- Pour modifier le comportement du traitement, il faut redéfinir
processors - Pour un nouveau format de sortie, il faut ajouter un nouveau
renderer - Pour un nouveau format d’entrée, il faut ajouter un nouveau
provider
Serveur API et déploiement
- Il est possible de lancer un serveur FastAPI simple
pip install -U uvicorn fastapi python-multipart marker_server --port 8001 - Le serveur est accessible sur
localhost:8001, et les options des endpoints sont visibles surlocalhost:8001/docs - Ce serveur API n’est pas une API robuste et est destiné uniquement à un usage limité
- Pour des options de conversion plus robustes, il est possible d’utiliser l’API Datalab hébergée
- Des exemples de déploiement incluent le déploiement d’un endpoint web via Modal
Résolution des problèmes
- En cas de problème de précision, utiliser un LLM avec
--use_llm- dans ce cas, la clé API Gemini doit être définie via
GOOGLE_API_KEY
- dans ce cas, la clé API Gemini doit être définie via
- Si du texte apparaît corrompu, relancer l’OCR du document avec
force_ocr TORCH_DEVICEpermet de forcer le device torch à utiliser- En cas d’erreur de mémoire insuffisante, il est possible de réduire le nombre de workers ou de découper les longs PDF en plusieurs fichiers
- L’option
debugenregistre des images de pages avec la mise en page et le texte détectés, ainsi que des fichiers JSON contenant les informations de bounding box
Résultats des benchmarks
- Le benchmark de conversion PDF complet utilise un jeu de benchmark créé à partir de pages PDF uniques extraites du common crawl
- Les scores sont calculés à partir d’une heuristique d’alignement avec les segments de texte ground truth, ainsi que d’une méthode LLM-as-judge
- Résultats de conversion PDF complète :
- marker : temps moyen 2.83837, heuristique 95.6709, LLM 4.23916
- llamaparse : temps moyen 23.348, heuristique 84.2442, LLM 3.97619
- mathpix : temps moyen 6.36223, heuristique 86.4281, LLM 4.15626
- docling : temps moyen 3.69949, heuristique 86.7073, LLM 3.70429
- marker et docling ont été exécutés sur H100, tandis que llamaparse et mathpix utilisent des services cloud
- Le benchmark de débit sur de longs PDF utilise Think Python
- marker : 0.18 seconde par page
- 43.42 secondes par document
- 3.17GB de VRAM
- 22 processus individuels peuvent être exécutés sur H100, pour un débit estimé de 122 pages/second
- Le benchmark de conversion de tableaux compare la représentation HTML du split de test FinTabNet
- marker : score moyen 0.816, total 99 tableaux
- marker w/use_llm : score moyen 0.907, total 99 tableaux
- gemini : score moyen 0.829, total 99 tableaux
- En raison des différences entre FinTabNet et la méthode de détection du modèle de layout, les tableaux impossibles à aligner avec la ground truth sont filtrés
Limites et licence
- Le PDF est un format difficile à traiter, et Marker ne fonctionne donc pas toujours parfaitement
- Limites connues :
- les mises en page très complexes avec tableaux imbriqués et formulaires peuvent ne pas fonctionner
- le rendu des formulaires peut être imparfait
- Les flags
--use_llmet--force_ocrpermettent de résoudre la plupart de ces problèmes - Les poids des modèles sont sous licence AI Pubs OpenRAIL-M modifiée
- ils sont gratuits pour la recherche, l’usage personnel et les startups avec financement/chiffre d’affaires inférieur à $2M
- Le code est sous licence GPL
- Une licence commerciale plus large ou la suppression des obligations GPL relèvent de la page de tarification
1 commentaires
Avis sur Hacker News
La façon dont le dépôt compare avec Nougat dans son ensemble est un peu déroutante
Nougat est un modèle entraîné spécifiquement pour les documents académiques, et je ne pense pas qu’il ait jamais été présenté comme le meilleur modèle d’OCR. Même dans le benchmark, il est indiqué que Nougat est plus précis sur les documents arXiv. Par ailleurs, dire que marker convertit moins bien les formules que Nougat tout en comparant la vitesse avec Nougat est aussi un peu regrettable, justement parce que c’est un modèle pour documents académiques
Si vous voulez faire de l’OCR sur des PDF contenant des maths, Nougat vaut vraiment la peine d’être essayé. Il s’installe facilement comme paquet Python et extrait formules, texte, tableaux, etc. dans un fichier
.mmdavec une seule commande. Pour un usage personnel, la vitesse est correcte aussi : sur un portable i5 vieux de 4 ans, il a fallu environ 30 secondes pour convertir un document de 6 pages uniquement avec le CPUC’est simplement une manière de placer le nouvel outil à côté d’un repère familier. Comme vous le dites, Nougat est facile à installer et à lancer, donc il est naturel de s’en servir comme point de comparaison. Ce serait évidemment encore mieux et plus utile si la comparaison incluait davantage de bibliothèques
Je cherche un modèle d’OCR qui m’aiderait à convertir des extraits de livres de RPG en Markdown. Idéalement, les emphases comme le gras ou l’italique seraient conservées
Le mélange de texte, de chiffres et de symboles mathématiques ressemble à celui de documents techniques ou académiques, mais on y trouve souvent des mises en page bizarres, des encadrés de texte dans les marges et beaucoup de tableaux
Plus bas, j’ai aussi comparé avec une extraction de texte simple. Nougat est un excellent modèle et convertit bien beaucoup de PDF, mais je voulais quelque chose de plus rapide et de plus généralisable
Il ne faut pas sous-estimer l’impact de ce type d’outil. Il s’agit de libérer une quantité énorme de connaissances enfermées dans un format « agréable à lire, mais mauvais pour la diffusion »
C’est vraiment prometteur. Ce serait bien de créer un pipeline : tous les PDF → tout convertir en Markdown → tout archiver sur archive.org
Ainsi, à chaque correction de bug et à chaque amélioration, on peut relancer la conversion. En général, pour la conservation d’archives, on préfère stocker les données sous une forme aussi proche que possible des originaux, car toutes les conversions ultérieures ne peuvent qu’entraîner une perte de données
On peut y inclure de manière invisible les données brutes utilisées pour générer le document vu par l’utilisateur final, dans le format que l’on veut. Par exemple, si l’on rend du HTML avec PrinceXML pour produire un PDF, on peut mettre dans le PDF le JSON source utilisé pour générer tout le texte, les graphes, les diagrammes, etc. Bien sûr, la plupart des gens ne le font pas en pratique, mais ce n’est pas la faute de la spécification
https://github.com/VikParuchuri/libgen_to_txt peut aussi être intéressant. Je ne l’ai pas encore intégré à marker, et pour l’instant il utilise une extraction de texte simple
Même s’il ne couvre qu’une partie des besoins ou des cas d’usage, s’il fonctionne correctement, il sera très utile
Rendre des PDF correctement accessibles représente un travail énorme, et même quand c’est fait, il y a de fortes chances que le lecteur PDF utilisé par l’utilisateur ne prenne pas en charge les standards nécessaires
Je vais l’essayer moi-même ce week-end
Je retranscris souvent à la main des scans de PDF de RPG d’origine inconnue, soit sans OCR permettant de sélectionner du texte, soit avec un OCR de mauvaise qualité
Il arrive littéralement que taper directement soit plus rapide que corriger les erreurs de copier-coller ou les erreurs après OCR
Même avec des PDF officiels, la mise en forme est souvent cassée, avec des doubles ou triples espaces, ou des tabulations entre les mots. Si ça marche correctement, cela pourrait vraiment faire gagner beaucoup de temps
Les tableaux et les encadrés de texte étaient très dégradés. En faisant une capture d’écran d’un tableau et en la collant dans ChatGPT pour demander une conversion en tableau Markdown, j’ai obtenu de très bons résultats. Avec un peu de prompt, du type « lis ligne par ligne ; les en-têtes de colonnes sont X, Y, Z ; X est du texte, Y est un nombre, Z est un mot », il arrivait même à traiter des tableaux irréguliers
Aujourd’hui, Tesseract OCR est-il correct ? Quand je l’avais essayé par le passé, il était très loin derrière les OCR en ligne d’AWS, Azure et GCP
https://github.com/tesseract-ocr/tesseract/releases
Au final, cela dépendra sans doute du cas d’usage. Pour ce genre de travail personnel, il a de bonnes chances d’être suffisant, sans nécessiter d’informations utilisateur ni de carte bancaire
En revanche, il est très sensible à la résolution. Quand l’image descend en dessous d’une certaine taille, même si elle reste parfaitement lisible pour un humain, la sortie de Tesseract devient catastrophique
J’ai aussi essayé l’API iOS Vision, mais elle a également échoué. Le cas de test était une photo nette d’une page de livre
Question à l’auteur : pourquoi Markdown ? La partie difficile de cet outil semble être de parser le PDF avec une grande précision, pas vraiment le format dans lequel il l’exporte ensuite.
Ce serait donc bien que l’utilisateur puisse choisir le format de sortie. S’il existe un parseur PDF très précis, j’aimerais l’utiliser pour générer des EPUB
Je gère des ebooks dans une presse universitaire, et nous avons une longue liste d’anciens titres en attente de conversion, dont beaucoup n’existent plus que sous forme de scans de pages d’anciennes éditions imprimées. Pour les proposer en EPUB, il faut savoir où se trouvent les séparations de chapitres, les titres, les tableaux, les graphiques, les formules, les citations, etc. Des prestataires peuvent le faire, mais pour certains livres, le coût de conversion dépasse les recettes de vente. Ce serait utile de pouvoir en faire au moins une partie nous-mêmes
Cela dit, ici, Markdown semble servir de format intermédiaire. Il est proche du texte brut, tout en pouvant préserver des informations de mise en page simples. En pratique, j’imagine qu’on prendrait la sortie Markdown pour la brancher sur un outil qui la convertit vers le format de sortie final souhaité
Les formules peuvent être entourées de
$/$$. Je n’ai pas encore étudié la sortie EPUB, mais ces besoins excluaient le texte brutJ’ai un cas d’usage particulier pour lequel je n’ai pas encore trouvé de bonne solution : lire des documents de construction.
Les plans arrivent toujours en PDF, alors que j’obtenais de bien meilleurs résultats en parsant des fichiers DXF (AutoCAD). Mais même quand je suis l’entrepreneur général sur le chantier, il n’est pas toujours facile d’obtenir les DXF auprès de l’architecte
Je lis surtout les textes longs sur une liseuse ebook.
Les PDF, en particulier avec une mise en page en plusieurs colonnes, sont presque un cauchemar avec les fonctions de base de l’Amazon Kindle ou du Pocketbook. Cet outil semble pouvoir améliorer nettement l’expérience de lecture
Beau travail.
Je me demandais d’où venaient les hallucinations visibles dans la sortie de Nougat. En parcourant la sortie Nougat de l’exemple Think Python, on voit de quoi il s’agit.
En relisant, j’ai vu que cela passe par un LLM, donc les hallucinations étaient prévisibles
Ce niveau est proche de zéro, et selon l’usage, il doit parfois être réellement nul. Si le contenu exact du document n’a pas d’importance, c’est globalement acceptable, mais il me semble rare qu’il existe de grandes quantités de documents qui ne soient importants pour personne, ni aujourd’hui ni à l’avenir, tout en devant être plus accessibles que des PDF
Ça ressemble à un outil qui pourrait m’aider à migrer mes notes depuis OneNote
https://help.obsidian.md/import/onenote
C’est assez intéressant. Ce serait bien d’ajouter au repo quelques exemples avant/après conversion.
Je me demande pour quels types de PDF vous l’optimisez. Comment les annotations manuscrites sont-elles traitées ?