Meet YOLO26: next-gen vision AI.

Link to this sectionتدريب YOLOv5 على بيانات مخصصة#

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

Link to this sectionقبل البدء#

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

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

Link to this sectionالتدريب على بيانات مخصصة#

مخطط حلقة التعلم النشط من Ultralytics

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

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

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

الترخيص

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

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

استكشف خيارات الترخيص الخاصة بنا بشكل أكبر على صفحة ترخيص Ultralytics.

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

Link to this sectionإنشاء مجموعة بيانات#

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

Link to this section1.1 إنشاء dataset.yaml#

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

يتضمن هيكل ملف dataset.yaml ما يلي:

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

يمكنك ضبط path إما على دليل مطلق (مثل /home/user/datasets/coco128) أو مسار نسبي مثل ../datasets/coco128 عند بدء التدريب من جذر مستودع YOLOv5.

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

# Dataset root directory relative to the yolov5 directory
path: 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

Link to this section1.2 الاستفادة من النماذج للتصنيف المؤتمت#

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

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

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

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

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

Example image with two persons and a tie annotated

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

YOLO format label file content example

Link to this section1.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 recommended dataset directory structure

Link to this sectionاختيار نموذج#

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

Comparison chart of YOLOv5 models showing size, speed, and accuracy

Link to this sectionتدريب#

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

  • --img: يحدد حجم صورة الإدخال (مثلاً، --img 640). الأحجام الأكبر تؤدي عمومًا إلى دقة أفضل ولكنها تتطلب ذاكرة GPU أكبر.
  • --batch: يحدد حجم الدفعة (batch size) (على سبيل المثال، --batch 16). اختر أكبر حجم يمكن لـ GPU الخاص بك التعامل معه.
  • --epochs: يحدد العدد الإجمالي لـ دورات (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 لتخزين صور مجموعة البيانات مؤقتاً في RAM أو القرص المحلي، على التوالي. هذا يسرع التدريب بشكل كبير، خاصة عندما تكون عمليات الإدخال/الإخراج (I/O) لمجموعة البيانات عنق زجاجة. لاحظ أن هذا يتطلب مساحة كبيرة في RAM أو القرص.

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

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

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

Link to this sectionتصور#

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

Link to this sectionتسجيل وتصور 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 Colab لعرض توضيحي مباشر: Open In Colab

Comet UI showing YOLOv5 training metrics and visualizations

Link to this sectionتسجيل وأتمتة ClearML#

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

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

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

ClearML experiment management UI for YOLOv5

Link to this sectionالتسجيل المحلي#

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

  • خسارة التدريب والتحقق ومقاييس الأداء.
  • صور عينة تظهر التعزيزات المطبقة (مثل الفسيفساء).
  • تصنيفات الحقيقة الأرضية (Ground truth) جنباً إلى جنب مع تنبؤات النموذج للفحص البصري.
  • مقاييس التقييم الرئيسية مثل منحنيات الدقة-الاستدعاء (PR).
  • مصفوفات الارتباك لتحليل الأداء المفصل لكل فئة.
YOLOv5 local logging results with charts and mosaics

يتم تحديث ملف 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

YOLOv5 results.png training metrics plot

Link to this sectionالخطوات التالية#

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

  • قم بإجراء استنتاج على صور أو مقاطع فيديو جديدة باستخدام النموذج المدرب عبر CLI أو Python.
  • قم بإجراء التحقق لتقييم دقة النموذج وقدراته على التعميم على مجموعات بيانات مختلفة (مثل مجموعة اختبار مستبعدة).
  • صدّر النموذج إلى تنسيقات نشر مختلفة مثل ONNX، أو TensorFlow SavedModel، أو TensorRT لتحقيق استنتاج محسن على منصات متنوعة.
  • استخدم تقنيات ضبط المعلمات الفائقة لانتزاع مكاسب إضافية في الأداء.
  • استمر في تحسين نموذجك باتباع نصائحنا لأفضل نتائج تدريب وإضافة بيانات أكثر تنوعًا وتحديًا بشكل تكراري بناءً على تحليل الأداء.

Link to this sectionالبيئات المدعومة#

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

Link to this sectionحالة المشروع#

YOLOv5 Continuous Integration Status Badge

This badge indicates that all YOLOv5 GitHub Actions Continuous Integration (CI) tests are passing successfully. These rigorous CI tests cover the core functionalities, including training, validation, inference, export, and benchmarks, across macOS, Windows, and Ubuntu operating systems. Tests are executed automatically every 24 hours and upon each code commit, ensuring consistent stability and optimal performance.

Link to this sectionالأسئلة الشائعة#

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

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

  1. جهّز مجموعة البيانات الخاصة بك: اجمع الصور وقم بتصنيفها. تأكد من أن التعليقات التوضيحية بتنسيق YOLO المطلوب. نظّم الصور والتسميات في أدلة train/ و val/ (واختياريًا test/). فكر في استخدام نماذج مثل Google Gemini، أو SAM2، أو YOLOWorld للمساعدة في عملية التصنيف أو أتمتتها (انظر القسم 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)، وحجم الصورة، وحجم الدفعة (batch size)، وعدد الدورات (epochs).
    python train.py --img 640 --batch 16 --epochs 100 --data path/to/your/dataset.yaml --weights yolov5s.pt

Link to this sectionلماذا يجب علي استخدام Ultralytics Platform لتدريب نماذج YOLO الخاصة بي؟#

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

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

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

Link to this sectionكيف يمكنني تحويل بياناتي المعلقة إلى صيغة YOLOv5؟#

سواء كنت تضع التعليقات يدويًا أو تستخدم أدوات مؤتمتة (مثل تلك المذكورة في القسم 1.2)، يجب أن تكون الملصقات النهائية بصيغة YOLO format المحددة المطلوبة بواسطة 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) مُطبعة (normalized) (قيم بين 0.0 و 1.0) بالنسبة لأبعاد الصورة.
  • فهارس الفئات تبدأ من الصفر (الفئة الأولى هي 0، والثانية هي 1، إلخ).

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

Link to this sectionما هي خيارات الترخيص لاستخدام YOLOv5 في التطبيقات التجارية؟#

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

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

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

التعليقات