๋ค์์ ์ฌ์ฉํ ๋ถ์ Ultralytics YOLO11
์๊ฐ
์ด ๊ฐ์ด๋์์๋ ์ ๊ทธ๋ํ, ๋ง๋ํ ์ฐจํธ, ์ํ ์ฐจํธ์ ์ธ ๊ฐ์ง ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์๊ฐํ ์ ํ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ ์น์ ์๋ Python ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์๊ฐํ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ๊ณ๋ณ ์ง์นจ๊ณผ ์ฝ๋ ์ค๋ํซ์ด ํฌํจ๋์ด ์์ต๋๋ค.
Watch: Ultralytics | ์ ๊ทธ๋ํ, ๋ง๋ ๊ทธ๋ํ, ๋ฉด์ ๋ฐ ํ์ด ์ฐจํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ
์๊ฐ์ ์ํ
์ ๊ทธ๋ํ | ๋ง๋ ํ๋กฏ | ํ์ด ์ฐจํธ |
---|---|---|
๊ทธ๋ํ๊ฐ ์ค์ํ ์ด์
- ์ ๊ทธ๋ํ๋ ์ฅ๋จ๊ธฐ ๋ณํ๋ฅผ ์ถ์ ํ๊ณ ๊ฐ์ ๊ธฐ๊ฐ ๋์ ์ฌ๋ฌ ๊ทธ๋ฃน์ ๋ณํ๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ด์์ ์ ๋๋ค.
- ๋ฐ๋ฉด ๋ง๋ํ ๋ง๋๊ทธ๋ํ๋ ์ฌ๋ฌ ์นดํ ๊ณ ๋ฆฌ์ ์๋์ ๋น๊ตํ๊ณ ์นดํ ๊ณ ๋ฆฌ์ ํด๋น ์์น ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํ์ํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ํ์ด ์ฐจํธ๋ ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ ๋น์จ์ ์ค๋ช ํ๊ณ ์ ์ฒด์ ์ผ๋ถ๋ฅผ ํ์ํ๋ ๋ฐ ํจ๊ณผ์ ์ ๋๋ค.
๋ถ์ ์์
yolo solutions analytics show=True
# pass the source
yolo solutions analytics source="path/to/video/file.mp4"
# generate the pie chart
yolo solutions analytics analytics_type="pie" show=True
# generate the bar plots
yolo solutions analytics analytics_type="bar" show=True
# generate the area plots
yolo solutions analytics analytics_type="area" show=True
import cv2
from ultralytics import solutions
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
out = cv2.VideoWriter(
"ultralytics_analytics.avi",
cv2.VideoWriter_fourcc(*"MJPG"),
fps,
(1920, 1080), # This is fixed
)
# Init analytics
analytics = solutions.Analytics(
show=True, # Display the output
analytics_type="line", # Pass the analytics type, could be "pie", "bar" or "area".
model="yolo11n.pt", # Path to the YOLO11 model file
# classes=[0, 2], # If you want to count specific classes i.e person and car with COCO pretrained model.
)
# Process video
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if success:
frame_count += 1
im0 = analytics.process_data(im0, frame_count) # update analytics graph every frame
out.write(im0) # write the video file
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
์ธ์ Analytics
๋ค์์ ํ์
๋๋ค. Analytics
์ธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค:
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
analytics_type |
str |
line |
๊ทธ๋ํ ์ ํ(์: "์ ", "๋ง๋", "๋ฉด์ ", "ํ์ด") |
model |
str |
None |
Ultralytics YOLO ๋ชจ๋ธ ํ์ผ ๊ฒฝ๋ก |
line_width |
int |
2 |
๊ฒฝ๊ณ ์์์ ์ ๋๊ป์ ๋๋ค. |
show |
bool |
False |
๋น๋์ค ์คํธ๋ฆผ ํ์ ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ ํ๋๊ทธ์ ๋๋ค. |
์ธ์ model.track
์ธ์ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
source |
str |
None |
์ด๋ฏธ์ง ๋๋ ๋์์์ ์์ค ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค. ํ์ผ ๊ฒฝ๋ก ๋ฐ URL์ ์ง์ํฉ๋๋ค. |
persist |
bool |
False |
ํ๋ ์ ๊ฐ ์ค๋ธ์ ํธ๋ฅผ ์ง์์ ์ผ๋ก ์ถ์ ํ์ฌ ๋น๋์ค ์ํ์ค ์ ์ฒด์์ ID๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. |
tracker |
str |
botsort.yaml |
์ฌ์ฉํ ์ถ์ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํฉ๋๋ค(์, bytetrack.yaml ๋๋ botsort.yaml . |
conf |
float |
0.3 |
ํ์ง ์ ๋ขฐ ์๊ณ๊ฐ์ ์ค์ ํฉ๋๋ค. ๊ฐ์ด ๋ฎ์์๋ก ๋ ๋ง์ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ ์ ์์ง๋ง ์คํ์ด ํฌํจ๋ ์ ์์ต๋๋ค. |
iou |
float |
0.5 |
์ค๋ณต ๊ฐ์ง๋ฅผ ํํฐ๋งํ๊ธฐ ์ํ IoU( Intersection over Union ) ์๊ณ๊ฐ์ ์ค์ ํฉ๋๋ค. |
classes |
list |
None |
ํด๋์ค ์ธ๋ฑ์ค๋ณ๋ก ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด classes=[0, 2, 3] ์ง์ ๋ ํด๋์ค๋ง ์ถ์ ํฉ๋๋ค. |
verbose |
bool |
True |
์ถ์ ๊ฒฐ๊ณผ์ ํ์๋ฅผ ์ ์ดํ์ฌ ์ถ์ ๋ ๊ฐ์ฒด์ ์๊ฐ์ ์ถ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. |
๊ฒฐ๋ก
ํจ๊ณผ์ ์ธ ๋ฐ์ดํฐ ๋ถ์์ ์ํด์๋ ๋ค์ํ ์ ํ์ ์๊ฐํ๋ฅผ ์ธ์ , ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ๊ทธ๋ํ, ๋ง๋ํ ์ฐจํธ, ํ์ด ์ฐจํธ๋ ๋ฐ์ดํฐ์ ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ค ๋ช ํํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฌํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐ๋ณธ์ ์ธ ๋๊ตฌ์ ๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Ultralytics YOLO11 ์ ๋๋ฆฌํฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ธ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
Ultralytics YOLO11 ์ ๋๋ฆฌํฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ธ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
- YOLO11 ๋ชจ๋ธ์ ๋ก๋ํ๊ณ ๋์์ ํ์ผ์ ์ฝ๋๋ค.
- ์ด๊ธฐํ
Analytics
ํด๋์ค์ ์ ํ์ "line"์ผ๋ก ์ค์ ํฉ๋๋ค. - ๋น๋์ค ํ๋ ์์ ๋ฐ๋ณตํ์ฌ ํ๋ ์๋น ๊ฐ์ฒด ์์ ๊ฐ์ ๊ด๋ จ ๋ฐ์ดํฐ๋ก ์ ๊ทธ๋ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ ๊ทธ๋ํ๊ฐ ํ์๋ ์ถ๋ ฅ ๋์์์ ์ ์ฅํฉ๋๋ค.
์์:
import cv2
from ultralytics import solutions
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(
"ultralytics_analytics.avi",
cv2.VideoWriter_fourcc(*"MJPG"),
fps,
(1920, 1080), # This is fixed
)
analytics = solutions.Analytics(
analytics_type="line",
show=True,
)
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if success:
frame_count += 1
im0 = analytics.process_data(im0, frame_count) # update analytics graph every frame
out.write(im0) # write the video file
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
๊ตฌ์ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ Analytics
ํด๋์ค๋ฅผ ๋ฐฉ๋ฌธํ์ญ์์ค. Ultralytics YOLO11 ๐์ ์ฌ์ฉํ ๋ถ์ ์น์
์ผ๋ก ์ด๋ํฉ๋๋ค.
๋ง๋ํ ์ฐจํธ ์์ฑ์ Ultralytics YOLO11 ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์๋์?
๋ง๋ํ ์ฐจํธ ์์ฑ์ Ultralytics YOLO11 ์ ์ฌ์ฉํ๋ฉด ๋ช ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค:
- ์ค์๊ฐ ๋ฐ์ดํฐ ์๊ฐํ: ๊ฐ์ฒด ๊ฐ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ํ ์ฐจํธ์ ์ํํ๊ฒ ํตํฉํ์ฌ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ ํธ์์ฑ: ๊ฐ๋จํ API์ ํจ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ๊ณ ์๊ฐํํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ง์ : ์ ๋ชฉ, ๋ผ๋ฒจ, ์์ ๋ฑ์ ํน์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ฌ์ฉ์ ์ง์ ํ์ธ์.
- ํจ์จ์ฑ: ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋์์ ์ฒ๋ฆฌ ์ค์ ์ค์๊ฐ์ผ๋ก ํ๋กฏ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ํ ์ฐจํธ๋ฅผ ์์ฑํฉ๋๋ค:
import cv2
from ultralytics import solutions
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(
"ultralytics_analytics.avi",
cv2.VideoWriter_fourcc(*"MJPG"),
fps,
(1920, 1080), # This is fixed
)
analytics = solutions.Analytics(
analytics_type="bar",
show=True,
)
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if success:
frame_count += 1
im0 = analytics.process_data(im0, frame_count) # update analytics graph every frame
out.write(im0) # write the video file
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
์์ธํ ๋ด์ฉ์ ๊ฐ์ด๋์ ๋ง๋ํ ์ฐจํธ ์น์ ์ ์ฐธ์กฐํ์ธ์.
๋ฐ์ดํฐ ์๊ฐํ ํ๋ก์ ํธ์์ ํ์ด ์ฐจํธ๋ฅผ ๋ง๋ค ๋ Ultralytics YOLO11 ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
Ultralytics YOLO11 ๋ ํ์ด ์ฐจํธ๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ์ ํ์ ๋๋ค:
- ๊ฐ์ฒด ๊ฐ์ง์ ํตํฉ: ๊ฐ์ฒด ๊ฐ์ง ๊ฒฐ๊ณผ๋ฅผ ํ์ด ์ฐจํธ์ ์ง์ ํตํฉํ์ฌ ์ฆ๊ฐ์ ์ธ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์นํ์ ์ธ API: ์ต์ํ์ ์ฝ๋๋ก ๊ฐํธํ๊ฒ ์ค์ ํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ง์ ๊ฐ๋ฅ: ์์, ๋ผ๋ฒจ ๋ฑ์ ๋ํ ๋ค์ํ ์ฌ์ฉ์ ์ง์ ์ต์ ์ด ์์ต๋๋ค.
- ์ค์๊ฐ ์ ๋ฐ์ดํธ: ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๊ฐํํ ์ ์์ด ๋์์ ๋ถ์ ํ๋ก์ ํธ์ ์ด์์ ์ ๋๋ค.
๋ค์์ ๊ฐ๋จํ ์์ ๋๋ค:
import cv2
from ultralytics import solutions
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(
"ultralytics_analytics.avi",
cv2.VideoWriter_fourcc(*"MJPG"),
fps,
(1920, 1080), # This is fixed
)
analytics = solutions.Analytics(
analytics_type="pie",
show=True,
)
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if success:
frame_count += 1
im0 = analytics.process_data(im0, frame_count) # update analytics graph every frame
out.write(im0) # write the video file
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
์์ธํ ๋ด์ฉ์ ๊ฐ์ด๋์ ํ์ด ์ฐจํธ ์น์ ์ ์ฐธ์กฐํ์ธ์.
Ultralytics YOLO11 ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๊ณ ๋น์ฃผ์ผ๋ฆฌ์ ์ด์ ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋์?
์, Ultralytics YOLO11 ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๊ณ ์๊ฐํ๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ ์ ์์ผ๋ฉฐ ์ถ์ ๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ทธ๋ํ, ๋ง๋ํ ์ฐจํธ, ์ํ ์ฐจํธ ๋ฑ ๋ค์ํ ์๊ฐํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ผ์ธ ๊ทธ๋ํ ์ถ์ ๋ฐ ์ ๋ฐ์ดํธ ์์:
import cv2
from ultralytics import solutions
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(
"ultralytics_analytics.avi",
cv2.VideoWriter_fourcc(*"MJPG"),
fps,
(1920, 1080), # This is fixed
)
analytics = solutions.Analytics(
analytics_type="line",
show=True,
)
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if success:
frame_count += 1
im0 = analytics.process_data(im0, frame_count) # update analytics graph every frame
out.write(im0) # write the video file
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
์ ์ฒด ๊ธฐ๋ฅ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ์ถ์ ์น์ ์ ์ฐธ์กฐํ์ธ์.
Ultralytics YOLO11 ์ด ๋ค๋ฅธ ๊ฐ์ฒด ๊ฐ์ง ์๋ฃจ์ ๊ณผ ๋ค๋ฅธ ์ ์ ๋ฌด์์ ๋๊น? TensorFlow?
Ultralytics YOLO11 ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก OpenCV๋ TensorFlow ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด ๊ฐ์ง ์๋ฃจ์ ๊ณผ ์ฐจ๋ณํ๋ฉ๋๋ค:
- ์ต์ฒจ๋จ ์ ํ๋: YOLO11 ๋ ๋ฌผ์ฒด ๊ฐ์ง, ์ธ๋ถํ ๋ฐ ๋ถ๋ฅ ์์ ์์ ๋ฐ์ด๋ ์ ํ๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ฉ ํธ์์ฑ: ์ฌ์ฉ์ ์นํ์ ์ธ API๋ฅผ ํตํด ๊ด๋ฒ์ํ ์ฝ๋ฉ ์์ด๋ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ณ ํตํฉํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์ฑ๋ฅ: ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ๊ณ ์ ์ถ๋ก ์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ : ๋ค์ค ๊ฐ์ฒด ์ถ์ , ์ฌ์ฉ์ ์ง์ ๋ชจ๋ธ ํ๋ จ, ONNX, TensorRT, CoreML ๊ณผ ๊ฐ์ ๋ค์ํ ํ์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ ๋ฑ ๋ค์ํ ์์ ์ ์ง์ํฉ๋๋ค.
- ์ข ํฉ์ ์ธ ๋ฌธ์: ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ดํ๋ ๋ฐฉ๋ํ ๋ฌธ์์ ๋ธ๋ก๊ทธ ๋ฆฌ์์ค.
์์ธํ ๋น๊ต ๋ฐ ์ฌ์ฉ ์ฌ๋ก๋ Ultralytics ๋ธ๋ก๊ทธ์์ ํ์ธํ ์ ์์ต๋๋ค.