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

Đếm đối tượng bằng cách sử dụng Ultralytics YOLOv8

Đếm đối tượng là gì?

Đếm đối tượng với Ultralytics YOLOv8 liên quan đến việc xác định và đếm chính xác các đối tượng cụ thể trong video và luồng camera. YOLOv8 Vượt trội trong các ứng dụng thời gian thực, cung cấp khả năng đếm đối tượng hiệu quả và chính xác cho các tình huống khác nhau như phân tích và giám sát đám đông, nhờ các thuật toán hiện đại và khả năng học sâu.


Xem: Đếm đối tượng bằng cách sử dụng Ultralytics YOLOv8

Xem: Đếm đối tượng theo lớp bằng cách sử dụng Ultralytics YOLOv8

Ưu điểm của đếm đối tượng?

  • Tối ưu hóa tài nguyên: Đếm đối tượng tạo điều kiện quản lý tài nguyên hiệu quả bằng cách cung cấp số lượng chính xác và tối ưu hóa phân bổ tài nguyên trong các ứng dụng như quản lý hàng tồn kho.
  • Tăng cường bảo mật: Đếm đối tượng tăng cường an ninh và giám sát bằng cách theo dõi và đếm chính xác các thực thể, hỗ trợ phát hiện mối đe dọa chủ động.
  • Ra quyết định sáng suốt: Đếm đối tượng cung cấp thông tin chi tiết có giá trị cho việc ra quyết định, tối ưu hóa các quy trình trong bán lẻ, quản lý lưu lượng truy cập và nhiều lĩnh vực khác.

Ứng dụng trong thế giới thực

Hậu cần Nuôi trồng thủy sản
Đếm các gói băng tải bằng cách sử dụng Ultralytics YOLOv8 Đếm cá trên biển bằng cách sử dụng Ultralytics YOLOv8
Đếm các gói băng tải bằng cách sử dụng Ultralytics YOLOv8 Đếm cá trên biển bằng cách sử dụng Ultralytics YOLOv8

Đếm đối tượng bằng cách sử dụng YOLOv8 Ví dụ

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

# Define region points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=region_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

# Define region points as a polygon with 5 points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360), (20, 400)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=region_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

# Define line points
line_points = [(20, 400), (1080, 400)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=line_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

line_points = [(20, 400), (1080, 400)]  # line or region points
classes_to_count = [0, 2]  # person and car classes for count

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=line_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
Khu vực có thể di chuyển

Bạn có thể di chuyển vùng bất cứ nơi nào trong khung bằng cách nhấp vào các cạnh của nó

Lý lẽ ObjectCounter

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

Tên Kiểu Mặc định Sự miêu tả
names dict None Từ điển tên lớp.
reg_pts list [(20, 400), (1260, 400)] Danh sách các điểm xác định khu vực đếm.
count_reg_color tuple (255, 0, 255) Màu RGB của vùng đếm.
count_txt_color tuple (0, 0, 0) Màu RGB của văn bản đếm.
count_bg_color tuple (255, 255, 255) Màu RGB của nền văn bản đếm.
line_thickness int 2 Độ dày dòng cho các hộp giới hạn.
track_thickness int 2 Độ dày của các đường ray.
view_img bool False Gắn cờ để kiểm soát việc có hiển thị luồng video hay không.
view_in_counts bool True Gắn cờ để kiểm soát việc có hiển thị số vào trên luồng video hay không.
view_out_counts bool True Gắn cờ để kiểm soát việc có hiển thị số lượng ra trên luồng video hay không.
draw_tracks bool False Gắn cờ để kiểm soát xem có vẽ các rãnh đối tượng hay không.
track_color tuple None Màu RGB của các bản nhạc.
region_thickness int 5 Độ dày của vùng đếm đối tượng.
line_dist_thresh int 15 Ngưỡng khoảng cách Euclide cho bộ đếm dòng.
cls_txtdisplay_gap int 50 Hiển thị khoảng cách giữa mỗi lớp học.

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

FAQ

Làm cách nào để đếm đối tượng trong video bằng cách sử dụng Ultralytics YOLOv8?

Để đếm đối tượng trong video bằng cách sử dụng Ultralytics YOLOv8, bạn có thể làm theo các bước sau:

  1. Nhập các thư viện cần thiết (cv2, ultralytics).
  2. Tải một đào tạo trước YOLOv8 mẫu.
  3. Xác định vùng đếm (ví dụ: đa giác, đường, v.v.).
  4. Thiết lập quay video và khởi tạo bộ đếm đối tượng.
  5. Xử lý từng khung hình để theo dõi các đối tượng và đếm chúng trong khu vực xác định.

Dưới đây là một ví dụ đơn giản để đếm trong một khu vực:

import cv2

from ultralytics import YOLO, solutions


def count_objects_in_region(video_path, output_video_path, model_path):
    """Count objects in a specific region within a video."""
    model = YOLO(model_path)
    cap = cv2.VideoCapture(video_path)
    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))
    region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    counter = solutions.ObjectCounter(
        view_img=True, reg_pts=region_points, names=model.names, draw_tracks=True, line_thickness=2
    )

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or video processing has been successfully completed.")
            break
        tracks = model.track(im0, persist=True, show=False)
        im0 = counter.start_counting(im0, tracks)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_objects_in_region("path/to/video.mp4", "output_video.avi", "yolov8n.pt")

Khám phá thêm các cấu hình và tùy chọn trong phần Đếm đối tượng .

Ưu điểm của việc sử dụng là gì Ultralytics YOLOv8 để đếm đối tượng?

Sử dụng Ultralytics YOLOv8 Để đếm đối tượng cung cấp một số lợi thế:

  1. Tối ưu hóa tài nguyên: Nó tạo điều kiện quản lý tài nguyên hiệu quả bằng cách cung cấp số lượng chính xác, giúp tối ưu hóa phân bổ tài nguyên trong các ngành như quản lý hàng tồn kho.
  2. Tăng cường bảo mật: Nó tăng cường an ninh và giám sát bằng cách theo dõi và đếm chính xác các thực thể, hỗ trợ phát hiện mối đe dọa chủ động.
  3. Ra quyết định sáng suốt: Nó cung cấp thông tin chi tiết có giá trị cho việc ra quyết định, tối ưu hóa các quy trình trong các lĩnh vực như bán lẻ, quản lý lưu lượng truy cập, v.v.

Để biết các ứng dụng trong thế giới thực và các ví dụ về mã, hãy truy cập phần Ưu điểm của việc đếm đối tượng .

Làm thế nào tôi có thể đếm các lớp đối tượng cụ thể bằng cách sử dụng Ultralytics YOLOv8?

Để đếm các lớp đối tượng cụ thể bằng cách sử dụng Ultralytics YOLOv8, bạn cần chỉ định các lớp bạn quan tâm trong giai đoạn theo dõi. Dưới đây là một Python ví dụ:

import cv2

from ultralytics import YOLO, solutions


def count_specific_classes(video_path, output_video_path, model_path, classes_to_count):
    """Count specific classes of objects in a video."""
    model = YOLO(model_path)
    cap = cv2.VideoCapture(video_path)
    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))
    line_points = [(20, 400), (1080, 400)]
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    counter = solutions.ObjectCounter(
        view_img=True, reg_pts=line_points, names=model.names, draw_tracks=True, line_thickness=2
    )

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or video processing has been successfully completed.")
            break
        tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)
        im0 = counter.start_counting(im0, tracks)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_specific_classes("path/to/video.mp4", "output_specific_classes.avi", "yolov8n.pt", [0, 2])

Trong ví dụ này, classes_to_count=[0, 2], có nghĩa là nó đếm các đối tượng của lớp 02 (ví dụ: người và xe).

Tại sao tôi nên sử dụng YOLOv8 so với các mô hình phát hiện đối tượng khác cho các ứng dụng thời gian thực?

Ultralytics YOLOv8 cung cấp một số lợi thế so với các mô hình phát hiện đối tượng khác như R-CNN nhanh hơn, SSD và trước đó YOLO Phiên bản:

  1. Tốc độ và hiệu quả: YOLOv8 Cung cấp khả năng xử lý thời gian thực, lý tưởng cho các ứng dụng yêu cầu suy luận tốc độ cao, chẳng hạn như giám sát và lái xe tự động.
  2. Chính xác: Nó cung cấp độ chính xác hiện đại cho các nhiệm vụ phát hiện và theo dõi đối tượng, giảm số lượng dương tính giả và cải thiện độ tin cậy tổng thể của hệ thống.
  3. Dễ dàng tích hợp: YOLOv8 cung cấp tích hợp liền mạch với các nền tảng và thiết bị khác nhau, bao gồm cả thiết bị di động và thiết bị biên, điều này rất quan trọng đối với các ứng dụng AI hiện đại.
  4. Linh hoạt: Hỗ trợ các tác vụ khác nhau như phát hiện đối tượng, phân đoạn và theo dõi với các mô hình có thể định cấu hình để đáp ứng các yêu cầu trường hợp sử dụng cụ thể.

Kiểm tra lại Ultralytics YOLOv8 Tài liệu để tìm hiểu sâu hơn về các tính năng và so sánh hiệu suất của nó.

Tôi có thể sử dụng không YOLOv8 Đối với các ứng dụng nâng cao như phân tích đám đông và quản lý lưu lượng truy cập?

Có Ultralytics YOLOv8 hoàn toàn phù hợp cho các ứng dụng nâng cao như phân tích đám đông và quản lý lưu lượng truy cập do khả năng phát hiện thời gian thực, khả năng mở rộng và tính linh hoạt tích hợp. Các tính năng nâng cao của nó cho phép theo dõi, đếm và phân loại đối tượng có độ chính xác cao trong môi trường động. Ví dụ về các trường hợp sử dụng bao gồm:

  • Phân tích đám đông: Giám sát và quản lý các cuộc tụ tập đông người, đảm bảo an toàn và tối ưu hóa lưu lượng đám đông.
  • Quản lý giao thông: Theo dõi và đếm xe, phân tích mô hình giao thông và quản lý tắc nghẽn trong thời gian thực.

Để biết thêm thông tin và chi tiết triển khai, hãy tham khảo hướng dẫn về Ứng dụng đếm đối tượng trong thế giới thực với YOLOv8.



Đã tạo 2023-12-02, Cập nhật 2024-07-14
Tác giả: RizwanMunawar (6), glenn-jocher (15), IvorZhu331 (1), AyushExel (1)

Ý kiến