# 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](https://huggingface.co/zju-community/matchanything_eloftr), 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](/docs/transformers/main/es/model_doc/auto#transformers.AutoModelForKeypointMatching).

```python
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.

    <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
         alt="Bee"
         style="height: 200px; object-fit: contain; margin-right: 10px;">
    <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee_edited.jpg"
         alt="Bee edited"
         style="height: 200px; object-fit: contain;">

```python
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.

```python
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.

```python
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.

```text
[{'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!

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

Podemos visualizarlos utilizando el método [visualize_keypoint_matching()](/docs/transformers/main/es/model_doc/efficientloftr#transformers.EfficientLoFTRImageProcessor.visualize_keypoint_matching) del procesador.

```python
plot_images = processor.visualize_keypoint_matching(images, outputs)
plot_images
```

![Matched Image](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/matched_bees.png)

Opcionalmente, puede usar la API de [Pipeline](/docs/transformers/main/es/main_classes/pipelines#transformers.Pipeline) y establecer la tarea en `keypoint-matching`.

```python
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.

```bash
[{'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},
  ...
 }
]
```

