5 Punkte von GN⁺ 2024-01-04 | 1 Kommentare | Auf WhatsApp teilen
  • Mit der Shortcuts-App unter macOS lässt sich ohne zusätzlichen kostenpflichtigen Dienst ein lokaler OCR-Kurzbefehl erstellen, mit dem sich die Texterkennung aus Bildern im Terminal/per CLI/per Python ausführen lässt
  • Der Kernaufbau ist ein Ablauf, bei dem Shortcut Input mit der Aktion Extract Text from Image verbunden wird und das Ergebnis in die Zwischenablage kopiert wird
  • Als Name für den Kurzbefehl eignet sich ein kleingeschriebener Name ohne Leerzeichen wie ocr-text oder extract-text, da er sich so leichter über die CLI aufrufen lässt; nach der Eingabe des Namens muss zum Speichern Enter gedrückt werden
  • Im Terminal wird er mit shortcuts run ocr-text -i ausgeführt, und das extrahierte Ergebnis wird in die Zwischenablage kopiert und kann mit Command-V überprüft werden
  • In Python kann derselbe shortcuts run-Befehl über subprocess.check_output() aufgerufen werden, um den OCR-Kurzbefehl wiederzuverwenden

OCR-Kurzbefehl in Shortcuts erstellen

  • Die Shortcuts-App in macOS öffnen und über die +-Schaltfläche einen neuen Kurzbefehl erstellen
  • In der rechten Seitenleiste nach extract text suchen und die Aktion Extract Text from Image in den linken Arbeitsbereich ziehen
  • In der Aktion Extract text from ... auf die blaue Eingabe Image klicken und Shortcut Input auswählen
    • Oben erscheint die Aktion Receive; diese kann unverändert bleiben
  • In der rechten Seitenleiste nach copy suchen und die Aktion Copy to Clipboard unter Extract Text from Image platzieren
    • In der letzten Aktion muss überprüft werden, dass hinter Copy Text from Image steht
    • Das Herunterziehen der Aktion Copy to Clipboard kann etwas umständlich sein
  • Für den Kurzbefehl ist ein einfacher, kleingeschriebener Name ohne Leerzeichen wie extract-text oder ocr-text geeignet
    • Nach der Eingabe des Namens muss Enter gedrückt werden, damit er gespeichert wird

In CLI und Python ausführen

  • Der Befehl zum Ausführen des Kurzbefehls im Terminal lautet wie folgt
shortcuts run ocr-text -i
  • Wenn nach der Ausführung beim Einfügen mit Command-V der extrahierte Text sichtbar ist, ist die Einrichtung korrekt
  • In Python kann derselbe Befehl mit subprocess.check_output() ausgeführt werden
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)
  • Das Teilen von Shortcuts kann sich mitunter merkwürdig verhalten, daher kann eine manuelle Einrichtung nötig sein; der Großteil des Vorgangs muss jedoch nur einmal durchgeführt werden

1 Kommentare

 
GN⁺ 2024-01-04
Meinungen auf Hacker News
  • Guter Beitrag vom OP. Apples Vision-Framework war ziemlich beeindruckend, und ich habe es für ein persönliches Projekt verwendet, bei dem ich Zehntausende Screenshots von Tabellen per OCR eingelesen und in eine PostgreSQL-Datenbank geschrieben habe.
    Da macOS und Nvidia immer noch nicht besonders gut zusammenpassen, habe ich auch CPU-basiertes OCR wie Tesseract ausprobiert, aber die Ergebnisse waren viel zu oft falsch. Das Vision-Framework lieferte die beste Ausgabequalität, die ich gesehen habe, und benötigte zugleich am wenigsten Rechenaufwand.
    Es war zwar ziemlich instabil, aber das könnte auch an Fehlern in meiner Implementierung gelegen haben. Für die eigentliche Implementierung habe ich RHetTbulls vision.py https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5... verwendet, für Experimente zusätzlich ocrmac https://github.com/straussmaximilian/ocrmac, und selbst auf einem i7-6700k-Hackintosh war die Performance überraschend gut.
    Ich würde mich selbst nicht Programmierer nennen, aber mit genug Zeit konnte ich die Probleme meist lösen — es hat nur ziemlich lange gedauert.

    • Wenn es besser ist als Tesseract, ist das wirklich beeindruckend. Ich frage mich, ob man mehrere macOS-Maschinen betreiben, daraus einen API-Service machen und damit Geld verdienen könnte — und ob das rechtlich möglich wäre.
    • Tesseract allein gilt inzwischen recht verbreitet als nur mittelmäßig.
      Schon bei RAG-Frameworks sieht man häufig mehrere Implementierungen im Einsatz oder unterstützt; Tesseract wird fast immer unterstützt, ist aber normalerweise nicht die ideale Wahl. Projekte wie Unstructured https://github.com/Unstructured-IO/unstructured-inference oder DocTR https://github.com/mindee/doctr werden eher bevorzugt.
      Sie nutzen meist moderne Vision-Modelle https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo... und übertreffen Tesseract deutlich.
      Ich habe sie nicht direkt mit dem Apple Vision Framework verglichen, aber sie sind definitiv besser als Tesseract und könnten potenziell auch besser als Apple Vision sein. Es gibt auch Ansätze, mehrere Methoden zu kombinieren, aber das wird ziemlich komplex.
    • Ich frage mich, ob es ein Tutorial gibt, wie man mit dem Apple Vision Framework Tabellenstrukturen aus PDFs oder Bildern extrahiert. Ich habe die beiden im Artikel genannten Links ausprobiert, aber sie haben nur den Text extrahiert, ohne die Tabellenstruktur zu erhalten.
      AWS Textract stellt Python-Beispielcode bereit, der Tabellen als CSV extrahiert, und das funktioniert gut.
  • Als ich unter Windows etwas Ähnliches ausprobieren wollte, stellte ich fest, dass in PowerToys, einem Microsoft-Projekt, das ich bereits installiert hatte, ein ziemlich gutes OCR-Tool enthalten ist.
    Drückt man Win+Shift+T und wählt den zu scannenden Bereich aus, wird der Text in die Zwischenablage kopiert.
    https://learn.microsoft.com/en-us/windows/powertoys/
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

    • Ich nutze AutoHotkey zusammen mit PowerToys, um Screenshot-Daten an eine CSV anzuhängen, und mit eigenen Key-Mappings funktioniert das gut.
  • Ich habe ein Open-Source-Tool gebaut, das sowohl eine CLI als auch eine brauchbare UI bietet, und es ist kostenlos.
    https://trex.ameba.co

    • Ich nutze Trex täglich. Es ist beeindruckend, wie gut es Handschrift und chaotische Bildschirmaufnahmen verarbeitet.
  • Ich habe festgestellt, dass viele Mac-Apps, darunter Safari, Preview und Notes, bei Bildern automatisch OCR ausführen. Man kann Text in Bildern einfach auswählen und anderswohin kopieren und einfügen; das ist ziemlich gut.

    • Die Qualität ist fast absurd gut. Selbst während ein YouTube-Video läuft, kann man Text im Video auswählen, und bei Bedarf kann man es auch pausieren.
      Bei URLs, Domain-Text oder QR-Codes kann man sogar in einem Posterfoto oder Video lange drücken oder lange klicken und den Link direkt aus dem Bild öffnen.
    • In der Photos-App ist es genauso. Das ist wirklich nützlich, etwa auf Konferenzen oder wenn man lange Zeichenketten digitalisieren muss, zum Beispiel ein Standard-Router-Passwort.
      Man kann es im Foto auswählen und kopieren und dann über Handoff auf dem Telefon oder Mac einfügen.
  • Ich mag ein kleines OCR-Tool sehr, das ich per brew auf dem MacBook installiert habe: https://github.com/schappim/macOCR

    • Geht mir genauso. Für meine Zwecke reicht es, dieses Utility in einen macOS Shortcut zu verpacken, sodass ich es über die Menüleiste anklicken oder mit Quicksilver starten kann.
  • Unter Windows empfehle ich den Text Extractor aus PowerToys.
    https://learn.microsoft.com/en-us/windows/powertoys/text-ext...

  • Wenn ich meine Lösung noch ergänzen darf, dann diese hier: https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
    PyXA verwendet das Vision-Framework, um Text aus einem oder mehreren Bildern zu extrahieren. Es ist nur ein kleiner Teil des Pakets und für einmalige Aufgaben vielleicht überdimensioniert, aber es ist eine Option.

    • Zur Einordnung: Es nutzt die ältere und weniger genaue API VNRecognizeTextRequest.
      ImageAnalyzer ist neuer und deutlich besser. Es sieht sehr danach aus, dass auch der Shortcut des OP intern die alte API verwendet.
  • Seit macOS Ventura ist tatsächlich eine native OCR-Funktion in die Image-Capture-Oberfläche integriert.
    Wenn man mit einem AirPrint-kompatiblen Scanner ein PDF scannt, erscheint im rechten Panel eine Checkbox „OCR“.

  • Um den Inhalt in eine Datei zu schreiben, kann man das so machen. Ich will nicht behaupten, dass es die effizienteste Methode ist, aber sie funktioniert.
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste > ${OCRTHISFILE}.txt
    Oder, wenn man die Ausgabe sehen und gleichzeitig in eine Datei schreiben möchte:
    OCRTHISFILE="ocr-test.jpg"
    shortcuts run ocr-text -i "${OCRTHISFILE}"
    pbpaste | tee ${OCRTHISFILE}.txt

    • Man kann macOS Shortcuts auch so einstellen, dass der OCR-Text in eine Datei ausgegeben wird. Dafür verwendet man die Aktion Append to Text File.
  • Ich frage mich, ob es für Apples Vision-Funktion Copy Subject eine ähnliche Technik gibt. Ich verlasse mich inzwischen ziemlich darauf, aber der Zugriff darauf fühlt sich sehr eingeschränkt an.

    • Das musste ich nachschlagen; ich vermute, gemeint ist die Funktion in Photos auf Mobilgeräten, mit der man Motive aus Fotos „extrahiert“ und als Sticker erstellt. Apple scheint das „lifting subjects“ zu nennen: https://support.apple.com/guide/iphone/lift-a-subject-from-t... https://developer.apple.com/videos/play/wwdc2023/10176/
      Man könnte versuchen, die Aktion „Extract text“ durch „Remove background“ zu ersetzen. Beim Ausführen des Shortcuts kann man mit „-o“ den Dateinamen für das Ausgabebild angeben.
      shortcuts run remove-background -i ~/Downloads/portrait-beard.avif -o beard.jpg