Maison >Périphériques technologiques >IA >Paligemma 2 Mix: un guide avec un projet de démo OCR
Le mélange Paligemma 2 est un modèle d'IA multimodal développé par Google. Il s'agit d'une version améliorée du modèle de langage de vision Paligemma (VLM), intégrant les capacités avancées du modèle Siglip Vision et des modèles de langue Gemma 2.
Dans ce tutoriel, je vais expliquer comment utiliser Paligemma 2 Mix pour construire un scanner de factures et un analyseur de dépenses alimenté par AI capable de:
Bien que nous nous concentrons sur la création d'un outil d'insistance financière, vous pouvez utiliser ce que vous apprenez dans ce blog pour explorer d'autres cas d'utilisation de mix Paligemma 2, tels que la segmentation de l'image, la détection d'objets et la réponse aux questions.
Le mix Paligemma 2 est un modèle avancé de vision-langage (VLM) qui traite à la fois les images et le texte en entrée et génère des sorties de texte. Il est conçu pour gérer une gamme diversifiée de tâches d'IA multimodales tout en prenant en charge plusieurs langues.
Paligemma 2 est conçu pour un large éventail de tâches de langue visuelle, y compris l'image et le sous-titrage vidéo court, la réponse à la question visuelle, la reconnaissance des caractères optiques (OCR), la détection d'objets et la segmentation.
Source des images utilisées dans le diagramme: Google
Le modèle de mélange Paligemma 2 est conçu pour:
Vous pouvez trouver plus d'informations sur le modèle de mix Paligemma 2 dans l'article de version officielle.
Décrivons les principales étapes que nous allons prendre:
Avant de commencer, assurez-vous que nous avons installé les outils et bibliothèques suivants:
Exécutez les commandes suivantes pour installer les dépendances nécessaires:
pip install gradio -U bitsandbytes -U transformers -q
Une fois les dépendances ci-dessus installées, exécutez les commandes d'importation suivantes:
import gradio as gr import torch import pandas as pd import matplotlib.pyplot as plt from transformers import PaliGemmaForConditionalGeneration, PaliGemmaProcessor, BitsAndBytesConfig from transformers import BitsAndBytesConfig from PIL import Image import re
Nous configurons et chargeons le modèle de mélange Paligemma 2 avec la quantification pour optimiser les performances. Pour cette démo, nous utiliserons le modèle de paramètre 10b avec une résolution d'image d'entrée 448 x 448. Vous avez besoin d'un minimum de GPU T4 avec une mémoire de 40 Go (configuration Colab) pour exécuter ce modèle.
device = "cuda" if torch.cuda.is_available() else "cpu" # Model setup model_id = "google/paligemma2-10b-mix-448" bnb_config = BitsAndBytesConfig( load_in_8bit=True, # Change to load_in_4bit=True for even lower memory usage llm_int8_threshold=6.0, ) # Load model with quantization model = PaliGemmaForConditionalGeneration.from_pretrained( model_id, quantization_config=bnb_config ).eval() # Load processor processor = PaliGemmaProcessor.from_pretrained(model_id) # Print success message print("Model and processor loaded successfully!")
La quantification des bitsandbytes aide à réduire l'utilisation de la mémoire tout en maintenant les performances, ce qui permet d'exécuter de grands modèles sur des ressources GPU limitées. Dans cette implémentation, nous utilisons la quantification 4 bits pour optimiser davantage l'efficacité de la mémoire.
Nous chargeons le modèle à l'aide de la classe PaligemMaforConditionAlGeneration de la bibliothèque Transformers en transmettant l'ID du modèle et la configuration de quantification. De même, nous chargeons le processeur, qui prépare les entrées dans les tenseurs avant de le passer au modèle.
Une fois les éclats du modèle chargés, nous traitons les images avant de les transmettre au modèle pour maintenir la compatibilité du format d'image et gagner l'uniformité. Nous convertissons les images au format RVB:
def ensure_rgb(image: Image.Image) -> Image.Image: if image.mode != "RGB": image = image.convert("RGB") return image
Maintenant, nos images sont prêtes à l'inférence.
Maintenant, nous avons configuré la fonction principale pour exécuter l'inférence avec le modèle. Cette fonction prend en place des images et des questions d'entrée, les intègre dans des invites et les transmet au modèle via le processeur pour l'inférence.
def ask_model(image: Image.Image, question: str) -> str: prompt = f"<image> answer en {question}" inputs = processor(text=prompt, images=image, return_tensors="pt").to(device) with torch.inference_mode(): generated_ids = model.generate( **inputs, max_new_tokens=50, do_sample=False ) result = processor.batch_decode(generated_ids, skip_special_tokens=True) return result[0].strip()
Maintenant que nous avons la fonction principale prête, nous travaillerons ensuite sur l'extraction des paramètres clés de l'image - dans notre cas, ce sont la catégorie totale de montants et de marchandises.
pip install gradio -U bitsandbytes -U transformers -q
La fonction extract_total_amount () traite une image pour extraire la quantité totale d'un reçu en utilisant OCR. Il construit une requête (question) demandant au modèle d'extraire uniquement des valeurs numériques, puis il appelle la fonction ASK_MODEL () pour générer une réponse à partir du modèle.
import gradio as gr import torch import pandas as pd import matplotlib.pyplot as plt from transformers import PaliGemmaForConditionalGeneration, PaliGemmaProcessor, BitsAndBytesConfig from transformers import BitsAndBytesConfig from PIL import Image import re
La fonction catégorize_goods () classe le type de biens dans une image en invitant le modèle avec une question prédéfinie énumérant les catégories possibles: épicerie, vêtements, électronique ou autre. La fonction ASK_MODEL () traite ensuite l'image et renvoie une réponse textuelle. Si la réponse traitée correspond à l'une des catégories valides prédéfinies, elle renvoie cette catégorie - autrement, elle par défaut la catégorie "autre".
Nous avons toutes les fonctions clés prêtes, alors analysons les sorties.
device = "cuda" if torch.cuda.is_available() else "cpu" # Model setup model_id = "google/paligemma2-10b-mix-448" bnb_config = BitsAndBytesConfig( load_in_8bit=True, # Change to load_in_4bit=True for even lower memory usage llm_int8_threshold=6.0, ) # Load model with quantization model = PaliGemmaForConditionalGeneration.from_pretrained( model_id, quantization_config=bnb_config ).eval() # Load processor processor = PaliGemmaProcessor.from_pretrained(model_id) # Print success message print("Model and processor loaded successfully!")
La fonction ci-dessus crée un graphique à secteurs pour visualiser la distribution des dépenses entre différentes catégories. Si aucune données de dépenses valides n'existe, elle génère un chiffre vide avec un message indiquant «pas de données de dépenses». Sinon, il crée un graphique à secteurs avec des étiquettes de catégorie et des valeurs de pourcentage, garantissant une visualisation proportionnelle et bien alignée.
Nous avons généralement plusieurs factures à analyser, alors créons une fonction pour traiter toutes nos factures simultanément.
def ensure_rgb(image: Image.Image) -> Image.Image: if image.mode != "RGB": image = image.convert("RGB") return image
Pour analyser plusieurs factures à la fois, nous effectuons les étapes suivantes:
Maintenant, nous avons toutes les fonctions de logique clés en place. Ensuite, nous travaillons sur la construction d'une interface utilisateur interactive avec Gradio.
def ask_model(image: Image.Image, question: str) -> str: prompt = f"<image> answer en {question}" inputs = processor(text=prompt, images=image, return_tensors="pt").to(device) with torch.inference_mode(): generated_ids = model.generate( **inputs, max_new_tokens=50, do_sample=False ) result = processor.batch_decode(generated_ids, skip_special_tokens=True) return result[0].strip()
Le code ci-dessus crée une interface utilisateur de gradio structurée avec un téléchargeur de fichiers pour plusieurs images et un bouton de soumission pour déclencher le traitement. Lors de la soumission, les images de factures téléchargées sont affichées dans une galerie, les données extraites sont affichées dans un tableau, les dépenses totales sont résumées dans le texte et un graphique à secteurs de distribution de dépenses est généré.
La fonction connecte les entrées utilisateur à la fonction process_multiple_bills (), assurant une extraction et une visualisation de données transparentes. Enfin, la fonction démo.launch () démarre l'application Gradio pour l'interaction en temps réel.
J'ai également essayé cette démo avec deux factures basées sur l'image (Amazon Shopping Facture) et j'ai obtenu les résultats suivants.
Remarque: les VLM ont du mal à extraire des nombres, ce qui peut parfois entraîner des résultats incorrects. Par exemple, il a extrait le mauvais montant total pour le deuxième projet de loi ci-dessous. Ceci est corrigeable avec l'utilisation de modèles plus grands ou tout simplement affiner ceux existants.
Dans ce didacticiel, nous avons construit un scanner de factures multiples alimenté en AI à l'aide de Paligemma 2 Mix, qui peut nous aider à extraire et classer nos dépenses à partir de reçus. Nous avons utilisé les capacités de langue visuelle de Paligemma 2 Mix pour l'OCR et la classification pour analyser les informations sur les dépenses sans effort. Je vous encourage à adapter ce tutoriel à votre propre cas d'utilisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!