İçeriğe geç

Analytics kullanarak Ultralytics YOLOv8 📊

Giriş

Bu kılavuz, üç temel veri görselleştirme türüne kapsamlı bir genel bakış sunmaktadır: çizgi grafikler, çubuk grafikler ve pasta grafikler. Her bölüm, Python adresini kullanarak bu görselleştirmelerin nasıl oluşturulacağına dair adım adım talimatlar ve kod parçacıkları içermektedir.

Görsel Örnekler

Çizgi Grafiği Çubuk Arsa Pasta Grafiği
Çizgi Grafiği Çubuk Arsa Pasta Grafiği

Grafikler Neden Önemlidir?

  • Çizgi grafikler, kısa ve uzun dönemlerdeki değişiklikleri izlemek ve aynı dönemde birden fazla grup için değişiklikleri karşılaştırmak için idealdir.
  • Öte yandan çubuk grafikler, farklı kategorilerdeki miktarları karşılaştırmak ve bir kategori ile sayısal değeri arasındaki ilişkileri göstermek için uygundur.
  • Son olarak, pasta grafikler kategoriler arasındaki oranları göstermek ve bir bütünün parçalarını göstermek için etkilidir.

Analitik Örnekler

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()

Tartışma Analytics

İşte bir tablo Analytics Argümanlar:

İsim Tip Varsayılan Açıklama
type str None Veri veya nesne türü.
im0_shape tuple None İlk görüntünün şekli.
writer cv2.VideoWriter None Video dosyalarını yazmak için nesne.
title str ultralytics Görselleştirme için başlık.
x_label str x X ekseni için etiket.
y_label str y Y ekseni için etiket.
bg_color str white Arka plan rengi.
fg_color str black Ön plan rengi.
line_color str yellow Çizgilerin rengi.
line_width int 2 Çizgilerin genişliği.
fontsize int 13 Metin için yazı tipi boyutu.
view_img bool False Görüntüyü veya videoyu görüntülemek için bayrak.
save_img bool True Görüntüyü veya videoyu kaydetmek için işaretleyin.
max_points int 50 For multiple lines, total points drawn on frame, before deleting initial points.
points_width int 15 Width of line points highlighter.

Argümanlar model.track

İsim Tip Varsayılan Açıklama
source im0 None resimler veya videolar için kaynak dizin
persist bool False kareler arasında kalıcı izler
tracker str botsort.yaml İzleme yöntemi 'bytetrack' veya 'botsort'
conf float 0.3 Güven Eşiği
iou float 0.5 IOU Eşiği
classes list None sonuçları sınıfa göre filtreleyin, yani classes=0 veya classes=[0,2,3]
verbose bool True Nesne izleme sonuçlarını görüntüleme

Sonuç

Farklı görselleştirme türlerinin ne zaman ve nasıl kullanılacağını anlamak, etkili veri analizi için çok önemlidir. Çizgi grafikler, çubuk grafikler ve pasta grafikler, verilerinizin hikayesini daha net ve etkili bir şekilde aktarmanıza yardımcı olabilecek temel araçlardır.



Created 2024-05-23, Updated 2024-06-10
Authors: glenn-jocher (3), IvorZhu331 (1), RizwanMunawar (3)

Yorumlar