انتقل إلى المحتوى

التحليلات باستخدام Ultralytics YOLOv8

مقدمة

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

عينات بصرية

رسم بياني خطي قطعة أرض بار رسم بياني دائري
رسم بياني خطي قطعة أرض بار رسم بياني دائري

لماذا الرسوم البيانية مهمة

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

أمثلة على التحليلات

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)
total_counts = 0
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            for box in boxes:
                total_counts += 1

        analytics.update_line(frame_count, total_counts)

        total_counts = 0
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
out = cv2.VideoWriter("multiple_line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
    max_points=200,
)

frame_count = 0
data = {}
labels = []

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1

        results = model.track(frame, persist=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            track_ids = results[0].boxes.id.int().cpu().tolist()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, track_id, cls in zip(boxes, track_ids, clss):
                # Store each class label
                if model.names[int(cls)] not in labels:
                    labels.append(model.names[int(cls)])

                # Store each class count
                if model.names[int(cls)] in data:
                    data[model.names[int(cls)]] += 1
                else:
                    data[model.names[int(cls)]] = 0

        # update lines every frame
        analytics.update_multiple_lines(data, labels, frame_count)
        data = {}  # clear the data list for next frame
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="pie",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_pie(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="bar",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_bar(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("area_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="area",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()
    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

        analytics.update_area(frame_count, clswise_count)
        clswise_count = {}
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

جدال Analytics

إليك الجدول الذي يحتوي على Analytics الحجج

اسم نوع افتراضي وصف
type str None نوع البيانات أو الكائن.
im0_shape tuple None شكل الصورة الأولية.
writer cv2.VideoWriter None كائن لكتابة ملفات الفيديو.
title str ultralytics عنوان التصور.
x_label str x تسمية المحور السيني.
y_label str y تسمية المحور ص.
bg_color str white لون الخلفية.
fg_color str black لون المقدمة.
line_color str yellow لون الخطوط.
line_width int 2 عرض الخطوط.
fontsize int 13 حجم الخط للنص.
view_img bool False علم لعرض الصورة أو الفيديو.
save_img bool True وضع علامة لحفظ الصورة أو الفيديو.
max_points int 50 للأسطر المتعددة، مجموع النقاط المرسومة على الإطار، قبل حذف النقاط الأولية.
points_width int 15 عرض تمييز نقاط الخط.

الحجج model.track

اسم نوع افتراضي وصف
source im0 None الدليل المصدر للصور أو مقاطع الفيديو
persist bool False المسارات المستمرة بين الإطارات
tracker str botsort.yaml طريقة التتبع "bytetrack" أو "botsort"
conf float 0.3 عتبة الثقة
iou float 0.5 عتبة IOU
classes list None تصفية النتائج حسب الفئة ، أي الفئات = 0 ، أو الفئات = [0،2،3]
verbose bool True عرض نتائج تعقب الكائن

استنتاج

يعد فهم متى وكيف تستخدم أنواعًا مختلفة من التصورات أمرًا بالغ الأهمية لتحليل البيانات بفعالية. تُعد الرسوم البيانية الخطية والمخططات الشريطية والمخططات الدائرية أدوات أساسية يمكن أن تساعدك في نقل قصة بياناتك بشكل أكثر وضوحًا وفعالية.

الأسئلة المتداولة

كيف يمكنني إنشاء رسم بياني خطي باستخدام Ultralytics YOLOv8 Analytics؟

لإنشاء رسم بياني خطي باستخدام Ultralytics YOLOv8 Analytics، اتبع الخطوات التالية:

  1. قم بتحميل نموذج YOLOv8 وافتح ملف الفيديو الخاص بك.
  2. قم بتهيئة Analytics مع ضبط النوع على "خط".
  3. قم بالتكرار من خلال إطارات الفيديو، مع تحديث الرسم البياني الخطي بالبيانات ذات الصلة، مثل عدد الكائنات في كل إطار.
  4. احفظ فيديو الإخراج الذي يعرض الرسم البياني الخطي.

مثل:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

لمزيد من التفاصيل حول تكوين Analytics الفصل، قم بزيارة التحليلات باستخدام Ultralytics YOLOv8 📊 📊 القسم.

ما هي فوائد استخدام Ultralytics YOLOv8 لإنشاء المخططات الشريطية؟

يوفر استخدام Ultralytics YOLOv8 لإنشاء المخططات الشريطية عدة فوائد:

  1. تصور البيانات في الوقت الحقيقي: دمج نتائج اكتشاف الكائنات بسلاسة في مخططات شريطية للتحديثات الديناميكية.
  2. سهولة الاستخدام: تجعل واجهة برمجة التطبيقات والوظائف البسيطة من السهل تنفيذ البيانات وتصورها.
  3. التخصيص: قم بتخصيص العناوين والملصقات والألوان وغيرها لتناسب متطلباتك الخاصة.
  4. الكفاءة: التعامل بكفاءة مع كميات كبيرة من البيانات وتحديث المخططات في الوقت الفعلي أثناء معالجة الفيديو.

استخدم المثال التالي لإنشاء مخطط شريطي:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="bar", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_bar(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

لمعرفة المزيد، يُرجى زيارة قسم قطعة الأرض في الدليل.

لماذا يجب أن أستخدم Ultralytics YOLOv8 لإنشاء المخططات الدائرية في مشاريع تصور البيانات الخاصة بي؟

Ultralytics YOLOv8 خيارًا ممتازًا لإنشاء المخططات الدائرية للأسباب التالية:

  1. التكامل مع كشف الكائنات: دمج نتائج اكتشاف الكائنات مباشرةً في المخططات الدائرية للحصول على رؤى فورية.
  2. واجهة برمجة تطبيقات سهلة الاستخدام: سهلة الإعداد والاستخدام مع الحد الأدنى من التعليمات البرمجية.
  3. قابلة للتخصيص: خيارات تخصيص متنوعة للألوان والملصقات وغيرها.
  4. تحديثات في الوقت الفعلي: التعامل مع البيانات وتصورها في الوقت الفعلي، وهو أمر مثالي لمشاريع تحليلات الفيديو.

إليك مثالاً سريعاً:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="pie", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_pie(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

لمزيد من المعلومات، راجع قسم المخطط الدائري في الدليل.

هل يمكن استخدام Ultralytics YOLOv8 لتتبع الكائنات وتحديث التصورات ديناميكيًا؟

نعم، يمكن استخدام Ultralytics YOLOv8 لتتبع الكائنات وتحديث التصورات ديناميكيًا. وهو يدعم تعقب كائنات متعددة في الوقت الفعلي ويمكنه تحديث التصورات المختلفة مثل الرسوم البيانية الخطية والمخططات الشريطية والمخططات الدائرية بناءً على بيانات الكائنات المتعقبة.

مثال لتتبع الرسم البياني الخطي وتحديثه:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

للتعرف على الوظائف الكاملة، راجع قسم التتبع.

ما الذي يجعل Ultralytics YOLOv8 مختلفاً عن حلول اكتشاف الأجسام الأخرى مثل OpenCV و TensorFlow ؟

Ultralytics YOLOv8 عن حلول اكتشاف الأجسام الأخرى مثل OpenCV و TensorFlow لأسباب متعددة:

  1. دقة فائقة: يوفر YOLOv8 دقة فائقة في مهام اكتشاف الأجسام وتجزئتها وتصنيفها.
  2. سهولة الاستخدام: تسمح واجهة برمجة التطبيقات سهلة الاستخدام بالتنفيذ والتكامل السريع دون الحاجة إلى ترميز واسع النطاق.
  3. أداء في الوقت الحقيقي: مُحسَّن للاستدلال عالي السرعة، ومناسب لتطبيقات الوقت الحقيقي.
  4. تطبيقات متنوعة: يدعم العديد من المهام المختلفة بما في ذلك التتبع متعدد الكائنات، والتدريب على النماذج المخصصة، والتصدير إلى تنسيقات مختلفة مثل ONNX و TensorRT و CoreML.
  5. وثائق شاملة: وثائق شاملة وموارد مدونة شاملة لتوجيه المستخدمين خلال كل خطوة.

للمزيد من المقارنات التفصيلية وحالات الاستخدام، استكشف مدونةUltralytics .



تم الإنشاء 2024-05-23، تم التحديث 2024-07-05
المؤلفون: جلين-جوتشر (4)، إيفور زو 331 (1)، رضوان منور (3)

التعليقات