Transformers documentation

Pencocokan titik kunci

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Pencocokan titik kunci

Keypoint matching mencocokkan titik-titik kepentingan (points of interest) yang berbeda yang berasal dari objek yang sama yang muncul dalam dua gambar yang berbeda. Sebagian besar matcher keypoint modern menerima gambar sebagai input dan menghasilkan output berikut:

  • Koordinat titik kunci (x,y): pemetaan satu-ke-satu dari koordinat piksel antara gambar pertama dan gambar kedua menggunakan dua daftar. Setiap titik kunci pada indeks tertentu di daftar pertama dipasangkan dengan titik kunci pada indeks yang sama di daftar kedua.
  • Skor pencocokan: Skor yang diberikan pada kecocokan titik kunci.

Dalam tutorial ini, Anda akan mengekstrak kecocokan titik kunci (keypoint) dengan model EfficientLoFTR yang dilatih menggunakan MatchAnything framework, lalu menyempurnakan kecocokan tersebut. Model ini hanya memiliki 16M parameter dan dapat dijalankan di CPU. Anda akan menggunakan kelas AutoModelForKeypointMatching.

from transformers import AutoImageProcessor, AutoModelForKeypointMatching
import torch

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

Muat dua gambar yang memiliki objek yang sama. Foto kedua diambil satu detik kemudian, warnanya telah diedit, serta dipotong lebih jauh dan diputar.

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]

Kita dapat meneruskan gambar ke processor dan melakukan inferensi.

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

Kita dapat memproses ulang output. Parameter threshold digunakan untuk menyaring noise (ambang kepercayaan yang lebih rendah) pada hasil pencocokan output.

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

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

Berikut adalah outputnya.

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

Kami memangkas output, tetapi ada 401 kecocokan!

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

Kita dapat memvisualisasikannya menggunakan metode visualize_keypoint_matching() dari processor.

plot_images = processor.visualize_keypoint_matching(images, outputs)
plot_images

Matched Image

Secara opsional, Anda dapat menggunakan API Pipeline dan mengatur task ke 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])

Hasilnya terlihat seperti berikut.

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