Ultralytics YOLO27:
Get Started

بنية Ultralytics YOLOv5#

YOLOv5 (v6.0/6.1) خوارزمية قوية لاكتشاف الأجسام طورتها Ultralytics. تتناول هذه المقالة بعمق بنية YOLOv5، واستراتيجيات زيادة البيانات، ومنهجيات التدريب، وتقنيات حساب الخسارة. ويساعد هذا الفهم الشامل على تحسين تطبيقك العملي لاكتشاف الأجسام في مجالات متنوعة، بما فيها المراقبة والمركبات ذاتية القيادة والتعرّف على الصور.

1. بنية النموذج#

تتكون بنية YOLOv5 من ثلاثة أجزاء رئيسية:

  • العمود الفقري: هو الجزء الأساسي من الشبكة. صُمم العمود الفقري في YOLOv5 باستخدام بنية CSPDarknet53، وهي تعديل لبنية Darknet المستخدمة في الإصدارات السابقة.
  • العنق: يربط هذا الجزء العمود الفقري بالرأس. ويستخدم YOLOv5 بنيتي SPPF (تجميع هرمي مكاني - سريع) وPANet (شبكة تجميع المسارات).
  • الرأس: هذا الجزء مسؤول عن إنشاء المخرجات النهائية. ويستخدم YOLOv5 YOLOv3 Head لهذا الغرض.

يوضح الشكل أدناه بنية النموذج. ويمكن الاطلاع على تفاصيل بنية النموذج في models/yolov5l.yaml.

بنية YOLOv5 التي تعرض العمود الفقري والعنق والرأس

يتضمن YOLOv5 بعض التحسينات البارزة مقارنةً بالإصدارات السابقة:

  1. استُبدلت بنية Focus الموجودة في الإصدارات السابقة ببنية 6x6 Conv2d. ويعزز هذا التغيير الكفاءة #4825.
  2. استُبدلت بنية SPP بـ SPPF. ويزيد هذا التغيير سرعة المعالجة إلى أكثر من الضعف مع الحفاظ على المخرجات نفسها.

يمكن استخدام التعليمات البرمجية التالية لاختبار سرعة SPP وSPPF:

مثال على تحليل سرعة SPP مقابل SPPF (انقر للفتح)
import time

import torch
from torch import nn

class SPP(nn.Module):
    def __init__(self):
        """Initializes an SPP module with three different sizes of max pooling layers."""
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        """Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)

class SPPF(nn.Module):
    def __init__(self):
        """Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        """Applies sequential max pooling and concatenates results with input tensor."""
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)

def main():
    """Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"SPP time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"SPPF time: {time.time() - t_start}")

if __name__ == "__main__":
    main()

النتيجة:

True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

2. تقنيات زيادة البيانات#

يستخدم YOLOv5 تقنيات متنوعة لزيادة البيانات لتحسين قدرة النموذج على التعميم والحد من فرط التكيّف. وتشمل هذه التقنيات:

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

    زيادة البيانات بالفسيفساء في YOLOv5 عبر دمج أربع صور

  • زيادة البيانات بالنسخ واللصق: طريقة مبتكرة لزيادة البيانات تنسخ رقعًا عشوائية من صورة وتلصقها على صورة أخرى مختارة عشوائيًا، مما يؤدي إلى إنشاء عينة تدريب جديدة بفاعلية.

    زيادة البيانات بالنسخ واللصق في YOLOv5 لتقسيم المثيلات

  • التحويلات الأفينية العشوائية: تشمل تدوير الصور وتحجيمها وإزاحتها وقصّها عشوائيًا.

    التحويلات الأفينية العشوائية في YOLOv5 للتدريب

  • زيادة البيانات باستخدام MixUp: طريقة تنشئ صورًا مركبة عبر حساب تركيبة خطية من صورتين والتسميات المرتبطة بهما.

    زيادة البيانات باستخدام MixUp في YOLOv5 لمزج صورتين

  • Albumentations: مكتبة قوية لزيادة الصور تدعم مجموعة واسعة من تقنيات زيادة البيانات. تعرّف على مزيد من المعلومات حول استخدام تقنيات زيادة البيانات في Albumentations.

  • زيادة بيانات HSV: تغييرات عشوائية في تدرج الألوان والتشبع والقيمة للصور.

    أمثلة على زيادة بيانات فضاء ألوان HSV في YOLOv5

  • القلب الأفقي العشوائي: طريقة لزيادة البيانات تقلب الصور أفقيًا بصورة عشوائية.

    زيادة البيانات بالقلب الأفقي العشوائي في YOLOv5

3. استراتيجيات التدريب#

يطبق YOLOv5 عدة استراتيجيات تدريب متقدمة لتعزيز أداء النموذج. وتشمل:

  • التدريب متعدد المقاييس: تُعاد تحجيم الصور المدخلة عشوائيًا ضمن نطاق يتراوح بين 0.5 و1.5 ضعف حجمها الأصلي أثناء التدريب.
  • AutoAnchor: تعمل هذه الاستراتيجية على تحسين مربعات الارتكاز المسبقة لتتوافق مع الخصائص الإحصائية لمربعات الحقيقة الأرضية في بياناتك المخصصة.
  • مُجدوِل معدل التعلّم للإحماء والجيب التمام: طريقة لضبط معدل التعلّم لتحسين أداء النموذج.
  • المتوسط المتحرك الأسي (EMA): استراتيجية تستخدم متوسط المعلمات عبر الخطوات السابقة لتحقيق الاستقرار في عملية التدريب والحد من خطأ التعميم.
  • التدريب باستخدام الدقة المختلطة: طريقة لتنفيذ العمليات بصيغة دقة نصفية، ما يقلل استخدام الذاكرة ويعزز سرعة الحوسبة.
  • تطور المعلمات الفائقة: استراتيجية لضبط المعلمات الفائقة تلقائيًا لتحقيق الأداء الأمثل. اطّلع على درس تطور المعلمات الفائقة.

4. ميزات إضافية#

4.1 حساب الخسائر#

تُحسب الخسارة في YOLOv5 بوصفها مزيجًا من ثلاثة مكونات منفصلة للخسارة:

  • خسارة الفئات (خسارة BCE): خسارة الانتروبيا المتقاطعة الثنائية، وتقيس الخطأ في مهمة التصنيف.
  • خسارة وجود الكائن (خسارة BCE): خسارة أخرى للانتروبيا المتقاطعة الثنائية، وتحسب الخطأ في اكتشاف وجود كائن في خلية شبكة معينة من عدمه.
  • خسارة الموقع (خسارة CIoU): خسارة IoU الكاملة، وتقيس الخطأ في تحديد موقع الكائن داخل خلية الشبكة.

تُمثَّل دالة الخسارة الإجمالية كما يلي:

صيغة دالة الخسارة الإجمالية في YOLOv5

4.2 موازنة الخسائر#

تُمنح خسائر وجود الكائن في طبقات التنبؤ الثلاث (P3، P4، P5) أوزانًا مختلفة. وأوزان الموازنة هي [4.0, 1.0, 0.4] على التوالي. يضمن هذا النهج أن تسهم التنبؤات عند المقاييس المختلفة إسهامًا مناسبًا في الخسارة الإجمالية.

صيغة موازنة خسارة وجود الكائن في YOLOv5

4.3 إزالة حساسية الشبكة#

تُجري بنية YOLOv5 تغييرات مهمة على استراتيجية التنبؤ بالمربعات مقارنةً بالإصدارات السابقة من YOLO. في YOLOv2 وYOLOv3، كان يجري التنبؤ بإحداثيات المربع مباشرةً باستخدام تفعيل الطبقة الأخيرة.

صيغة التنبؤ بإحداثي x لمربع الإحاطة صيغة التنبؤ بإحداثي y لمربع الإحاطة صيغة التنبؤ بعرض مربع الإحاطة صيغة التنبؤ بارتفاع مربع الإحاطة

YOLOv5 grid computation

لكن في YOLOv5، حُدّثت صيغة التنبؤ بإحداثيات المربع للحد من حساسية الشبكة ومنع النموذج من التنبؤ بأبعاد غير محدودة للمربع.

فيما يلي الصيغ المنقحة لحساب مربع الإحاطة المتنبأ به:

صيغة إحداثي x المنقحة لمربع الإحاطة في YOLOv5 صيغة إحداثي y المنقحة لمربع الإحاطة في YOLOv5 صيغة العرض المنقحة لمربع الإحاطة في YOLOv5 صيغة الارتفاع المنقحة لمربع الإحاطة في YOLOv5

قارن إزاحة نقطة المركز قبل التحجيم وبعده. يُعدَّل نطاق إزاحة نقطة المركز من (0, 1) إلى (-0.5, 1.5). لذلك، يمكن أن تصبح الإزاحة 0 أو 1 بسهولة.

YOLOv5 grid scaling

قارن نسبة تحجيم الارتفاع والعرض (بالنسبة إلى المرساة) قبل التعديل وبعده. تنطوي معادلات مربعات yolo/darknet الأصلية على عيب خطير. فالعرض والارتفاع غير محدودين تمامًا، إذ إنهما ببساطة out=exp(in)، وهذا أمر خطير لأنه قد يؤدي إلى تضخم التدرجات، وعدم الاستقرار، وخسائر NaN، وفي النهاية إلى فشل التدريب بالكامل. راجع هذه المشكلة لمزيد من التفاصيل.

YOLOv5 unbounded scaling

4.4 إنشاء الأهداف#

تُعد عملية إنشاء الأهداف في YOLOv5 ضرورية لكفاءة التدريب ودقة النموذج. وتشمل إسناد مربعات الحقيقة الأرضية إلى خلايا الشبكة المناسبة في خريطة الإخراج ومطابقتها بمربعات الارتكاز المناسبة.

تتبع هذه العملية الخطوات التالية:

  • احسب نسبة أبعاد مربع الحقيقة الأرضية إلى أبعاد كل قالب ارتكاز.

صيغة نسبة عرض الحقيقة الأرضية إلى عرض المرساة

صيغة نسبة ارتفاع الحقيقة الأرضية إلى ارتفاع المرساة

صيغة أقصى نسبة للعرض

صيغة أقصى نسبة للارتفاع

صيغة النسبة القصوى الإجمالية

صيغة عتبة مطابقة المراسي

YOLOv5 IoU computation
  • إذا كانت النسبة المحسوبة ضمن العتبة، فطابق مربع الحقيقة الأرضية مع المرساة المقابلة.
YOLOv5 grid overlap
  • أسند المرساة المطابقة إلى الخلايا المناسبة، مع مراعاة أن مربع الحقيقة الأرضية قد يُسنَد إلى أكثر من مرساة بسبب تعديل نطاق إزاحة نقطة المركز من (0, 1) إلى (-0.5, 1.5)، ما يتيح إجراء مطابقات إضافية.
YOLOv5 anchor selection

بهذه الطريقة، تضمن عملية إنشاء الأهداف إسناد كل كائن من كائنات الحقيقة الأرضية ومطابقته على نحو صحيح أثناء التدريب، ما يتيح لـ YOLOv5 تعلّم مهمة اكتشاف الكائنات بفاعلية أكبر.

الخلاصة#

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

تشمل التحسينات الأساسية في YOLOv5 استخدام بنية ديناميكية، ومجموعة واسعة من تقنيات زيادة البيانات، واستراتيجيات تدريب مبتكرة، إلى جانب تعديلات مهمة على حساب الخسائر وعملية إنشاء الأهداف. وتُحسّن كل هذه الابتكارات دقة اكتشاف الكائنات وكفاءته تحسنًا كبيرًا، مع الحفاظ على سرعة عالية، وهي السمة المميزة لنماذج YOLO.

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

  • تستخرج بنية CSPDarknet53 الأساسية السمات، وتدمجها طبقتا SPPF وPANet عبر المقاييس، بينما تتنبأ طبقة الرأس، المصممة على غرار YOLOv3، بالمربعات ووجود الكائنات والفئات عند خطوات 8 و16 و32. وترد قائمة الطبقات كاملةً في models/yolov5l.yaml.

  • تربط SPPF ثلاث عمليات تجميع أقصى بحجم 5x5 على التوالي، بدلًا من تنفيذ عمليات تجميع 5x5 و9x9 و13x13 بالتوازي. وتكون المخرجات متطابقة رياضيًا، لكن التنفيذ أسرع بأكثر من الضعف، كما يوضح مقطع قياس الأداء أعلاه.

  • لم يكن إزاحة YOLO الأصلية تصل أبدًا إلى 0 أو 1 بالضبط، لذا كان من الصعب التنبؤ بالكائنات المتمركزة على حدود الشبكة. ويزيل توسيع نطاق دالة سيغمويد إلى (-0.5, 1.5) حساسية الشبكة، كما أن تربيع 2σ للعرض والارتفاع يحدّ التنبؤات إلى 4 أضعاف حجم المرساة، ما يمنع تضخم التدرجات الناتج عن الدالة الأسية غير المحدودة.

  • تُطابق أي مرساة تكون نسبتا عرضها وارتفاعها إلى المربع ضمن anchor_t (4.0 افتراضيًا)، كما يتيح نطاق الإزاحة الموسع إسناد المربع أيضًا إلى خليتي الشبكة المجاورتين. لذلك، يمكن لكائن واحد إنشاء عدة أهداف إيجابية، ما يسرّع التقارب.

التعليقات