تحميل YOLOv5 من PyTorch Hub#
📚 يشرح هذا الدليل كيفية تحميل YOLOv5 🚀 من PyTorch Hub عبر https://pytorch.org/hub/ultralytics_yolov5.
قبل البدء#
ثبّت 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 وأسرعها. للحصول على تفاصيل حول جميع النماذج المتاحة، يُرجى مراجعة 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مثال مفصّل#
يوضح هذا المثال الاستدلال على دفعات باستخدام مصادر صور PIL و**OpenCV. يمكن طباعة 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
للاطلاع على جميع خيارات الاستدلال، راجع الطريقة forward الخاصة بـ AutoShape() في YOLOv5.
إعدادات الاستدلال#
تتضمن نماذج YOLOv5 سمات متنوعة للاستدلال، مثل عتبة الثقة وعتبة 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الجهاز#
يمكن نقل النماذج إلى أي جهاز بعد إنشائها:
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تُنقل صور الإدخال تلقائيًا إلى جهاز النموذج الصحيح قبل الاستدلال.
إخفاء المخرجات#
يمكن تحميل النماذج بصمت باستخدام _verbose=False:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", _verbose=False) # load silentlyقنوات الإدخال#
لتحميل نموذج YOLOv5s مدرَّب مسبقًا بأربع قنوات إدخال بدلًا من القنوات الثلاث الافتراضية:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", channels=4)في هذه الحالة، سيتكوّن النموذج من أوزان مدرَّبة مسبقًا باستثناء طبقة الإدخال الأولى تمامًا، إذ لم يعد شكلها مماثلًا لشكل طبقة الإدخال المدرَّبة مسبقًا. وستظل طبقة الإدخال مهيّأة بأوزان عشوائية.
عدد الفئات#
لتحميل نموذج YOLOv5s مدرَّب مسبقًا بعشر فئات إخراج بدلًا من الفئات الثمانين الافتراضية:
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) # 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)الاستدلال باستخدام وحدات 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. يجب أن توفّر في هذه الحالة نص التدريب الخاص بك. وبدلًا من ذلك، راجع دليل تدريب البيانات المخصّصة الخاص بنا لـ 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النتائج المقتصّة#
يمكن إرجاع النتائج وحفظها على هيئة قصاصات للكائنات المكتشفة:
results = model(im) # inference
crops = results.crop(save=True) # cropped detections dictionaryنتائج Pandas#
يمكن إرجاع النتائج على هيئة إطارات بيانات Pandas:
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. راجع توثيق pandas .to_json() للحصول على التفاصيل.
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 مخصّصًا مدرَّبًا على VOC ذي 20 فئة، وهو '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 أسرع بمرتين إلى 5 مرات من PyTorch في اختبارات أداء GPU.
- يمكن أن يكون ONNX وOpenVINO أسرع بمرتين إلى 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، لبدء مشاريعك.
- دفاتر ملاحظات GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تشير هذه الشارة إلى اجتياز جميع اختبارات إجراءات YOLOv5 على GitHub الخاصة بـالتكامل المستمر (CI) بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف YOLOv5 وأدائه عبر جوانب رئيسية متنوعة: التدريب والتحقق والاستدلال والتصدير والمعايير. وتضمن التشغيل المتسق والموثوق على macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.