Ultralytics YOLOv8 ๐์ ์ฌ์ฉํ ์ด๋ ๋ชจ๋ํฐ๋ง
์์ธ ์ถ์ ์ ํตํ ์ด๋ ๋ชจ๋ํฐ๋ง Ultralytics YOLOv8 ๋ ์ ์ฒด์ ์ฃผ์ ๋๋๋งํฌ์ ๊ด์ ์ ์ค์๊ฐ์ผ๋ก ์ ํํ๊ฒ ์ถ์ ํ์ฌ ์ด๋ ํ๊ฐ๋ฅผ ํฅ์์ํต๋๋ค. ์ด ๊ธฐ์ ์ ์ด๋ ์์ธ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ณ , ์ด๋ ๋ฃจํด์ ์ถ์ ํ๋ฉฐ, ์ฑ๊ณผ ์งํ๋ฅผ ์ธก์ ํ์ฌ ์ฌ์ฉ์์ ํธ๋ ์ด๋ ๋ชจ๋๋ฅผ ์ํด ํธ๋ ์ด๋ ์ธ์ ์ ์ต์ ํํฉ๋๋ค.
Watch: Ultralytics YOLOv8 | ํธ์์
, ํ์
, ๋ณต๊ทผ ์ด๋์ ์ด์ฉํ ์ด๋ ๋ชจ๋ํฐ๋ง
์ด๋ ๋ชจ๋ํฐ๋ง์ ์ฅ์ ์?
- ์ต์ ํ๋ ํผํฌ๋จผ์ค: ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ํ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ๋ง์ถคํ ์ด๋.
- ๋ชฉํ ๋ฌ์ฑ: ์ธก์ ๊ฐ๋ฅํ ์งํ ์ํฉ์ ์ํด ํผํธ๋์ค ๋ชฉํ๋ฅผ ์ถ์ ํ๊ณ ์กฐ์ ํ์ธ์.
- ๊ฐ์ธํ: ๊ฐ์ธ๋ณ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ๋ง์ถคํ ์ด๋ ๊ณํ์ผ๋ก ์ด๋ ํจ๊ณผ๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
- ๊ฑด๊ฐ ์ธ์: ๊ฑด๊ฐ ๋ฌธ์ ๋๋ ๊ณผ๋ํ ํ๋ จ์ ๋ํ๋ด๋ ํจํด์ ์กฐ๊ธฐ์ ๊ฐ์งํฉ๋๋ค.
- ์ ๋ณด์ ๊ธฐ๋ฐํ ์์ฌ ๊ฒฐ์ : ๋ฃจํด์ ์กฐ์ ํ๊ณ ํ์ค์ ์ธ ๋ชฉํ๋ฅผ ์ค์ ํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ ๊ฒฐ์ .
์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ ๋ชจ๋ํฐ๋ง | ์ด๋ ๋ชจ๋ํฐ๋ง |
---|---|
ํธ์์ ์นด์ดํ | ํ์ ์นด์ดํ |
์ด๋ ๋ชจ๋ํฐ๋ง ์์
from ultralytics import YOLO
from ultralytics.solutions import ai_gym
import cv2
model = YOLO("yolov8n-pose.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))
gym_object = ai_gym.AIGym() # init AI GYM module
gym_object.set_args(line_thickness=2,
view_img=True,
pose_type="pushup",
kpts_to_check=[6, 8, 10])
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
frame_count += 1
results = model.track(im0, verbose=False) # Tracking recommended
#results = model.predict(im0) # Prediction also supported
im0 = gym_object.start_counting(im0, results, frame_count)
cv2.destroyAllWindows()
from ultralytics import YOLO
from ultralytics.solutions import ai_gym
import cv2
model = YOLO("yolov8n-pose.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("workouts.avi",
cv2.VideoWriter_fourcc(*'mp4v'),
fps,
(w, h))
gym_object = ai_gym.AIGym() # init AI GYM module
gym_object.set_args(line_thickness=2,
view_img=True,
pose_type="pushup",
kpts_to_check=[6, 8, 10])
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
frame_count += 1
results = model.track(im0, verbose=False) # Tracking recommended
#results = model.predict(im0) # Prediction also supported
im0 = gym_object.start_counting(im0, results, frame_count)
video_writer.write(im0)
cv2.destroyAllWindows()
video_writer.release()
์ง์
"ํธ์์ ", "ํ์ " ๋ฐ "๋ณต๊ทผ ์ด๋" ์ง์
ํคํฌ์ธํธ ๋งต
์ธ์ set_args
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
kpts_to_check |
list |
None |
ํน์ ์ด๋์ ๊ณ์ฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ํคํฌ์ธํธ ์ธ๋ฑ์ค ๋ชฉ๋ก๊ณผ ํคํฌ์ธํธ ๋งต |
view_img |
bool |
False |
์นด์ดํธ๊ฐ ์๋ ํ๋ ์ ํ์ |
line_thickness |
int |
2 |
์นด์ดํธ ๊ฐ์ ๋๊ป๋ฅผ ๋๋ฆฝ๋๋ค. |
pose_type |
str |
pushup |
๋ชจ๋ํฐ๋ง์ด ํ์ํ ํฌ์ฆ, pullup ๊ทธ๋ฆฌ๊ณ abworkout ๋ํ ์ง์ |
pose_up_angle |
int |
145 |
ํฌ์ฆ ์ ๊ฐ๋ ๊ฐ |
pose_down_angle |
int |
90 |
ํฌ์ฆ ๋ค์ด ๊ฐ๋ ๊ฐ |
์ธ์ model.predict
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
source |
str |
'ultralytics/assets' |
์ด๋ฏธ์ง ๋๋ ๋น๋์ค์ ์์ค ๋๋ ํ ๋ฆฌ |
conf |
float |
0.25 |
ํ์ง๋ฅผ ์ํ ๊ฐ์ฒด ์ ๋ขฐ ์๊ณ๊ฐ |
iou |
float |
0.7 |
NMS์ ๋ํ ๊ต์ฐจ์ ์ค๋ฒ ์ ๋์จ(IoU) ์๊ณ๊ฐ |
imgsz |
int or tuple |
640 |
์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์นผ๋ผ ๋๋ (h, w) ๋ชฉ๋ก(์: (640, 480))์ผ๋ก ์ง์ ํฉ๋๋ค. |
half |
bool |
False |
๋ฐ์ ๋ฐ๋ ์ฌ์ฉ(FP16) |
device |
None or str |
None |
์คํํ ๋๋ฐ์ด์ค(์: CUDA ๋๋ฐ์ด์ค=0/1/2/3 ๋๋ ๋๋ฐ์ด์ค=CPU) |
max_det |
int |
300 |
์ด๋ฏธ์ง๋น ์ต๋ ํ์ง ํ์ |
vid_stride |
bool |
False |
๋น๋์ค ํ๋ ์ ์๋ ๋ณดํญ |
stream_buffer |
bool |
False |
๋ชจ๋ ์คํธ๋ฆฌ๋ฐ ํ๋ ์์ ๋ฒํผ๋งํ๊ฑฐ๋(True) ๊ฐ์ฅ ์ต๊ทผ ํ๋ ์์ ๋ฐํํฉ๋๋ค(False). |
visualize |
bool |
False |
๋ชจ๋ธ ๊ธฐ๋ฅ ์๊ฐํ |
augment |
bool |
False |
์์ธก ์์ค์ ์ด๋ฏธ์ง ์ฆ๊ฐ ์ ์ฉ |
agnostic_nms |
bool |
False |
ํด๋์ค์ ๊ตฌ์ ๋ฐ์ง ์๋ NMS |
classes |
list[int] |
None |
ํด๋์ค๋ณ๋ก ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํฉ๋๋ค(์: classes=0 ๋๋ classes=[0,2,3]). |
retina_masks |
bool |
False |
๊ณ ํด์๋ ์ธ๋ถํ ๋ง์คํฌ ์ฌ์ฉ |
embed |
list[int] |
None |
์ฃผ์ด์ง ๋ ์ด์ด์์ ํผ์ฒ ๋ฒกํฐ/์๋ฒ ๋ฉ์ ๋ฐํํฉ๋๋ค. |
์ธ์ 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 |
๊ฐ์ฒด ์ถ์ ๊ฒฐ๊ณผ ํ์ |