Transformers documentation

Correspondência de pontos-chave

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

Correspondência de pontos-chave

O casamento de pontos-chave (keypoint matching) corresponde a diferentes pontos de interesse que pertencem ao mesmo objeto presente em duas imagens distintas. A maioria dos casadores de pontos-chave modernos recebe imagens como entrada e produz a seguinte saída:

  • Coordenadas dos pontos-chave (x,y): mapeamento um-para-um das coordenadas de pixels entre a primeira e a segunda imagem usando duas listas. Cada ponto-chave em um determinado índice na primeira lista é correspondido ao ponto-chave no mesmo índice na segunda lista.
  • Pontuações de correspondência: Pontuações atribuídas às correspondências de pontos-chave.

Neste tutorial, você extrairá correspondências de pontos-chave com o modelo EfficientLoFTR treinado com o framework MatchAnything e refinará as correspondências. Este modelo possui apenas 16M de parâmetros e pode ser executado em uma CPU. Você usará a classe AutoModelForKeypointMatching.

from transformers import AutoImageProcessor, AutoModelForKeypointMatching
import torch

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

Carregue duas imagens que possuem o mesmo objeto de interesse. A segunda foto foi tirada um segundo depois, suas cores foram editadas e ela foi mais recortada e rotacionada.

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 passar as imagens para o processador e inferir.

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

Podemos fazer o pós-processamento das saídas. O parâmetro threshold é usado para refinar o ruído (limiares de confiança mais baixos) nas correspondências de saída.

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

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

Aqui estão as saídas.

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

Reduzimos a saída, mas há 401 correspondências!

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

Podemos visualizá-los usando o método visualize_keypoint_matching() do processador.

plot_images = processor.visualize_keypoint_matching(images, outputs)
plot_images

Matched Image

Opcionalmente, você pode usar a API Pipeline e definir a tarefa como 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])

A saída é a seguinte.

[{'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