Ultralytics YOLO27: انضم إلى قائمة الانتظار.
ابدأ

تحميل YOLOv5 من PyTorch Hub

يشرح هذا الدليل كيفية تحميل YOLOv5 من PyTorch Hub، مستودع النماذج المدرّبة مسبقًا لـ PyTorch.

قبل البدء#

ثبّت requirements.txt في بيئة Python>=3.8.0، بما في ذلك PyTorch>=1.8. تُنزّل النماذج ومجموعات البيانات تلقائيًا من أحدث إصدار من 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.

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

مثال تفصيلي#

يعرض هذا المثال الاستدلال على دفعات باستخدام مصادر الصور PIL وOpenCV، وهما من أنواع الإدخال التي تقبلها طريقة forward في AutoShape() الخاص بـ YOLOv5. يمكن طباعة results في وحدة التحكم، أو حفظه في runs/hub، أو عرضه على الشاشة في البيئات المدعومة، أو إرجاعه على هيئة موترات أو إطارات بيانات 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(f"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
YOLO inference results on zidane.jpg YOLO inference results on bus.jpg

إعدادات الاستدلال#

تحتوي نماذج YOLOv5 على سمات استدلال متنوعة، مثل عتبة الثقة وعتبة IoU، ويمكن ضبطها كما يلي:

model.conf = 0.25  # ⁨عتبة ثقة NMS⁩
model.iou = 0.45  # ⁨عتبة IoU لـ NMS⁩
model.agnostic = False  # ⁨NMS دون اعتبار للفئة⁩
model.multi_label = False  # ⁨تسميات متعددة لكل صندوق في NMS⁩
model.classes = None  # ⁨(قائمة اختيارية) التصفية حسب الفئة، مثل = [0, 15, 16] للأشخاص والقطط والكلاب في COCO⁩
model.max_det = 1000  # ⁨الحد الأقصى لعدد الاكتشافات لكل صورة⁩
model.amp = False  # ⁨الاستدلال بدقة مختلطة تلقائية (AMP)⁩

results = model(im, size=320)  # ⁨حجم استدلال مخصص⁩

الجهاز#

يمكن نقل النماذج إلى أي جهاز بعد إنشائها:

model.cpu()  # CPU
model.cuda()  # GPU
model.to(device)  # ⁨أي device=torch.device⁩(0)

يمكن أيضًا إنشاء النماذج مباشرةً على أي device:

model = torch.hub.load("ultralytics/yolov5", "yolov5s", device="cpu")  # ⁨التحميل على CPU⁩
نصيحة

تُنقل صور الإدخال تلقائيًا إلى جهاز النموذج الصحيح قبل الاستدلال.

إخفاء المخرجات#

يمكن تحميل النماذج بصمت باستخدام _verbose=False:

model = torch.hub.load("ultralytics/yolov5", "yolov5s", _verbose=False)  # ⁨التحميل بصمت⁩

قنوات الإدخال#

لتحميل نموذج YOLOv5s مدرّب مسبقًا بأربع قنوات إدخال بدلًا من العدد الافتراضي، وهو 3:

model = torch.hub.load("ultralytics/yolov5", "yolov5s", channels=4)

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

عدد الفئات#

لتحميل نموذج YOLOv5s مدرّب مسبقًا بعشر فئات إخراج بدلًا من العدد الافتراضي، وهو 80:

model = torch.hub.load("ultralytics/yolov5", "yolov5s", classes=10)

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

فرض إعادة التحميل#

إذا واجهت مشكلات في الخطوات أعلاه، فقد يساعد ضبط force_reload=True على التخلص من ذاكرة التخزين المؤقت الحالية وفرض تنزيل جديد لأحدث إصدار من YOLOv5 من PyTorch Hub. توجد النسخ المخزنة مؤقتًا في ~/.cache/torch/hub؛ ويؤدي حذف هذا المجلد إلى النتيجة نفسها.

model = torch.hub.load("ultralytics/yolov5", "yolov5s", force_reload=True)  # ⁨فرض إعادة التحميل⁩

الاستدلال من لقطة شاشة#

لتشغيل الاستدلال على شاشة سطح المكتب:

import torch
from PIL import ImageGrab

# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# Image
im = ImageGrab.grab()  # ⁨التقاط لقطة شاشة⁩

# Inference
results = model(im)

الاستدلال باستخدام وحدات GPU متعددة#

يمكن تحميل نماذج YOLOv5 على وحدات GPU متعددة بالتوازي باستخدام الاستدلال متعدد الخيوط:

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. يجب توفير نص التدريب الخاص بك في هذه الحالة، أو التدريب باستخدام train.py كما هو موضح في درس تدريب البيانات المخصصة لـ YOLOv5.

import torch

model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False)  # ⁨تحميل نموذج مدرّب مسبقًا⁩
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False, pretrained=False)  # ⁨تحميل نموذج من البداية⁩

النتائج بترميز Base64#

تفيد النتائج المشفّرة بترميز Base64 في خدمات API، كما في مثال Flask REST API لـ YOLOv5.

import base64
from io import BytesIO

from PIL import Image

results = model(im)  # inference

results.ims  # ⁨مصفوفة الصور الأصلية (على هيئة مصفوفة np) الممررة إلى النموذج للاستدلال⁩
results.render()  # ⁨يحدّث results.ims بالمربعات والتسميات⁩
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 تتضمن النتائج⁩

النتائج المقصوصة#

يمكن إرجاع النتائج وحفظها على هيئة قصاصات للاكتشافات:

results = model(im)  # inference
crops = results.crop(save=True)  # ⁨قاموس الاكتشافات المقصوصة⁩

نتائج Pandas#

يمكن إرجاع النتائج على هيئة إطارات بيانات Pandas:

results = model(im)  # inference
results.pandas().xyxy[0]  # ⁨إطار بيانات Pandas⁩
مخرجات pandas (انقر للتوسيع)
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")  # ⁨مرتبة من اليسار إلى اليمين⁩

نتائج JSON#

يمكن إرجاع النتائج بتنسيق JSON بعد تحويلها إلى إطارات بيانات .pandas() باستخدام الطريقة .to_json(). ويمكن تعديل تنسيق JSON باستخدام الوسيطة orient. للاطلاع على التفاصيل، راجع توثيق pandas .to_json().

results = model(im)  # inference
results.pandas().xyxy[0].to_json(orient="records")  # ⁨تنبؤات JSON للصورة1⁩
مخرجات JSON (انقر للتوسيع)
[
    {
        "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")  # ⁨نموذج محلي⁩
model = torch.hub.load("path/to/yolov5", "custom", path="path/to/best.pt", source="local")  # ⁨مستودع محلي⁩

نماذج TensorRT وONNX وOpenVINO#

يدعم PyTorch Hub الاستدلال باستخدام معظم تنسيقات التصدير لـ YOLOv5، بما في ذلك النماذج المدرّبة مخصصًا.

نصيحة
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.mlpackage")  # ⁨CoreML (لـ macOS فقط)⁩
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، لتتمكن من بدء مشاريعك.

حالة المشروع#

YOLOv5 CI

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

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

  • لا. ينزّل torch.hub.load("ultralytics/yolov5", ...) الشيفرة إلى ~/.cache/torch/hub والأوزان عند الاستخدام لأول مرة. ولا يلزم تثبيت سوى الحزم الموجودة في requirements.txt.

  • استخدم نقطة الدخول custom مع مسار نقطة التحقق: torch.hub.load("ultralytics/yolov5", "custom", path="runs/train/exp/weights/best.pt"). أضف source="local" ومسارًا إلى مستودع محلي للتحميل دون الوصول إلى الشبكة.

  • نعم. مرّر الملف المُصدّر إلى أداة التحميل نفسها custom، وسيختار YOLOv5 الواجهة الخلفية المطابقة استنادًا إلى امتداد الملف، مثل yolov5s.onnx أو yolov5s.engine أو yolov5s_openvino_model/.

  • مرّر force_reload=True لإزالة المستودع المخزّن مؤقتًا وجلب أحدث الشيفرة، أو احذف ~/.cache/torch/hub يدويًا. يؤدي ذلك أيضًا إلى الحصول على الإصدارات الجديدة من YOLOv5.

  • تعيد results.xyxy[0] موترًا يتكوّن من صفوف [x1, y1, x2, y2, confidence, class]، بينما تعيد results.pandas().xyxy[0] إطار بيانات يتضمن أسماء الفئات، وينشئ .to_json(orient="records") على إطار البيانات هذا مخرجات JSON.

التعليقات

اطرح سؤالًا، وشارك نتائجك، أو ساعد شخصًا آخر.