์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

Ultralytics YOLOv8 ๐Ÿš€์„ ์‚ฌ์šฉํ•œ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ

๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์„ ์‚ฌ์šฉํ•œ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ Ultralytics YOLOv8 ๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ์ด๋‚˜ ์ฐจ๋Ÿ‰์˜ ์ค„์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์„ ์ตœ์ ํ™”ํ•˜์—ฌ ์†Œ๋งค์ , ์€ํ–‰, ๊ณตํ•ญ, ์˜๋ฃŒ ์‹œ์„ค ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๊ณ ๊ฐ ๋งŒ์กฑ๋„์™€ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ์˜ ์žฅ์ ์€?

  • ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋‹จ์ถ•: ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ๋Œ€๊ธฐ์—ด์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ณ ๊ฐ์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณ ๊ฐ์ด ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์ œํ’ˆ์ด๋‚˜ ์„œ๋น„์Šค์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์–ด ๋งŒ์กฑ๋„ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
  • ํšจ์œจ์„ฑ ํ–ฅ์ƒ: ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๊ธฐ์—…์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ง์› ๋ฐฐ์น˜๋ฅผ ์ตœ์ ํ™”ํ•จ์œผ๋กœ์จ ๊ธฐ์—…์€ ์šด์˜์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋ฉฐ ์ „๋ฐ˜์ ์ธ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

๋ฌผ๋ฅ˜ ๋ฆฌํ…Œ์ผ
๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ•ญ ๋ฐœ๊ถŒ ์นด์šดํ„ฐ์—์„œ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ Ultralytics YOLOv8 ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋ผ์šฐ๋“œ์—์„œ ๋Œ€๊ธฐ์—ด ๋ชจ๋‹ˆํ„ฐ๋ง Ultralytics YOLOv8
๊ณตํ•ญ ๋ฐœ๊ถŒ ์นด์šดํ„ฐ์—์„œ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ Ultralytics YOLOv8 ๊ตฐ์ค‘ ์† ๋Œ€๊ธฐ์—ด ๋ชจ๋‹ˆํ„ฐ๋ง Ultralytics YOLOv8

YOLOv8 ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•œ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ

import cv2
from ultralytics import YOLO
from ultralytics.solutions import queue_management

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

video_writer = cv2.VideoWriter("queue_management.avi",
                               cv2.VideoWriter_fourcc(*'mp4v'),
                               fps,
                               (w, h))

queue_region = [(20, 400), (1080, 404), (1080, 360), (20, 360)]

queue = queue_management.QueueManager()
queue.set_args(classes_names=model.names,
               reg_pts=queue_region,
               line_thickness=3,
               fontsize=1.0,
               region_color=(255, 144, 31))

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

    if success:
        tracks = model.track(im0, show=False, persist=True,
                             verbose=False)
        out = queue.process_queue(im0, tracks)

        video_writer.write(im0)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        continue

    print("Video frame is empty or video processing has been successfully completed.")
    break

cap.release()
cv2.destroyAllWindows()
import cv2
from ultralytics import YOLO
from ultralytics.solutions import queue_management

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

video_writer = cv2.VideoWriter("queue_management.avi",
                               cv2.VideoWriter_fourcc(*'mp4v'),
                               fps,
                               (w, h))

queue_region = [(20, 400), (1080, 404), (1080, 360), (20, 360)]

queue = queue_management.QueueManager()
queue.set_args(classes_names=model.names,
               reg_pts=queue_region,
               line_thickness=3,
               fontsize=1.0,
               region_color=(255, 144, 31))

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

    if success:
        tracks = model.track(im0, show=False, persist=True,
                             verbose=False, classes=0)  # Only person class
        out = queue.process_queue(im0, tracks)

        video_writer.write(im0)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        continue

    print("Video frame is empty or video processing has been successfully completed.")
    break

cap.release()
cv2.destroyAllWindows()

์„ ํƒ์  ์ธ์ˆ˜ set_args

์ด๋ฆ„ ์œ ํ˜• ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
view_img bool False ์นด์šดํŠธ๊ฐ€ ์žˆ๋Š” ํ”„๋ ˆ์ž„ ํ‘œ์‹œ
view_queue_counts bool True ๋น„๋””์˜ค ํ”„๋ ˆ์ž„์—๋งŒ ๋Œ€๊ธฐ์—ด ์ˆ˜ ํ‘œ์‹œ
line_thickness int 2 ๋ฐ”์šด๋”ฉ ์ƒ์ž ๋‘๊ป˜ ๋Š˜๋ฆฌ๊ธฐ
reg_pts list [(20, 400), (1260, 400)] ์ง€์—ญ์„ ์ •์˜ํ•˜๋Š” ํฌ์ธํŠธ ์˜์—ญ
classes_names dict model.model.names ํด๋ž˜์Šค ์ด๋ฆ„ ์‚ฌ์ „
region_color RGB Color (255, 0, 255) ๊ฐœ์ฒด ๊ณ„์‚ฐ ์˜์—ญ ๋˜๋Š” ์„ ์˜ ์ƒ‰์ƒ
track_thickness int 2 ํŠธ๋ž˜ํ‚น ๋ผ์ธ์˜ ๋‘๊ป˜
draw_tracks bool False ํŠธ๋ž™ ๋ผ์ธ ๊ทธ๋ฆฌ๊ธฐ ํ™œ์„ฑํ™”
track_color RGB Color (0, 255, 0) ๊ฐ ํŠธ๋ž™ ๋ผ์ธ์˜ ์ƒ‰์ƒ
count_txt_color RGB Color (255, 255, 255) ๊ฐœ์ฒด ์ˆ˜ ํ…์ŠคํŠธ์˜ ์ „๊ฒฝ์ƒ‰
region_thickness int 5 ๊ฐœ์ฒด ์นด์šดํ„ฐ ์˜์—ญ ๋˜๋Š” ์„ ์˜ ๋‘๊ป˜
fontsize float 0.6 ์นด์šดํŒ… ํ…์ŠคํŠธ์˜ ๊ธ€๊ผด ํฌ๊ธฐ

์ธ์ˆ˜ 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 ๊ฐœ์ฒด ์ถ”์  ๊ฒฐ๊ณผ ํ‘œ์‹œ


์ƒ์„ฑ 2024-04-02, ์—…๋ฐ์ดํŠธ 2024-04-02
์ž‘์„ฑ์ž: Burhan-Q (1), ๋ฆฌ์ฆˆ์™„ ๋ฌด๋‚˜์™€๋ฅด (1)

๋Œ“๊ธ€