Utilisation de Florence 2¶
Description¶
Florence-2 est le dernier modèle de Microsoft dans le domaine de la vision par ordinateur, marquant un tournant significatif dans les capacités des modèles de traitement d'image. Ce modèle se distingue par son approche unifiée, capable d'aborder divers défis de vision tels que le captioning, la reconnaissance d'objets, et bien d'autres. Développé sur une vaste base de données, le modèle Florence-2 bénéficie d'une formation étendue avec 5,4 milliards d'annotations sur 126 millions d'images, lui permettant de réaliser des performances impressionnantes tout en restant relativement compact. Disponible sous une licence MIT permissive, il offre une flexibilité d'utilisation et de personnalisation pour diverses applications commerciales et privées.
!pip install timm einops flash_attn
Importation des bibliothèques¶
Nous importons les bibliothèques nécessaires pour traiter les images, gérer les requêtes et utiliser le modèle Florence 2.
import requests
from PIL import Image, ImageDraw
from transformers import AutoProcessor, AutoModelForCausalLM
import torch
from IPython.display import display, Markdown, HTML
Définition de la fonction de dessin de boîtes englobantes¶
Nous définissons une fonction draw_bboxes_with_labels
qui permet de dessiner des boîtes
englobantes avec des étiquettes sur une image donnée.
def draw_bboxes_with_labels(image : Image, predictions : dict[list]) -> Image:
"""
Draws bounding boxes with labels on an image.
Args:
image: A PIL Image object.
predictions: A list of dictionaries, where each dictionary contains 'bbox' (list of coordinates) and 'label' (string).
Returns:
The modified PIL Image object with drawn bounding boxes and labels.
"""
draw = ImageDraw.Draw(image)
bboxes = predictions["bboxes"]
labels = predictions["labels"]
for i in range(len(bboxes)):
bbox = bboxes[i]
label = labels[i]
draw.rectangle(bbox, outline="red", width=2)
draw.text((bbox[0], bbox[1]-10), label, fill="red")
return image
Vérification de la disponibilité de CUDA¶
La cellule suivante vérifie si CUDA est disponible pour utiliser le modèle sur le GPU. Si CUDA n'est pas disponible, une exception sera levée.
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")
Chargement du modèle et du processeur¶
Nous chargeons le modèle AutoModelForCausalLM
et le processeur AutoProcessor
à
partir du dépôt pré-entraîné "microsoft/Florence-2-base".
model = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-base", trust_remote_code=True, cache_dir="/content")
processor = AutoProcessor.from_pretrained("microsoft/Florence-2-base", trust_remote_code=True, cache_dir="/content")
Définition de la fonction d'exécution des exemples¶
La fonction run_example
exécute une tâche spécifique en utilisant le modèle Florence 2. La
tâche initiale et l'image sont fournies comme paramètres.
def run_example(task_prompt: str, image: Image, text_input: str = '') -> dict:
"""
Runs the example task based on the given prompt, image, and optional text input.
Args:
task_prompt (str): The task prompt to be used.
image (Image): The image to be processed.
text_input (str, optional): Additional text input for tasks that require it. Defaults to ''.
Returns:
dict: The parsed answer from the model, including bounding boxes and labels as per the task.
"""
prompt = task_prompt + text_input
inputs = processor(text=prompt, images=image, return_tensors="pt").to(device) # Move inputs to device
# Move model to device
model.to(device)
generated_ids = model.generate(
input_ids=inputs["input_ids"],
pixel_values=inputs["pixel_values"],
max_new_tokens=1024,
num_beams=3
)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=False)[0]
parsed_answer = processor.post_process_generation(generated_text, task=task_prompt, image_size=(image.width, image.height))
return parsed_answer
Exécution des tâches¶
Nous allons maintenant spécifier la tâche que nous souhaitons exécuter, fournir l'image à analyser et afficher les résultats.
Choix de la tâche et du prompt¶
Nous définissons la tâche et le prompt à utiliser. Dans cet exemple, nous utilisons l'URL d'une image de voiture et un prompt pour identifier des "doors".
# @title TASK
task = "Caption" # @param ['Caption', 'Detailed Caption', 'More Detailed Caption', 'Caption To Phrase Grounding', 'Od', 'Dense Region Caption', 'Region Proposal', 'Ocr', 'Ocr With Region']
prompt = "" # @param {type:"string"}
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg?download=true" # @param {type:"string"}
image = Image.open(requests.get(url, stream=True).raw)
Exécution de la tâche et affichage des résultats¶
Nous exécutons la tâche choisie sur l'image fournie et affichons le résultat, en dessinant des boîtes englobantes si nécessaire.
task = f"<{task.upper().replace(' ', '_')}>"
try :
response = run_example(task, image, prompt)[task]
except AssertionError :
display(HTML('Warning : prompt value not used
'))
response = run_example(task, image)[task]
if isinstance(response, dict):
if 'bboxes' in response.keys() and 'labels' in response.keys():
display(draw_bboxes_with_labels(image, response))
else : print(response)
A green car parked in front of a yellow building.
Utilisation de Florence 2¶
Description¶
Florence-2 est le dernier modèle de Microsoft dans le domaine de la vision par ordinateur, marquant un tournant significatif dans les capacités des modèles de traitement d'image. Ce modèle se distingue par son approche unifiée, capable d'aborder divers défis de vision tels que le captioning, la reconnaissance d'objets, et bien d'autres. Développé sur une vaste base de données, le modèle Florence-2 bénéficie d'une formation étendue avec 5,4 milliards d'annotations sur 126 millions d'images, lui permettant de réaliser des performances impressionnantes tout en restant relativement compact. Disponible sous une licence MIT permissive, il offre une flexibilité d'utilisation et de personnalisation pour diverses applications commerciales et privées.
!pip install timm einops flash_attn
Importation des bibliothèques¶
Nous importons les bibliothèques nécessaires pour traiter les images, gérer les requêtes et utiliser le modèle Florence 2.
import requests
from PIL import Image, ImageDraw
from transformers import AutoProcessor, AutoModelForCausalLM
import torch
from IPython.display import display, Markdown, HTML
Définition de la fonction de dessin de boîtes englobantes¶
Nous définissons une fonction draw_bboxes_with_labels
qui permet de dessiner des boîtes
englobantes avec des étiquettes sur une image donnée.
def draw_bboxes_with_labels(image : Image, predictions : dict[list]) -> Image:
"""
Draws bounding boxes with labels on an image.
Args:
image: A PIL Image object.
predictions: A list of dictionaries, where each dictionary contains 'bbox' (list of coordinates) and 'label' (string).
Returns:
The modified PIL Image object with drawn bounding boxes and labels.
"""
draw = ImageDraw.Draw(image)
bboxes = predictions["bboxes"]
labels = predictions["labels"]
for i in range(len(bboxes)):
bbox = bboxes[i]
label = labels[i]
draw.rectangle(bbox, outline="red", width=2)
draw.text((bbox[0], bbox[1]-10), label, fill="red")
return image
Vérification de la disponibilité de CUDA¶
La cellule suivante vérifie si CUDA est disponible pour utiliser le modèle sur le GPU. Si CUDA n'est pas disponible, une exception sera levée.
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")
Chargement du modèle et du processeur¶
Nous chargeons le modèle AutoModelForCausalLM
et le processeur AutoProcessor
à
partir du dépôt pré-entraîné "microsoft/Florence-2-base".
model = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-base", trust_remote_code=True, cache_dir="/content")
processor = AutoProcessor.from_pretrained("microsoft/Florence-2-base", trust_remote_code=True, cache_dir="/content")
Définition de la fonction d'exécution des exemples¶
La fonction run_example
exécute une tâche spécifique en utilisant le modèle Florence 2. La
tâche initiale et l'image sont fournies comme paramètres.
def run_example(task_prompt: str, image: Image, text_input: str = '') -> dict:
"""
Runs the example task based on the given prompt, image, and optional text input.
Args:
task_prompt (str): The task prompt to be used.
image (Image): The image to be processed.
text_input (str, optional): Additional text input for tasks that require it. Defaults to ''.
Returns:
dict: The parsed answer from the model, including bounding boxes and labels as per the task.
"""
prompt = task_prompt + text_input
inputs = processor(text=prompt, images=image, return_tensors="pt").to(device) # Move inputs to device
# Move model to device
model.to(device)
generated_ids = model.generate(
input_ids=inputs["input_ids"],
pixel_values=inputs["pixel_values"],
max_new_tokens=1024,
num_beams=3
)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=False)[0]
parsed_answer = processor.post_process_generation(generated_text, task=task_prompt, image_size=(image.width, image.height))
return parsed_answer
Exécution des tâches¶
Nous allons maintenant spécifier la tâche que nous souhaitons exécuter, fournir l'image à analyser et afficher les résultats.
Choix de la tâche et du prompt¶
Nous définissons la tâche et le prompt à utiliser. Dans cet exemple, nous utilisons l'URL d'une image de voiture et un prompt pour identifier des "doors".
# @title TASK
task = "Caption" # @param ['Caption', 'Detailed Caption', 'More Detailed Caption', 'Caption To Phrase Grounding', 'Od', 'Dense Region Caption', 'Region Proposal', 'Ocr', 'Ocr With Region']
prompt = "" # @param {type:"string"}
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg?download=true" # @param {type:"string"}
image = Image.open(requests.get(url, stream=True).raw)
Exécution de la tâche et affichage des résultats¶
Nous exécutons la tâche choisie sur l'image fournie et affichons le résultat, en dessinant des boîtes englobantes si nécessaire.
task = f"<{task.upper().replace(' ', '_')}>"
try :
response = run_example(task, image, prompt)[task]
except AssertionError :
display(HTML('Warning : prompt value not used
'))
response = run_example(task, image)[task]
if isinstance(response, dict):
if 'bboxes' in response.keys() and 'labels' in response.keys():
display(draw_bboxes_with_labels(image, response))
else : print(response)
A green car parked in front of a yellow building.