# تقدير العمق أحادي العين

تقدير العمق أحادي العين هو مهمة في مجال رؤية الحاسوب تتضمن التنبؤ بمعلومات العمق لمشهد من صورة واحدة. بعبارة أخرى، هو عملية تقدير مسافة الأشياء في مشهد من منظور كاميرا واحدة.

تتمتع تقديرات العمق أحادية العين بتطبيقات متنوعة، تشمل إعادة البناء ثلاثية الأبعاد، والواقع المعزز، والقيادة الذاتية، والروبوتات. وهي مهمة صعبة تتطلب من النموذج فهم العلاقات المعقدة بين الكائنات في المشهد ومعلومات العمق المقابلة، والتي يمكن أن تتأثر بعوامل مثل ظروف الإضاءة، والإخفاء، والملمس.

توجد فئتان رئيسيتان لتقدير العمق:

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

- **تقدير العمق النسبي**: يهدف تقدير العمق النسبي إلى التنبؤ بترتيب العمق للكائنات أو النقاط في المشهد دون تقديم قياسات دقيقة. تُخرج هذه النماذج خريطة عمق تُظهر أي أجزاء من المشهد أقرب أو أبعد بالنسبة لبعضها البعض دون المسافات الفعلية بين A و B.

في هذا الدليل، سنرى كيفية الاستدلال باستخدام [Depth Anything V2](https://huggingface.co/depth-anything/Depth-Anything-V2-Large)، وهو نموذج متطور لتقدير العمق النسبي بدون تدريب مسبق (zero-shot)، و[ZoeDepth](../model_doc/zoedepth)، وهو نموذج لتقدير العمق المطلق.

اطّلع على صفحة مهمة [تقدير العمق](https://huggingface.co/tasks/depth-estimation) لعرض جميع البنى وال نقاط التفتيش المتوافقة.

قبل أن نبدأ، نحتاج إلى تثبيت أحدث إصدار من Transformers:

```bash
pip install -q -U transformers
```

## خط أنابيب تقدير العمق

أبسط طريقة لتجربة الاستدلال باستخدام نموذج يدعم تقدير العمق هي استخدام [pipeline()](/docs/transformers/main/ar/main_classes/pipelines#transformers.pipeline) المقابل. قم بإنشاء خط أنابيب من [نقطة تفتيش على Hugging Face Hub](https://huggingface.co/models?pipeline_tag=depth-estimation&sort=downloads):

```py
>>> from transformers import pipeline
from accelerate import Accelerator
>>> import torch
>>> device = Accelerator().device
>>> checkpoint = "depth-anything/Depth-Anything-V2-base-hf"
>>> pipe = pipeline("depth-estimation", model=checkpoint, device=device)
```

بعد ذلك، اختر صورة لتحليلها:

```py
>>> from PIL import Image
>>> import requests

>>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> image
```

     

مرّر الصورة إلى خط الأنابيب.

```py
>>> predictions = pipe(image)
```

يعيد خط الأنابيب قاموسًا يحتوي على مدخلين. المدخل الأول، المسمى `predicted_depth`، هو متجه (tensor) تكون قيمه العمق معبرًا عنه بالمتر لكل بكسل. أما المدخل الثاني، `depth`، فهو صورة PIL تُظهر نتيجة تقدير العمق.

لنلقِ نظرة على النتيجة المُصوَّرة:

```py
>>> predictions["depth"]
```

     

## استدلال تقدير العمق يدوياً

الآن بعد أن اطلعتَ على كيفية استخدام خط أنابيب تقدير العمق، دعنا نرى كيف يمكننا إعادة إنتاج النتيجة نفسها يدويًا.

ابدأ بتحميل النموذج والمعالج المرتبط به من [نقطة تحقق على Hugging Face Hub](https://huggingface.co/models?pipeline_tag=depth-estimation&sort=downloads). سنستخدم هنا نفس نقطة التحقق التي استخدمناها سابقًا:

```py
>>> from transformers import AutoImageProcessor, AutoModelForDepthEstimation

>>> checkpoint = "Intel/zoedepth-nyu-kitti"

>>> image_processor = AutoImageProcessor.from_pretrained(checkpoint)
>>> model = AutoModelForDepthEstimation.from_pretrained(checkpoint).to(device)
```

جهّز مدخل الصورة للنموذج باستخدام `image_processor` الذي سيتولى تنفيذ التحويلات اللازمة على الصورة مثل تغيير الحجم والتطبيع:

```py
>>> pixel_values = image_processor(image, return_tensors="pt").pixel_values.to(device)
```

مرّر المدخلات المُعدّة عبر النموذج:

```py
>>> import torch

>>> with torch.no_grad():
...     outputs = model(pixel_values)
```

لنقم بمعالجة النتائج بعد المعالجة لإزالة أي حشو (padding) وإعادة تحجيم خريطة العمق لتطابق حجم الصورة الأصلية. يُخرج `post_process_depth_estimation` قائمة من القواميس (dicts) تحتوي على `"predicted_depth"`.

```py
>>> # ZoeDepth dynamically pads the input image. Thus we pass the original image size as argument
>>> # to `post_process_depth_estimation` to remove the padding and resize to original dimensions.
>>> post_processed_output = image_processor.post_process_depth_estimation(
...     outputs,
...     source_sizes=[(image.height, image.width)],
... )

>>> predicted_depth = post_processed_output[0]["predicted_depth"]
>>> depth = (predicted_depth - predicted_depth.min()) / (predicted_depth.max() - predicted_depth.min())
>>> depth = depth.detach().cpu().numpy() * 255
>>> depth = Image.fromarray(depth.astype("uint8"))
```

في التنفيذ الأصلي، يقوم نموذج ZoeDepth بتنفيذ الاستدلال على كل من الصورة الأصلية والصورة المعكوسة، ثم يأخذ متوسط النتائج. يمكن لدالة post_process_depth_estimation التعامل مع هذا الأمر نيابةً عنا من خلال تمرير المخرجات المعكوسة إلى معامل outputs_flipped الاختياري: &gt;&gt;&gt; with torch.no_grad(): ...     outputs = model(pixel_values) ...     outputs_flipped = model(pixel_values=torch.flip(inputs.pixel_values, dims=[3])) &gt;&gt;&gt; post_processed_output = image_processor.post_process_depth_estimation( ...     outputs, ...     source_sizes=[(image.height, image.width)], ...     outputs_flipped=outputs_flipped, ... )

     

