Text aus Dokumenten mit Kuenstlicher Intelligenz extrahieren

In diesem Tutorial lernen wir, wie man Dokumente scannt und den enthaltenen Text mithilfe von Dokumentensegmentierung und optischer Zeichenerkennung extrahiert.

Eine voll funktionsfaehige iOS-Anwendung, bereitgestellt als Quellcode, wird uns helfen zu verstehen, welche Apple-Frameworks und -Klassen erforderlich sind, um diese Aufgabe zu erfuellen.

Einfuehrung

Telefone sind nicht mehr nur Telefone; unter anderem sind sie zu unseren Bueros geworden. Nicht viele meiner Generation (ich bin etwas aelter…) haetten gedacht, dass heutige Smartphones so viele andere Geraete ersetzen koennten.

Eines dieser Geraete ist der Dokumentenscanner.

Im Jahr 2017 fuehrte Apple einen Dokumentenscanner in Notizen, Mail, Dateien und Nachrichten ein. Er liefert bereinigte Dokument-”Scans”, die perspektivkorrigiert und gleichmaessig beleuchtet sind.

Seit der WWDC 2019 koennen wir als Entwickler diese Funktion auch in unseren Apps nutzen.

Ich habe beschlossen, die minimalstmoegliche, aber voll funktionsfaehige SwiftUI-App zu erstellen. Das Ergebnis ist dieses Tutorial und der begleitende App-Quellcode.

Hier ist eine Demo, wie die App funktioniert:

https://youtu.be/iESuFX8nsMk

Das vollstaendige Xcode-Projekt kann ueber diesen Link heruntergeladen werden.

Zum Zeitpunkt des Schreibens ist mein Setup:

  • MacBook Pro, 16 Zoll, 2021, M1 Max
  • macOS Monterey, Version 12.0.1
  • Xcode, Version 13.1

Hier ist, was wir behandeln werden:

  • Ueberblick ueber Frameworks
  • Dokumentensegmentierung
  • Optische Zeichenerkennung
  • Referenzanwendungs-Walkthrough
  • Optimierungen und Best Practices
  • Fazit

Lass uns loslegen.

Ueberblick

Es sind im Grunde zwei Schritte noetig, um unsere Aufgabe zu erfuellen.

Erstens muessen wir das Dokument in unserem Bild “finden”: Dokumentensegmentierung.

Zweitens muessen wir die Zeichen “finden” und Text extrahieren: optische Zeichenerkennung.

Gluecklicherweise stellt Apple reichlich fertigen Code bereit, den wir verwenden koennen, um eine ausgefeilte App zu erstellen.

Die Grafik unten zeigt die wichtigsten beteiligten Klassen und Frameworks.

Es gibt jedoch nur zwei Klassen, die am wichtigsten sind und auf die wir uns konzentrieren werden.

Die erste ist VNDocumentCameraViewController:

A view controller that shows what the document camera sees.

Die zweite ist VNRecognizeTextRequest:

An image analysis request that finds and recognizes text in an image.

Zusaetzlich verwenden wir etwas Combine, um Dinge zusammenzufuegen. Fuer die Benutzerinteraktion verwenden wir SwiftUI.

Dokumentensegmentierung

Lass uns auf die Dokumentensegmentierung fokussieren, um den Hintergrund zu verstehen, der fuer die Implementierung unserer App notwendig ist.

Wikipedia definiert Bildsegmentierung als:

In digital image processing and computer vision, image segmentation is the process of partitioning a digital image into multiple segments (sets of pixels, also known as image objects).

Apple stellt VNRequest bereit:

The abstract superclass for analysis requests.

VNRequest bietet eine Reihe von Anfragen fuer die Dokumentenanalyse, wie z.B.

  • Barcode-Erkennung
  • Texterkennung
  • Konturerkennung
  • Rechteckerkennung
  • NEU fuer 2021: Dokumentensegmentierungs-Erkennung

Die, die wir brauchen, ist VNDetectDocumentSegmentationRequest:

An object that detects rectangular regions that contain text in the input image.

Es ist ein auf maschinellem Lernen basierender Detektor, der in Echtzeit auf Geraeten mit Apples Neural Engine laeuft. Er liefert eine Segmentierungsmaske und Eckpunkte und wird von VNDocumentCameraViewController verwendet.

Frueher mussten wir die Rechteckerkennung mit dem allgemeineren VNDetectRectanglesRequest verwenden, um ein Dokument zu segmentieren:

An image analysis request that finds projected rectangular regions in an image.

Er verwendet einen traditionellen CPU-gebundenen Algorithmus, der Kanten und Schnittpunkte erkennt, um Vierecke zu bilden (nur Eckpunkte). Er kann mehrere Rechtecke einschliesslich verschachtelter erkennen.

Im Vergleich dazu verwendet VNDetectDocumentSegmentationRequest einen Machine-Learning-Algorithmus, der auf der Neural Engine, GPU oder CPU laufen kann. Er wurde auf Dokumente, Etiketten und Schilder trainiert, einschliesslich nicht-rechteckiger Formen. Er findet typischerweise ein Dokument und liefert eine Segmentierungsmaske und Eckpunkte.

Zu unserem Komfort muessen wir VNDetectDocumentSegmentationRequest nicht einmal direkt verwenden, da es bereits in VNDocumentCameraViewController gekapselt ist.

Wir haben jetzt alles, was fuer den naechsten Schritt benoetigt wird: das Extrahieren des Textes aus dem Dokument.

Optische Zeichenerkennung

Wikipedia definiert optische Zeichenerkennung (OCR) als:

Optical character recognition or optical character reader (OCR) is the electronic or mechanical conversion of images of typed, handwritten, or printed text into machine-encoded text, whether from a scanned document, a photo of a document, a scene photo (for example, text on signs and billboards), or from subtitle text superimposed on an image.

Bis 2019 haetten wir VNDetectRectanglesRequest und VNTextObservation verwenden und dann mehrere Schritte ausfuehren muessen, um den Text zu extrahieren:

  1. Ueber Zeichenfelder in der Beobachtung iterieren.
  2. Ein Core ML-Modell fuer die Zeichenerkennung trainieren.
  3. Das Modell auf jedem Zeichenfeld ausfuehren.
  4. Gegen moegliche Muellergebnisse schwellenwerten.
  5. Zeichen zu Zeichenketten verketten.
  6. Erkannte Zeichen in Zeichenketten korrigieren.
  7. Erkannte Woerter basierend auf einem Woerterbuch und Heuristiken korrigieren.

Das ist viel Arbeit - aber nicht mehr.

Dank VNRecognizeTextRequest werden viele dieser Schritte auf das reduziert, was im Wesentlichen ein Einzeiler ist.

Es ist wirklich so einfach. Wir haben jetzt alles, um eine App zu schreiben, was ich fuer dich getan habe.

Als Naechstes gebe ich einen Ueberblick ueber das Xcode-Projekt, zeige die Klassen auf, die die Arbeit machen, und fuehre dich durch einige Funktionen.

Referenzanwendungs-Walkthrough

Alles beginnt in Xcode mit der Standard-SwiftUI-Anwendung. Nach dem Hinzufuegen des notwendigen Codes sah die Projektstruktur wie folgt aus:

Die beiden wichtigsten Klassen sind DocumentCameraView und TextScanner.

Wir brauchen DocumentCameraView, um VNDocumentCameraViewController zu “umhuellen”, was eine UIKit-Klasse und nicht nativ fuer SwiftUI ist.

Ich habe dies in meinem Tutorial beschrieben:

https://itnext.io/using-uiview-in-swiftui-ec4e2b39451b

Das “Ergebnis” von VNDocumentCameraViewController ist ein VNDocumentCameraScan.

An diesem Punkt nimmt die TextScanner-Klasse den VNDocumentCameraScan zur weiteren Verarbeitung - das Extrahieren der Textdaten aus dem gescannten Bild.

Um den Code einfach zu halten, habe ich alles in der Hauptansicht (ContentView) zusammengefuegt. Ich halte es nicht fuer notwendig, eine ausgefallene App-Architektur fuer eine App einzufuehren, die so einfach wie moeglich sein soll.

Lass uns nun einige Funktionen der App vorstellen, die mit VNDocumentCameraViewController kommen.

Es gibt mehrere Optionen in der Kameraansicht, die Leistung und Genauigkeit optimieren.

  • Der Blitz kann auf automatisch (Standard), immer an oder aus gesetzt werden.
  • Die Dokumentmodus-Optionen sind Farbe (Standard), Graustufen, Schwarz-Weiss und Foto.
  • Das Ausloeseverhalten kann automatisch (Standard) sein - die Kamera “drueckt” den Ausloeser, wenn sie denkt, ein Dokument erkannt zu haben - oder manuell, wenn du den Ausloeser lieber selbst drueckst.

Wenn der Ausloeser im manuellen Modus ist, wird das Dokument nicht automatisch segmentiert. Die Segmentierung muss manuell durch Anpassen der Eckpunkte erfolgen.

Wenn der “Abbrechen”-Button gedrueckt wird, gehen wir zur Ergebnisansicht, die, wenn kein Bild aufgenommen wurde, leer ist.

In der Ergebnisansicht koennen wir zur Kameraansicht zurueckkehren, indem wir das “Scan”-Symbol in der oberen rechten Ecke druecken.

Und das war’s in etwa. Lass uns zusammenfassen.

Fazit

Was fuer eine Fahrt. Ausgehend von den grundlegenden Bausteinen - Dokumentensegmentierung und Texterkennung - haben wir die Klassen und Frameworks kennengelernt, die zum Erstellen einer App benoetigt werden.

Dann haben wir eine voll funktionsfaehige iOS-App durchgearbeitet, die fuer jeden spezifischen Anwendungsfall oder Anforderungen, die du realisieren moechtest, angepasst und erweitert werden kann.

Ich hoffe, das hilft, deine naechste grosse App-Idee zu starten!

Das vollstaendige Xcode-Projekt kann ueber diesen Link heruntergeladen werden.

Danke fuers Lesen!

Ressourcen