Transformers documentation

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

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

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

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

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

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

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

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

في هذا الدليل، سنرى كيفية الاستدلال باستخدام Depth Anything V2، وهو نموذج متطور لتقدير العمق النسبي بدون تدريب مسبق (zero-shot)، وZoeDepth، وهو نموذج لتقدير العمق المطلق.

اطّلع على صفحة مهمة تقدير العمق لعرض جميع البنى وال نقاط التفتيش المتوافقة.

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

pip install -q -U transformers

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

أبسط طريقة لتجربة الاستدلال باستخدام نموذج يدعم تقدير العمق هي استخدام pipeline() المقابل. أنشئ خط أنابيب من نقطة تفتيش على Hugging Face Hub:

>>> 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)

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

>>> 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
Photo of a bee

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

>>> predictions = pipe(image)

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

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

>>> predictions["depth"]
Depth estimation visualization

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

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

ابدأ بتحميل النموذج والمعالج المرتبط به من نقطة تحقق على Hugging Face Hub. سنستخدم هنا نفس نقطة التحقق التي استخدمناها سابقًا:

>>> 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 الذي سيتولى تنفيذ التحويلات اللازمة على الصورة، مثل تغيير الحجم والتطبيع:

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

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

>>> import torch

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

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

>>> # 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 الاختياري:

>>> with torch.no_grad():
...     outputs = model(pixel_values)
...     outputs_flipped = model(pixel_values=torch.flip(inputs.pixel_values, dims=[3]))
>>> post_processed_output = image_processor.post_process_depth_estimation(
...     outputs,
...     source_sizes=[(image.height, image.width)],
...     outputs_flipped=outputs_flipped,
... )
Depth estimation visualization
Update on GitHub