Transformers documentation

Extraction de caractéristiques d'image

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Extraction de caractéristiques d'image

L’extraction de caractéristiques d’images consiste à extraire des caractéristiques sémantiquement significatives à partir d’une image. Cette tâche présente de nombreuses applications, notamment la similarité d’images et la récupération d’images. De plus, la plupart des modèles de vision par ordinateur peuvent être utilisés pour l’extraction de caractéristiques d’images : il suffit de retirer la tête spécifique à la tâche (classification d’images, détection d’objets, etc.) pour obtenir les caractéristiques. Ces caractéristiques sont très utiles à un niveau supérieur : détection de contours, détection de coins, etc. Elles peuvent également contenir des informations sur le monde réel (par exemple, à quoi ressemble un chat), selon la profondeur du modèle. Par conséquent, ces sorties peuvent être utilisées pour entraîner de nouveaux classifieurs sur un jeu de données spécifique.

Dans ce guide, vous allez :

  • Apprenez à construire un système simple de similarité d’images à partir du pipeline image-feature-extraction.
  • Accomplir la même tâche avec une inférence sur le modèle brut.

Similarité d'images à l'aide du pipeline image-feature-extraction

Nous disposons de deux images de chats assis sur des filets de pêche, dont une est générée.

from PIL import Image
import requests

img_urls = ["https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png", "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.jpeg"]
image_real = Image.open(requests.get(img_urls[0], stream=True).raw).convert("RGB")
image_gen = Image.open(requests.get(img_urls[1], stream=True).raw).convert("RGB")

Passons le pipeline en action. Tout d’abord, initialisez le pipeline. Si vous ne lui transmettez aucun modèle, le pipeline sera automatiquement initialisé avec google/vit-base-patch16-224. Si vous souhaitez calculer la similarité, définissez pool sur True.

import torch
from transformers import pipeline
from accelerate import Accelerator
# automatically detects the underlying device type (CUDA, CPU, XPU, MPS, etc.)
device = Accelerator().device
pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-384", device=device, pool=True)

Pour effectuer une inférence avec pipe, passez-lui les deux images.

outputs = pipe([image_real, image_gen])

La sortie contient les embeddings agrégés de ces deux images.

# get the length of a single output
print(len(outputs[0][0]))
# show outputs
print(outputs)

# 768
# [[[-0.03909236937761307, 0.43381670117378235, -0.06913255900144577,

Pour obtenir le score de similarité, nous devons les transmettre à une fonction de similarité.

from torch.nn.functional import cosine_similarity

similarity_score = cosine_similarity(torch.Tensor(outputs[0]),
                                     torch.Tensor(outputs[1]), dim=1)

print(similarity_score)

# tensor([0.6043])

Si vous souhaitez obtenir les derniers états cachés avant le pooling, évitez de passer une valeur au paramètre pool, car il est défini sur False par défaut. Ces états cachés sont utiles pour entraîner de nouveaux classifieurs ou modèles basés sur les caractéristiques issues du modèle.

pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-224", device=device)
outputs = pipe(image_real)

Comme les sorties ne sont pas agrégées, nous obtenons les derniers états cachés, dont la première dimension correspond à la taille du lot et les deux dernières à la forme de l'embedding.

import numpy as np
print(np.array(outputs).shape)
# (1, 197, 768)

Obtenir les caractéristiques et les similarités avec AutoModel

Nous pouvons également utiliser la classe AutoModel de transformers pour obtenir les caractéristiques. AutoModel charge n’importe quel modèle de transformers sans tête spécifique à une tâche, et nous pouvons l’utiliser pour extraire les caractéristiques.

from transformers import AutoImageProcessor, AutoModel

processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = AutoModel.from_pretrained("google/vit-base-patch16-224").to(device)

Écrivons une fonction simple pour l’inférence. Nous transmettrons d’abord les entrées au processor, puis ses sorties au model.

def infer(image):
  inputs = processor(image, return_tensors="pt").to(device)
  outputs = model(**inputs)
  return outputs.pooler_output

Nous pouvons passer directement les images à cette fonction pour obtenir les embeddings.

embed_real = infer(image_real)
embed_gen = infer(image_gen)

Nous pouvons à nouveau obtenir la similarité sur les embeddings.

from torch.nn.functional import cosine_similarity

similarity_score = cosine_similarity(embed_real, embed_gen, dim=1)
print(similarity_score)

# tensor([0.6061], device='cuda:0', grad_fn=<SumBackward1>)
Update on GitHub