· 

Bilderkennung von Formeln mit Python via Mathpix

1. Einführung

Das richtige Erkennen von (u. a. handschriftlich notierten) mathematischen Formeln stellt eine große Herausforderung dar. Auf dem Lernportal LetsRockMathe wäre eine solche automatisierte Erkennung von Formeln oft ein Segen: Nicht nur zur besseren Lesbarkeit, sondern auch als Schnittstelle für AI-basierte Hilfestellungen. Die Mathpix-API stellt für Programmierer eine einfache Möglichkeit dar, um eine AI zu nutzen, die eigens für die Erkennung mathematischer Formeln trainiert wurde. Wir werden diese Schnittstelle nun mit Python ansprechen.


2. Die Mathpix-API

Die Nutzung der Mathpix-API ist nicht kostenfrei. Man hat als Entwickler (nach aktuellem Stand) allerdings 1000 Anfragen pro Monat frei und zahlt danach (je nach Anzahl der monatlichen Gesamtanfragen) einen kleineren Cent-Betrag. Du benötigst zur Nutzung einen gültigen App-Key, also einen Schlüssel, der dich dazu berechtigt, die Mathpix-API für eine von dir festgelegte Anwendung (App) zu nutzen. Zu dem App-Key gehört eine entsprechende App-ID. Diese kannst du in deinem Profil festlegen. Über den App-Key bzw. die App-ID wird auch registriert, wie viele Anfragen du bereits gestellt hast. Gehe auf das Mathpix-Dashboard und erstelle dir einen Account. Während der Anmeldung musst du deine Kreditkartennummer hinterlegen. Eine Abbuchung erfolgt aber erst, wenn du die 1000 Anfragen pro Monat überschreitest. 


3. Das Python-Skript

Um beim Aufruf des Skripts Konsolenargumente entgegennehmen zu können, musst du sys importieren. Für die Bildkodierung in der Request-URI wird Base64 verwendet. Als Übertragungsformat wird JSON genutzt. Python bietet dir mit dem Modul requests die Möglichkeit, API-Requests zu formulieren.

import sys
import base64
import json
import requests

Definiere eine Funktion (z. B. mit dem Namen to_mathpix( )), in der du den Code zur Kommunikation mit der Mathpix-API kapselst. Dieser übergibst du als Parameter den Pfad zur Bilddatei, die an die API gesendet werden soll.

def to_mathpix(path):

Bau die an die URI zum Aufruf der API zusammen, indem du das Bild als Base64-String an den Filetype hängst. Rufe dazu auf base64 die Funktion base64encode(...) mit dem eingelesenen Bild auf. Wandle die Bytes mit der Funktion str(...) und der Zeichenkodierung 'utf-8' in einen String um.

def to_mathpix(path):
   image_uri = "data:image/jpg;base64," + str(base64.b64encode(open(path, "rb").read()),'utf-8')

Baue nun den Request mit den Bilddaten und sende diesen an die API. Rufe hierzu auf requests die Funktion post(...) auf, der du als erstes Argument den Link zur API (https://api.mathpix.com/v3/latex) übergibst. Als zweites Argument (data) übergibst du den 'src'-Parameter mit dem Wert 'image_uri' und das Format via 'format' und dem Wert 'latex_normal' (also der normalen LaTeX-Zeichenkodierung). Als drittes und letztes Arguments folgt nun der Header, in dem du die App-ID, den APP-Key und den Content-Type (hier 'application/json'). Gib den Wert, den dir API nach erfolgreichem Aufruf zurücksendet, zurück. An diesen Wert kommst du, indem du auf json die Funktion loads(...) aufrufst, dieser als Argument das Ergebnis und auf das du via text auf deinem erzeugten Request zugreifen kannst, übergibst.

def to_mathpix(path):
   image_uri = "data:image/jpg;base64," + str(base64.b64encode(open(path, "rb").read()),'utf-8')
   request = requests.post("https://api.mathpix.com/v3/latex",
   data=json.dumps(
                {'src': image_uri, 'formats': ['latex_normal']}),
                headers={
                        "app_id": "app_id",
                        "app_key": "api_key",
                        "Content-type": "application/json"
                }
   )
   return json.loads(request.text)

Diese Funktion kannst du nun auf einfache Art und Weise ausführen. Rufe dazu to_mathpix(...) mit dem beim Aufruf übergebenen Pfad zur Bilddatei auf und gib das Ergebnis auf der Konsole aus.

print(to_mathpix(sys.argv[1]))

4. Test der Schnittstelle

Zum Schluss wollen wir natürlich noch testen, ob die Schnittstelle reibungslos funktioniert und tatsächlich handschriftlich notierte Formeln erkannt werden. Zu diesem Zweck verwenden wir dieses Bild:

Beim Aufruf des Python-Skripts geben wir als Parameter den Pfad zu dieser Datei mit. 

python name_des_skripts.py pfad/zum/bild.png

Wir führen das Skript also aus und erhalten diese Ausgabe:

\\sum _ { k = 1 } ^ { \\infty } \\frac { 3 } { k } \\neq c \\int _ { - 5 } ^ { 42 } \\sqrt { x } d x

Das ist die LaTeX-Darstellung der im Bild erfassten Formel. Diese kann via MathJax auch direkt auf einer Webseite als Formel gerendert werden.