تخطي إلى المحتوى

تدريب YOLOv5 على البيانات المخصصة

📚 يشرح هذا الدليل كيفية تدريب مجموعة البيانات المخصصة الخاصة بك باستخدام YOLOv5 🚀. يعد تدريب النماذج المخصصة خطوة أساسية في تخصيص حلول الرؤية الحاسوبية لتطبيقات واقعية محددة تتجاوز اكتشاف الأجسام العامة.

قبل أن تبدأ

أولاً، تأكد من إعداد البيئة اللازمة. استنساخ مستودع YOLOv5 وتثبيت التبعيات المطلوبة من requirements.txt. A Python.8.0 البيئة مع PyTorch.8 ضروري. يتم تنزيل النماذج ومجموعات البيانات تلقائيًا من أحدث إصدار YOLOv5 الإصدار إذا لم يتم العثور عليها محلياً.

git clone https://github.com/ultralytics/yolov5 # Clone the repository
cd yolov5
pip install -r requirements.txt # Install dependencies

التدريب على البيانات المخصصة

مخطط حلقة التعلم النشط Ultralytics الذي يوضح جمع البيانات، ووضع العلامات، والتدريب، والنشر، وجمع الحالات المتطورة

يعد تطوير نموذج مخصص للكشف عن الكائنات عملية تكرارية:

  1. جمع الصور وتنظيمها: اجمع الصور ذات الصلة بمهمتك المحددة. البيانات عالية الجودة والمتنوعة أمر بالغ الأهمية. راجع دليلنا حول جمع البيانات والتعليقات التوضيحية.
  2. تسمية الكائنات: قم بتسمية الكائنات ذات الأهمية داخل صورك بدقة.
  3. تدريب نموذج: استخدم البيانات المصنفة لتدريب نموذج YOLOv5 الخاص بك. استفد من تعلّم النقل من خلال البدء بأوزان مُدرّبة مسبقًا.
  4. النشر والتنبؤ: استخدام النموذج المدرّب للاستدلال على البيانات الجديدة غير المرئية.
  5. جمع حالات الحافة: حدّد السيناريوهات التي يكون أداء النموذج فيها ضعيفًا(حالات الحافة) وأضف بيانات مماثلة إلى مجموعة بياناتك لتحسين المتانة. كرر الدورة.

يوفر حلUltralytics HUB حلاً مبسطاً خالياً من التعليمات البرمجية لدورة عمليات التعلم الآلي (MLOps) بأكملها، بما في ذلك إدارة مجموعة البيانات وتدريب النماذج ونشرها.

الترخيص

توفر Ultralytics خيارين للترخيص لاستيعاب سيناريوهات الاستخدام المتنوعة:

  • رخصةAGPL-3.0 : تعتبر هذه الرخصة مفتوحة المصدر المعتمدة من OSI مثالية للطلاب والباحثين والمتحمسين الشغوفين بالتعاون المفتوح ومشاركة المعرفة. يتطلب مشاركة الأعمال المشتقة تحت نفس الرخصة. راجع ملف LICENSE للحصول على التفاصيل الكاملة.
  • ترخيص المؤسسات: صُمم هذا الترخيص للتطبيقات التجارية، ويسمح هذا الترخيص بالتكامل السلس لبرمجيات Ultralytics ونماذج الذكاء الاصطناعي في المنتجات والخدمات التجارية دون شروط المصدر المفتوح ل AGPL-3.0 إذا كان مشروعك يتطلب نشرًا تجاريًا، فاطلب ترخيصًا مؤسسيًا.

استكشف المزيد من خيارات الترخيص لدينا على صفحة ترخيصUltralytics .

قبل بدء التدريب، يعد إعداد مجموعة البيانات أمرًا ضروريًا.

1. إنشاء مجموعة بيانات

تتطلب نماذج YOLOv5 بيانات مصنفة لمعرفة الخصائص المرئية لفئات الكائنات. تنظيم مجموعة بياناتك بشكل صحيح هو المفتاح.

1.1 إنشاء dataset.yaml

ملف تكوين مجموعة البيانات (على سبيل المثال, coco128.yaml) يحدد بنية مجموعة البيانات وأسماء الفئات والمسارات إلى أدلة الصور. COCO128 بمثابة مثال صغير لمجموعة بيانات صغيرة، تضم أول 128 صورة من مجموعة البيانات الشاملة كوكو مجموعة البيانات. إنه مفيد لاختبار خط أنابيب التدريب بسرعة وتشخيص المشكلات المحتملة مثل الإفراط في التركيب.

إن dataset.yaml تتضمن بنية الملف ما يلي:

  • path: الدليل الجذر الذي يحتوي على مجموعة البيانات.
  • train, val, test: المسارات النسبية من path إلى أدلة تحتوي على صور أو ملفات نصية تسرد مسارات الصور لمجموعات التدريب والتحقق من الصحة والاختبار.
  • names: قاموس تعيين مؤشرات الفئات (بدءًا من 0) إلى أسماء الفئات المقابلة لها.

فيما يلي هيكلية coco128.yaml (عرض على GitHub):

# Dataset root directory relative to the yolov5 directory
path: ../datasets/coco128

# Train/val/test sets: specify directories, *.txt files, or lists
train: images/train2017 # 128 images for training
val: images/train2017 # 128 images for validation
test: # Optional path to test images

# Classes (example using 80 COCO classes)
names:
    0: person
    1: bicycle
    2: car
    # ... (remaining COCO classes)
    77: teddy bear
    78: hair drier
    79: toothbrush

1.2 الاستفادة من النماذج الخاصة بالتوسيم الآلي

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

  • Google الجوزاء: تمتلك نماذج كبيرة متعددة الوسائط مثل Gemini قدرات قوية لفهم الصور. يمكن مطالبتهم بتحديد الكائنات وتحديد مواقعها داخل الصور، وإنشاء مربعات أو أوصاف يمكن تحويلها إلى تسميات بتنسيق YOLO . استكشف إمكاناتها في المفكرة التعليمية المتوفرة.
  • SAM2 (نموذج أي شيء قطاعي 2): يمكن للنماذج التأسيسية التي تركز على التجزئة، مثل SAM2 تحديد وتحديد الكائنات بدقة عالية. على الرغم من أنه مخصص في المقام الأول للتجزئة، إلا أنه يمكن تحويل الأقنعة الناتجة في كثير من الأحيان إلى شروح صندوقية محددة مناسبة لمهام اكتشاف الكائنات.
  • عالم يولوورلد: يوفر هذا النموذج إمكانات الكشف عن المفردات المفتوحة. يمكنك تقديم أوصاف نصية للكائنات التي تهتم بها، ويمكن لـ YOLOWorld تحديد موقعها في الصور دون تدريب مسبق على تلك الفئات المحددة. يمكن استخدام هذا كنقطة بداية لتوليد تسميات أولية، والتي يمكن تنقيحها بعد ذلك.

يمكن أن يوفر استخدام هذه النماذج خطوة "التسمية المسبقة"، مما يقلل من الجهد اليدوي المطلوب. ومع ذلك، من الضروري مراجعة وتنقيح التسميات التي يتم إنشاؤها تلقائيًا لضمان الدقة والاتساق، حيث تؤثر الجودة بشكل مباشر على أداء نموذج YOLOv5 المدرّب الخاص بك. بعد إنشاء (وربما تنقيح) التسميات الخاصة بك، تأكد من التزامها ب YOLO التنسيق:: واحد *.txt ملف لكل صورة، بحيث يمثل كل سطر كائنًا على أنه class_index x_center y_center width height (إحداثيات طبيعية، فئة ذات فهرس صفري). إذا كانت الصورة لا تحتوي على كائنات ذات أهمية، فلا توجد صورة مقابلة *.txt ملف مطلوب.

تنسيق YOLO *.txt مواصفات الملف دقيقة:

  • صف واحد لكل صندوق حدود الكائن.
  • يجب أن يحتوي كل صف على: class_index x_center y_center width height.
  • يجب أن تكون الإحداثيات تطبيع إلى نطاق يتراوح بين 0 و1. لتحقيق ذلك، قم بتقسيم قيم البكسل ل x_center و width على العرض الكلي للصورة، ثم قسمة y_center و height بالارتفاع الكلي للصورة.
  • تكون مؤشرات الفئات ذات فهرسة صفرية (أي أن الفئة الأولى ممثلة بـ 0والثاني بواسطة 1وما إلى ذلك).

مثال على صورة مع شخصين وربطة عنق مشروحة

ملف التسمية المطابق للصورة أعلاه، الذي يحتوي على كائنين "شخص" (فهرس الفئة 0) وكائن "ربطة عنق" واحد (فهرس الفئة 27)، سيبدو هكذا:

مثال لمحتوى ملف تسمية تنسيق YOLO للصورة المشروحة

1.3 تنظيم الدلائل

هيكلة مجموعات البيانات كما هو موضح أدناه. افتراضيًا، يتوقع YOLOv5 دليل مجموعة البيانات (على سبيل المثال, /coco128) للإقامة داخل /datasets المجلد الموجود المجاورة لـ فإن /yolov5 دليل المستودع.

يقوم YOLOv5 تلقائيًا بتحديد موقع التسميات لكل صورة عن طريق استبدال آخر مثيل ل /images/ في مسار الصورة مع /labels/. على سبيل المثال:

../datasets/coco128/images/im0.jpg # Path to the image file
../datasets/coco128/labels/im0.txt # Path to the corresponding label file

بنية الدليل الموصى بها هي:

/datasets/
└── coco128/  # Dataset root
    ├── images/
    │   ├── train2017/  # Training images
    │   │   ├── 000000000009.jpg
    │   │   └── ...
    │   └── val2017/    # Validation images (optional if using same set for train/val)
    │       └── ...
    └── labels/
        ├── train2017/  # Training labels
        │   ├── 000000000009.txt
        │   └── ...
        └── val2017/    # Validation labels (optional if using same set for train/val)
            └── ...

رسم تخطيطي يوضح هيكل دليل مجموعة بيانات YOLOv5 الموصى به

2. اختر الطراز

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

مخطط مقارنة بين موديلات YOLOv5 يوضح الحجم والسرعة والدقة

3. القطار

ابدأ التدريب النموذجي باستخدام train.py السيناريو. تشمل الحجج الأساسية ما يلي:

  • --img: يحدد المدخلات حجم الصورة (على سبيل المثال, --img 640). تنتج الأحجام الأكبر عمومًا دقة أفضل ولكنها تتطلب المزيد من ذاكرة GPU .
  • --batch: يحدد حجم الدُفعة (على سبيل المثال, --batch 16). اختر أكبر حجم يمكن GPU لديك التعامل معه.
  • --epochs: يحدد العدد الإجمالي للتدريب الحقب الزمنية (على سبيل المثال, --epochs 100). تمثل الحلقة الواحدة تمريرة كاملة على مجموعة بيانات التدريب بأكملها.
  • --data: الطريق إلى dataset.yaml ملف (على سبيل المثال, --data coco128.yaml).
  • --weights: المسار إلى ملف الأوزان الأولية. باستخدام الأوزان المدربة مسبقًا (على سبيل المثال, --weights yolov5s.pt) ينصح بشدة للحصول على تقارب أسرع ونتائج أفضل. للتدريب من الصفر (لا يُنصح به إلا إذا كانت لديك مجموعة بيانات كبيرة جدًا واحتياجات محددة)، استخدم --weights '' --cfg yolov5s.yaml.

يتم تنزيل الأوزان التي تم تدريبها مسبقًا تلقائيًا من أحدث إصدار YOLOv5 إذا لم يتم العثور عليها محليًا.

# Example: Train YOLOv5s on the COCO128 dataset for 3 epochs
python train.py --img 640 --batch 16 --epochs 3 --data coco128.yaml --weights yolov5s.pt

تحسين سرعة التدريب

💡 التوظيف --cache ram أو --cache disk لتخزين صور مجموعة البيانات مؤقتًا في ذاكرة الوصول العشوائي أو القرص المحلي، على التوالي. يؤدي ذلك إلى تسريع التدريب بشكل كبير، خاصةً عندما تكون عمليات الإدخال/الإخراج (الإدخال/الإخراج) لمجموعة البيانات عنق الزجاجة. لاحظ أن هذا يتطلب مساحة كبيرة من ذاكرة الوصول العشوائي أو القرص.

تخزين البيانات المحلية

💡 قم دائمًا بالتدريب باستخدام مجموعات البيانات المخزنة محليًا. يمكن أن يكون الوصول إلى البيانات من محركات أقراص الشبكة (مثل Google Drive) أو التخزين عن بُعد أبطأ بكثير ويعيق أداء التدريب. غالبًا ما يكون نسخ مجموعة البيانات إلى محرك أقراص SSD محلي هو أفضل ممارسة.

تُحفظ جميع مخرجات التدريب، بما في ذلك الأوزان والسجلات في runs/train/ الدليل. تقوم كل جلسة تدريبية بإنشاء دليل فرعي جديد (على سبيل المثال, runs/train/exp, runs/train/exp2إلخ). للحصول على تجربة تفاعلية وعملية، استكشف قسم التدريب في دفاتر الملاحظات التعليمية الرسمية: افتح في كولاب فتح في Kaggle

4. تصوّر

يتكامل YOLOv5 بسلاسة مع العديد من الأدوات لتصور تقدم التدريب وتقييم النتائج ومراقبة الأداء في الوقت الفعلي.

Comet التسجيل والتصور 🌟 جديد

Comet متكامل تمامًا للتتبع الشامل للتجربة. يمكنك عرض المقاييس مباشرةً، وحفظ المعلمات الفائقة، وإدارة مجموعات البيانات ونقاط التحقق من النموذج، وتحليل تنبؤات النموذج باستخدام لوحاتComet المخصصة التفاعلية.

البدء في العمل مباشرة:

pip install comet_ml                                                          # 1. Install Comet library
export COMET_API_KEY=YOUR_API_KEY_HERE                                        # 2. Set your Comet API key (create a free account at Comet.ml)
python train.py --img 640 --epochs 3 --data coco128.yaml --weights yolov5s.pt # 3. Train your model - Comet automatically logs everything!

تعمّق أكثر في الميزات المدعومة في دليل تكامل Comet. تعرف على المزيد حول إمكانيات Comet من خلال الوثائق. جرّب دفتر ملاحظات Comet كولاب للحصول على عرض توضيحي مباشر: افتح في كولاب

واجهة مستخدم Comet UI تعرض مقاييس تدريب YOLOv5 وتصوراته

ClearML التسجيل والأتمتة 🌟 جديد

ClearML يتيح التكامل إمكانية التتبع التفصيلي للتجارب وإدارة إصدارات مجموعة البيانات وحتى تنفيذ عمليات التدريب عن بُعد. قم بتفعيل ClearML بهذه الخطوات البسيطة:

  • قم بتثبيت الحزمة: pip install clearml
  • تهيئة ClearML: تشغيل clearml-init مرة واحدة للاتصال بخادم ClearML الخاص بك (سواء كان مستضافًا ذاتيًا أو الفئة المجانية).

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

واجهة مستخدم ClearML لإدارة التجارب تُظهر الرسوم البيانية والسجلات الخاصة بالتدريب على YOLOv5

التسجيل المحلي

يتم تسجيل نتائج التدريب تلقائيًا باستخدام لوحة تينسور بورد وحفظها على أنها CSV الملفات داخل دليل التجربة المحدد (على سبيل المثال, runs/train/exp). تتضمن البيانات المسجلة:

  • مقاييس فقدان التدريب والتحقق من الصحة والأداء.
  • عينة من الصور التي تُظهر التعزيزات المطبقة (مثل الفسيفساء).
  • تسميات الحقيقة الأرضية إلى جانب تنبؤات النموذج للفحص البصري.
  • مقاييس التقييم الرئيسية مثل منحنيات دقةالاستدعاء (PR).
  • مصفوفات الارتباك لتحليل الأداء التفصيلي على مستوى الفئة.

مثال على نتائج التسجيل المحلي بما في ذلك المخططات وفسيفساء الصور من تدريب YOLOv5

إن results.csv يتم تحديث الملف بعد كل حقبة زمنية ويتم رسمه على هيئة results.png بمجرد انتهاء التدريب. يمكنك أيضًا رسم أي results.csv الملف يدويًا باستخدام وظيفة الأداة المساعدة المتوفرة:

from utils.plots import plot_results

# Plot results from a specific training run directory
plot_results("runs/train/exp/results.csv")  # This will generate 'results.png' in the same directory

مثال على رسم بياني للنتائج.png يوضح مقاييس التدريب مثل mAP والدقة والاستدعاء والخسارة على الحلقات

5. الخطوات التالية

عند الانتهاء بنجاح من التدريب، تكون نقطة التحقق من النموذج الأفضل أداءً (best.pt) محفوظة وجاهزة للنشر أو لمزيد من التنقيح. تشمل الخطوات التالية المحتملة ما يلي:

البيئات المدعومة

توفر Ultralytics بيئات جاهزة للاستخدام مجهزة بتبعيات أساسية مثل CUDAو cuDNNPythonو PyTorchمما يسهل البداية السلسة.

حالة المشروع

شارة حالة التكامل المستمر YOLOv5 شارة حالة التكامل المستمر

تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (CI)لإجراءات YOLOv5 GitHub بنجاح. تغطي اختبارات التكامل المستمر (CI) الصارمة هذه الوظائف الأساسية، بما في ذلك التدريب والتحقق من الصحة والاستدلال والتصدير والمقاييس عبر أنظمة تشغيل macOS وWindows وUbuntu. يتم تنفيذ الاختبارات تلقائيًا كل 24 ساعة وعند كل التزام برمجي، مما يضمن ثباتًا ثابتًا وأداءً مثاليًا.

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

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

كيف يمكنني تدريب YOLOv5 على مجموعة البيانات المخصصة الخاصة بي؟

يتضمن تدريب YOLOv5 على مجموعة بيانات مخصصة عدة خطوات رئيسية:

  1. إعداد مجموعة البيانات الخاصة بك: جمع الصور ووضع التعليقات التوضيحية عليها. تأكد من وجود التعليقات التوضيحية في YOLO التنسيق. تنظيم الصور والملصقات في train/ و val/ (واختيارياً test/) الدلائل. ضع في اعتبارك استخدام نماذج مثل Google الجوزاء, SAM2أو عالم يولوورلد للمساعدة في عملية وضع العلامات أو أتمتتها (انظر القسم 1-2).
  2. إعداد البيئة المحيطة بك: استنساخ مستودع YOLOv5 وتثبيت التبعيات باستخدام pip install -r requirements.txt.
    git clone https://github.com/ultralytics/yolov5
    cd yolov5
    pip install -r requirements.txt
    
  3. إنشاء تكوين مجموعة البيانات: تحديد مسارات مجموعة البيانات وعدد الفئات وأسماء الفئات في dataset.yaml الملف.
  4. ابدأ التدريب: تنفيذ train.py النص البرمجي، وتوفير مسارات إلى dataset.yaml، الأوزان المطلوبة قبل التدريب (على سبيل المثال, yolov5s.pt)، وحجم الصورة، وحجم الدُفعة، وعدد الحقب الزمنية.
    python train.py --img 640 --batch 16 --epochs 100 --data path/to/your/dataset.yaml --weights yolov5s.pt
    

لماذا يجب أن أستخدم Ultralytics HUB لتدريب نماذج YOLO الخاصة بي؟

إن Ultralytics HUB عبارة عن منصة شاملة مصممة لتبسيط دورة حياة تطوير نموذج YOLO بالكامل، وغالباً دون الحاجة إلى كتابة أي كود. تشمل المزايا الرئيسية ما يلي:

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

للحصول على إرشادات عملية، راجع منشور المدونة الخاص بنا: كيفية تدريب نماذجك المخصصة باستخدام Ultralytics HUB.

كيف يمكنني تحويل بياناتي المشروحة إلى تنسيق YOLOv5

سواء قمت بالتعليق التوضيحي يدويًا أو باستخدام أدوات آلية (مثل تلك المذكورة في القسم 1-2)، يجب أن تكون التسميات النهائية بتنسيقYOLO المحدد الذي يتطلبه YOLOv5:

  • إنشاء واحد .txt ملف لكل صورة. يجب أن يتطابق اسم الملف مع اسم ملف الصورة (على سبيل المثال, image1.jpg يتوافق مع image1.txt). ضع هذه الملفات في labels/ دليل موازٍ لدليل موازٍ ل images/ دليل (على سبيل المثال, ../datasets/mydataset/labels/train/).
  • كل سطر داخل .txt ملف يمثل تعليقًا توضيحيًا لكائن واحد ويتبع التنسيق: class_index center_x center_y width height.
  • الإحداثيات (center_x, center_y, width, height) يجب أن يكون تطبيع (قيم تتراوح بين 0.0 و1.0) بالنسبة إلى أبعاد الصورة.
  • مؤشرات الفئة هي على أساس الصفر (الفئة الأولى هي 0والثاني هو 1إلخ).

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

ما هي خيارات الترخيص لاستخدام YOLOv5 في التطبيقات التجارية؟

توفر Ultralytics ترخيصاً مرناً مصمماً خصيصاً لتلبية الاحتياجات المختلفة:

  • رخصةAGPL-3.0 : هذه الرخصة مفتوحة المصدر مناسبة للأبحاث الأكاديمية والمشاريع الشخصية والحالات التي يكون فيها الامتثال لرخصة المصدر المفتوح مقبولاً. تنص الرخصة على أن تكون التعديلات والأعمال المشتقة مفتوحة المصدر أيضًا بموجب AGPL-3.0 راجع تفاصيل رخصة AGPL-3.0 تفاصيل رخصةAGPL-3.0 .
  • ترخيص المؤسسة: رخصة تجارية مصممة للشركات التي تدمج YOLOv5 في المنتجات أو الخدمات المملوكة لها. يزيل هذا الترخيص التزامات المصدر المفتوح الخاصة AGPL-3.0 مما يسمح بتوزيعه على مصادر مغلقة. قم بزيارة صفحة الترخيص للحصول على مزيد من التفاصيل أو لطلب ترخيص مؤسسي.

حدد الترخيص الذي يتوافق بشكل أفضل مع متطلبات مشروعك ونموذج التوزيع الخاص بك.



📅 تم إنشاؤها منذ 1 سنة مضت ✏️ تم التحديث منذ 17 يومًا

التعليقات