Bỏ để qua phần nội dung

Phân tích bằng cách sử dụng Ultralytics YOLOv8

Giới thiệu

Hướng dẫn này cung cấp tổng quan toàn diện về ba loại trực quan hóa dữ liệu cơ bản: biểu đồ đường, biểu đồ thanh và biểu đồ tròn. Mỗi phần bao gồm hướng dẫn từng bước và đoạn mã về cách tạo các trực quan hóa này bằng cách sử dụng Python.

Mẫu hình ảnh

Biểu đồ đường Cốt truyện quán bar Biểu đồ hình tròn
Biểu đồ đường Cốt truyện quán bar Biểu đồ hình tròn

Tại sao đồ thị lại quan trọng

  • Biểu đồ đường lý tưởng để theo dõi các thay đổi trong thời gian ngắn và dài và để so sánh các thay đổi cho nhiều nhóm trong cùng một khoảng thời gian.
  • Mặt khác, biểu đồ thanh phù hợp để so sánh số lượng trên các danh mục khác nhau và hiển thị mối quan hệ giữa một danh mục và giá trị số của nó.
  • Cuối cùng, biểu đồ hình tròn có hiệu quả để minh họa tỷ lệ giữa các danh mục và hiển thị các phần của tổng thể.

Ví dụ về Analytics

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

Lý lẽ Analytics

Đây là bảng với Analytics Lập luận:

Tên Kiểu Mặc định Sự miêu tả
type str None Loại dữ liệu hoặc đối tượng.
im0_shape tuple None Hình dạng của hình ảnh ban đầu.
writer cv2.VideoWriter None Đối tượng để ghi các tập tin video.
title str ultralytics Tiêu đề cho trực quan hóa.
x_label str x Nhãn cho trục x.
y_label str y Nhãn cho trục y.
bg_color str white Màu nền.
fg_color str black Màu nền trước.
line_color str yellow Màu sắc của các dòng.
line_width int 2 Chiều rộng của các dòng.
fontsize int 13 Cỡ chữ cho văn bản.
view_img bool False Gắn cờ để hiển thị hình ảnh hoặc video.
save_img bool True Gắn cờ để lưu hình ảnh hoặc video.
max_points int 50 Đối với nhiều dòng, tổng số điểm được vẽ trên khung, trước khi xóa điểm ban đầu.
points_width int 15 Chiều rộng của điểm đường tô sáng.

Lập luận model.track

Tên Kiểu Mặc định Sự miêu tả
source im0 None Thư mục nguồn cho hình ảnh hoặc video
persist bool False Các rãnh liên tục giữa các khung hình
tracker str botsort.yaml Phương pháp theo dõi 'bytetrack' hoặc 'botsort'
conf float 0.3 Ngưỡng tin cậy
iou float 0.5 Ngưỡng IOU
classes list None Lọc kết quả theo lớp, tức là lớp = 0 hoặc lớp = [0,2,3]
verbose bool True Hiển thị kết quả theo dõi đối tượng

Kết thúc

Hiểu khi nào và làm thế nào để sử dụng các loại trực quan hóa khác nhau là rất quan trọng để phân tích dữ liệu hiệu quả. Biểu đồ đường, biểu đồ thanh và biểu đồ hình tròn là những công cụ cơ bản có thể giúp bạn truyền tải câu chuyện dữ liệu của mình rõ ràng và hiệu quả hơn.

FAQ

Làm cách nào để tạo biểu đồ đường bằng cách sử dụng Ultralytics YOLOv8 Analytics?

Để tạo biểu đồ đường bằng cách sử dụng Ultralytics YOLOv8 Phân tích, hãy làm theo các bước sau:

  1. Tải một YOLOv8 Mô hình hóa và mở tệp video của bạn.
  2. Khởi tạo Analytics lớp với kiểu được đặt thành "dòng".
  3. Lặp qua các khung video, cập nhật biểu đồ đường với dữ liệu liên quan, chẳng hạn như số lượng đối tượng trên mỗi khung hình.
  4. Lưu video đầu ra hiển thị biểu đồ đường.

Ví dụ:

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

Để biết thêm chi tiết về cách định cấu hình Analytics lớp học, ghé thăm Phân tích bằng cách sử dụng Ultralytics YOLOv8 📊 phần.

Lợi ích của việc sử dụng là gì Ultralytics YOLOv8 để tạo lô thanh?

Sử dụng Ultralytics YOLOv8 Để tạo các ô thanh cung cấp một số lợi ích:

  1. Trực quan hóa dữ liệu thời gian thực: Tích hợp liền mạch kết quả phát hiện đối tượng vào biểu đồ thanh để cập nhật động.
  2. Dễ sử dụng: API và các chức năng đơn giản giúp việc triển khai và trực quan hóa dữ liệu trở nên đơn giản.
  3. Tùy chỉnh: Tùy chỉnh tiêu đề, nhãn, màu sắc và hơn thế nữa để phù hợp với yêu cầu cụ thể của bạn.
  4. Hiệu quả: Xử lý hiệu quả lượng lớn dữ liệu và cập nhật cốt truyện trong thời gian thực trong quá trình xử lý video.

Sử dụng ví dụ sau để tạo biểu đồ thanh:

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

Để tìm hiểu thêm, hãy truy cập phần Bar Plot trong hướng dẫn.

Tại sao tôi nên sử dụng Ultralytics YOLOv8 Để tạo biểu đồ hình tròn trong các dự án trực quan hóa dữ liệu của tôi?

Ultralytics YOLOv8 là một lựa chọn tuyệt vời để tạo biểu đồ hình tròn vì:

  1. Tích hợp với Phát hiện đối tượng: Tích hợp trực tiếp kết quả phát hiện đối tượng vào biểu đồ hình tròn để có thông tin chi tiết ngay lập tức.
  2. API thân thiện với người dùng: Đơn giản để thiết lập và sử dụng với mã tối thiểu.
  3. Có thể tùy chỉnh: Các tùy chọn tùy chỉnh khác nhau cho màu sắc, nhãn và hơn thế nữa.
  4. Cập nhật thời gian thực: Xử lý và trực quan hóa dữ liệu trong thời gian thực, lý tưởng cho các dự án phân tích video.

Dưới đây là một ví dụ nhanh:

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

Để biết thêm thông tin, hãy tham khảo phần Biểu đồ hình tròn trong hướng dẫn.

Có thể Ultralytics YOLOv8 Được sử dụng để theo dõi các đối tượng và tự động cập nhật trực quan hóa?

Có Ultralytics YOLOv8 có thể được sử dụng để theo dõi các đối tượng và tự động cập nhật trực quan hóa. Nó hỗ trợ theo dõi nhiều đối tượng trong thời gian thực và có thể cập nhật các hình ảnh trực quan khác nhau như biểu đồ đường, biểu đồ thanh và biểu đồ hình tròn dựa trên dữ liệu của các đối tượng được theo dõi.

Ví dụ về theo dõi và cập nhật biểu đồ đường:

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

Để tìm hiểu về chức năng hoàn chỉnh, hãy xem phần Theo dõi .

Điều gì làm cho Ultralytics YOLOv8 khác với các giải pháp phát hiện đối tượng khác như OpenCV và TensorFlow?

Ultralytics YOLOv8 nổi bật so với các giải pháp phát hiện đối tượng khác như OpenCV và TensorFlow Vì nhiều lý do:

  1. Độ chính xác hiện đại: YOLOv8 Cung cấp độ chính xác vượt trội trong các nhiệm vụ phát hiện, phân đoạn và phân loại đối tượng.
  2. Dễ sử dụng: API thân thiện với người dùng cho phép triển khai và tích hợp nhanh chóng mà không cần mã hóa mở rộng.
  3. Hiệu suất thời gian thực: Được tối ưu hóa cho suy luận tốc độ cao, phù hợp với các ứng dụng thời gian thực.
  4. Ứng dụng đa dạng: Hỗ trợ các tác vụ khác nhau bao gồm theo dõi đa đối tượng, đào tạo mô hình tùy chỉnh và xuất sang các định dạng khác nhau như ONNX, TensorRTvà CoreML.
  5. Tài liệu toàn diện: Tài liệu mở rộng và tài nguyên blog để hướng dẫn người dùng qua từng bước.

Để biết thêm thông tin so sánh chi tiết và trường hợp sử dụng, hãy khám phá Ultralytics Tin tức.



Đã tạo 2024-05-23, Cập nhật 2024-07-05
Tác giả: glenn-jocher (4), IvorZhu331 (1), RizwanMunawar (3)

Ý kiến