Transformers documentation

Anahtar Nokta Algılama

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

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.

Bee Cats
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.

Bee Cats
Update on GitHub