Ultralytics YOLOv8 ๐์ ์ฌ์ฉํ ๋๊ธฐ์ด ๊ด๋ฆฌ
๋๊ธฐ์ด ๊ด๋ฆฌ๋ ๋ฌด์์ธ๊ฐ์?
์ ์ฌ์ฉํ ๋๊ธฐ์ด ๊ด๋ฆฌ Ultralytics YOLOv8 ๋ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ๋์ด๋ ์ฐจ๋์ ์ค์ ๊ตฌ์ฑํ๊ณ ์ ์ดํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋๊ธฐ์ด์ ์ต์ ํํ์ฌ ์๋งค์ , ์ํ, ๊ณตํญ, ์๋ฃ ์์ค ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ ๊ณ ๊ฐ ๋ง์กฑ๋์ ์์คํ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค.
Watch: ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ Ultralytics YOLOv8 | ๊ณตํญ ๋ฐ ์งํ์ฒ ์ญ
๋๊ธฐ์ด ๊ด๋ฆฌ์ ์ฅ์ ์?
- ๋๊ธฐ ์๊ฐ ๋จ์ถ: ๋๊ธฐ์ด ๊ด๋ฆฌ ์์คํ ์ ๋๊ธฐ์ด์ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํ์ฌ ๊ณ ๊ฐ์ ๋๊ธฐ ์๊ฐ์ ์ต์ํํฉ๋๋ค. ์ด๋ ๊ณ ๊ฐ์ด ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ์ ํ์ด๋ ์๋น์ค์ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ ์์ด ๋ง์กฑ๋ ํฅ์์ผ๋ก ์ด์ด์ง๋๋ค.
- ํจ์จ์ฑ ํฅ์: ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ๋ฉด ๊ธฐ์ ์ ๋ฆฌ์์ค๋ฅผ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ํ ๋นํ ์ ์์ต๋๋ค. ๋๊ธฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ์ง์ ๋ฐฐ์น๋ฅผ ์ต์ ํํจ์ผ๋ก์จ ๊ธฐ์ ์ ์ด์์ ๊ฐ์ํํ๊ณ ๋น์ฉ์ ์ ๊ฐํ๋ฉฐ ์ ๋ฐ์ ์ธ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์
๋ฌผ๋ฅ | ๋ฆฌํ ์ผ |
---|---|
๊ณตํญ ๋ฐ๊ถ ์นด์ดํฐ์์ ๋๊ธฐ์ด ๊ด๋ฆฌ Ultralytics YOLOv8 | ๊ตฐ์ค ์ ๋๊ธฐ์ด ๋ชจ๋ํฐ๋ง Ultralytics YOLOv8 |
YOLOv8 ์์ ๋ฅผ ์ฌ์ฉํ ๋๊ธฐ์ด ๊ด๋ฆฌ
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))
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 = solutions.QueueManager(
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, 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))
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 = solutions.QueueManager(
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()
์ธ์ QueueManager
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
names |
dict |
model.names |
ํด๋์ค ID๋ฅผ ํด๋์ค ์ด๋ฆ์ ๋งคํํ๋ ์ฌ์ ์ ๋๋ค. |
reg_pts |
list of tuples |
[(20, 400), (1260, 400)] |
๊ณ์ฐ ์์ญ ๋ค๊ฐํ์ ์ ์ํ๋ ์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์๋ ์ง์ฌ๊ฐํ์ ๋๋ค. |
line_thickness |
int |
2 |
์ฃผ์ ์ ์ ๋๊ป์ ๋๋ค. |
track_thickness |
int |
2 |
ํธ๋ ์ ์ ๋๊ป์ ๋๋ค. |
view_img |
bool |
False |
์ด๋ฏธ์ง ํ๋ ์์ ํ์ํ ์ง ์ฌ๋ถ์ ๋๋ค. |
region_color |
tuple |
(255, 0, 255) |
๊ณ์ฐ ์์ญ ์ (BGR)์ ์์. |
view_queue_counts |
bool |
True |
๋๊ธฐ์ด ์๋ฅผ ํ์ํ ์ง ์ฌ๋ถ์ ๋๋ค. |
draw_tracks |
bool |
False |
์ค๋ธ์ ํธ์ ํธ๋์ ๊ทธ๋ฆด์ง ์ฌ๋ถ์ ๋๋ค. |
count_txt_color |
tuple |
(255, 255, 255) |
์นด์ดํธ ํ ์คํธ์ ์์(BGR). |
track_color |
tuple |
None |
ํธ๋์ ์์. ๋ง์ฝ None ๋ฅผ ํด๋ฆญํ๋ฉด ํธ๋๋ง๋ค ๋ค๋ฅธ ์์์ด ์ฌ์ฉ๋ฉ๋๋ค. |
region_thickness |
int |
5 |
๊ณ์ฐ ์์ญ ์ ์ ๋๊ป์ ๋๋ค. |
fontsize |
float |
0.7 |
ํ ์คํธ ์ฃผ์์ ๊ธ๊ผด ํฌ๊ธฐ์ ๋๋ค. |
์ธ์ 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 |
๊ฐ์ฒด ์ถ์ ๊ฒฐ๊ณผ ํ์ |
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
์ค์๊ฐ ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ์ํด Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
์ค์๊ฐ ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ์ํด Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
- YOLOv8 ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ๋ก๋ํฉ๋๋ค.
YOLO("yolov8n.pt")
. - ๋ค์์ ์ฌ์ฉํ์ฌ ๋์์ ํผ๋๋ฅผ ์บก์ฒํฉ๋๋ค.
cv2.VideoCapture
. - ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ์ํ ๊ด์ฌ ์์ญ(ROI)์ ์ ์ํฉ๋๋ค.
- ํ๋ ์์ ์ฒ๋ฆฌํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ์งํ๊ณ ๋๊ธฐ์ด์ ๊ด๋ฆฌํฉ๋๋ค.
๋ค์์ ์ต์ํ์ ์์ ๋๋ค:
import cv2
from ultralytics import YOLO, solutions
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video.mp4")
queue_region = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
queue = solutions.QueueManager(
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)
cv2.imshow("Queue Management", im0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
Ultralytics HUB๋ฅผ ํ์ฉํ๋ฉด ๋๊ธฐ์ด ๊ด๋ฆฌ ์๋ฃจ์ ์ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์๋ ์ฌ์ฉ์ ์นํ์ ์ธ ํ๋ซํผ์ ์ ๊ณตํจ์ผ๋ก์จ ์ด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค.
๋๊ธฐ์ด ๊ด๋ฆฌ์ Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ฃผ์ ์ด์ ์ด ์๋์?
๋๊ธฐ์ด ๊ด๋ฆฌ์ Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ฉด ๋ช ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค:
- ๋๊ธฐ ์๊ฐ ๋จ์ถ: ๋๊ธฐ์ด์ ํจ์จ์ ์ผ๋ก ์ ๋ฆฌํ์ฌ ๊ณ ๊ฐ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ๋ง์กฑ๋๋ฅผ ๋์ ๋๋ค.
- ํจ์จ์ฑ ํฅ์: ๋๊ธฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ง์ ๋ฐฐ์น ๋ฐ ์ด์์ ์ต์ ํํจ์ผ๋ก์จ ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค.
- ์ค์๊ฐ ์๋ฆผ: ๊ธด ๋๊ธฐ์ด์ ๋ํ ์ค์๊ฐ ์๋ฆผ์ ์ ๊ณตํ์ฌ ๋น ๋ฅธ ๊ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ํ์ฅ์ฑ: ๋ฆฌํ ์ผ, ๊ณตํญ, ์๋ฃ ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ๋๊ธฐ์ด ๊ด๋ฆฌ ์๋ฃจ์ ์ ์ดํด๋ณด์ธ์.
๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ์ํด TensorFlow ๋๋ Detectron2์ ๊ฐ์ ๊ฒฝ์์ฌ๋ณด๋ค Ultralytics YOLOv8 ์ ์ ํํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
Ultralytics YOLOv8 ๋ ๋๊ธฐ์ด ๊ด๋ฆฌ ์ธก๋ฉด์์ TensorFlow ๋ฐ Detectron2์ ๋นํด ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค:
- ์ค์๊ฐ ์ฑ๋ฅ: YOLOv8 ๋ ์ค์๊ฐ ๊ฐ์ง ๊ธฐ๋ฅ์ผ๋ก ๋ ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ผ๋ก ์ ๋ช ํฉ๋๋ค.
- ์ฌ์ฉ ํธ์์ฑ: Ultralytics Ultralytics HUB๋ฅผ ํตํด ๊ต์ก๋ถํฐ ๋ฐฐํฌ๊น์ง ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ ํ์ต๋ ๋ชจ๋ธ: ์ฌ์ ํ์ต๋ ๋ค์ํ ๋ชจ๋ธ์ ์ก์ธ์คํ์ฌ ์ค์ ์ ํ์ํ ์๊ฐ์ ์ต์ํํ ์ ์์ต๋๋ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ๊ด๋ฒ์ํ ๋ฌธ์์ ํ๋ฐํ ์ปค๋ฎค๋ํฐ ์ง์์ผ๋ก ๋ฌธ์ ํด๊ฒฐ์ด ์ฌ์์ง๋๋ค.
์์ํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ Ultralytics YOLO.
Ultralytics YOLOv8 ๊ณตํญ ๋ฐ ์๋งค์ ๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ ํ์ ๋๊ธฐ์ด์ ์ฒ๋ฆฌํ ์ ์๋์?
์, Ultralytics YOLOv8 ์ ๊ณตํญ ๋ฐ ๋ฆฌํ ์ผ ํ๊ฒฝ์ ํฌํจํ ๋ค์ํ ์ ํ์ ๋๊ธฐ์ด์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ํน์ ์ง์ญ ๋ฐ ์ค์ ์ผ๋ก QueueManager๋ฅผ ๊ตฌ์ฑํ๋ฉด YOLOv8 ๋ค์ํ ๋๊ธฐ์ด ๋ ์ด์์๊ณผ ๋ฐ๋์ ๋ง๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
๊ณตํญ์ ์์ ๋๋ค:
queue_region_airport = [(50, 600), (1200, 600), (1200, 550), (50, 550)]
queue_airport = solutions.QueueManager(
names=model.names,
reg_pts=queue_region_airport,
line_thickness=3,
fontsize=1.0,
region_color=(0, 255, 0),
)
๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์น์ ์ ์ฐธ์กฐํ์ธ์.
๋๊ธฐ์ด ๊ด๋ฆฌ์์ Ultralytics YOLOv8 ์ ์ค์ ์ ์ฉ ์ฌ๋ก๋ ๋ฌด์์ธ๊ฐ์?
Ultralytics YOLOv8 ๋ ๋๊ธฐ์ด ๊ด๋ฆฌ๋ฅผ ์ํด ๋ค์ํ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค:
- ์๋งค์ : ๊ณ์ฐ๋ ๋๊ธฐ์ด์ ๋ชจ๋ํฐ๋งํ์ฌ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ๊ณ ๊ฐ ๋ง์กฑ๋๋ฅผ ๋์ ๋๋ค.
- ๊ณตํญ: ๋ณด๋ค ์ํํ ์น๊ฐ ๊ฒฝํ์ ์ํด ๋ฐ๊ถ ์นด์ดํฐ์ ๋ณด์ ๊ฒ์๋์ ๋๊ธฐ์ด์ ๊ด๋ฆฌํฉ๋๋ค.
- ํฌ์ค์ผ์ด: ํด๋ฆฌ๋๊ณผ ๋ณ์์์ ํ์ ํ๋ฆ์ ์ต์ ํํฉ๋๋ค.
- ์ํ: ์ํ์์ ๋๊ธฐ์ด์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ๊ณ ๊ฐ ์๋น์ค๋ฅผ ๊ฐ์ ํฉ๋๋ค.
์ค์ ๋๊ธฐ์ด ๊ด๋ฆฌ์ ๋ํ ๋ธ๋ก๊ทธ์์ ์์ธํ ๋ด์ฉ์ ํ์ธํ์ธ์.
์์ฑ 2024-04-02, ์ ๋ฐ์ดํธ 2024-07-14
์์ฑ์: RizwanMunawar (1), glenn-jocher (5), IvorZhu331 (1), Burhan-Q (1)