تحميل 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
إعدادات الاستدلال#
تحتوي نماذج 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، بما في ذلك النماذج المدرّبة مخصصًا.
- يمكن أن يكون 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.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، لتتمكن من بدء مشاريعك.
- دفاتر GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (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.
التعليقات
اطرح سؤالًا، وشارك نتائجك، أو ساعد شخصًا آخر.