5 points par GN⁺ 2024-01-04 | 1 commentaires | Partager sur WhatsApp
  • Avec l’app Shortcuts de macOS, il est possible de créer un raccourci d’OCR local sans service payant supplémentaire, puis d’extraire le texte d’images depuis le terminal, en CLI ou avec Python
  • La configuration clé consiste à relier Shortcut Input à l’action Extract Text from Image, puis à copier le résultat dans le presse-papiers
  • Il est préférable de donner au raccourci un nom simple, en minuscules et sans espaces, comme ocr-text ou extract-text, afin de l’appeler facilement en CLI ; il faut appuyer sur Entrée après avoir saisi le nom pour l’enregistrer
  • Dans le terminal, on l’exécute avec shortcuts run ocr-text -i , puis le résultat extrait est copié dans le presse-papiers et peut être vérifié avec Command-V
  • En Python, on peut réutiliser le même raccourci d’OCR en appelant la commande shortcuts run via subprocess.check_output()

Créer un raccourci OCR dans Shortcuts

  • Ouvrir l’app Shortcuts sur macOS et créer un nouveau raccourci avec le bouton +
  • Dans la barre latérale droite, rechercher extract text, puis faire glisser l’action Extract Text from Image dans la zone de travail à gauche
  • Cliquer sur l’entrée Image en bleu dans l’action Extract text from ..., puis sélectionner Shortcut Input
    • L’action Receive apparaît en haut ; il suffit de la laisser telle quelle
  • Dans la barre latérale droite, rechercher copy, puis placer l’action Copy to Clipboard sous Extract Text from Image
    • Dans la dernière action, il faut vérifier que l’élément après Copy est bien Text from Image
    • Faire glisser l’action Copy to Clipboard vers le bas peut être un peu peu pratique
  • Un nom simple, en minuscules et sans espaces, comme extract-text ou ocr-text, convient bien pour le raccourci
    • Après avoir saisi le nom, il faut appuyer sur Entrée pour l’enregistrer

Exécution en CLI et avec Python

  • La commande pour exécuter le raccourci dans le terminal est la suivante
shortcuts run ocr-text -i
  • Si, après l’exécution, le texte extrait apparaît lorsque vous collez avec Command-V, c’est que la configuration est correcte
  • En Python, il est possible d’exécuter la même commande avec subprocess.check_output()
import subprocess
file_path = '... some file path ...'
ocr_out = subprocess.check_output(
    f'shortcuts run ocr-text -i "{file_path}"', shell=True
)
print(ocr_out)
  • Le partage de Shortcuts peut parfois se comporter de façon étrange et nécessiter une configuration manuelle, mais dans la plupart des cas cela ne doit être fait qu’une seule fois

1 commentaires

 
GN⁺ 2024-01-04
Avis de Hacker News
  • Bon billet de l’OP. Le framework Vision d’Apple est assez impressionnant, et je l’ai utilisé pour un projet personnel consistant à lire par OCR des dizaines de milliers de captures d’écran de tableurs et à les insérer dans une base de données PostgreSQL
    Comme macOS et Nvidia ne font toujours pas bon ménage, j’ai aussi essayé des solutions d’OCR basées CPU comme Tesseract, mais les résultats étaient beaucoup trop souvent incorrects. Le framework Vision a donné la meilleure qualité de sortie que j’aie vue, tout en utilisant le moins de calcul
    C’était tout de même assez instable, même si c’était peut-être dû à une erreur dans mon implémentation. Pour l’implémentation réelle, j’ai utilisé vision.py de RHetTbull https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5..., et pour les expérimentations ocrmac https://github.com/straussmaximilian/ocrmac ; les performances étaient étonnamment bonnes même sur un Hackintosh i7 6700k
    Je ne me qualifierais pas de programmeur, mais avec assez de temps j’ai généralement réussi à résoudre les problèmes, au prix de pas mal d’heures

    • Si c’est meilleur que Tesseract, c’est vraiment impressionnant. Je me demande s’il serait possible de faire tourner plusieurs machines macOS pour en faire un service API et gagner de l’argent avec, et si ce serait légal
    • Tesseract seul est désormais assez largement reconnu comme plutôt moyen
      Rien que dans les frameworks RAG, beaucoup utilisent ou prennent en charge plusieurs implémentations ; Tesseract est presque toujours pris en charge, mais ce n’est généralement pas le choix idéal. Des projets comme Unstructured https://github.com/Unstructured-IO/unstructured-inference ou DocTR https://github.com/mindee/doctr sont davantage privilégiés
      Ils s’appuient en général sur des modèles de vision de pointe https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo..., ce qui surclasse Tesseract
      Je ne les ai pas comparés directement au framework Apple Vision, mais ils sont clairement meilleurs que Tesseract et pourraient potentiellement être meilleurs qu’Apple Vision. Il existe aussi des approches combinant plusieurs méthodes, mais cela devient assez complexe
    • Je me demande s’il existe un tutoriel pour extraire la structure des tableaux depuis des PDF ou des images avec Apple Vision Framework. J’ai essayé les deux liens mentionnés dans l’article, mais ils n’extrayaient que le texte sans préserver la structure des tableaux
      AWS Textract fournit un exemple de code Python pour extraire des tableaux en CSV, et cela fonctionne bien
  • En essayant de faire quelque chose de similaire sous Windows, j’ai découvert que PowerToys, un projet Microsoft que j’avais déjà installé, incluait un assez bon outil d’OCR
    Appuyez sur Win+Shift+T, sélectionnez la zone à scanner, et le texte est copié dans le presse-papiers
    https://learn.microsoft.com/en-us/windows/powertoys/
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

    • J’utilise AutoHotkey avec PowerToys pour ajouter des données de captures d’écran à un CSV, et cela fonctionne bien avec mes propres raccourcis clavier
  • J’ai créé un outil open source qui propose à la fois une CLI et une interface correcte, et il est gratuit
    https://trex.ameba.co

    • J’utilise Trex tous les jours. Je suis impressionné par sa capacité à gérer l’écriture manuscrite et les captures d’écran de mauvaise qualité
  • J’ai découvert que de nombreuses apps Mac, dont Safari, Preview et Notes, effectuent automatiquement de l’OCR sur les images. On peut facilement sélectionner le texte dans les images et le copier-coller ailleurs, c’est plutôt pratique

    • La qualité est presque absurdement bonne. On peut même sélectionner du texte dans une vidéo YouTube en cours de lecture, ou la mettre en pause si nécessaire
      S’il s’agit d’une URL, d’un nom de domaine ou d’un QR code, on peut aussi appuyer longtemps ou cliquer longuement, même sur une photo d’affiche ou dans une vidéo, pour ouvrir directement le lien depuis l’image
    • L’app Photos fait pareil. C’est vraiment pratique en conférence, ou quand il faut numériser une longue chaîne, par exemple le mot de passe par défaut d’un routeur
      On peut le sélectionner et le copier depuis la photo, puis le coller sur son téléphone ou son Mac via Handoff
  • J’aime beaucoup un petit outil d’OCR que j’installe avec brew sur mon MacBook : https://github.com/schappim/macOCR

    • Pareil. Pour mon usage, il me suffit d’envelopper cet utilitaire dans un macOS Shortcut afin de pouvoir le lancer depuis la barre de menus ou avec Quicksilver
  • Sous Windows, je recommande Text Extractor de PowerToys
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

  • J’ajoute aussi ma solution : https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
    PyXA utilise le framework Vision pour extraire du texte depuis une ou plusieurs images. Ce n’est qu’une petite partie du package, donc ça peut être excessif pour une tâche ponctuelle, mais c’est une option.

    • À noter qu’il utilise VNRecognizeTextRequest, une API plus ancienne et moins précise.
      ImageAnalyzer est plus récent et bien meilleur. Le shortcut de l’OP utilise très probablement aussi l’ancienne API en interne.
  • Depuis macOS Ventura, une fonction OCR est effectivement intégrée par défaut dans l’interface d’Image Capture.
    Quand on scanne un PDF avec un scanner compatible AirPrint, une case « OCR » apparaît dans le panneau de droite.

  • Pour mettre le contenu dans un fichier, on peut faire comme ceci. Je ne dis pas que c’est le plus efficace, mais ça fonctionne.
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste > ${OCRTHISFILE}.txt
    Ou, pour voir la sortie tout en l’écrivant aussi dans un fichier :
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste | tee ${OCRTHISFILE}.txt

    • On peut aussi faire en sorte que Shortcuts sur macOS écrive le texte OCR dans un fichier. Pour l’action, il faut utiliser Append to Text File.
  • Je me demande s’il existe une technique similaire pour la fonction Copy Subject d’Apple Vision. Je suis devenu assez dépendant de cette fonction, mais son mode d’accès me paraît trop limité.

    • J’ai dû chercher de quoi il s’agissait : j’imagine que c’est la fonction de Photos sur mobile qui permet d’« extraire » des éléments d’une photo pour en faire des stickers. Apple semble appeler cela « lifting subjects » https://support.apple.com/guide/iphone/lift-a-subject-from-t... https://developer.apple.com/videos/play/wwdc2023/10176/
      Il devrait suffire de remplacer l’action « Extract text » par « Remove background ». Quand on exécute le shortcut, il faut indiquer avec « -o » le nom du fichier image de sortie.
      shortcuts run remove-background -i ~/Downloads/portrait-beard.avif -o beard.jpg