- Un outil web qui réduit le travail consistant à transcrire des images de documents en texte puis à les remettre en forme, en le remplaçant par une conversion en Markdown structuré
- L’entrée web repose actuellement surtout sur le téléversement d’images, avec une prise en charge des PDF annoncée comme bientôt disponible
- Le service fonctionne sur la base du package npm llama-ocr et de Together AI
- En JavaScript, il est possible d’obtenir un résultat Markdown en passant
filePath et TOGETHER_API_KEY à la fonction ocr
- Comme il prend en charge à la fois le téléversement web et les appels depuis le code, il permet d’essayer la conversion d’images de documents selon un flux manuel ou un workflow de développement
Convertir des documents image en Markdown
- LlamaOCR.com est un outil qui transforme les documents téléversés en Markdown
- La page web indique “Upload an image to turn it into structured markdown” et génère du Markdown structuré à partir d’un téléversement d’image
- La prise en charge des PDF est indiquée comme “soon”, le périmètre actuel étant donc centré sur les images
Utilisation depuis le code
- Le package npm llama-ocr permet d’exécuter l’OCR depuis du code JavaScript
import { ocr } from 'llama-ocr';
const markdown = await ocr({
filePath: './trader-receipt.jpg',
apiKey: process.env.TOGETHER_API_KEY
});
- L’exemple place le chemin du fichier image dans
filePath et transmet la variable d’environnement TOGETHER_API_KEY dans apiKey
- Le service repose sur llama-ocr et Together AI
1 commentaires
Avis de Hacker News
Je suis la personne qui a créé llama-ocr. Merci pour le partage et pour les bons retours. J’avais besoin d’une API OCR simple, donc je l’ai créée au début de la semaine ; elle analyse les images en Markdown structuré avec Llama 3.2 Vision, hébergé chez Together.ai.
C’est aussi disponible sous forme de package npm. Je prévois d’ajouter des fonctionnalités comme l’analyse de PDF et les réponses JSON ; si vous avez des questions, j’essaierai d’y répondre.
Je me demande si ce genre de transformation importante est un comportement attendu ou souhaitable. La sortie est parfois une liste à puces, parfois un tableau, ce qui rend le traitement automatisé en aval un peu plus difficile.
Je me demande si ce cas d’usage a aussi été envisagé.
J’aimerais savoir quels types d’erreurs il commet par rapport aux systèmes OCR existants.
Ce n’est rien de plus que l’envoi d’une image à Llama 3.2 Vision pour lui demander de lire le texte.
Comme toute sortie de LLM, c’est vulnérable aux hallucinations. Il ne lit pas la forme des caractères dans les pixels ; il décrit l’image en s’appuyant sur les images et légendes apprises, puis en déduit le texte. Surtout quand c’est difficile à lire, il peut inventer des mots de toutes pièces.
Ça a l’air chouette. Je fais beaucoup d’OCR ces derniers temps, donc je suis content de voir arriver un nouvel outil dans ce domaine. Le champion actuel du PDF→Markdown est probablement Nougat de Facebook[1], et j’aimerais le connecter à DSPy pour comparer lequel s’en sort le mieux sur des livres de philosophie.
Le projet Zerox[2] de la startup liée par ce dépôt a aussi l’air intéressant, et sa communication est au moins nettement plus soignée que celle de Nougat. Si un vrai spécialiste passe par là, je serais preneur de corrections ou de conseils.
J’ai deux questions. 1) Qu’est-ce que Together.ai, et ce modèle est-il open source ? Le site web ressemble à un service d’hébergement, et la page « Custom Models »[3] semble plutôt parler de fine-tuning personnalisé que d’entraînement de modèles propriétaires maison. Ils semblent avoir un profil HuggingFace, mais il n’est pas évident que ce soit vraiment le leur : https://huggingface.co/TogetherAI
2) GitHub indique « hosted demo », mais la partie hébergée semble n’être qu’une petite WebGUI propre. Je me demande si cela signifie que cette fonctionnalité n’est disponible, aujourd’hui comme à l’avenir, que via des appels API.
P.-S. : sur navigateur desktop, les liens de l’en-tête sont cassés et le onClick ne se déclenche pas.
[1] https://facebookresearch.github.io/nougat/
[2] https://github.com/getomni-ai/zerox
[3] https://www.together.ai/products#custom-models
J’ai remarqué quelque chose d’étrange. J’ai téléversé un webcomic en exemple : tous les dialogues étaient en majuscules, mais la sortie mélangeait de façon incohérente, selon les cases, une casse de phrase et une casse de titre.
J’ai aussi testé le vrai problème pour lequel je voudrais utiliser l’OCR. J’ai de vieilles diapositives à numériser, la plupart avec des étiquettes ; quand j’en ai téléversé une, il l’a décrite comme ressemblant à une photo de diapositive ou de cadre de film, vieillie et jaunie, avec une découpe rectangulaire sombre au centre, avec le texte « Once Upon a Time » et le nombre « 1069 ».
La description inutilement répétitive de la diapositive est déjà un problème, mais le vrai texte n’était pas en cursive et disait « Once Uniquitous. », et le nombre était 106g. C’était très clairement un « g », pas un « 9 ».
Ce qui est intéressant, c’est que cela pourrait être un exemple de biais du modèle. Il a tellement interprété la diapositive comme un objet ancien qu’il a halluciné un titre complètement cliché ; quant au rectangle noir, il venait d’un éclairage par l’avant qui empêchait de voir la partie transparente, ce qu’il n’a pas compris.
En plus, l’API elle-même semble avoir des limites non documentées de taille de fichier ou de résolution.
J’ai récemment utilisé llama3.2-vision pour traiter des feuilles d’enchères papier destinées à une vente caritative, et il s’en est sorti assez précisément même avec une écriture manuscrite franchement médiocre. J’aimerais l’utiliser aussi pour l’événement de l’an prochain.
En revanche, le fait qu’il soit difficile de lui faire produire du CSV de façon cohérente est assez agaçant. ChatGPT et Gemini semblent meilleurs sur ce point, mais je n’ai pas poussé jusqu’à l’automatisation.
L’échelle est d’environ 100 pages de feuilles d’enchères, donc un certain nettoyage manuel reste acceptable. C’est clairement mieux que de brûler du temps de bénévoles.
https://github.com/philips/paper-bidsheets
Ce n’est pas gratuit, mais sa précision sur les documents manuscrits est de tout premier plan. Je suis le fondateur, donc je suis biaisé, mais le niveau de précision actuel est vraiment enthousiasmant. Pour un projet de 100 pages, cela ne coûterait que 12 dollars et permettrait de gagner du temps.
J’ai beaucoup fait d’OCR récemment, principalement pour numériser le texte présent sur des photos de famille. Les modèles OCR classiques sont médiocres, et les LLM s’en sortent bien mieux. Parmi les modèles testés, Gemini Flash était de très loin le meilleur, mais il y avait quand même assez d’échecs et d’hallucinations pour que la saisie manuelle soit plus rapide.
C’est frustrant, parce qu’on a l’impression que ça y est presque, mais non. Cet outil a l’air pire. Parfois il ne répond qu’avec le texte, parfois il donne une description complète du genre « The image is a scanned document with handwritten text... ». J’espérais qu’il y aurait quelque chose comme un fine-tuning capable de battre Gemini Flash, ce qui m’aurait fait gagner beaucoup de temps, donc c’est dommage
convert -density 76 input.pdf output-%d.pnghttps://github.com/philips/paper-bidsheets
Flash est intéressant, et je me demande aussi quels LLM tu as testés
Recadrer l’image pour ne garder que les zones de texte, retirer les bordures puis augmenter le contraste a énormément aidé. C’est un article que j’ai écrit en 2015, mais il s’applique encore très bien à GPT : https://www.danvk.org/2015/01/07/finding-blocks-of-text-in-a...
Avec GPT, il valait mieux lui donner au plus quelques paragraphes à la fois plutôt qu’une page entière. Plus le texte est court, plus le risque d’hallucination diminue
L’OCR dont on a beaucoup parlé récemment était médiocre, et j’espérais que celui-ci serait meilleur. ChatGPT 4o marche bien quand je colle des images individuelles dans le chat, mais je n’ai pas encore essayé l’API. Je ne sais pas combien coûterait le traitement de 6 500 photos, et beaucoup d’entre elles sont probablement vides, sans moyen simple de les filtrer
Pour renvoyer la position du texte, ce n’est pas encore très bon, mais dans mes tests les performances OCR étaient impressionnantes
Je me demande si ça devrait vraiment être un post « Show HN ». Ça ressemble juste à un frontend, et je ne vois pas non plus de lien direct avec Llama dans le nom. together.ai a peut-être fourni de l’espace cloud
J’ai essayé avec une phrase créée en plaçant 500 cercles au moyen d’un algorithme génétique, puis dessinée avec de vrais cercles physiques.
https://www.instagram.com/marekgibney/p/BiFNyYBhvGr/
Fait intéressant, il reconnaît bien les cercles, mais ne voit pas la phrase. Il a répondu quelque chose du genre : « l’image ne contient pas de texte ni d’éléments pouvant être représentés en Markdown, seulement une composition visuelle de cercles, sans information à traduire en Markdown »
Comme la réponse n’est pas déterministe, j’ai aussi essayé plusieurs fois l’image originale, mais ça n’a jamais réussi. En revanche, tous les effets de filtre passe-bas que j’ai appliqués ont fonctionné avec un fort taux de réussite.
https://imgur.com/q7Zd7fa
C’est plus facile à lire de loin
La façon dont l’algorithme génétique est utilisé est plutôt cool. J’aimerais voir le code, ou au moins la fonction de récompense
C’était amusant. J’ai donné trois captures d’écran d’un long document, et il s’en est relativement bien sorti, mais en relisant, j’ai vu que l’IA avait inventé des paragraphes qui n’existaient pas dans l’original.
À cause du format des captures d’écran, certaines phrases ou certains paragraphes étaient probablement coupés au milieu, ce qui a dû déclencher la tendance du LLM à remplir les blancs. Il n’a pas pu laisser un paragraphe inachevé tel quel, et a même ajouté un court paragraphe de conclusion qui n’existait absolument pas dans le document original
J’ai essayé avec un vieux scan du schéma de la carte mère Asus P3B-F de 1997.
Il n’a extrait qu’une partie du texte du cartouche, par exemple le nom du projet et la date, et malgré une police bien nette, il a confondu tous les 8/B et 1/I.
Les informations réellement utiles ont été transformées en quelque chose comme « Tables / Table 1: [Insert table 1 here] / Other Elements / [Insert other elements here] »