Texterkennung und Transkription in Bildern
Auf dieser Seite
Text in Bildern lesen
Die optische Zeichenerkennung (OCR) ist einer der häufigsten Anwendungsfälle für die Vision API. Mit den multimodalen Modellen von Mistral können Sie Text aus Fotos, Screenshots, gescannten Dokumenten, Rechnungen oder Quittungen extrahieren, ohne eine dedizierte OCR-Bibliothek zu installieren – weder Tesseract, noch Sprachmodelle, noch eine Vorverarbeitungspipeline sind erforderlich.
Der Vorteil beschränkt sich nicht nur auf die Reduzierung von Abhängigkeiten. Klassische OCR-Verfahren liefern Zeichen; ein multimodales Modell versteht jedoch, was es liest, und kann in derselben Anfrage eine Rechnungsnummer von einer Bestelldatennummer unterscheiden. Diese Lektion behandelt gängige Anwendungsfälle und Techniken, die die Genauigkeit konkret verbessern.
Einfache OCR: Lesung sichtbaren Textes
Der direkteste Ansatz reduziert sich auf einen einzigen Prompt, sofern dieser eindeutig ist:
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
response = client.chat.complete(
model="mistral-small-latest",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Transkribieren Sie exakt alle im Bild sichtbaren Texte. Kommentieren Sie nicht, fassen Sie nicht zusammen – geben Sie nur den Text so zurück, wie er erscheint."},
{"type": "image_url", "image_url": "https://exemple.com/document-scanne.jpg"}
]
}
]
)
print(response.choices[0].message.content)
Das Schlüsselwort ist “exakt”. Ohne diese Anweisung neigt das Modell dazu, den Inhalt zu paraphrasieren oder zusammenzufassen, da dies das Verhalten einer hilfsbereiten KI ist: hier bitten Sie um das Gegenteil einer Dienstleistung, nämlich eine wörtliche Wiedergabe.
Extrahieren von Text aus einer Rechnung
Rechnungen enthalten strukturierte Informationen – Absender, Empfänger, Beträge, Daten –, die das Modell anhand ihrer Rolle, nicht nur ihrer Position identifizieren kann. Dies ist genau der Vorteil gegenüber der OCR mit festgelegten Zonen, die sofort versagt, sobald der Lieferant das Layout ändert:
prompt_facture = """Analysieren Sie diese Rechnung und extrahieren Sie die folgenden Informationen:
- Absender (Name, Adresse, SIRET, falls sichtbar)
- Empfänger (Name, Adresse)
- Rechnungsnummer
- Ausstellungsdatum
- Fälligkeitsdatum
- Positionen (Beschreibung, Menge, Einzelpreis, Gesamt)
- Zwischensumme ohne MwSt.
- MwSt. (Satz und Betrag)
- Gesamtbetrag einschließlich MwSt.
Geben Sie das Ergebnis als strukturiertes JSON zurück."""
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Sie sind ein zertifizierter Buchhalter. Extrahieren Sie Buchhaltungsdaten mit Präzision. Geben Sie nur gültiges JSON zurück."
},
{
"role": "user",
"content": [
{"type": "text", "text": prompt_facture},
{"type": "image_url", "image_url": data_uri_facture}
]
}
]
)
Transkribieren von Screenshots
Ein weiterer häufiger Bedarf besteht darin, Inhalte aus einer als Screenshot geteilten Benutzeroberfläche oder einem Terminal abzurufen, typischerweise im Rahmen eines Support-Tickets. Hier ist das Format Teil der Information: eine nicht eingerückte Terminalausgabe ist unbrauchbar.
import base64
def encoder_image(chemin):
with open(chemin, "rb") as f:
b64 = base64.standard_b64encode(f.read()).decode("utf-8")
return f"data:image/png;base64,{b64}"
# Transkribieren eines Screenshots vom Terminal
response = client.chat.complete(
model="mistral-small-latest",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Transkribieren Sie die im Screenshot sichtbare Terminalausgabe. Bewahren Sie Formatierung und Einrückungen bei."
},
{"type": "image_url", "image_url": encoder_image("captures/terminal.png")}
]
}
]
)
Lesen von Quittungen und Kassenbons
Thermopapierquittungen stellen den schwierigsten Fall dar: schwaches Druckbild, zerknittertes Papier, verblassende Tinte. Die entscheidende Technik besteht darin, dem Modell explizit zu erlauben, bei einem Artikel das Eingeständnis der Unmöglichkeit zu machen; andernfalls füllt es Lücken mit plausiblen Werten auf.
prompt_recu = """Lesen Sie diesen Kassenbon und extrahieren Sie:
1. Ladenname
2. Datum und Uhrzeit
3. Liste der Artikel (Name, Preis)
4. Zwischensumme
5. Zahlungsmethode
6. Gesamtbetrag
Wenn ein Artikel nicht lesbar ist, geben Sie [nicht lesbar] an.
Geben Sie das Ergebnis als JSON zurück."""
response = client.chat.complete(
model="mistral-large-latest", # Großes Modell für beste Lesbarkeit
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": prompt_recu},
{"type": "image_url", "image_url": encoder_image("recu-supermarche.jpg")}
]
}
]
)
Ein [nicht lesbar] im Ergebnis ist unendlich besser als ein erfundener Betrag: das erste löst eine menschliche Überprüfung aus, das zweite bleibt unbemerkt, bis die Buchhaltungsbereinigung ansteht. Für diese verschlechterten Dokumente verwenden Sie Mistral Large 3 – der Unterschied in der Genauigkeit im Vergleich zu Small ist bei unscharfen oder teilweise lesbaren Texten signifikant.
Batch-Verarbeitung von Dokumenten
Das Skalieren folgt dem Muster, das wir bereits gesehen haben: eine Funktionseinheit, die durch das Modell parametrisiert ist, gefolgt von einer Schleife über den Ordner.
import json
from pathlib import Path
def ocr_document(chemin_image, modele="mistral-small-latest"):
"""Führt OCR an einem Dokument durch und gibt den Text zurück."""
response = client.chat.complete(
model=modele,
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Transkribieren Sie den gesamten Text dieses Dokuments. Bewahren Sie Formatierung (Überschriften, Absätze, Listen) bei."
},
{"type": "image_url", "image_url": encoder_image(chemin_image)}
]
}
]
)
return response.choices[0].message.content
# Verarbeitung eines Ordners
dossier = Path("documents_scannes/")
resultats = {}
for fichier in sorted(dossier.glob("*.jpg")):
print(f"OCR von {fichier.name}...")
resultats[fichier.name] = ocr_document(fichier)
# Speichern
with open("transcriptions.json", "w", encoding="utf-8") as f:
json.dump(resultats, f, ensure_ascii=False, indent=2)
print(f"{len(resultats)} Dokumente transkribiert.")
Der Parameter modele in der Signatur ist nicht kosmetisch: er ermöglicht es Ihnen, nur zweifelhafte Dokumente erneut mit Large zu verarbeiten, ohne die Funktion umzuschreiben.
Verbesserung der OCR-Genauigkeit
Zwei Hebel wirken upstream des Modells. Der erste ist die Bildvorverarbeitung: ein graues, kontrastarmes Scanbild wird nach Umwandlung in Graustufen, Kontrastverbesserung und Schärfung lesbar.
from PIL import Image, ImageEnhance, ImageFilter
def pretraiter_pour_ocr(chemin):
"""Verbessert ein Bild für OCR: Kontrast, Schärfe, Graustufen."""
img = Image.open(chemin)
# Umwandlung in Graustufen
img = img.convert("L")
# Erhöhung des Kontrasts
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)
# Erhöhung der Schärfe
img = img.filter(ImageFilter.SHARPEN)
return img
Der Faktor 2,0 funktioniert für ein verblassendes Scanbild; bei zu starker Anwendung entstehen Artefakte, die das Lesen verschlechtern. Testen Sie den Wert an drei repräsentativen Dokumenten, bevor Sie ihn festlegen.
Der zweite Hebel ist die Spezialisierung des Prompts nach Dokumententyp. Ein Formular verlangt “Lesen Sie jedes Feld und seinen entsprechenden Wert”, ein Brief “Transkribieren Sie den Briefkörper unter Bewahrung der Absätze”, eine Tabelle “Extrahieren Sie Tabellendaten im Markdown-Format”. Drei Formulierungen, drei Ausgabestrukturen: Klassifizieren Sie Ihre Dokumente, bevor Sie sie transkribieren, und die Qualität springt um eine Stufe.
Vision API vs. Document AI
Für erweiterte OCR und Dokumentenanalyse bietet Mistral auch Document AI (OCR 4), einen spezialisierten Service, an. Die folgende Tabelle grenzt die beiden voneinander ab.
| Kriterium | Vision API | Document AI (OCR 4) |
|---|---|---|
| Einfache OCR | Ausreichend | Überqualifiziert |
| Komplexe Dokumente | Begrenzt | Optimiert |
| Verschachtelte Tabellen | Näherungsweise | Präzise |
| Mehrseitige PDFs | Nicht unterstützt | Unterstützt |
| Komplexes Layout | Basis | Erweitert |
Die entscheidende Grenze sind mehrseitige PDFs: Die Vision API verarbeitet Bilder, nicht paginierte Dokumente. Sobald Ihre Quelle ein PDF mit mehreren Dutzend Seiten ist, stellt sich die Frage nicht mehr. Wir behandeln Document AI in Lektion 12 (Nächste Schritte).
Kernaussagen
- Die Vision API führt eine ausreichende OCR für einfache Fälle (Rechnungen, Screenshots, Quittungen) durch
- Verwenden Sie das Wort “exakt” in Ihrem Prompt, um Paraphrasierungen zu vermeiden
- Mistral Large 3 ist bei schlechten Dokumenten deutlich besser als Small
- Bildvorverarbeitung (Kontrast, Graustufen) verbessert die Ergebnisse
- Für erweiterte OCR und mehrseitige PDFs sollten Sie Mistral’s Document AI (OCR 4) in Betracht ziehen