# مطابقة النقاط الرئيسية

يقوم مطابقة النقاط الرئيسية (Keypoint matching) بمطابقة نقاط اهتمام مختلفة تنتمي إلى نفس الكائن الظاهر في صورتين مختلفتين. تستقبل معظم مطابقات النقاط الرئيسية الحديثة الصور كمدخلات وتُخرج ما يلي:

- **إحداثيات النقاط الرئيسية (x,y):** إسقاط واحد لواحد لإحداثيات البكسلات بين الصورة الأولى والصورة الثانية باستخدام قائمتين. تُطابَق كل نقطة رئيسية عند فهرس معيّن في القائمة الأولى مع النقطة الرئيسية عند نفس الفهرس في القائمة الثانية.
- **درجات التطابق:** الدرجات المخصصة لمطابقات النقاط الرئيسية.

في هذا الشرح التعليمي، ستستخرج تطابقات النقاط الرئيسية باستخدام نموذج `EfficientLoFTR` المدرَّب عبر إطار [MatchAnything](https://huggingface.co/zju-community/matchanything_eloftr)، ثم تحسّن هذه التطابقات. يحتوي هذا النموذج على 16 مليون معامل فقط ويمكن تشغيله على وحدة المعالجة المركزية. ستستخدم فئة [AutoModelForKeypointMatching](/docs/transformers/main/ar/model_doc/auto#transformers.AutoModelForKeypointMatching).

```python
from transformers import AutoImageProcessor, AutoModelForKeypointMatching
import torch

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

حمّل صورتين تحتويان على نفس الكائن محل الاهتمام. تم التقاط الصورة الثانية بعد ثانية واحدة، وقد تم تعديل ألوانها، كما تم اقتطاعها بشكل أكبر وتدويرها.

    <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
         alt="Bee"
         style="height: 200px; object-fit: contain; margin-right: 10px;">
    <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee_edited.jpg"
         alt="Bee edited"
         style="height: 200px; object-fit: contain;">

```python
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]
```

يمكننا تمرير الصور إلى المعالج والاستدلال عليها.

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

يمكننا معالجة المخرجات بعد التنفيذ. يُستخدم معامل threshold لتحسين الضوضاء (حدود الثقة المنخفضة) في التطابقات الناتجة.

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

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

إليك المخرجات.

```text
[{'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 تطابقًا!

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

يمكننا تصورهم باستخدام طريقة [visualize_keypoint_matching()](/docs/transformers/main/ar/model_doc/efficientloftr#transformers.EfficientLoFTRImageProcessor.visualize_keypoint_matching) الخاصة بالمعالج.

```python
plot_images = processor.visualize_keypoint_matching(images, outputs)
plot_images
```

![Matched Image](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/matched_bees.png)

يمكنك اختيارياً استخدام واجهة [Pipeline](/docs/transformers/main/ar/main_classes/pipelines#transformers.Pipeline) البرمجية وتحديد المهمة على أنها `keypoint-matching`.

```python
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])
```

يبدو المخرج على النحو التالي.

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

