اكتشاف مربعات الإحاطة الموجّهة باستخدام Ultralytics YOLO#
يتجاوز اكتشاف الكائنات الموجّه خطوةً إضافيةً مقارنةً باكتشاف الكائنات القياسي، إذ يضيف زاويةً لتحديد مواقع الكائنات في الصورة بدقة أكبر.
تتمثل مخرجات كاشف الكائنات الموجّه في مجموعة من مربعات الإحاطة المستديرة التي تحيط بدقة بالكائنات في الصورة، إلى جانب تسميات الفئات ودرجات الثقة لكل مربع. وتفيد مربعات الإحاطة الموجّهة خصوصًا عندما تظهر الكائنات بزوايا مختلفة، مثل الصور الجوية، حيث قد تتضمن مربعات الإحاطة التقليدية المحاذية للمحاور خلفية غير ضرورية. ومن الاستخدامات الشائعة اكتشاف السفن والمركبات من الأقمار الصناعية والطائرات المسيّرة، وتحليل المباني والبنية التحتية للتخطيط الحضري، ومراقبة المحاصيل، وفحص الألواح الشمسية أو توربينات الرياح.
شاهد: كيفية اكتشاف الكائنات وتتبعها باستخدام مربعات الإحاطة الموجّهة (OBB) في Ultralytics YOLO26 | تتبع السفن 🚢
تستخدم نماذج YOLO26 OBB اللاحقة -obb، أي yolo26n-obb.pt، وتُدرَّب مسبقًا على DOTAv1.
| اكتشاف السفن باستخدام OBB | اكتشاف المركبات باستخدام OBB |
|---|---|
![]() | ![]() |
النماذج#
تظهر أدناه نماذج YOLO26 OBB المدرّبة مسبقًا على مجموعة بيانات DOTAv1.
تُنزّل النماذج تلقائيًا من أحدث إصدار من Ultralytics عند استخدامها لأول مرة.
| النموذج | الحجم (بكسل) | mAPالاختبار 50-95(e2e) | mAPالاختبار 50(e2e) | السرعة CPU ONNX (مللي ثانية) | السرعة T4 TensorRT10 (ms) | المعاملات (M) | FLOPs (B) |
|---|---|---|---|---|---|---|---|
| YOLO26n-obb | 1024 | 52.4 | 78.9 | 97.7 ± 0.9 | 2.8 ± 0.0 | 2.4 | 14.8 |
| YOLO26s-obb | 1024 | 54.8 | 80.9 | 218.0 ± 1.4 | 4.9 ± 0.1 | 9.8 | 56.7 |
| YOLO26m-obb | 1024 | 55.3 | 81.0 | 579.2 ± 3.8 | 10.2 ± 0.3 | 21.2 | 184.9 |
| YOLO26l-obb | 1024 | 56.2 | 81.6 | 735.6 ± 3.1 | 13.0 ± 0.2 | 25.6 | 232.4 |
| YOLO26x-obb | 1024 | 56.7 | 81.7 | 1485.7 ± 11.5 | 30.5 ± 0.9 | 57.6 | 520.1 |
- قيم mAPtest محسوبة لنموذج واحد وبمقاييس متعددة على مجموعة بيانات DOTAv1.
أعِد إنتاج النتائج باستخدامyolo obb val data=DOTAv1.yaml device=0 split=test nms=False save_json=Trueوقدّم النتائج المدمجة إلى تقييم DOTA. - السرعة هي متوسط الأداء على صور التحقق DOTAv1 باستخدام ONNX على CPU وTensorRT10 على وحدة معالجة الرسوميات NVIDIA T4.
أعِد إنتاج النتائج باستخدامyolo obb val data=DOTAv1.yaml batch=1 device=0|cpu nms=False - قيم المعلمات وFLOPs خاصة بالنماذج المدمجة بعد طي Conv/BatchNorm وإزالة فرع الاكتشاف غير المستخدم. تحتفظ نقاط التحقق المدرّبة مسبقًا ببنية التدريب الكاملة، وقد تُظهر أعدادًا أعلى.
اطّلع على معاينة YOLO27 غير المُصدرة لمعرفة النتائج الأولية لـ DOTAv1.
التدريب#
درّب YOLO26n-obb على مجموعة بيانات DOTA8 لمدة 100 حقبة وبحجم صورة 640. للاطلاع على القائمة الكاملة بالوسيطات المتاحة، راجع صفحة الإعدادات.
إن مربع OBB ودورانه بمقدار 180° متطابقان، لذا يُعرَّف الدوران بترديد 180° ولا يكون للمربع اتجاه. وتُوحَّد تسميات التدريب وفق صيغة الضلع الأطول: يكون عرض المربع w هو الضلع الأطول، وتُقاس الزاوية باتجاه عقارب الساعة من محور x الموجب إلى اتجاه الضلع w، وتُخزَّن بالراديان في [-π/4, 3π/4) ([-45°, 135°)). لا تُوحَّد التنبؤات بهذه الطريقة، لذا قد يُظهر المربع المتنبأ به الضلع الأقصر بوصفه w؛ راجع مخرجات النتائج. إن صيغة [0°, 90°) هي الاصطلاح المنتظم وفق نمط DOTA، ولا تُطبَّق أثناء التدريب أو الاستدلال.
from ultralytics import YOLO
# تحميل نموذج
model = YOLO("yolo26n-obb.yaml") # إنشاء نموذج جديد من YAML
model = YOLO("yolo26n-obb.pt") # تحميل نموذج مدرّب مسبقًا (موصى به للتدريب)
model = YOLO("yolo26n-obb.yaml").load("yolo26n-obb.pt") # الإنشاء من YAML ونقل الأوزان
# تدريب النموذج
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)شاهد: كيفية تدريب نماذج Ultralytics YOLO-OBB (مربعات الإحاطة الموجّهة) على مجموعة بيانات DOTA باستخدام منصة Ultralytics
راجع التفاصيل الكاملة لوضع train في صفحة التدريب. ويمكن أيضًا تدريب نماذج OBB باستخدام التدريب السحابي على منصة Ultralytics.
تنسيق مجموعة البيانات#
للاطلاع على التفاصيل المتعلقة بتنسيق مجموعة بيانات OBB، راجع دليل مجموعة البيانات. يحدد تنسيق YOLO OBB مربعات الإحاطة بنقاط زواياها الأربع، مع تطبيع الإحداثيات بين 0 و1، وفق البنية التالية. وتدعم التعليقات التوضيحية على منصة Ultralytics تسميات OBB باستخدام أداة مخصصة لرسم مربعات الإحاطة الموجّهة:
class_index x1 y1 x2 y2 x3 y3 x4 y4يعالج YOLO الخسائر والمخرجات داخليًا بتنسيق xywhr، الذي يمثل مركز مربع الإحاطة (xy) وعرضه وارتفاعه ودورانه.
التحقق#
تحقّق من دقة نموذج YOLO26n-obb المدرَّب على مجموعة بيانات DOTA8. مرّر data صراحةً لكي يستخدم التحقق من الصحة ملف YAML لمجموعة البيانات المقصودة.
from ultralytics import YOLO
# تحميل نموذج
model = YOLO("yolo26n-obb.pt") # حمّل نموذجًا رسميًا
model = YOLO("path/to/best.pt") # تحميل نموذج مخصص
# تحقّق من النموذج
metrics = model.val(data="dota8.yaml") # تحقّق من الصحة على مجموعة بيانات DOTA8
metrics.box.map # map50-95(B)
metrics.box.map50 # map50(B)
metrics.box.map75 # map75(B)
metrics.box.maps # قائمة تحتوي على mAP50-95(B) لكل فئة
metrics.box.image_metrics # قاموس المقاييس لكل صورة، ويشمل precision وrecall وF1 وTP وFP وFNالتنبؤ#
استخدم نموذج YOLO26n-obb مدرَّبًا لإجراء تنبؤات على الصور.
from ultralytics import YOLO
# تحميل نموذج
model = YOLO("yolo26n-obb.pt") # حمّل نموذجًا رسميًا
model = YOLO("path/to/best.pt") # تحميل نموذج مخصص
# أجرِ التنبؤ باستخدام النموذج
results = model("https://ultralytics.com/images/boats.jpg") # أجرِ التنبؤ على صورة
# الوصول إلى النتائج
for result in results:
xywhr = result.obb.xywhr # المركز-x، المركز-y، العرض، الارتفاع، الزاوية (بالراديان)
xyxyxyxy = result.obb.xyxyxyxy # تنسيق مضلع بأربع نقاط
names = [result.names[cls.item()] for cls in result.obb.cls.int()] # اسم فئة كل مربع
confs = result.obb.conf # درجة الثقة لكل مربعاطّلع على التفاصيل الكاملة لوضع predict في صفحة التنبؤ.
مرّر save_crop=True لحفظ قصاصة محاذاة للدوران لكل OBB بحجم صندوقه، كما يفعل ObjectCropper أيضًا.
مخرجات النتائج#
يعيد اكتشاف مربعات الإحاطة الموجّهة كائن Results واحدًا لكل صورة. حقل التنبؤ الأساسي هو result.obb، ويحتوي على المربعات المستديرة ومعرّفات الفئات ودرجات الثقة لكل كائن مكتشف.
| السمة | النوع | الشكل | الوصف |
|---|---|---|---|
result.obb | OBB | (N) | الصناديق الموجَّهة. |
result.obb.data | torch.float32 | (N,7/8) | الصناديق المُدارة الخام مع درجة الثقة/الفئة. |
result.obb.xywhr | torch.float32 | (N,5) | الصناديق المُدارة في xywhr. |
result.obb.xyxyxyxy | torch.float32 | (N,4,2) | أربع نقاط زوايا. |
result.obb.conf | torch.float32 | (N,) | درجات الثقة. |
تُوحَّد صيغة التسميات وفق اصطلاح الحافة الطويلة، بينما لا تُوحَّد صيغة التنبؤات؛ لذا قد يُظهر result.obb.xywhr أن w أصغر من h عند قياس الدوران انطلاقًا من الحافة القصيرة. تصف الصيغتان المستطيل نفسه، لذا يكون result.obb.xyxyxyxy صحيحًا في كلتا الحالتين. عند التتبّع، يحتفظ كل مسار بصيغة نصف دورة (θ أو θ ± π) الأقرب إلى زاويته السابقة، لذلك لا تنقلب زوايا المسارات بمقدار π بين الإطارات، وقد تخرج عن [-π/4, 3π/4). أعد تحويل الزوايا إلى الإحداثيات الركنية عندما يحتاج إليها الكود اللاحق بصيغة الحافة الطويلة، مع مراعاة أن إعادة كتابة معلمات الصندوق قد تؤدي دوريًا إلى تغيير ترتيب الزوايا الركنية:
from ultralytics.utils.ops import xyxyxyxy2xywhr
xywhr = xyxyxyxy2xywhr(result.obb.xyxyxyxy) # w >= h، والدوران في [-pi/4, 3pi/4)للاطلاع على حقول Results الخاصة بكل مهمة، راجع قسم نتائج التنبؤ حسب المهمة.
التصدير#
صدّر نموذج YOLO26n-obb إلى تنسيق آخر مثل ONNX أو CoreML وغيرها.
from ultralytics import YOLO
# تحميل نموذج
model = YOLO("yolo26n-obb.pt") # حمّل نموذجًا رسميًا
model = YOLO("path/to/best.pt") # تحميل نموذج مخصص
# صدّر النموذج
model.export(format="onnx")تتوفر تنسيقات تصدير YOLO26-obb في الجدول أدناه. يمكنك التصدير إلى أي تنسيق باستخدام الوسيطة format، أي format='onnx' أو format='engine'. يمكنك التنبؤ باستخدام النماذج المُصدَّرة أو التحقق من صحتها مباشرةً، أي yolo predict model=yolo26n-obb.onnx. تُعرض أمثلة الاستخدام الخاصة بنموذجك بعد اكتمال التصدير.
| التنسيق | وسيط format | النموذج | البيانات الوصفية | الوسيطات |
|---|---|---|---|---|
| PyTorch | - | yolo26n-obb.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-obb.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-obb.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-obb_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-obb.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-obb.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n-obb.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n-obb_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-obb.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-obb_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n-obb.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-obb_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-obb.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-obb_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo11n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-obb_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-obb_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-obb_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-obb_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-obb_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n-obb_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n-obb_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n-obb_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
يُخرج nms=None افتراضيًا مخرجات خامًا لاستخدام NMS خارجي (ويحتفظ YOLO26 برأسه الخالي من NMS على Axelera). اضبط nms=False لتحديد رأس خالٍ من NMS متاح؛ أما التنسيقات غير المدعومة فتعود إلى مسار الإخراج الأصلي الخاص بها. تحدد إدخالات nms أعلاه التنسيقات التي يمكنها تضمين NMS باستخدام nms=True.
اطّلع على التفاصيل الكاملة لـexport في صفحة التصدير.
الأسئلة الشائعة#
تتضمن مربعات الإحاطة الموجّهة (OBB) زاوية إضافية لتحسين دقة تحديد مواضع الكائنات في الصور. وعلى عكس مربعات الإحاطة العادية، وهي مستطيلات محاذية للمحاور، يمكن تدوير مربعات الإحاطة الموجّهة لتلائم اتجاه الكائن بشكل أفضل. وهذا مفيد بوجه خاص للتطبيقات التي تتطلب تحديدًا دقيقًا لمواضع الكائنات، مثل الصور الجوية أو صور الأقمار الصناعية (دليل مجموعات البيانات).
لتدريب نموذج YOLO26n-obb باستخدام مجموعة بيانات مخصصة، اتبع المثال أدناه باستخدام Python أو CLI:
مثالfrom ultralytics import YOLO # تحميل نموذج مدرَّب مسبقًا model = YOLO("yolo26n-obb.pt") # تدريب النموذج results = model.train(data="path/to/custom_dataset.yaml", epochs=100, imgsz=640)لمزيد من وسيطات التدريب، راجع قسم الإعدادات.
تُدرَّب نماذج YOLO26-OBB مسبقًا على مجموعات بيانات مثل DOTAv1، لكن يمكنك استخدام أي مجموعة بيانات مُهيأة بتنسيق OBB. تتوفر معلومات تفصيلية عن تنسيقات مجموعات بيانات OBB في دليل مجموعات البيانات.
للتحقق من نموذج YOLO26n-obb، يمكنك استخدام أوامر Python أو CLI كما هو موضح أدناه:
مثالfrom ultralytics import YOLO # تحميل نموذج model = YOLO("yolo26n-obb.pt") # تحقّق من النموذج metrics = model.val(data="dota8.yaml")اطّلع على تفاصيل التحقق الكاملة في قسم Val.
يمكن بسهولة تصدير نموذج YOLO26-OBB إلى تنسيق ONNX باستخدام Python أو CLI:
مثالfrom ultralytics import YOLO # تحميل نموذج model = YOLO("yolo26n-obb.pt") # صدّر النموذج model.export(format="onnx")لمزيد من تنسيقات التصدير والتفاصيل، راجع صفحة Export.

