Transformers documentation

Сопоставление ключевых точек

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

Сопоставление ключевых точек

Сопоставление ключевых точек (Keypoint matching) сопоставляет различные точки интереса, принадлежащие одному и тому же объекту, который появляется на двух разных изображениях. Большинство современных алгоритмов сопоставления ключевых точек принимают на вход изображения и выдают следующие результаты:

  • Координаты ключевых точек (x, y): попарное соответствие пиксельных координат между первым и вторым изображением с использованием двух списков. Каждая ключевая точка с определённым индексом в первом списке соответствует ключевой точке с тем же индексом во втором списке.
  • Оценки соответствия: Оценки, присвоенные совпадениям ключевых точек.

В этом руководстве вы извлечете совпадения ключевых точек с помощью модели EfficientLoFTR, обученной в рамках MatchAnything framework, и уточните эти совпадения. Модель содержит всего 16 млн параметров и может работать на CPU. Вы будете использовать класс AutoModelForKeypointMatching.

from transformers import AutoImageProcessor, AutoModelForKeypointMatching
import torch

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

Загрузите два изображения, на которых присутствует один и тот же объект интереса. Второе фото сделано через секунду, его цвета отредактированы, а также оно дополнительно обрезано и повёрнуто.

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]

Мы можем передать изображения в процессор и выполнить инференс.

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

Мы можем выполнить постобработку результатов. Параметр threshold используется для уточнения шума (порогов низкой уверенности) в совпадениях результата.

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

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

Вот результаты.

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

Мы сократили вывод, но совпадений 401!

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

Мы можем визуализировать их с помощью метода visualize_keypoint_matching() процессора.

plot_images = processor.visualize_keypoint_matching(images, outputs)
plot_images

Matched Image

При необходимости можно использовать API Pipeline и установить задачу 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])

Результат выглядит следующим образом.

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