Heim >Backend-Entwicklung >Python-Tutorial >Schnelle und schmutzige Dokumentenanalyse: Kombination von GOT-OCR und LLama in Python

Schnelle und schmutzige Dokumentenanalyse: Kombination von GOT-OCR und LLama in Python

DDD
DDDOriginal
2025-01-09 12:14:41721Durchsuche

Lassen Sie uns eine Möglichkeit erkunden, eine OCR-LLM-Analyse für ein Bild durchzuführen. Wird dies der beste Weg sein, der von einem Experten mit jahrzehntelanger Erfahrung gegeben wird? Nicht wirklich. Aber es kommt von jemandem, der im wirklichen Leben einen ähnlichen Ansatz verfolgt. Betrachten Sie dies als eine Wochenendprojektversion mit praktischen Schnipseln und nicht als produktionsbereiten Code. Lasst uns reinschnuppern!

Was ist hier unser Ziel?

Wir werden eine einfache Pipeline erstellen, die ein Bild (oder PDF) aufnehmen, mithilfe von OCR Text daraus extrahieren und diesen Text dann mithilfe eines LLM analysieren kann, um nützliche Metadaten zu erhalten. Dies könnte nützlich sein, um Dokumente automatisch zu kategorisieren, eingehende Korrespondenz zu analysieren oder ein intelligentes Dokumentenverwaltungssystem aufzubauen. Wir werden dafür einige beliebte Open-Source-Tools verwenden und die Dinge relativ einfach halten.

Und ja, bei allem Folgenden wird davon ausgegangen, dass Sie mit HF-Transformatoren bereits ziemlich vertraut sind. Wenn nicht, schauen Sie sich https://huggingface.co/docs/transformers/en/quicktour an – scheint ein guter Ausgangspunkt zu sein. Obwohl ich es nie getan habe und nur aus Beispielen gelernt habe. Ich werde es schaffen... irgendwann.

Welche Pakete brauchen wir?

Wir verwenden Taschenlampe und Transformatoren für die schwere Arbeit sowie Pymupdf und Rich, um uns das Leben mit einer benutzerfreundlichen Konsolenausgabe zu erleichtern (ich mag Rich, also verwenden wir es im Grunde genommen zum Spaß).

import json
import time
import fitz

import torch
from transformers import AutoModel, AutoTokenizer, pipeline

from rich.console import Console
console = Console()

Bereiten Sie das Bild vor

Welches Bild sollten wir zunächst als Eingabe verwenden? Da wir Hugging Face hier hauptsächlich für den Zweck verwenden, verwenden wir die erste Seite ihrer führenden Webseite als Testobjekt. Es ist ein guter Kandidat sowohl für Text als auch für komplizierte Formatierungen – perfekt, um unsere OCR auf Herz und Nieren zu testen.

That landing page of HF that was mentioned above

Für eine realistischere Lösung gehen wir davon aus, dass unsere Eingabe ein PDF ist (denn seien wir ehrlich, damit werden Sie in der realen Welt wahrscheinlich zu tun haben). Wir müssen es in das PNG-Format konvertieren, damit unser Modell Folgendes verarbeiten kann:

INPUT_PDF_FILE = "./data/ocr_hf_main_page.pdf"
OUTPUT_PNG_FILE = "./data/ocr_hf_main_page.png"

doc = fitz.open(INPUT_PDF_FILE)
page = doc.load_page(0)
pixmap = page.get_pixmap(dpi=300)
img = pixmap.tobytes()

with console.status("Converting PDF to PNG...", spinner="monkey"):
    with open(OUTPUT_PNG_FILE, "wb") as f:
        f.write(img)

Führen Sie hier die echte OCR durch

Ich habe für diese Aufgabe mit verschiedenen OCR-Lösungen herumgespielt. Klar, es gibt Tesseract und viele andere Optionen. Aber für meinen Testfall habe ich mit GOT-OCR2_0 (https://huggingface.co/stepfun-ai/GOT-OCR2_0) die besten Ergebnisse erzielt. Also lasst uns gleich loslegen:

tokenizer = AutoTokenizer.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    device_map="cuda",
    trust_remote_code=True,
)
model = AutoModel.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    trust_remote_code=True,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    pad_token_id=tokenizer.eos_token_id,
)
model = model.eval().cuda()

Was ist hier los? Nun, standardmäßig AutoModel und AutoTokenizer. Das einzig Besondere daran ist, dass wir das Modell für die Verwendung von cuda einrichten. Und das ist nicht optional. Für die Ausführung des Modells ist CUDA-Unterstützung erforderlich.

Da wir nun unser Modell definiert haben, lassen Sie uns es tatsächlich an unserer gespeicherten Datei anwenden. Außerdem messen wir die Zeit und drucken sie aus. Nützlich nicht nur zum Vergleich mit verschiedenen Modellen, sondern auch um zu verstehen, ob es für Ihren Anwendungsfall überhaupt machbar ist, so lange zu warten (obwohl es in unserem Fall sehr schnell ist):

import json
import time
import fitz

import torch
from transformers import AutoModel, AutoTokenizer, pipeline

from rich.console import Console
console = Console()

Und das erhalten wir aus unserem Originalbild:

INPUT_PDF_FILE = "./data/ocr_hf_main_page.pdf"
OUTPUT_PNG_FILE = "./data/ocr_hf_main_page.png"

doc = fitz.open(INPUT_PDF_FILE)
page = doc.load_page(0)
pixmap = page.get_pixmap(dpi=300)
img = pixmap.tobytes()

with console.status("Converting PDF to PNG...", spinner="monkey"):
    with open(OUTPUT_PNG_FILE, "wb") as f:
        f.write(img)

^ den gesamten Text, keine Formatierung, aber es ist beabsichtigt.

GOT-OCR2_0 ist ziemlich flexibel – es kann in verschiedenen Formaten ausgeben, einschließlich HTML. Hier sind einige andere Möglichkeiten, wie Sie es verwenden können:

tokenizer = AutoTokenizer.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    device_map="cuda",
    trust_remote_code=True,
)
model = AutoModel.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    trust_remote_code=True,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    pad_token_id=tokenizer.eos_token_id,
)
model = model.eval().cuda()

Versuchen Sie es endlich mit LLM

Jetzt kommt der spaßige Teil – die Auswahl eines LLM. Es gab endlose Diskussionen darüber, welches das Beste ist, und überall gab es Artikel. Aber lassen Sie es uns einfach halten: Was ist das LLM, von dem jeder und sein Hund gehört haben? Lama. Also verwenden wir Llama-3.2-1B, um Text zu verarbeiten.

Was können wir aus dem Text lernen? Denken Sie an grundlegende Dinge wie Textklassifizierung, Stimmungsanalyse, Spracherkennung usw. Stellen Sie sich vor, Sie bauen ein System auf, um hochgeladene Dokumente automatisch zu kategorisieren oder eingehende Faxe für eine Apotheke zu sortieren.

Ich überspringe den tiefen Einblick in Prompt Engineering (das ist ein ganz anderer Artikel und ich glaube nicht, dass ich einen schreiben werde), aber hier ist die Grundidee:

def run_ocr_for_file(func: callable, text: str):
    start_time = time.time()
    res = func()
    final_time = time.time() - start_time

    console.rule(f"[bold red] {text} [/bold red]")
    console.print(res)
    console.rule(f"Time: {final_time} seconds")

    return res

result_text = None
with console.status(
    "Running OCR for the result file...",
    spinner="monkey",
):
    result_text = run_ocr_for_file(
        lambda: model.chat(
            tokenizer,
            OUTPUT_PNG_FILE,
            ocr_type="ocr",
        ),
        "plain texts OCR",
    )

Übrigens, mache ich hier etwas unglaublich Dummes mit Aufforderung/Inhalt? Lass es mich wissen. Ziemlich neu im Bereich „Prompt Engineering“ und ich nehme es noch nicht ernst genug.

Das Modell verpackt das Ergebnis manchmal in Markdown-Codeblöcke, also müssen wir damit umgehen (falls jemand einen saubereren Weg kennt, ich bin ganz Ohr):

Hugging Face- The Al community building the future.  https: / / hugging face. co/  Search models, datasets, users. . .  Following 0
All Models Datasets Spaces Papers Collections Community Posts Up votes Likes New Follow your favorite Al creators Refresh List black-
forest- labs· Advancing state- of- the- art image generation Follow stability a i· Sharing open- source image generation models
Follow bria a i· Specializing in advanced image editing models Follow Trending last 7 days All Models Datasets Spaces deep see k- a
i/ Deep Seek- V 3 Updated 3 days ago· 40 k· 877 deep see k- a i/ Deep Seek- V 3- Base Updated 3 days ago· 6.34 k· 1.06 k 2.39 k
TRELLIS Q wen/ QV Q- 72 B- Preview 88888888888888888888 888888888888888888 301 Gemini Co der 1 of 3 2025-01-01,9:38 p. m

Und hier ist, was wir normalerweise als Ausgabe erhalten:

# format texts OCR:
result_text = model.chat(
  tokenizer,
  image_file,
  ocr_type='format',
)

# fine-grained OCR:
result_text = model.chat(
  tokenizer,
  image_file,
  ocr_type='ocr',
  ocr_box='',
)
# ... ocr_type='format', ocr_box='')
# ... ocr_type='ocr', ocr_color='')
# ... ocr_type='format', ocr_color='')

# multi-crop OCR:
# ... ocr_type='ocr')
# ... ocr_type='format')

# render the formatted OCR results:
result_text = model.chat(
  tokenizer,
  image_file,
  ocr_type='format',
  render=True,
  save_render_file = './demo.html',
)

Um zusammenzufassen

Wir haben eine kleine Pipeline erstellt, die eine PDF-Datei aufnehmen, ihren Text mithilfe einer ziemlich guten OCR extrahieren und diesen Text dann mithilfe eines LLM analysieren kann, um nützliche Metadaten zu erhalten. Ist es produktionsreif? Wahrscheinlich nicht. Aber es ist ein guter Ausgangspunkt, wenn Sie etwas Ähnliches bauen möchten. Das Coole daran ist, wie wir verschiedene Open-Source-Tools kombiniert haben, um etwas Nützliches zu schaffen – von der PDF-Verarbeitung über OCR bis hin zur LLM-Analyse.

Sie können dies problemlos erweitern. Fügen Sie möglicherweise eine bessere Fehlerbehandlung hinzu, unterstützen Sie mehrere Seiten oder probieren Sie verschiedene LLMs aus. Oder schließen Sie es vielleicht an ein Dokumentenverwaltungssystem an. Ich hoffe, Sie werden es tun. Es könnte eine lustige Aufgabe sein.

Denken Sie daran, dass dies nur eine Möglichkeit ist – es gibt wahrscheinlich Dutzende anderer Ansätze, die für Ihren spezifischen Anwendungsfall besser funktionieren könnten. Aber hoffentlich gibt Ihnen das einen guten Ausgangspunkt für Ihre eigenen Experimente! Oder ein perfekter Ort, um mir in den Kommentaren zu zeigen, wie es gemacht wird.

Das obige ist der detaillierte Inhalt vonSchnelle und schmutzige Dokumentenanalyse: Kombination von GOT-OCR und LLama in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:CocoCaptions in PyTorch (3)Nächster Artikel:CocoCaptions in PyTorch (3)