Ga naar hoofdinhoud

Mistral OCR 3: Een volledige gids met Mistral AI Studio en Python

Leer tekstuele data uit documenten en afbeeldingen te halen met Mistrals nieuwste en meest capabele OCR-model, Mistral OCR 3.
· 9 min lezen

Verken met AI

Mistrals nieuwste OCR-model, Mistral OCR 3, kan tekst en ingesloten afbeeldingen met uitzonderlijke nauwkeurigheid extraheren uit een breed scala aan documenten.

In dit artikel laat ik je zien hoe je alles uit Mistral OCR 3 haalt, zowel met hun AI Studio als via de API met Python. We bouwen een kleine applicatie die een foto van een menu omzet in een interactieve website.

Screenshot waaruit blijkt dat Mistral OCR 3 handgeschreven tekst met hoge nauwkeurigheid kan herkennen.

Als je meer wilt leren over werken met API’s om AI-tools te bouwen, raad ik de cursus Working with the OpenAI API aan. 

Wat is Mistral OCR?

OCR staat voor Optical Character Recognition en is bedoeld om documenten om te zetten in tekst. Zo kan het bijvoorbeeld een foto van een handgeschreven notitie in tekst omzetten, of een tabel in een PDF in een echte teksttabel die doorzoekbaar en bewerkbaar is.

Mistral OCR 3 is Mistral AI’s nieuwste model voor documentbegrip en levert state-of-the-art nauwkeurigheid en efficiëntie voor realistische documenten. Het extraheert tekst en ingesloten afbeeldingen met hoge getrouwheid en behoudt de structuur via markdown-uitvoer met HTML-gebaseerde tabelreconstructie, met optioneel gestructureerde JSON.

Mistral OCR 3 presteert beter dan alle concurrenten op een breed scala aan benchmarks:

Benchmarkresultaten van Mistral OCR 3.

Vergeleken met Mistral OCR 2 behaalt het een algehele winst van 74% op formulieren, gescande documenten, complexe tabellen en handschrift, met grote winst op scans van lage kwaliteit en dichte lay-outs.

Mistral OCR 2 vs Mistral OCR 3

Wil je meer leren over OCR en Mistrals vorige model? Lees dan dit artikel: Mistral OCR: A Guide With Practical Examples.

Mistral OCR 3 gebruiken in Mistral AI Studio

Laten we bekijken hoe je Mistral OCR 3 instelt in AI Studio. 

Accountinstelling

Mistral OCR 3 is beschikbaar op hun AI-studio. Dit is de makkelijkste manier om het te proberen, omdat het een gebruiksvriendelijke interface biedt.

Na het aanmelden worden we eerst gevraagd een organisatie aan te maken:

Een Mistral-organisatie aanmaken

In eerste instantie is Mistral OCR 3 vergrendeld en moeten we een plan kiezen om het te ontgrendelen:

Screenshot waaruit blijkt dat een plan vereist is om Mistral OCR te ontgrendelen.

Je kunt een gratis plan selecteren, waarmee je Mistral OCR 3 mag gebruiken in ruil voor het toestaan van dataverzameling om hun diensten te verbeteren. Of je kunt je creditcardgegevens opgeven en per gebruik betalen.

Er is geen abonnement, maar we betalen $2 of $1 per 1.000 pagina’s, afhankelijk van of we batchverzoeken gebruiken.

Prijsdetails van Mistral OCR 3.

Ons eerste document parsen

Zodra het account is ingesteld, kunnen we met Mistral OCR 3 experimenteren via het tabblad "Document AI" in de AI Studio.

OCR playground-interface.

Om te beginnen uploaden we het document of de afbeelding waarop we OCR willen uitvoeren. In mijn geval schreef ik wat tekst en een tabel op een vel papier en uploadde die. Mijn handschrift is nogal slecht, dus ik was benieuwd of Mistral OCR 3 het kon ontcijferen.

OCR-opties selecteren.

Wanneer het bestand is geselecteerd, krijgen we opties te zien voor de verwerking. In dit eerste voorbeeld liet ik de standaardopties staan en klikte ik gewoon op de knop "Run" rechtsboven.

Hier is het resultaat:

Resultaat van OCR uitvoeren op mijn handschrift.

Het resultaat is best goed, maar niet perfect:

  • De eerste zin heeft twee fouten: "homd" in plaats van "hand" en "tarnible" in plaats van "terrible".
  • De tabel is over het algemeen goed, maar de kolomnamen zijn niet juist herkend. De tabelnaam "OCR Benchmark Multilingual Chinese" en de kolom "Result" zijn samengevoegd.
  • Ik was onder de indruk van hoe het omging met fouten die ik handmatig had doorgestreept. Als ik het echter zou gebruiken om mijn aantekeningen te parsen, zou ik liever hebben dat die worden herkend en weggelaten.
  • Tot slot schreef ik een zin in traditioneel Chinees, en het herkende het grootste deel. Het karakter "好" werd echter als twee losse tekens geparset, "女" en "子", de komma’s werden herkend als de letter "g", en er zit ook een fout op het einde.

Parseopties verkennen

Een van de fijne features van Mistral OCR 3 is de mogelijkheid om een JSON-structuur te specificeren voor het parsen van data. Dit is vooral handig voor tabellen, omdat we kolomnamen en datatypes kunnen opgeven zodat we de rijen als een JSON-dictionary krijgen.

Laten we proberen de tabel uit het vorige voorbeeld opnieuw te parsen door een JSON-schema op te geven.

Voorbeeld van een handgeschreven tabel.

Om een JSON-schema te gebruiken, moeten we vóór het uitvoeren van de OCR JSON schema selecteren in plaats van tekstmodus.

Een JSON-schema selecteren.

Vervolgens leveren we een schema aan, ofwel met code of via de gebruikersinterface "Visual Builder". Ik raad de tweede optie aan; dat is eenvoudiger als we het model toch al handmatig gebruiken.

Bij het toevoegen van een veld specificeren we:

  • De naam
  • De beschrijving
  • Het datatype
  • Of het veld verplicht is of niet

Een JSON-veld toevoegen.

In dit geval specificeerde ik twee velden: één voor de naam van het model en één voor het benchmarkresultaat:

Voorbeeld van een JSON-schema met twee velden.

Nu kunnen we op "Run" klikken en de resultaten bekijken. Helaas werkte dit voorbeeld niet. In de resultaten stond alleen het door mij opgegeven schema, niet de daadwerkelijke data.

Resultaat van JSON-parsing.

Ik dacht dat ik het misschien verkeerd had gebruikt, dus om het zeker te weten, maakte ik een screenshot van een voorbeeldtabel van Wikipedia) en probeerde het opnieuw.

Voorbeeldtabel afkomstig van Wikipedia.

Ik specificeerde vier kolommen, waarbij ik de laatste optioneel liet:

JSON-schema voor de voorbeeldtabel van Wikipedia.

Deze keer werkte het goed. Het lijkt erop dat wanneer het parsen faalt, het JSON-resultaat simpelweg het aangeleverde schema is. Dat betekent ook dat Mistral OCR 3 mijn handgeschreven tabel niet als JSON kon parsen, ondanks dat het hem wel als tekst kon weergeven.

Voorbeeld van JSON-parsingresultaat.

Mistral OCR 3 gebruiken met Python

In deze sectie bekijken we hoe je Python gebruikt om met de Mistral OCR 3 API te werken. Dit biedt veel meer flexibiliteit: je kunt de output bijvoorbeeld combineren met andere AI-modellen om de geëxtraheerde data te verwerken.

Wanneer we een bestand uploaden naar de AI Studio, staat er een knop "Code" naast de knop "Run". Als je daarop klikt, zie je welke code nodig is om dezelfde bewerking via de API uit te voeren.

Met de codeknop kun je de code zien die nodig is om de OCR te genereren.

Hier is een voorbeeld:

De code bekijken die nodig is om OCR uit te voeren.

De meegeleverde Python-code is echter niet helemaal correct. Zo wordt een functie encode_file gedefinieerd, maar vervolgens een functie encode aangeroepen. Dit zijn kleine inconsistenties, maar ze zorgen ervoor dat de code niet direct werkt.

Geen zorgen: we leggen in detail uit hoe je de API gebruikt. Voor meer informatie over de API kun je terecht in de officiële documentatie.

API-instelling

Het eerste wat we doen is een API-sleutel aanmaken in het tabblad "API Keys" en die sleutel kopiëren naar een nieuw bestand met de naam .env in dezelfde map als het Python-script.

Installeer vervolgens de benodigde dependencies:

pip install mistralai python-dotenv

OCR uitvoeren op een afbeelding

Hier is een Python-script dat een lokale JPEG-afbeelding laadt, er OCR op uitvoert en het resultaat opslaat in een markdown-bestand:

import sys
import base64
import os
from mistralai import Mistral
from dotenv import load_dotenv

# Load the API key from the .env file
load_dotenv()

# Initialize the Mistral client
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)

# Load a file as base 64
def encode_file(file_path):
    with open(file_path, "rb") as pdf_file:
        return base64.b64encode(pdf_file.read()).decode('utf-8')

# Perform OCR on and image
def process_image_ocr(file_path):
    base64_file = encode_file(file_path)
    ocr_response = client.ocr.process(
        model="mistral-ocr-latest",
        document={
            "type": "image_url",
            "image_url": f"data:image/jpeg;base64,{base64_file}" 
        },
        include_image_base64=True
    )
    for index, page in enumerate(ocr_response.pages):
        with open(f"page{index}.md", "wt") as f:
            f.write(page.markdown)

if __name__ == "__main__":
    # Load the input file from the arguments
    file_path = sys.argv[1]
    process_image_ocr(file_path)

OCR uitvoeren op een PDF

Als de input een PDF is in plaats van een afbeelding, verandert alleen de waarde in het veld document. Voor een JPEG-afbeelding gebruikten we:

document={
  "type": "image_url",
   "image_url": f"data:image/jpeg;base64,{base64_file}" 
},

Voor een PDF gebruiken we in plaats daarvan:

document={
  "type": "document_url",
  "document_url": f"data:application/pdf;base64,{base64_file}" 
},

Hier is een volledige functie die we kunnen gebruiken om een PDF te verwerken:

def process_pdf_ocr(file_path):
    base64_file = encode_file(file_path)
    ocr_response = client.ocr.process(
        model="mistral-ocr-latest",
        document={
            "type": "document_url",
            "document_url": f"data:application/pdf;base64,{base64_file}" 
        },
        include_image_base64=True
    )
    process_pages(ocr_response)

Een generieke versie maken

Twee aparte functies hebben voor PDF- en JPEG-bestanden is wat onhandig en ook niet ideaal, want er is veel gedeelde code.

Om dit te vermijden, schreven we een nieuwe, verbeterde functie die het pakket mimetypes gebruikt om het bestandstype te bepalen en het API-verzoek daarop af te stemmen. We hebben de code ook aangepast om afbeeldingen op te slaan die in het document zijn herkend.

Hier is de uiteindelijke versie:

import sys
import os
import base64
import mimetypes
import datauri
from mistralai import Mistral
from dotenv import load_dotenv
# Load the API key from the .env file
load_dotenv()
# Initialize the Mistral client
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
# List the supported image types
SUPPORTED_IMAGE_TYPES = {
    "image/jpeg",
    "image/png",
    "image/webp",
    "image/tiff",
}
PDF_MIME = "application/pdf"
# Load a file as base 64
def encode_file(file_path: str) -> str:
    with open(file_path, "rb") as f:
        return base64.b64encode(f.read()).decode("utf-8")
# Build the document payload depending on the type of data contained in the file
def build_document_payload(file_path: str) -> dict:
    mime_type, _ = mimetypes.guess_type(file_path)
    if not mime_type:
        raise ValueError(f"Could not determine MIME type for {file_path}")
base64_file = encode_file(file_path)
if mime_type == PDF_MIME:
        return {
            "type": "document_url",
            "document_url": f"data:{mime_type};base64,{base64_file}",
        }
if mime_type in SUPPORTED_IMAGE_TYPES:
        return {
            "type": "image_url",
            "image_url": f"data:{mime_type};base64,{base64_file}",
        }
raise ValueError(f"Unsupported file type: {mime_type}")
# Generic function to process OCR on a file
def process_ocr(file_path: str, output_filename: str = "output.md"):
    document = build_document_payload(file_path)
    ocr_response = client.ocr.process(
        model="mistral-ocr-latest",
        document=document,
        include_image_base64=True,
    )
    process_pages(ocr_response, output_filename)
# Save an image to a local file
def save_image(image):
    parsed = datauri.parse(image.image_base64)
    with open(image.id, "wb") as f:
        f.write(parsed.data)
# Process all pages from the OCR response
def process_pages(ocr_response, output_filename: str):
    with open(output_filename, "wt") as f:
        for page in ocr_response.pages:
            f.write(page.markdown)
            for image in page.images:
                save_image(image)
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python ocr.py <file>")
        sys.exit(1)
process_ocr(sys.argv[1])

Voor deze versie is het pakket datauri nodig om de door Mistral OCR 3 herkende afbeelding op te slaan. Dat installeer je met:

pip install datauri

Een JSON-schema aanleveren

We hebben hierboven gezien dat Mistral OCR 3 ons toelaat een JSON-schema aan te leveren om data te parsen. Deze functionaliteit is ook beschikbaar via de API.

Daarvoor geven we het JSON-schema mee in de parameter document_annotation_format bij het verzoek. Hieronder staat een voorbeeld van een JSON-schema voor de twee kolommen model en result, passend bij de handgeschreven voorbeeldtabel.

Voorbeeld van een handgeschreven tabel.

document_annotation_format={
    "name": "response_schema",
    "schemaDefinition": {
        "properties": {
            "model": {
                "type": "string",
	         "description": "The name of the model"
             },
             "result": {
	         "type": "number",
	         "description": "The benchmark result"
	     }
         },
         "required": [
             "model"
         ]
    }
}

De structuur is altijd hetzelfde. We voegen voor elke kolom een entry toe onder properties, met informatie over het datatype en een beschrijving om het model te helpen de data te herkennen.

Vervolgens sommen we alle verplichte velden op onder het veld required.

Om het samen met de code te gebruiken, is het het eenvoudigst om het schema in een JSON-bestand op te slaan en te laden met het pakket json.

Projectideeën met Mistral OCR 3

Een van de grootste voordelen van Mistral OCR 3 via de API is dat je erop kunt voortbouwen. In deze sectie geven we een paar projectideeën om op verder te bouwen.

Uitgaven-tracker app

We hebben geleerd hoe je OCR uitvoert op een afbeelding. Daarmee kun je een app bouwen die een foto van een kassabon maakt, vervolgens Mistral OCR 3 gebruikt om de gegevens in de afbeelding te verwerken en een JSON-dictionary te extraheren met de artikelen op de bon en hun prijzen.

Deze uitgaven kunnen dan automatisch worden gecategoriseerd en aan een database toegevoegd, zodat de gebruiker zijn uitgaven kan bijhouden.

Documenten-voorlezer

We kunnen Mistral OCR 3 combineren met een tekst-naar-spraak-AI om een documenten-voorlezer te maken. De gebruiker kan een tekst-PDF selecteren en naar Mistral OCR 3 sturen voor verwerking. De resulterende tekst wordt dan naar een tekst-naar-spraakmodel gestuurd, zoals OpenAI Audio API of Eleven Labs.

Omdat Mistral OCR 3 ook met afbeeldingen werkt, kun je het gebruiken met foto’s, zodat gebruikers een foto van een document kunnen maken en die onderweg kunnen beluisteren.

Wil je meer leren over tekst-naar-spraak? Bekijk dan een van de volgende artikelen:

Conclusie

Mistral OCR 3 is een capabele, praktische tool om echte documenten om te zetten in bruikbare tekst en gestructureerde data, of je nu experimenteert in de AI Studio of integreert via Python.

Het blinkt uit op gescande pagina’s, formulieren en tabellen, behoudt de lay-out met markdown en afbeeldingen, en ondersteunt JSON-schema’s wanneer je structuur nodig hebt. Zoals we zagen, kunnen rommelig handschrift en dubbelzinnige kopteksten het nog in de war brengen, en mislukte schema-parses geven simpelweg het schema terug.

De API is rechttoe rechtaan zodra je kleine inconsistenties oplost, en een generieke bestandsverwerker plus het opslaan van afbeeldingen maakt integratie in kleine apps of pipelines eenvoudig. Wil je het gewoon proberen, dan is de Studio het snelst. Voor productiegebruik: houd rekening met de kosten, batch waar mogelijk en voeg validatie toe voor randgevallen.

Van daaruit kun je itereren: schema’s verfijnen, outputs combineren met andere modellen en gerichte tools bouwen zoals bonparsers of voorlezers, waarbij het model het zware werk doet en jij betrouwbaarheid en UX borgt.

Mistral OCR 3 FAQs

Hoeveel kost Mistral OCR 3?

Mistral OCR 3 hanteert een prijs per pagina in plaats van per token (gebruikelijk bij LLM’s).

  • Standaard API: $2 per 1.000 pagina’s.
  • Batch API: $1 per 1.000 pagina’s (het beste voor taken met hoog volume waarbij directe verwerking niet nodig is).
  • Gratis tier: Er is geen abonnementsvergoeding om het model te gebruiken op het "Free"-plan, maar gebruiksdata op dit niveau kan door Mistral worden gebruikt om hun modellen te trainen. Wil je data privé houden, kies dan voor een betaald plan.
Welke bestandsformaten en talen worden ondersteund?

Mistral OCR 3 is van nature meertalig en kan complexe schriften aan, niet alleen Engels.

  • Bestandsformaten: Het ondersteunt vooral PDF’s en gangbare beeldformaten zoals JPEG, PNG, TIFF, WEBP en AVIF. De documentatie vermeldt ook ondersteuning voor documentformaten zoals DOCX en PPTX via de input document_url.
  • Talen: Het ondersteunt standaard 35+ talen, waaronder Latijnse talen (Engels, Frans, Spaans), Cyrillisch, Arabisch, Hindi en Chinees (Traditioneel en Vereenvoudigd).
Hoe verhoudt Mistral OCR 3 zich tot Vision-LLM’s zoals GPT-4o?

Hoewel algemene Vision-LLM’s (zoals GPT-4o) afbeeldingen kunnen "lezen", is Mistral OCR 3 een gespecialiseerd model dat specifiek is geoptimaliseerd voor documentparsing.

  • Structuur vs. inhoud: Mistral OCR 3 blinkt uit in het behouden van lay-outstructuur, zet complexe tabellen direct om naar HTML/Markdown en extraheert ingesloten afbeeldingen apart. Vision-LLM’s hebben vaak moeite met strikte tabelgeometrie of hallucineren bij het parsen van dichte spreadsheets.
  • Kostenefficiëntie: Voor pure documentverwerking (bijv. 10.000 facturen parsen) is Mistral OCR 3 doorgaans aanzienlijk goedkoper omdat je per pagina betaalt, terwijl Vision-LLM’s per token rekenen (input-beeldtokens + output-teksttokens), wat snel duur wordt bij veel tekst.
Kan Mistral OCR 3 met handschrift overweg?

Ja, maar met beperkingen. Het behaalde een winstpercentage van 74% ten opzichte van zijn voorganger op handschrifttests en kan cursief en gemengde annotaties aan (bijv. krabbels op een geprint formulier). Zoals ook in je experimenten bleek, kan het echter moeite hebben met erg rommelig handschrift of doorgestreepte tekst, en soms handmatige correcties verkeerd interpreteren of als actieve tekst herkennen.

Wat gebeurt er als de JSON-extractie mislukt?

Een van de unieke features van Mistral OCR 3 is Structured OCR, waarbij je een JSON-schema kunt definiëren (zoals kolomnamen en datatypes). Als het model er niet in slaagt om de documentinhoud aan je strikte schema te koppelen, bijvoorbeeld door dubbelzinnige koppen of samengesmolten kolommen, dan valt het doorgaans terug op het retourneren van de schemadefinitie zelf of een standaard tekstparse, in plaats van verzonnen data te produceren. Dit "fail-safe" gedrag helpt voorkomen dat downstream-applicaties ongemerkt ongeldige data verwerken.

François Aubry

Auteur

François Aubry

Full-stack engineer & oprichter bij CheapGPT. Lesgeven is altijd mijn passie geweest. Al vanaf mijn studententijd zocht ik actief naar kansen om bijles te geven en andere studenten te helpen. Die passie bracht me ertoe om te promoveren, waarbij ik ook als onderwijsassistent werkte ter ondersteuning van mijn academische werk. In die jaren vond ik veel voldoening in de traditionele klasomgeving, waar ik verbindingen kon leggen en leren kon begeleiden. Met de opkomst van online leerplatforms zag ik echter het transformerende potentieel van digitaal onderwijs. Sterker nog, ik was actief betrokken bij de ontwikkeling van zo’n platform op onze universiteit. Ik zet me sterk in om traditionele didactische principes te combineren met innovatieve digitale methoden. Mijn passie is om cursussen te maken die niet alleen boeiend en informatief zijn, maar ook toegankelijk voor lerenden in dit digitale tijdperk.

Onderwerpen