Transformers documentation
Detección de puntos clave
Detección de puntos clave
La detección de puntos clave identifica y localiza puntos de interés específicos dentro de una imagen. Estos puntos clave, también conocidos como puntos de referencia, representan características significativas de los objetos, como rasgos faciales o partes de objetos. Estos modelos toman una imagen como entrada y devuelven las siguientes salidas:
- Puntos clave y puntuaciones: Puntos de interés y sus puntuaciones de confianza.
- Descriptores: una representación de la región de la imagen que rodea cada punto clave, que captura su textura, gradiente, orientación y otras propiedades.
En esta guía, mostraremos cómo extraer puntos clave de imágenes.
Para este tutorial, utilizaremos SuperPoint, un modelo de base para la detección de puntos clave.
from transformers import AutoImageProcessor, SuperPointForKeypointDetection
processor = AutoImageProcessor.from_pretrained("magic-leap-community/superpoint")
model = SuperPointForKeypointDetection.from_pretrained("magic-leap-community/superpoint")Probemos el modelo con las imágenes siguientes.

import torch
from PIL import Image
import requests
import cv2
url_image_1 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
image_1 = Image.open(requests.get(url_image_1, stream=True).raw)
url_image_2 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png"
image_2 = Image.open(requests.get(url_image_2, stream=True).raw)
images = [image_1, image_2]Ahora podemos procesar nuestras entradas y realizar la inferencia.
inputs = processor(images,return_tensors="pt").to(model.device, model.dtype)
outputs = model(**inputs)La salida del modelo incluye puntos clave relativos, descriptores, máscaras y puntuaciones para cada elemento del lote. La máscara resalta las áreas de la imagen donde están presentes los puntos clave.
SuperPointKeypointDescriptionOutput(loss=None, keypoints=tensor([[[0.0437, 0.0167],
[0.0688, 0.0167],
[0.0172, 0.0188],
...,
[0.5984, 0.9812],
[0.6953, 0.9812]]]),
scores=tensor([[0.0056, 0.0053, 0.0079, ..., 0.0125, 0.0539, 0.0377],
[0.0206, 0.0058, 0.0065, ..., 0.0000, 0.0000, 0.0000]],
grad_fn=<CopySlices>), descriptors=tensor([[[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
...],
grad_fn=<CopySlices>), mask=tensor([[1, 1, 1, ..., 1, 1, 1],
[1, 1, 1, ..., 0, 0, 0]], dtype=torch.int32), hidden_states=None)Para trazar los puntos clave reales en la imagen, necesitamos postprocesar la salida. Para ello, debemos pasar los tamaños reales de la imagen a post_process_keypoint_detection junto con las salidas.
image_sizes = [(image.size[1], image.size[0]) for image in images]
outputs = processor.post_process_keypoint_detection(outputs, image_sizes)Las salidas ahora son una lista de diccionarios donde cada diccionario es una salida procesada de puntos clave, puntuaciones y descriptores.
[{'keypoints': tensor([[ 226, 57],
[ 356, 57],
[ 89, 64],
...,
[3604, 3391]], dtype=torch.int32),
'scores': tensor([0.0056, 0.0053, ...], grad_fn=<IndexBackward0>),
'descriptors': tensor([[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357]],
grad_fn=<IndexBackward0>)},
{'keypoints': tensor([[ 46, 6],
[ 78, 6],
[422, 6],
[206, 404]], dtype=torch.int32),
'scores': tensor([0.0206, 0.0058, 0.0065, 0.0053, 0.0070, ...,grad_fn=<IndexBackward0>),
'descriptors': tensor([[-0.0525, 0.0726, 0.0270, ..., 0.0389, -0.0189, -0.0211],
[-0.0525, 0.0726, 0.0270, ..., 0.0389, -0.0189, -0.0211]}]Podemos usarlos para graficar los puntos clave.
import matplotlib.pyplot as plt
import torch
for i in range(len(images)):
keypoints = outputs[i]["keypoints"]
scores = outputs[i]["scores"]
descriptors = outputs[i]["descriptors"]
keypoints = outputs[i]["keypoints"].detach().numpy()
scores = outputs[i]["scores"].detach().numpy()
image = images[i]
image_width, image_height = image.size
plt.axis('off')
plt.imshow(image)
plt.scatter(
keypoints[:, 0],
keypoints[:, 1],
s=scores * 100,
c='cyan',
alpha=0.4
)
plt.show()A continuación puede ver las salidas.
