Transformers documentation
Anahtar Nokta Algılama
Anahtar Nokta Algılama
Keypoint detection, bir görüntü içindeki belirli ilgi noktalarını belirler ve konumlarını tespit eder. Bu anahtar noktalar, aynı zamanda landmark olarak da bilinir ve nesnelerin anlamlı özelliklerini, örneğin yüz özelliklerini veya nesne parçalarını temsil eder. Bu modeller bir görüntü girdisi alır ve aşağıdaki çıktıları döndürür:
- Keypoints and Scores: İlgi noktaları ve bunların güven puanları.
- Öznitelikler: Her anahtar noktanın çevresindeki görüntü bölgesinin, doku, gradyan, yön ve diğer özelliklerini yakalayan bir temsili.
Bu kılavuzda, görüntülerden anahtar noktaların nasıl çıkarılacağını göstereceğiz.
Bu öğreticide, anahtar nokta tespiti için bir temel model olan SuperPoint kullanacağız.
from transformers import AutoImageProcessor, SuperPointForKeypointDetection
processor = AutoImageProcessor.from_pretrained("magic-leap-community/superpoint")
model = SuperPointForKeypointDetection.from_pretrained("magic-leap-community/superpoint")Şimdi modeli aşağıdaki görseller üzerinde test edelim.

import torch
from PIL import Image
import requests
import cv2
url_image_1 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
image_1 = Image.open(requests.get(url_image_1, stream=True).raw)
url_image_2 = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png"
image_2 = Image.open(requests.get(url_image_2, stream=True).raw)
images = [image_1, image_2]Artık girdilerimizi işleyip çıkarım yapabiliriz.
inputs = processor(images,return_tensors="pt").to(model.device, model.dtype)
outputs = model(**inputs)Model çıktısı, batch'teki her öğe için göreli anahtar noktaları, tanımlayıcıları, maskeleri ve skorları içerir. Maske, anahtar noktaların bulunduğu görüntü alanlarını vurgular.
SuperPointKeypointDescriptionOutput(loss=None, keypoints=tensor([[[0.0437, 0.0167],
[0.0688, 0.0167],
[0.0172, 0.0188],
...,
[0.5984, 0.9812],
[0.6953, 0.9812]]]),
scores=tensor([[0.0056, 0.0053, 0.0079, ..., 0.0125, 0.0539, 0.0377],
[0.0206, 0.0058, 0.0065, ..., 0.0000, 0.0000, 0.0000]],
grad_fn=<CopySlices>), descriptors=tensor([[[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
...],
grad_fn=<CopySlices>), mask=tensor([[1, 1, 1, ..., 1, 1, 1],
[1, 1, 1, ..., 0, 0, 0]], dtype=torch.int32), hidden_states=None)Görseldeki gerçek anahtar noktaları çizmek için çıktıyı son işlemeye (postprocess) tabi tutmamız gerekir. Bunu yapmak için, çıktıların yanı sıra gerçek görsel boyutlarını post_process_keypoint_detection fonksiyonuna iletmemiz gerekir.
image_sizes = [(image.size[1], image.size[0]) for image in images]
outputs = processor.post_process_keypoint_detection(outputs, image_sizes)Çıktılar artık her biri anahtar noktaların, skorların ve tanımlayıcıların işlenmiş çıktısını içeren sözlüklerden oluşan bir listedir.
[{'keypoints': tensor([[ 226, 57],
[ 356, 57],
[ 89, 64],
...,
[3604, 3391]], dtype=torch.int32),
'scores': tensor([0.0056, 0.0053, ...], grad_fn=<IndexBackward0>),
'descriptors': tensor([[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357],
[-0.0807, 0.0114, -0.1210, ..., -0.1122, 0.0899, 0.0357]],
grad_fn=<IndexBackward0>)},
{'keypoints': tensor([[ 46, 6],
[ 78, 6],
[422, 6],
[206, 404]], dtype=torch.int32),
'scores': tensor([0.0206, 0.0058, 0.0065, 0.0053, 0.0070, ...,grad_fn=<IndexBackward0>),
'descriptors': tensor([[-0.0525, 0.0726, 0.0270, ..., 0.0389, -0.0189, -0.0211],
[-0.0525, 0.0726, 0.0270, ..., 0.0389, -0.0189, -0.0211]}]Bu noktaları kullanarak anahtar noktaları (keypoints) çizebiliriz.
import matplotlib.pyplot as plt
import torch
for i in range(len(images)):
keypoints = outputs[i]["keypoints"]
scores = outputs[i]["scores"]
descriptors = outputs[i]["descriptors"]
keypoints = outputs[i]["keypoints"].detach().numpy()
scores = outputs[i]["scores"].detach().numpy()
image = images[i]
image_width, image_height = image.size
plt.axis('off')
plt.imshow(image)
plt.scatter(
keypoints[:, 0],
keypoints[:, 1],
s=scores * 100,
c='cyan',
alpha=0.4
)
plt.show()Aşağıda çıktıları görebilirsiniz.
