OCR-VQA mit Donut
Einführung
Stellen Sie sich vor, Sie können eine Frage zu einem Foto stellen und die Antwort wird nicht nur durch das Bild selbst, sondern auch durch den darin enthaltenen Text angezeigt! Dies ist die faszinierende Welt der optischen Zeichenerkennung (engl. Optical Character Recognition, OCR) und der visuellen Fragenbeantwortung (engl. Visual Question Answering, VQA).
Die OCR-Technologie überbrückt die Kluft zwischen dem Physischen und dem Digitalen und ermöglicht es Computern, Text in Bildern zu “lesen”. VQA geht noch einen Schritt weiter. Durch die Kombination der OCR-Fähigkeit, Text zu extrahieren, mit fortschrittlicher Bildanalyse können VQA-Systeme Fragen beantworten, bei denen es darauf ankommt, sowohl den visuellen Inhalt als auch den eingebetteten Text zu verstehen.
Hier kommt das Document Understanding Transformer (Donut)-Modell ins Spiel, ein leistungsstarkes Tool, das das Potenzial von OCR und VQA nutzt. In den folgenden Abschnitten sehen wir uns genauer an, wie Donut funktioniert und wie Sie es nutzen können, um die verborgenen Erkenntnisse in Ihren Bildern und Texten zu erschließen.
Get Mert’s stories in your inbox
Join Medium for free to get updates from this writer.
Während das Innenleben von Donut faszinierend ist, konzentriert sich dieser Blog auf seine praktische Anwendung. Wir ersparen Ihnen die theoretische Vertiefung und geben Ihnen stattdessen das Wissen an die Hand, um Donut in Ihren eigenen Projekten einzusetzen. Wir führen Sie durch die ersten Schritte, vom Einrichten des Modells bis zum Extrahieren wertvoller Informationen aus Ihren Bildern und Texten. Für diejenigen, die neugierig auf das Innenleben des Donut-Modells sind, gibt es am Ende einige Links. Sie können Donut auch für die Klassifizierung von Dokumentenbildern und das Verstehen von Formularen verwenden.
Wie man Donut für OCR-VQA nutzt
Schritt 1: Installiere die Bibliotheken
pip install transformers torch opencv-pythonSchritt 2: Importiere die Bibliotheken
from transformers import DonutProcessor, VisionEncoderDecoderModel
import cv2
import torch
import reSchritt 3: Lade das Model und den Prozessor
processor = DonutProcessor.from_pretrained("naver-clova-ix/donut-base-finetuned-docvqa")
model = VisionEncoderDecoderModel.from_pretrained("naver-clova-ix/donut-base-finetuned-docvqa")
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)Wenn Sie einen Grafikprozessor haben, sollten Sie ihn verwenden, da Sie so viel schnellere Ergebnisse erzielen.
Schritt 4: Lade das Bild
image_path = r"DeinBildPfad"
image = cv2.imread(image_path)Schritt 5: Gebe den Prompt ein
# prepare decoder inputs
task_prompt = "<s_docvqa><s_question>{user_input}</s_question><s_answer>"
question = "What's the population of Dade?"
prompt = task_prompt.replace("{user_input}", question)
decoder_input_ids = processor.tokenizer(prompt, add_special_tokens=False, return_tensors="pt").input_idsSchritt 6: Bereite den Input des Decoders vor
decoder_input_ids = processor.tokenizer(prompt, add_special_tokens=False, return_tensors="pt").input_ids
pixel_values = processor(image, return_tensors="pt").pixel_values
outputs = model.generate(
pixel_values.to(device),
decoder_input_ids=decoder_input_ids.to(device),
max_length=model.decoder.config.max_position_embeddings,
pad_token_id=processor.tokenizer.pad_token_id,
eos_token_id=processor.tokenizer.eos_token_id,
use_cache=True,
bad_words_ids=[[processor.tokenizer.unk_token_id]],
return_dict_in_generate=True,
)Schritt 7: Erhalte das Ergebnis
sequence = processor.batch_decode(outputs.sequences)[0]
sequence = sequence.replace(processor.tokenizer.eos_token, "").replace(processor.tokenizer.pad_token, "")
sequence = re.sub(r"<.*?>", "", sequence, count=1).strip() # remove first task start token
print(processor.token2json(sequence))Fazit
In diesem Tutorial haben wir gelernt, wie man Donut für OCR-VQA verwendet. Wenn Sie diesen Code hilfreich fanden, klatschen Sie bitte in die Hände und kommentieren Sie diesen Beitrag! Ich würde mich auch freuen, wenn Sie mir folgen würden, um mehr über Data Science und andere verwandte Themen zu erfahren. Vielen Dank fürs Lesen!
Paper of Donut: https://arxiv.org/abs/2111.15664
Github-Page of Donut: https://github.com/WongKinYiu/yolov9
Huggingface-Demo: https://huggingface.co/spaces/nielsr/donut-docvqa
Wie man das Donut Model fine-tuned: https://www.freecodecamp.org/news/how-to-fine-tune-the-donut-model/









