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.calibrate() ثلاثة خيارات باستخدام δ1 للمقياس الخام على الصور المحجوبة، عبر تحقق متقاطع من طيتين على ما يصل إلى نحو 200 صورة من المجموعة الموسومة، ثم يكتب الخيار الفائز في النموذج:

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

يُحتفَظ بالهوية ما لم يتفوق عليها الخيار الحالي أو خيار المقياس وحده بأكثر من 0.002 δ1؛ وإلا يفوز الخيار الأعلى نتيجةً من بينهما، وفي حال التعادل يُحتفَظ بالخيار الحالي. لذلك يحتفظ النموذج بمعايرته الحالية ما لم يحقق المقياس الجديد نتيجة أعلى، أو ما لم تتفوق أي من المعايرتين على الخرج الخام بذلك الهامش.

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

تأتي نقاط التحقق المنشورة لـ 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
IMX500imxyolo11n_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 خارجي (ويحتفظ YOLO26 برأسه الخالي من NMS على Axelera). اضبط 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.

التعليقات