تحميل YOLOv5 من PyTorch Hub#
📚 يشرح هذا الدليل كيفية تحميل YOLOv5 🚀 من PyTorch Hub على الرابط https://pytorch.org/hub/ultralytics_yolov5.
قبل البدء#
قم بتثبيت requirements.txt في بيئة Python>=3.8.0، بما في ذلك PyTorch>=1.8. يتم تنزيل Models وdatasets تلقائياً من أحدث إصدار لـ YOLOv5.
pip install -r https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txtاستنساخ ultralytics/yolov5 غير مطلوب — يقوم PyTorch Hub جلب الكود تلقائياً.
تحميل YOLOv5 باستخدام PyTorch Hub#
مثال بسيط#
يقوم هذا المثال بتحميل نموذج YOLOv5s مدرب مسبقاً من PyTorch Hub كـ model ومر تمرير صورة للاستدلال. 'yolov5s' هو نموذج YOLOv5 الأخف والأسرع. للحصول على تفاصيل حول جميع النماذج المتاحة، يرجى الاطلاع على README.
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Image
im = "https://ultralytics.com/images/zidane.jpg"
# Inference
results = model(im)
results.pandas().xyxy[0]
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tieمثال مفصل#
يوضح هذا المثال الاستدلال المجمع (batched inference) باستخدام مصادر الصور PIL و**OpenCV**. يمكن طباعة results على وحدة التحكم، أو حفظه في runs/hub، أو عرضه على الشاشة في البيئات المدعومة، وإرجاعه كـ موترات (tensors) أو هياكل بيانات pandas.
import cv2
import torch
from PIL import Image
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Images
for f in "zidane.jpg", "bus.jpg":
torch.hub.download_url_to_file("https://ultralytics.com/images/" + f, f) # download 2 images
im1 = Image.open("zidane.jpg") # PIL image
im2 = cv2.imread("bus.jpg")[..., ::-1] # OpenCV image (BGR to RGB)
# Inference
results = model([im1, im2], size=640) # batch of images
# Results
results.print()
results.save() # or .show()
results.xyxy[0] # im1 predictions (tensor)
results.pandas().xyxy[0] # im1 predictions (pandas)
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tie
لكل خيارات الاستدلال، راجع طريقة التوجيه AutoShape() في YOLOv5.
إعدادات الاستنتاج#
تحتوي نماذج YOLOv5 على العديد من سمات الاستنتاج مثل عتبة الثقة (confidence threshold)، وعتبة IoU، وما إلى ذلك، والتي يمكن ضبطها بواسطة:
model.conf = 0.25 # NMS confidence threshold
model.iou = 0.45 # NMS IoU threshold
model.agnostic = False # NMS class-agnostic
model.multi_label = False # NMS multiple labels per box
model.classes = None # (optional list) filter by class, i.e. = [0, 15, 16] for COCO persons, cats and dogs
model.max_det = 1000 # maximum number of detections per image
model.amp = False # Automatic Mixed Precision (AMP) inference
results = model(im, size=320) # custom inference sizeالجهاز#
يمكن نقل النماذج إلى أي جهاز (device) بعد إنشائها:
model.cpu() # CPU
model.cuda() # GPU
model.to(device) # i.e. device=torch.device(0)يمكن أيضاً إنشاء النماذج مباشرة على أي device:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", device="cpu") # load on CPUيتم نقل صور الإدخال تلقائياً إلى جهاز النموذج الصحيح قبل الاستنتاج.
إخفاء المخرجات (Silence Outputs)#
يمكن تحميل النماذج في صمت باستخدام _verbose=False:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", _verbose=False) # load silentlyقنوات الإدخال#
لتحميل نموذج YOLOv5s مدرب مسبقاً بـ 4 قنوات إدخال بدلاً من القيمة الافتراضية 3:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", channels=4)في هذه الحالة، سيتكون النموذج من أوزان مدربة مسبقاً باستثناء طبقة الإدخال الأولى تماماً، والتي لم تعد بنفس شكل طبقة الإدخال المدربة مسبقاً. ستظل طبقة الإدخال مهيأة بأوزان عشوائية.
عدد الفئات (Classes)#
لتحميل نموذج YOLOv5s مدرب مسبقاً بـ 10 فئات إخراج بدلاً من القيمة الافتراضية 80:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", classes=10)في هذه الحالة، سيتكون النموذج من أوزان مدربة مسبقاً باستثناء طبقات الإخراج، التي لم تعد بنفس شكل طبقات الإخراج المدربة مسبقاً. ستظل طبقات الإخراج مهيأة بأوزان عشوائية.
فرض إعادة التحميل (Force Reload)#
إذا واجهت مشاكل مع الخطوات المذكورة أعلاه، فقد يساعد ضبط force_reload=True عن طريق تجاهل ذاكرة التخزين المؤقت الحالية وفرض تنزيل جديد لأحدث إصدار من YOLOv5 من PyTorch Hub. توجد النسخ المخزنة مؤقتاً في ~/.cache/torch/hub؛ وحذف هذا المجلد يحقق نفس النتيجة.
model = torch.hub.load("ultralytics/yolov5", "yolov5s", force_reload=True) # force reloadاستنتاج لقطة الشاشة#
لتشغيل الاستنتاج على شاشة سطح المكتب الخاصة بك:
import torch
from PIL import ImageGrab
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Image
im = ImageGrab.grab() # take a screenshot
# Inference
results = model(im)الاستنتاج باستخدام وحدات معالجة رسومية متعددة (Multi-GPU)#
يمكن تحميل نماذج YOLOv5 إلى وحدات GPU متعددة بالتوازي مع استنتاج مترابط (threaded inference):
import threading
import torch
def run(model, im):
"""Performs inference on an image using a given model and saves the output; model must support `.save()` method."""
results = model(im)
results.save()
# Models
model0 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=0)
model1 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=1)
# Inference
threading.Thread(target=run, args=[model0, "https://ultralytics.com/images/zidane.jpg"], daemon=True).start()
threading.Thread(target=run, args=[model1, "https://ultralytics.com/images/bus.jpg"], daemon=True).start()التدريب#
لتحميل نموذج YOLOv5 للتدريب بدلاً من الاستدلال، قم بتعيين autoshape=False. لتحميل نموذج بأوزان مُهيئة عشوائياً (للتدريب من الصفر)، استخدم pretrained=False. يجب عليك توفير سكريبت التدريب الخاص بك في هذه الحالة. بدلاً من ذلك، راجع دليل تدريب بيانات مخصصة لـ YOLOv5 لتدريب النماذج.
import torch
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False) # load pretrained
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False, pretrained=False) # load scratchنتائج Base64#
للاستخدام مع خدمات API. راجع مثال Flask REST API للحصول على التفاصيل.
import base64
from io import BytesIO
from PIL import Image
results = model(im) # inference
results.ims # array of original images (as np array) passed to model for inference
results.render() # updates results.ims with boxes and labels
for im in results.ims:
buffered = BytesIO()
im_base64 = Image.fromarray(im)
im_base64.save(buffered, format="JPEG")
print(base64.b64encode(buffered.getvalue()).decode("utf-8")) # base64 encoded image with resultsنتائج مقصوصة (Cropped)#
يمكن إرجاع النتائج وحفظها كمقتطفات كشف (detection crops):
results = model(im) # inference
crops = results.crop(save=True) # cropped detections dictionaryنتائج Pandas#
يمكن إرجاع النتائج كـ Pandas DataFrames:
results = model(im) # inference
results.pandas().xyxy[0] # Pandas DataFramePandas Output (click to expand)
print(results.pandas().xyxy[0])
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tieنتائج مرتبة#
يمكن ترتيب النتائج حسب العمود، على سبيل المثال لترتيب كشف أرقام لوحات الترخيص من اليسار إلى اليمين (المحور x):
results = model(im) # inference
results.pandas().xyxy[0].sort_values("xmin") # sorted left-rightنتائج JSON#
يمكن إرجاع النتائج بتنسيق JSON بمجرد تحويلها إلى إطارات بيانات .pandas() باستخدام طريقة .to_json(). يمكن تعديل تنسيق JSON باستخدام وسيطة orient. راجع توثيق .to_json() في pandas للتفاصيل.
results = model(ims) # inference
results.pandas().xyxy[0].to_json(orient="records") # JSON img1 predictionsJSON Output (click to expand)
[
{
"xmin": 749.5,
"ymin": 43.5,
"xmax": 1148.0,
"ymax": 704.5,
"confidence": 0.8740234375,
"class": 0,
"name": "person"
},
{
"xmin": 433.5,
"ymin": 433.5,
"xmax": 517.5,
"ymax": 714.5,
"confidence": 0.6879882812,
"class": 27,
"name": "tie"
},
{
"xmin": 115.25,
"ymin": 195.75,
"xmax": 1096.0,
"ymax": 708.0,
"confidence": 0.6254882812,
"class": 0,
"name": "person"
},
{
"xmin": 986.0,
"ymin": 304.0,
"xmax": 1028.0,
"ymax": 420.0,
"confidence": 0.2873535156,
"class": 27,
"name": "tie"
}
]نماذج مخصصة#
يحمل هذا المثال نموذج YOLOv5s مخصصاً مكوناً من 20 فئة ومدرباً على VOC وهو 'best.pt' باستخدام PyTorch Hub.
import torch
model = torch.hub.load("ultralytics/yolov5", "custom", path="path/to/best.pt") # local model
model = torch.hub.load("path/to/yolov5", "custom", path="path/to/best.pt", source="local") # local repoنماذج TensorRT و ONNX و OpenVINO#
يدعم PyTorch Hub الاستدلال على معظم تنسيقات تصدير YOLOv5، بما في ذلك النماذج المدربة خصيصاً. راجع دليل تصدير TFLite، ONNX، CoreML، TensorRT للحصول على تفاصيل حول تصدير النماذج.
- يمكن أن تكون TensorRT أسرع بـ 2-5 أضعاف من PyTorch على معايير GPU.
- يمكن أن تكون ONNX وOpenVINO أسرع بـ 2-3 أضعاف من PyTorch على معايير CPU.
import torch
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.pt") # PyTorch
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.torchscript") # TorchScript
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.onnx") # ONNX
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_openvino_model/") # OpenVINO
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.engine") # TensorRT
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.mlmodel") # CoreML (macOS-only)
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.tflite") # TFLite
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_paddle_model/") # PaddlePaddleالبيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقاً بالتبعيات الأساسية مثل CUDA، وCUDNN، وPython، وPyTorch، لبدء مشاريعك بسرعة.
- دفاتر ملاحظات مجانية لوحدات معالجة الرسومات:
- Google Cloud: GCP Quickstart Guide
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: Docker Quickstart Guide
حالة المشروع#
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) لـ YOLOv5 GitHub Actions تمر بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر جوانب رئيسية مختلفة: training، وvalidation، وinference، وexport، وbenchmarks. وهي تضمن تشغيلاً متسقاً وموثوقاً على أنظمة macOS وWindows وUbuntu، مع إجراء اختبارات كل 24 ساعة ومع كل عملية commit جديدة.