Transformers documentation

Correspondencia de puntos clave

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

and get access to the augmented documentation experience

to get started

Correspondencia de puntos clave

El emparejamiento de puntos clave coincide puntos de interés distintos que pertenecen al mismo objeto que aparece en dos imágenes diferentes. La mayoría de los emparejadores de puntos clave modernos toman imágenes como entrada y producen la siguiente salida:

  • Coordenadas de puntos clave (x,y): correspondencia uno a uno de las coordenadas de píxeles entre la primera y la segunda imagen mediante dos listas. Cada punto clave en un índice dado de la primera lista se corresponde con el punto clave en el mismo índice de la segunda lista.
  • Puntuaciones de coincidencia: Puntuaciones asignadas a las coincidencias de puntos clave.

En este tutorial, extraerás coincidencias de puntos clave con el modelo EfficientLoFTR entrenado con el MatchAnything framework, y refinarás las coincidencias. Este modelo tiene solo 16M de parámetros y se puede ejecutar en una CPU. Utilizarás la clase AutoModelForKeypointMatching.

from transformers import AutoImageProcessor, AutoModelForKeypointMatching
import torch

processor = AutoImageProcessor.from_pretrained("zju-community/matchanything_eloftr")
model = AutoModelForKeypointMatching.from_pretrained("zju-community/matchanything_eloftr")

Cargue dos imágenes que tengan el mismo objeto de interés. La segunda foto se tomó un segundo después, sus colores están editados y está recortada y rotada en mayor medida.

Bee Bee edited
from transformers.image_utils import load_image
image1 = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg")
image2 = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee_edited.jpg")

images = [image1, image2]

Podemos pasar las imágenes al procesador y realizar la inferencia.

inputs = processor(images, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

Podemos aplicar un postprocesamiento a las salidas. El parámetro threshold se utiliza para refinar el ruido (umbrales de confianza más bajos) en las coincidencias de la salida.

image_sizes = [[(image.height, image.width) for image in images]]

outputs = processor.post_process_keypoint_matching(outputs, image_sizes, threshold=0.2)
print(outputs)

Aquí están las salidas.

[{'keypoints0': tensor([[4514,  550],
          [4813,  683],
          [1972, 1547],
          ...
          [3916, 3408]], dtype=torch.int32),
  'keypoints1': tensor([[2280,  463],
          [2378,  613],
          [2231,  887],
          ...
          [1521, 2560]], dtype=torch.int32),
  'matching_scores': tensor([0.2189, 0.2073, 0.2414, ...
    ])}]

Hemos recortado la salida, ¡pero hay 401 coincidencias!

len(outputs[0]["keypoints0"])
# 401

Podemos visualizarlos usando el método visualize_keypoint_matching() del procesador.

plot_images = processor.visualize_keypoint_matching(images, outputs)
plot_images

Matched Image

Opcionalmente, puede usar la API de Pipeline y establecer la tarea en keypoint-matching.

from transformers import pipeline 

image_1 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
image_2 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee_edited.jpg"

pipe = pipeline("keypoint-matching", model="zju-community/matchanything_eloftr")
pipe([image_1, image_2])

La salida tiene el siguiente aspecto.

[{'keypoint_image_0': {'x': 2444, 'y': 2869},
  'keypoint_image_1': {'x': 837, 'y': 1500},
  'score': 0.9756593704223633},
 {'keypoint_image_0': {'x': 1248, 'y': 2819},
  'keypoint_image_1': {'x': 862, 'y': 866},
  'score': 0.9735618829727173},
 {'keypoint_image_0': {'x': 1547, 'y': 3317},
  'keypoint_image_1': {'x': 1436, 'y': 1500},
  ...
 }
]
Update on GitHub