μ½˜ν…μΈ λ‘œ κ±΄λ„ˆλ›°κΈ°

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 XμΆ•μ˜ λ ˆμ΄λΈ”μž…λ‹ˆλ‹€.
y_label str y 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 For multiple lines, total points drawn on frame, before deleting initial points.
points_width int 15 Width of line points highlighter.

인수 model.track

이름 μœ ν˜• κΈ°λ³Έκ°’ μ„€λͺ…
source im0 None 이미지 λ˜λŠ” λΉ„λ””μ˜€μ˜ μ†ŒμŠ€ 디렉토리
persist bool False ν”„λ ˆμž„ κ°„ νŠΈλž™ 지속
tracker str botsort.yaml 좔적 방법 'λ°”μ΄νŠΈνŠΈλž™' λ˜λŠ” 'λ΄‡μ†ŒνŠΈ'
conf float 0.3 μ‹ λ’° μž„κ³„κ°’
iou float 0.5 IOU μž„κ³„κ°’
classes list None ν΄λž˜μŠ€λ³„λ‘œ κ²°κ³Όλ₯Ό ν•„ν„°λ§ν•©λ‹ˆλ‹€(예: classes=0 λ˜λŠ” classes=[0,2,3]).
verbose bool True 개체 좔적 κ²°κ³Ό ν‘œμ‹œ

κ²°λ‘ 

효과적인 데이터 뢄석을 μœ„ν•΄μ„œλŠ” λ‹€μ–‘ν•œ μœ ν˜•μ˜ μ‹œκ°ν™”λ₯Ό μ–Έμ œ, μ–΄λ–»κ²Œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ„  κ·Έλž˜ν”„, λ§‰λŒ€ν˜• 차트, 파이 μ°¨νŠΈλŠ” λ°μ΄ν„°μ˜ μŠ€ν† λ¦¬λ₯Ό 보닀 λͺ…ν™•ν•˜κ³  효과적으둜 μ „λ‹¬ν•˜λŠ” 데 도움이 λ˜λŠ” 기본적인 λ„κ΅¬μž…λ‹ˆλ‹€.



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

λŒ“κΈ€