Ultralytics YOLO27:
Get Started

تقدير العمق أحادي العين باستخدام Ultralytics YOLO#

Monocular depth estimation examples

يتنبأ تقدير العمق أحادي العين بخريطة عمق لكل بكسل انطلاقًا من صورة RGB واحدة. تحمل كل بكسل في الناتج قيمة عمق بالأمتار تمثل المسافة المقدّرة من الكاميرا إلى نقطة السطح تلك.

ناتج نموذج العمق هو خريطة كثيفة من قيم الفاصلة العائمة، بأبعاد (H, W)، ومحاذية للصورة المدخلة. يجعل هذا التمثيل لكل بكسل تقدير العمق أحادي العين مناسبًا لإعادة بناء المشاهد ثلاثية الأبعاد، وتنقل الروبوتات، وإنشاء محتوى الواقع المعزز/الافتراضي، وأي تطبيق يتطلب استنتاج الترتيب المكاني من كاميرا واحدة.



شاهد: تقدير العمق أحادي العين باستخدام Ultralytics YOLO26 | شرح تعليمي بـ Python | Vision AI 🚀
نصيحة

استخدم task=depth أو مهمة CLI yolo depth لتقدير العمق أحادي العين. تستخدم ملفات نماذج YOLO26 للعمق اللاحقة -depth، مثل yolo26n-depth.pt.

النماذج#

تُعرض أدناه نماذج YOLO26 للعمق المدرّبة مسبقًا على مزيج واسع من مجموعات البيانات (داخلية + خارجية، ~2.19M صورة). تُسجَّل مقاييس الأعمدة في قسم اختبار Eigen من NYU Depth V2.

تُنزّل النماذج تلقائيًا من أحدث إصدار من Ultralytics عند استخدامها لأول مرة.

النموذجالحجم
(بكسل)
delta1NYUabs_relNYUrmseNYUالسرعة
CPU ONNX
(مللي ثانية)
السرعة
T4 TensorRT10
(ms)
المعاملات
(M)
FLOPs
(B)
YOLO26n-depth7680.8820.1090.414272.0 ± 27.22.7 ± 0.16.346.9
YOLO26s-depth7680.8960.1040.399393.7 ± 13.13.8 ± 0.013.268.0
YOLO26m-depth7680.9210.0890.364621.5 ± 49.76.0 ± 0.123.3130.4
YOLO26l-depth7680.9300.0830.351821.9 ± 50.77.7 ± 0.127.7157.0
YOLO26x-depth7680.9330.0800.3441240.9 ± 73.313.6 ± 0.257.0301.7
  • delta1NYU هي نسبة البكسلات التي يقع فيها العمق المتنبأ به ضمن عامل 1.25 من القيمة الحقيقية، في قسم اختبار Eigen من NYU Depth V2 (654 صورة)، باستخدام TTA متعدد المقاييس مع قلب أفقي ومحاذاة المربعات الصغرى اللوغاريتمية.
  • يمكن إعادة إنتاج الدقة بمقياس واحد من دون TTA باستخدام yolo depth val model=yolo26n-depth.pt data=nyu-depth.yaml imgsz=768 device=0 (استبدل model= بكل حجم)، الذي يستخدم المحاذاة بالوسيط (للمقياس فقط) ويسجل نتائج أقل: delta1 0.783 (n)، 0.793 (s)، 0.840 (m)، 0.853 (l)، 0.860 (x).
  • abs_rel هو متوسط الخطأ النسبي المطلق بين قيم العمق المتوقعة والحقيقية.
  • rmse هو الجذر التربيعي لمتوسط مربعات الخطأ بالأمتار.
  • السرعة هي زمن الاستدلال فقط (باستثناء المعالجة المسبقة واللاحقة) عند imgsz=768 وbatch=1، وتُعرض كمتوسط ± انحراف معياري عبر عمليات التشغيل الموقّتة بعد الإحماء. CPU ONNX هو ONNX Runtime بدقة fp32 على Intel Xeon ذي 32 نواة (Skylake)؛ أما T4 TensorRT10 فهو TensorRT بدقة fp16 على Tesla T4.
  • يُقاس عدد المعلمات وFLOPs عند دقة 768×768، وهي دقة التدريب للأوزان المنشورة.

راجع معاينة YOLO27 غير المنشورة للاطلاع على النتائج الأولية على NYU Depth V2.

مقارنة السرعة مع Depth Anything V2#

يُعد Depth Anything V2 خط أساس مفتوحًا واسع الاستخدام لتقدير العمق أحادي العين. وتستهلك البنية الأساسية DINOv2 لمحوّل الرؤية وفك الترميز DPT موارد حسابية كبيرة؛ لذا فإن أصغر نموذج منشور من Depth Anything V2 أبطأ من جميع نماذج YOLO26 للعمق على Tesla T4 نفسها باستخدام TensorRT fp16 — بما في ذلك YOLO26x-depth، الذي يضم أكثر من ضعف عدد المعلمات.

عند ~768 بكسل — imgsz=768 لـ YOLO26، وهي الدقة التي دُرّبت عليها الأوزان المنشورة، و770 بكسل لـ Depth Anything V2، إذ تتطلب بنيته الأساسية DINOv2 مضاعفًا لحجم رقعته البالغ 14:

النموذجعدد المعلمات (M)FLOPs (B)T4 TensorRT10 (مللي ثانية)إطارًا في الثانية (FPS)التسريع مقارنةً بـ V2 Smallالتسريع مقارنةً بـ V2 Base
Depth Anything V2 Base97.51025.555.4018.1——
Depth Anything V2 Small24.8346.920.9947.6——
YOLO26x-depth57.0301.713.5773.71.5×4.1×
YOLO26l-depth27.7157.07.68130.22.7×7.2×
YOLO26m-depth23.3130.46.00166.73.5×9.2×
YOLO26s-depth13.268.03.82261.65.5×14.5×
YOLO26n-depth6.346.92.73365.87.7×20.3×

عند ~640 بكسل — imgsz=640 و644 بكسل على التوالي — يظل الترتيب كما هو، ويزيد YOLO26n-depth سرعةً بمقدار 5.9× على Depth Anything V2 Small:

النموذجT4 TensorRT10 (مللي ثانية)إطارًا في الثانية (FPS)
Depth Anything V2 Base35.1028.5
Depth Anything V2 Small13.6273.4
YOLO26x-depth10.2697.5
YOLO26l-depth6.14162.8
YOLO26m-depth4.71212.1
YOLO26s-depth3.08324.4
YOLO26n-depth2.29436.9
  • زمن الاستجابة هو للاستدلال فقط، batch=1، باستخدام TensorRT fp16 على Tesla T4 — وهو إعداد الاختبار نفسه المستخدم في جدول النماذج أعلاه، وتُعرض الأرقام هنا بمنزلتين عشريتين؛ أما FPS فهو مقلوب زمن الاستجابة غير المقرب. تقسم أعمدة التسريع زمن استجابة Depth Anything V2 Small (20.99 ms) وBase (55.40 ms) على زمن استجابة YOLO26.
  • Depth Anything V2 Small وBase هما نقطتا التحقق ViT-S وViT-B المنشورتان.
  • تقتصر المقارنة على زمن الاستجابة — ولم يُقيَّم نموذجا العائلتين هنا وفق بروتوكول دقة موحّد.

نطاق العمق ورأس العمق اللوغاريتمي#

يتنبأ رأس العمق بـ exp(logit) — من دون حدود (~0.02–150 m) — ويفصل شكل المشهد عن المقياس المطلق: تتنبأ الشبكة بحقل عمق لوغاريتمي نسبي، وتُحدَّد القيم المطلقة بالأمتار عبر تحويل منفصل ذي معاملين (exp(a·log d + b))، يُستعاد أثناء التقييم أو بالمعايرة الخفيفة أو بالضبط الدقيق. أما البديل الشائع، وهو رأس sigmoid × max_depth محدود النطاق، فيدمج حدًا أعلى ثابتًا في البنية، فتُقص أي قيمة عمق تتجاوز max_depth — ما يمنع التدريب على المشاهد ذات المدى الأطول والتنبؤ بها.

مقارنة A/B مضبوطة — البيانات نفسها، والجدول الزمني نفسه، والاختلاف الوحيد هو الرأس. عند تدريب كلا الرأسين من البداية على مزيج متطابق من البيانات الداخلية (≤10 m) والخارجية (≤80 m):

الرأسنطاق الناتجδ1 للتحقق على نطاق مختلطسلوك التدريب
sigmoid × max_depth (10 m)محدود النطاق 0–10 m0.221يستقر عند الحقبة 1
log (بلا حدود)0–~150 m0.367 (+66%)يتحسن طوال التدريب

لا يستطيع الرأس محدود النطاق تمثيل أغلبية البكسلات الخارجية التي يتجاوز عمقها 10 m، لذا يتوقف عن التحسن في وقت شبه فوري؛ أما الرأس log فيتعلّم من النطاق الكامل.

حالة الإخفاق التي يعالجها — الضبط الدقيق على مجموعة بيانات واحدة، مصنّفًا حسب النطاق. ينجح الضبط الدقيق لرأس محدود النطاق (10 m) على مجموعات البيانات الفردية عندما تقع البيانات ضمن الحد، لكنه يتدهور عندما تتجاوزه:

مجموعة البياناتنطاق العمقδ1 للرأس محدود النطاق
SUN RGB-D≤10 m0.78 ✅
Hypersimغالبًا ≤10 m0.74 ✅
KITTI~80 m0.08 ❌ (abs_rel ≈ 7.0 — عدم تطابق المقياس 80/10)
vKITTI280 m0.04 ❌

يحدث الانهيار تحديدًا عند حد النطاق. ولا يواجه الرأس log هذا الحد.

النماذج المنشورة — الأداء عبر النطاقات. عائلة النماذج المنشورة ذات الرأس log، التي جرى تقييمها عبر معايير تمتد من 10 m (NYU وiBims-1) إلى 80 m (KITTI)، مع δ1 محاذى المقياس:

قياس الأداءالنطاقYOLO26x-depth (log)الإصدار السابق محدود النطاق
NYU Eigen10 m0.9330.934
iBims-110 m0.9610.945
ETH3D~60 m0.9590.931
Make3D~70 m0.3020.296
KITTI Eigen80 m0.9420.891
المتوسط—0.8190.799

كلا العمودين كما نُشرا. حُسبت نتائج الصفوف الأخرى باستخدام بروتوكول TTA والمربعات الصغرى اللوغاريتمية الموضح في صفحات مجموعات البيانات الخاصة بها، وهو بروتوكول لا ينفذه المُحقِّق في هذا المستودع؛ لذلك لا يمكن إعادة قياس صف KITTI على الأساس نفسه. تعرض صفحة KITTI بدلًا من ذلك أرقامًا مقاسة على قسم Eigen القياسي ذي 652 إطارًا.

تظهر أكبر المكاسب في معايير العمق الخارجية الأطول مدى (KITTI وETH3D) — وهي بالضبط الحالات التي يكون فيها السقف الثابت البالغ 10 m أشد ضررًا — مع الحفاظ على الأداء الداخلي.

التدريب#

درّب YOLO26n-depth على مجموعة بيانات Depth8 لمدة 100 حقبة بحجم صورة 640. للاطلاع على القائمة الكاملة بالوسائط المتاحة، راجع صفحة الإعدادات.

مثال
from ultralytics import YOLO

# ⁨تحميل نموذج⁩
model = YOLO("yolo26n-depth.yaml")  # ⁨إنشاء نموذج جديد من YAML⁩
model = YOLO("yolo26n-depth.pt")  # ⁨تحميل نموذج مدرّب مسبقًا (موصى به للتدريب)⁩
model = YOLO("yolo26n-depth.yaml").load("yolo26n-depth.pt")  # ⁨الإنشاء من YAML ونقل الأوزان⁩

# ⁨تدريب النموذج⁩
results = model.train(data="depth8.yaml", epochs=100, imgsz=640)

اطّلع على التفاصيل الكاملة لوضع train في صفحة التدريب. ويمكن أيضًا تدريب نماذج العمق باستخدام التدريب السحابي على منصة Ultralytics.

تنسيق مجموعة البيانات#

تتضمن مجموعات بيانات تقدير العمق كل صورة RGB مع صورة عمق PNG ذات قيم uint16 مُقاسة، أو خريطة عمق NPY بفاصلة عائمة وبالأمتار. تستخدم قيم PNG المليمترات افتراضيًا؛ أما مجموعات البيانات التي تتبع اصطلاحًا آخر فتعيّن depth_scale في ملف YAML الخاص بها. يستنتج المُحمِّل مسار العمق باستبدال المكوّن images بالمكوّن depth، مع تفضيل .png والرجوع إلى .npy عند عدم توفره.

dataset/
├── images/
│   ├── train/
│   └── val/
└── depth/
    ├── train/
    └── val/

على سبيل المثال، تُقرن الصورة الموجودة في images/train/scene_001.jpg بخريطة العمق الموجودة في depth/train/scene_001.png. راجع دليل مجموعة بيانات تقدير العمق للاطلاع على المواصفات الكاملة للتنسيق.

الضبط الدقيق على بياناتك الخاصة#

عند تكييف نموذج عمق مُدرَّب مسبقًا مع مجموعة بيانات مخصصة، خفّض معدل التعلّم واستخدم محسّن AdamW. إعدادات المحسّن الافتراضية مضبوطة للتدريب من البداية؛ وعند تطبيقها على نموذج عمق تقارب تدريبه بالفعل، قد تمحو المعرفة المكتسبة مسبقًا وتؤدي إلى تدهور النتائج — لا سيما عند إجراء الضبط الدقيق على مجال واحد.

الوصفة الموصى بها للضبط الدقيق
from ultralytics import YOLO

model = YOLO("yolo26s-depth.pt")  # ⁨ابدأ بأوزان مدرّبة مسبقًا⁩

model.train(
    data="path/to/your_dataset.yaml",
    epochs=20,
    imgsz=640,
    optimizer="AdamW",
    lr0=1e-4,  # ⁨أقل بنحو 100 مرة من القيمة الافتراضية للتدريب من الصفر⁩
    warmup_bias_lr=1e-4,  # ⁨اجعل الإحماء تدريجيًا أيضًا⁩
)

نصائح إضافية:

  • تتحكم الوسيطات القياسية في التعزيز (degrees, translate, scale, shear, perspective, flipud, fliplr, hsv_h, hsv_s, hsv_v)؛ ويُطبّق التحويل الهندسي والانعكاسات بالطريقة نفسها على خريطة العمق المقترنة. للاطلاع على الوصفة الدقيقة المستخدمة لأوزان YOLO26-Depth المُصدرة، افحص train_args المخزّن في نقطة التحقق — راجع فحص وسيطات التدريب في نقطة تحقق YOLO26.
  • لم تُنفّذ mosaic وmixup وcutmix وcopy_paste للعمق. يضبط محمّل بيانات العمق هذه الاحتمالات تلقائيًا على 0، لذلك لا يؤثر تمريرها في شيء. لا تُدعم عمليات التعزيز هذه لأنها تجمع صورًا متعددة، ما ينتج عنه خرائط عمق مقترنة غير صالحة.
  • يعمل أي نطاق عمق مباشرةً دون إعداد إضافي. تتنبأ النماذج ذات الرأس log بعمق غير محدود، لذا تتكيف مع البيانات قصيرة المدى (الماكرو) أو طويلة المدى (الخارجية/القيادة) دون تغييرات. يحدد ضبط max_depth: في YAML مجموعة البيانات (بالمتر) وحدات البكسل في GT التي تدخل في مقاييس التحقق.
  • حافظ على الأداء العام. إذا كنت بحاجة إلى أن يظل النموذج دقيقًا في المشاهد التي تتجاوز مجموعة التدريب، فأضف نسبة صغيرة (~5–10%) من الصور العامة المتنوعة إلى بيانات التدريب؛ فهذا يقلل بدرجة كبيرة من النسيان أثناء الضبط الدقيق.
  • درّب من الصفر (model=yolo26s-depth.yaml) فقط إذا كان نطاقك مختلفًا جدًا وكانت لديك مجموعة بيانات كبيرة — ففي هذه الحالة تكون القيمة الافتراضية optimizer=auto مناسبة، إذ لا توجد أوزان مدرّبة مسبقًا للحفاظ عليها.

معايرة مقياس العمق#

يفصل رأس العمق بين الشكل (بنية المشهد النسبية) والمقياس (الأمتار المطلقة). إذا كان النموذج ينتج بالفعل عمقًا نسبيًا جيدًا لمشاهدك، لكن القيم المطلقة لا تناسب كاميرتك، فيمكنك تصحيح المقياس في ثوانٍ باستخدام model.calibrate() — وهو ملاءمة مغلقة الصيغة للمقياس فقط لتحويل الرأس اللوغاريتمي-الأفيني، استنادًا إلى مجموعة صغيرة ذات تسميات، ولا يُحتفظ بها إلا إذا حسّنت δ1 على بيانات التحقق المتروكة خارج التدريب، من دون تدريب بالتدرج أو تغيير أوزان الشبكة، لذا لا يمكنها إفساد البنية النسبية.

معايرة المقياس
from ultralytics import YOLO

model = YOLO("yolo26s-depth.pt")

# ⁨لاءم المقياس على تقسيم ذي تسميات (~100 صورة أو أكثر تكفي)، ثم احفظه⁩
model.calibrate(data="path/to/your_dataset.yaml")
model.save("yolo26s-depth-calibrated.pt")

تحتاج المعايرة إلى عمق الحقيقة المرجعية لإجراء الملاءمة، لذا تُنفّذ على تقسيم ذي تسميات — ولا يمكن إجراؤها أثناء الاستدلال دون بيانات مرجعية. وتُجري الملاءمة والتقييم على وحدات البكسل نفسها التي تقيّمها مقاييس التحقق: تُستبعد قيم GT التي تساوي حد max_depth في YAML مجموعة البيانات أو تتجاوزه (الافتراضي 100 m). استخدمها عندما يكون العمق النسبي جيدًا بالفعل ويكون المقياس/النطاق وحده غير صحيح؛ أما إذا كانت البنية النسبية نفسها بحاجة إلى التغيير لتناسب نطاقك، فاستخدم الضبط الدقيق بدلًا من ذلك.

يتولى التدريب ذلك تلقائيًا: بعد اكتمال model.train(...)، تُعايَر أفضل نقاط التحقق وآخرها على مجموعة التحقق، لتنتج عمقًا بمقياس متري مباشرةً دون إعداد إضافي.

تأتي نقاط التحقق yolo26*-depth.pt المُصدرة ومعايرة القياس هذه مدمجة فيها بالفعل، وقد أُجريت الملاءمة على مزيج التحقق قبل التدريب. وهو مقياس عالمي واحد لجميع النطاقات، لذا للحصول على أدق عمق مطلق لكاميرا أو نوع مشهد محدد، شغّل model.calibrate() على تقسيم صغير ذي تسميات من بياناتك — إذ يستبدل الملاءمة المدمجة.

الحصول على عمق الحقيقة الأرضية دون كاميرا عمق#

إذا لم تكن كاميرتك مزودة بمستشعر عمق، فلا يزال بإمكانك معايرتها. تضبط المعايرة مقياسًا عامًا واحدًا وتتجاهل وحدات البكسل التي تبلغ قيمة عمقها 0، لذا تكفي بضع نقاط مقاسة في كل صورة.

  1. اجمع الصور. التقط من 50 إلى 150 صورة بالكاميرا، باستخدام الدقة وإعدادات العدسة التي ستستخدمها عند النشر، وضعها في dataset/images/val/. تقرأ المعايرة مجموعة البيانات المقسمة val.

  2. أضف تسميات العمق. استخدم إحدى الطريقتين أدناه. تكتب كلتاهما خريطة عمق واحدة لكل صورة في dataset/depth/val/ وفق تنسيق مجموعة البيانات.

قِس المسافة إلى بضع نقاط في كل صورة باستخدام مقياس مسافة ليزري أو شريط قياس، على أسطح مستوية وبعيدًا عن حواف الأجسام، وسجّل موقع البكسل لكل نقطة في points.csv:

image,x,y,meters
img_0001.jpg,352,453,3.15
img_0001.jpg,28,300,2.672

بعد ذلك، اكتب خرائط العمق مع ترك قيمة كل بكسل غير مقاس عند 0. تُرسم كل نقطة على شكل نقطة صغيرة لتبقى ظاهرة بعد تغيير الحجم إلى imgsz:

import csv
from collections import defaultdict
from pathlib import Path

import cv2
import numpy as np

points = defaultdict(list)
with open("points.csv") as f:  # columns: image, x, y, meters
    for row in csv.DictReader(f):
        points[row["image"]].append((int(row["x"]), int(row["y"]), float(row["meters"])))

for name, pts in points.items():
    h, w = cv2.imread(f"dataset/images/val/{name}").shape[:2]
    depth = np.zeros((h, w), np.uint16)  # 0 means no label
    r = max(h, w) // 768 + 1  # dot radius that survives the resize to imgsz=768
    for x, y, meters in pts:
        cv2.circle(depth, (x, y), r, round(meters * 100), -1)  # centimeters, matching depth_scale: 100
    out = Path("dataset/depth/val") / f"{Path(name).stem}.png"
    out.parent.mkdir(parents=True, exist_ok=True)
    cv2.imwrite(str(out), depth)

يقيس مقياس المسافة المسافة في خط مستقيم إلى نقطة، بينما تخزّن خرائط العمق المسافة على امتداد محور رؤية الكاميرا. تتطابق القيمتان عند مركز الصورة، وتختلفان بنحو 3.5% على بُعد 15° عن المركز؛ لذا قِس النقاط بالقرب من المركز أو حوّل كل قراءة باستخدام meters / sqrt(1 + ((x - cx) / fx) ** 2 + ((y - cy) / fy) ** 2) مع معلمات الكاميرا الداخلية.

  1. اكتب ملف YAML لمجموعة البيانات باسم calib.yaml. يقرأ depth_scale: 100 صور PNG بوحدة السنتيمتر الناتجة عن النقاط المقاسة، ولا يُستخدم مع خرائط NPY:

    path: dataset
    train: images/val
    val: images/val
    depth_scale: 100 # PNG value 100 = 1 meter
    names:
        0: depth
  2. عاير واحفظ، ثم حمّل yolo26s-depth-calibrated.pt لإجراء التنبؤ أو التصدير:

    from ultralytics import YOLO
    
    model = YOLO("yolo26s-depth.pt")
    model.calibrate(data="calib.yaml", imgsz=768)
    model.save("yolo26s-depth-calibrated.pt")

في الاختبارات التي أُجريت باستخدام yolo26s-depth.pt و150 صورة لكل كاميرا، اختلفت المعايرة المنشورة بنسبة تراوحت بين 4% و46% عن ملاءمة المقياس المحسوبة باستخدام الحقيقة الأرضية الكاملة لمجموعات NYU وKITTI وكاميرا ذات عدسة ضيقة. وكانت المعايرة باستخدام 5 نقاط مقاسة لكل صورة ضمن 1% من تلك الملاءمة، بينما كانت المعايرة باستخدام تسميات DA3METRIC-LARGE ضمن 7%. تفيد زيادة عدد الصور أكثر من زيادة عدد النقاط في كل صورة: فقد كانت 150 صورة بنقطة واحدة لكل منها ضمن نحو 3%، بينما تفاوتت النتائج بنسبة وصلت إلى 9% عند استخدام 20 صورة و5 نقاط لكل منها.

التحقق#

تحقّق من دقة نموذج YOLO26n-depth المدرّب على مجموعة بيانات لتقدير العمق. مرّر data صراحةً لضمان استخدام ملف YAML المقصود لمجموعة البيانات عند التحقق. دُرّبت الأوزان المنشورة على imgsz=768 باستخدام صور ممدودة لتصبح مربعة بدلًا من إضافة حشو إليها للحفاظ على نسبة أبعادها، لذا أجرِ التحقق والتنبؤ بهذا الحجم للحصول على أفضل دقة. تمدّ عمليات التنبؤ والتحقق وmodel.calibrate() الإدخال بالطريقة نفسها.

مثال
from ultralytics import YOLO

# ⁨تحميل نموذج⁩
model = YOLO("yolo26n-depth.pt")  # ⁨حمّل نموذجًا رسميًا⁩
model = YOLO("path/to/best.pt")  # ⁨تحميل نموذج مخصص⁩

# ⁨تحقّق من النموذج⁩
metrics = model.val(data="nyu-depth.yaml")
metrics.delta1  # ⁨نسبة وحدات البكسل التي تقع ضمن العتبة δ=1.25⁩
metrics.abs_rel  # ⁨متوسط الخطأ النسبي المطلق⁩
metrics.rmse  # ⁨الجذر التربيعي لمتوسط مربع الخطأ (بالمتر)⁩
metrics.silog  # ⁨الخطأ اللوغاريتمي عديم التأثر بالمقياس⁩

التنبؤ#

استخدم نموذج YOLO26n-depth مدرّبًا لإجراء تنبؤات على الصور.

مثال
from ultralytics import YOLO

# ⁨تحميل نموذج⁩
model = YOLO("yolo26n-depth.pt")  # ⁨حمّل نموذجًا رسميًا⁩
model = YOLO("path/to/best.pt")  # ⁨تحميل نموذج مخصص⁩

# ⁨أجرِ التنبؤ باستخدام النموذج⁩
results = model("https://ultralytics.com/images/bus.jpg")  # ⁨أجرِ التنبؤ على صورة⁩

# ⁨الوصول إلى النتائج⁩
for result in results:
    depth_map = result.depth.data.cpu().numpy()  # ⁨torch.Tensor ← NumPy float32، بالشكل (H, W)، بالمتر⁩

اطّلع على التفاصيل الكاملة لوضع predict في صفحة التنبؤ.

مخرجات النتائج#

يعيد تقدير العمق باستخدام YOLO كائن Results واحدًا لكل صورة. وتخزّن كل نتيجة خريطة عمق كثيفة واحدة من القيم العشرية للصورة كاملة.

السمةالنوعالشكلالوصف
result.depthDepthMap(H,W)خريطة عمق كثيفة لكل بكسل.
result.depth.datatorch.Tensor(H,W)قيم العمق بالأمتار؛ استدعِ .cpu().numpy() للحصول على NumPy.
result.boxes--لا توجد صناديق للمثيلات.
result.masks--لا توجد أقنعة للمثيلات.

للاطلاع على حقول Results الخاصة بكل مهمة، راجع قسم نتائج التنبؤ حسب المهمة.

العمق لكل كائن باستخدام تجزئة الكائنات#

اجمع بين تجزئة الكائنات وتقدير العمق لمعرفة بُعد كل كائن مكتشف. شغّل النموذجين على الصورة نفسها باستخدام retina_masks=True كي تتطابق دقة الأقنعة مع دقة خريطة العمق الأصلية للصورة، ثم احسب وسيط قيم العمق الصالحة داخل كل قناع.

وسيط العمق لكل كائن مجزّأ
from ultralytics import YOLO

image = "https://ultralytics.com/images/bus.jpg"
seg = YOLO("yolo26n-seg.pt")(image, retina_masks=True)[0]
depth = YOLO("yolo26n-depth.pt")(image)[0].depth.data  # (H, W) meters

if seg.masks is not None:
    for mask, cls in zip(seg.masks.data.bool(), seg.boxes.cls):
        values = depth[mask & (depth > 0)]  # valid depth pixels inside this mask
        if values.numel():
            print(f"{seg.names[int(cls)]}: {values.median():.2f} m")

يقاوم الوسيط تأثير وحدات البكسل في الخلفية عند حواف القناع، لكنه يصف السطح المرئي للكائن لا مركزه، كما تعتمد دقته على مقياس العمق للنموذج (راجع معايرة مقياس العمق).

تلوين خريطة العمق#

خريطة العمق الخام مصفوفة عائمة أحادية القناة بوحدة المتر — وهي مفيدة للحوسبة، لكن يصعب قراءتها مباشرةً. لتحويلها إلى صورة ملونة، استخدم الدالة المساعدة colorize_depth في ultralytics.utils.plotting، التي تحوّل مصفوفة العمق (H, W) إلى صورة BGR uint8 من نوع (H, W, 3) (وتُعرض وحدات البكسل غير الصالحة <= 0 باللون الأسود).

يمزج result.plot() هذا التلوين بالفعل فوق صورة الإدخال باستخدام القيم الافتراضية (cmap="jet"، mode="disparity")؛ استدعِ colorize_depth مباشرةً عندما تريد صورة عمق ملونة مستقلة أو خريطة ألوان أو تطبيعًا مختلفًا.

لوّن خريطة عمق متنبأ بها
import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import colorize_depth

model = YOLO("yolo26n-depth.pt")
result = model("https://ultralytics.com/images/bus.jpg")[0]

depth = result.depth.data.cpu().numpy()  # (H, W) float32, meters

# ⁨لوّن بحيث يكون القريب دافئ اللون واحفظ الصورة⁩
cv2.imwrite("depth_colored.png", colorize_depth(depth, cmap="spectral"))  # (H, W, 3) BGR uint8

# ⁨ثبّت النطاق عند 0-20 m كي يدل اللون نفسه على المسافة نفسها عبر الإطارات⁩
cv2.imwrite("depth_metric.png", colorize_depth(depth, vmin=0.0, vmax=20.0, cmap="inferno", mode="metric"))

# ⁨تراكب ممزوج مباشرةً من كائن Results (يستخدم cmap="jet" وmode="disparity")⁩
result.save("depth_overlay.png")

تنتقل كل خريطة ألوان من البارد/الداكن إلى الدافئ/الساطع. تحدد mode الطرف الذي يمثل المسافة القريبة، ويثبّت vmin/vmax النطاق عبر الإطارات، بحيث يدل اللون دائمًا على المسافة نفسها.

المعاملالقيمةالوصف
cmapjet (افتراضي)أزرق → أخضر → أحمر بتباين عالٍ؛ وهي لوحة الألوان التي يستخدمها result.plot().
cmapinfernoأسود → بنفسجي → برتقالي → أصفر. موحّدة إدراكيًا، وملائمة لعمى الألوان، وواضحة بتدرج الرمادي.
cmapspectralأحمر → أصفر → أخضر → أزرق (Spectral_r في matplotlib).
modedisparity (افتراضي)تطبّع العمق العكسي (1/d) بين النسبتين المئويتين الثانية والثامنة والتسعين؛ وتشير الألوان الدافئة إلى القريب، بينما تُستوعب القيم المتطرفة البعيدة.
modemetricتطبّع العمق بالمتر خطيًا بين vmin وvmax؛ وتشير الألوان الدافئة إلى البعيد، لذا تعكس الألوان المسافة الحقيقية.

التصدير#

صدّر نموذج YOLO26n-depth إلى تنسيق آخر مثل ONNX أو CoreML، إلخ.

مثال
from ultralytics import YOLO

# ⁨تحميل نموذج⁩
model = YOLO("yolo26n-depth.pt")  # ⁨حمّل نموذجًا رسميًا⁩
model = YOLO("path/to/best.pt")  # ⁨تحميل نموذج مخصص⁩

# ⁨صدّر النموذج⁩
model.export(format="onnx")

ترد تنسيقات التصدير المتاحة لتقدير العمق باستخدام YOLO26 في الجدول أدناه. يمكنك التصدير إلى أي تنسيق باستخدام الوسيطة format، مثل format='onnx' أو format='engine'. ويمكنك إجراء التنبؤ أو التحقق مباشرةً على النماذج المُصدرة، مثل yolo predict model=yolo26n-depth.onnx. تظهر أمثلة الاستخدام لنموذجك بعد اكتمال التصدير.

التنسيقوسيط formatالنموذجالبيانات الوصفيةالوسيطات
PyTorch-yolo26n-depth.pt✅-
TorchScripttorchscriptyolo26n-depth.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n-depth.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n-depth_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n-depth.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n-depth.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n-depth.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n-depth_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n-depth.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n-depth_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n-depth.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n-depth_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n-depth.mnn✅imgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n-depth_ncnn_model/✅imgsz, quantize, batch, device
IMX500imxyolo26n-depth_imx_model/✅imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n-depth_rknn_model/✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n-depth_executorch_model/✅imgsz, batch, device
Axeleraaxelerayolo26n-depth_axelera_model/✅imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n-depth_deepx_model/✅imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n-depth_qnn.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n-depth_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n-depth_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n-depth_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

يعتمد nms=None على المخرجات الأولية لإجراء NMS خارجي. اضبط nms=False لتحديد رأس متاح خالٍ من NMS؛ وتعود التنسيقات غير المدعومة إلى مسار المخرجات الأصلي الخاص بها. تحدد إدخالات nms أعلاه التنسيقات التي يمكنها تضمين NMS باستخدام nms=True.

اطّلع على التفاصيل الكاملة لـexport في صفحة التصدير.

الأسئلة الشائعة#

  • جهّز صور RGB مقترنة وملفات PNG للعمق بدقة 16 بت أو خرائط عمق NPY بنقطة عائمة بوحدة المتر، ثم أنشئ ملف YAML لمجموعة البيانات يشير إلى دليل images/. يعثر المحمّل على ملفات العمق تلقائيًا باستبدال images بـ depth في المسار، مع تفضيل .png والرجوع إلى .npy عند عدم توفره.

    ابدأ بأوزان مدرّبة مسبقًا واستخدم معدل تعلم منخفضًا مع AdamW كي يحافظ الضبط الدقيق على ما يعرفه النموذج بالفعل (راجع الضبط الدقيق على بياناتك لمعرفة السبب):

    مثال
    from ultralytics import YOLO
    
    # ⁨حمّل نموذج YOLO26 للعمق المدرّب مسبقًا⁩
    model = YOLO("yolo26s-depth.pt")
    
    # ⁨أجرِ ضبطًا دقيقًا على مجموعة بيانات عمق مخصصة⁩
    results = model.train(
        data="path/to/your_dataset.yaml",
        epochs=20,
        imgsz=640,
        optimizer="AdamW",
        lr0=1e-4,
        warmup_bias_lr=1e-4,
    )

    راجع صفحة Configuration للاطلاع على مزيد من الوسيطات المتاحة.

  • يعرض التحقق من تقدير العمق مجموعة المقاييس المستخدمة في Depth Anything والأعمال ذات الصلة بالعمق أحادي العين:

    • delta1 / delta2 / delta3 — نسبة وحدات البكسل التي تقل فيها نسبة العمق المتنبأ به إلى عمق الحقيقة المرجعية (أو معكوسها) عن 1.25 و1.25² و1.25³ على التوالي. الأعلى أفضل.
    • abs_rel — متوسط الخطأ النسبي المطلق. الأقل أفضل.
    • rmse — الجذر التربيعي لمتوسط مربع الخطأ بالمتر. الأقل أفضل.
    • silog — الخطأ اللوغاريتمي عديم التأثر بالمقياس. الأقل أفضل.

    تُواءَم كل نتيجة تنبؤ مع الحقيقة المرجعية الخاصة بها على مستوى الوسيط لكل صورة، ويُحسب كل مقياس نهائيًا على تلك الصورة، ثم تُحسب متوسطات نتائج الصور على مجموعة التحقق، لذا يكون وزن كل صورة متساويًا بصرف النظر عن عدد وحدات البكسل الصالحة للعمق فيها. تُتخطى الصور التي تحتوي على أقل من 10 وحدات بكسل صالحة للحقيقة المرجعية ولا تدخل في ذلك المتوسط، إذ لا معنى لمواءمة وسيط عدد قليل من وحدات البكسل؛ أما التنبؤات غير المنتهية فتُقيّم عند حدود العمق. وهذا يطابق حساب المتوسط لكل عينة والحد الأدنى البالغ 10 وحدات بكسل المستخدمين في Depth Anything V2.

  • تُخزّن خريطة العمق على هيئة torch.Tensor بالشكل (H, W)، حيث تمثل كل قيمة العمق المتنبأ به بالمتر (استخدم result.depth.data.cpu().numpy() للحصول على مصفوفة NumPy من نوع float32). يمكنك الوصول إليها عبر result.depth.data بعد إجراء التنبؤ. وتتوافق الخريطة مع دقة صورة الإدخال.

  • يوفر Ultralytics YOLO26 إعدادات YAML مدمجة لمجموعات بيانات متعددة لتقدير العمق، منها NYU Depth V2 وKITTI وHypersim وSUN RGB-D وARKitScenes. راجع دليل مجموعات بيانات تقدير العمق للاطلاع على القائمة الكاملة وتفاصيل التنسيق.

  • تحقق من نموذج YOLO26 مدرّب مسبقًا لتقدير العمق بتمرير ملف YAML لمجموعة البيانات المستخدمة في التقييم:

    مثال
    from ultralytics import YOLO
    
    # ⁨تحميل نموذج مدرَّب مسبقًا⁩
    model = YOLO("yolo26n-depth.pt")
    
    # ⁨تحقّق من النموذج⁩
    metrics = model.val(data="nyu-depth.yaml")
    print("delta1:", metrics.delta1)
    print("abs_rel:", metrics.abs_rel)
    print("rmse:", metrics.rmse)
  • صدّر نموذج YOLO26 للعمق إلى ONNX باستخدام Python أو CLI:

    مثال
    from ultralytics import YOLO
    
    # ⁨تحميل نموذج مدرَّب مسبقًا⁩
    model = YOLO("yolo26n-depth.pt")
    
    # ⁨تصدير النموذج إلى تنسيق ONNX⁩
    model.export(format="onnx")

    لمزيد من التفاصيل حول التصدير إلى تنسيقات مختلفة، راجع صفحة Export.

التعليقات