๋ค์์ ์ฌ์ฉํ์ฌ ์ด๋ ๋ชจ๋ํฐ๋ง Ultralytics YOLOv8
์์ธ ์ถ์ ์ ํตํ ์ด๋ ๋ชจ๋ํฐ๋ง Ultralytics YOLOv8 ๋ ์ ์ฒด์ ์ฃผ์ ๋๋๋งํฌ์ ๊ด์ ์ ์ค์๊ฐ์ผ๋ก ์ ํํ๊ฒ ์ถ์ ํ์ฌ ์ด๋ ํ๊ฐ๋ฅผ ํฅ์์ํต๋๋ค. ์ด ๊ธฐ์ ์ ์ด๋ ์์ธ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ณ , ์ด๋ ๋ฃจํด์ ์ถ์ ํ๋ฉฐ, ์ฑ๊ณผ ์งํ๋ฅผ ์ธก์ ํ์ฌ ์ฌ์ฉ์์ ํธ๋ ์ด๋ ๋ชจ๋๋ฅผ ์ํด ํ๋ จ ์ธ์ ์ ์ต์ ํํฉ๋๋ค.
Watch: Ultralytics YOLOv8 | ํธ์์
, ํ์
, ๋ณต๊ทผ ์ด๋์ ์ด์ฉํ ์ด๋ ๋ชจ๋ํฐ๋ง
์ด๋ ๋ชจ๋ํฐ๋ง์ ์ฅ์ ์?
- ์ต์ ํ๋ ํผํฌ๋จผ์ค: ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ํ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ๋ง์ถคํ ์ด๋.
- ๋ชฉํ ๋ฌ์ฑ: ์ธก์ ๊ฐ๋ฅํ ์งํ ์ํฉ์ ์ํด ํผํธ๋์ค ๋ชฉํ๋ฅผ ์ถ์ ํ๊ณ ์กฐ์ ํ์ธ์.
- ๊ฐ์ธํ: ๊ฐ์ธ๋ณ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ๋ง์ถคํ ์ด๋ ๊ณํ์ผ๋ก ์ด๋ ํจ๊ณผ๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
- ๊ฑด๊ฐ ์ธ์: ๊ฑด๊ฐ ๋ฌธ์ ๋๋ ๊ณผ๋ํ ํ๋ จ์ ๋ํ๋ด๋ ํจํด์ ์กฐ๊ธฐ์ ๊ฐ์งํฉ๋๋ค.
- ์ ๋ณด์ ๊ธฐ๋ฐํ ์์ฌ ๊ฒฐ์ : ๋ฃจํด์ ์กฐ์ ํ๊ณ ํ์ค์ ์ธ ๋ชฉํ๋ฅผ ์ค์ ํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ ๊ฒฐ์ .
์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ ๋ชจ๋ํฐ๋ง | ์ด๋ ๋ชจ๋ํฐ๋ง |
---|---|
ํธ์์ ์นด์ดํ | ํ์ ์นด์ดํ |
์ด๋ ๋ชจ๋ํฐ๋ง ์์
import cv2
from ultralytics import YOLO, solutions
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 = solutions.AIGym(
line_thickness=2,
view_img=True,
pose_type="pushup",
kpts_to_check=[6, 8, 10],
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
results = model.track(im0, verbose=False) # Tracking recommended
# results = model.predict(im0) # Prediction also supported
im0 = gym_object.start_counting(im0, results)
cv2.destroyAllWindows()
import cv2
from ultralytics import YOLO, solutions
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 = solutions.AIGym(
line_thickness=2,
view_img=True,
pose_type="pushup",
kpts_to_check=[6, 8, 10],
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
results = model.track(im0, verbose=False) # Tracking recommended
# results = model.predict(im0) # Prediction also supported
im0 = gym_object.start_counting(im0, results)
video_writer.write(im0)
cv2.destroyAllWindows()
video_writer.release()
์ง์
"ํธ์์ ", "ํ์ " ๋ฐ "๋ณต๊ทผ ์ด๋" ์ง์
ํคํฌ์ธํธ ๋งต
์ธ์ AIGym
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
kpts_to_check |
list |
None |
ํน์ ์ด๋์ ๊ณ์ฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ํคํฌ์ธํธ ์ธ๋ฑ์ค ๋ชฉ๋ก๊ณผ ํคํฌ์ธํธ ์ง๋ |
line_thickness |
int |
2 |
๊ทธ๋ ค์ง ์ ์ ๋๊ป์ ๋๋ค. |
view_img |
bool |
False |
ํ๋๊ทธ๋ฅผ ํด๋ฆญํ์ฌ ์ด๋ฏธ์ง๋ฅผ ํ์ํฉ๋๋ค. |
pose_up_angle |
float |
145.0 |
'์๋ก' ํฌ์ฆ์ ๋ํ ๊ฐ๋ ์๊ณ๊ฐ์ ๋๋ค. |
pose_down_angle |
float |
90.0 |
'์๋' ํฌ์ฆ์ ๋ํ ๊ฐ๋ ์๊ณ๊ฐ์ ๋๋ค. |
pose_type |
str |
pullup |
๊ฐ์งํ ํฌ์ฆ ์ ํ('pullup ', pushup , abworkout , squat ). |
์ธ์ model.predict
์ธ์ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
source |
str |
'ultralytics/assets' |
์ถ๋ก ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ฏธ์ง ๊ฒฝ๋ก, ๋์์ ํ์ผ, ๋๋ ํ ๋ฆฌ, URL ๋๋ ์ค์๊ฐ ํผ๋์ฉ ๋๋ฐ์ด์ค ID๊ฐ ๋ ์ ์์ต๋๋ค. ๋ค์ํ ํ์๊ณผ ์์ค๋ฅผ ์ง์ํ๋ฏ๋ก ๋ค์ํ ์ ํ์ ์ ๋ ฅ์ ์ ์ฐํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค. |
conf |
float |
0.25 |
ํ์ง์ ๋ํ ์ต์ ์ ๋ขฐ๋ ์๊ณ๊ฐ์ ์ค์ ํฉ๋๋ค. ์ด ์๊ณ๊ฐ๋ณด๋ค ๋ฎ์ ์ ๋ขฐ๋๋ก ํ์ง๋ ๊ฐ์ฒด๋ ๋ฌด์๋ฉ๋๋ค. ์ด ๊ฐ์ ์กฐ์ ํ๋ฉด ์คํ์ง๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. |
iou |
float |
0.7 |
๋น์ต๋ ์ต์ (NMS)์ ๋ํ ๊ต์ฐจ์ ์ด๊ณผ(IoU) ์๊ณ๊ฐ์ ๋๋ค. ๊ฐ์ด ๋ฎ์์๋ก ์ค๋ณต๋๋ ์์๋ฅผ ์ ๊ฑฐํ์ฌ ํ์ง ํ์๊ฐ ์ค์ด๋ค์ด ์ค๋ณต์ ์ค์ด๋ ๋ฐ ์ ์ฉํฉ๋๋ค. |
imgsz |
int or tuple |
640 |
์ถ๋ก ํ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. ๋จ์ผ ์ ์์ผ ์ ์์ต๋๋ค. 640 ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ๊ฐํ ํฌ๊ธฐ ์กฐ์ ๋๋ (๋์ด, ๋๋น) ํํ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ ํ ํฌ๊ธฐ ์กฐ์ ์ ๊ฐ์ง ์ ํ๋์ ์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค. |
half |
bool |
False |
์ ํ๋์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๋ฉด์ ์ง์๋๋ GPU์์ ๋ชจ๋ธ ์ถ๋ก ์๋๋ฅผ ๋์ผ ์ ์๋ ๋ฐ์ ํ๋(FP16) ์ถ๋ก ์ ํ์ฑํํฉ๋๋ค. |
device |
str |
None |
์ถ๋ก ํ ์ฅ์น๋ฅผ ์ง์ ํฉ๋๋ค(์, cpu , cuda:0 ๋๋ 0 ). ์ฌ์ฉ์๊ฐ ๋ชจ๋ธ ์คํ์ ์ํด CPU, ํน์ GPU, ๋๋ ๊ธฐํ ์ปดํจํ
์ฅ์น ์ค์์ ์ ํํ ์ ์์ต๋๋ค. |
max_det |
int |
300 |
์ด๋ฏธ์ง๋น ํ์ฉ๋๋ ์ต๋ ๊ฐ์ง ํ์. ๋ชจ๋ธ์ด ํ ๋ฒ์ ์ถ๋ก ์์ ๊ฐ์งํ ์ ์๋ ์ด ์ค๋ธ์ ํธ ์๋ฅผ ์ ํํ์ฌ ๋ฐ์ง๋ ์ฅ๋ฉด์์ ๊ณผ๋ํ ์ถ๋ ฅ์ ๋ฐฉ์งํฉ๋๋ค. |
vid_stride |
int |
1 |
๋น๋์ค ์ ๋ ฅ์ ํ๋ ์ ๋ณดํญ. ๋์์์์ ํ๋ ์์ ๊ฑด๋๋ฐ์ด ์๊ฐ ํด์๋๋ฅผ ํฌ์ํ๋ฉด์ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ๊ฐ์ด 1์ด๋ฉด ๋ชจ๋ ํ๋ ์์ ์ฒ๋ฆฌํ๊ณ , ๊ฐ์ด ํด์๋ก ํ๋ ์์ ๊ฑด๋๋๋๋ค. |
stream_buffer |
bool |
False |
๋น๋์ค ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ ๋ ๋ชจ๋ ํ๋ ์์ ๋ฒํผ๋งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค(True ), ๋๋ ๋ชจ๋ธ์ด ๊ฐ์ฅ ์ต๊ทผ ํ๋ ์์ ๋ฐํํด์ผ ํ๋์ง(False ). ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฉํฉ๋๋ค. |
visualize |
bool |
False |
์ถ๋ก ์ค์ ๋ชจ๋ธ ๊ธฐ๋ฅ์ ์๊ฐํ๋ฅผ ํ์ฑํํ์ฌ ๋ชจ๋ธ์ด '๋ณด๊ณ ์๋ ๊ฒ'์ ๋ํ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋๋ฒ๊น ๋ฐ ๋ชจ๋ธ ํด์์ ์ ์ฉํฉ๋๋ค. |
augment |
bool |
False |
์์ธก์ ์ํ ํ ์คํธ ์๊ฐ ์ฆ๊ฐ(TTA)์ ์ง์ํ์ฌ ์ถ๋ก ์๋๋ฅผ ํฌ์ํ๋๋ผ๋ ํ์ง ๊ฒฌ๊ณ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. |
agnostic_nms |
bool |
False |
์๋ก ๋ค๋ฅธ ํด๋์ค์ ๊ฒน์น๋ ์์๋ฅผ ๋ณํฉํ๋ ํด๋์ค ๋ฌด๊ด NMS(Non-Maximum Suppression)๋ฅผ ํ์ฑํํฉ๋๋ค. ํด๋์ค ์ค๋ณต์ด ์ผ๋ฐ์ ์ธ ๋ค์ค ํด๋์ค ํ์ง ์๋๋ฆฌ์ค์ ์ ์ฉํฉ๋๋ค. |
classes |
list[int] |
None |
ํด๋์ค ID ์งํฉ์ผ๋ก ์์ธก์ ํํฐ๋งํฉ๋๋ค. ์ง์ ๋ ํด๋์ค์ ์ํ๋ ํ์ง๋ง ๋ฐํ๋ฉ๋๋ค. ๋ค์ค ํด๋์ค ํ์ง ์์ ์์ ๊ด๋ จ ๊ฐ์ฒด์ ์ง์คํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. |
retina_masks |
bool |
False |
๋ชจ๋ธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ณ ํด์๋ ์ธ๋ถํ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ธ๋ถํ ์์ ์ ๋ง์คํฌ ํ์ง์ ํฅ์์์ผ ๋ ์ธ๋ฐํ ๋ํ ์ผ์ ์ ๊ณตํ ์ ์์ต๋๋ค. |
embed |
list[int] |
None |
ํน์ง ๋ฒกํฐ ๋๋ ์๋ฒ ๋ฉ์ ์ถ์ถํ ๋ ์ด์ด๋ฅผ ์ง์ ํฉ๋๋ค. ํด๋ฌ์คํฐ๋ง์ด๋ ์ ์ฌ๋ ๊ฒ์๊ณผ ๊ฐ์ ๋ค์ด์คํธ๋ฆผ ์์ ์ ์ ์ฉํฉ๋๋ค. |
์ธ์ model.track
์ธ์ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
source |
str |
None |
Specifies the source directory for images or videos. Supports file paths and URLs. |
persist |
bool |
False |
Enables persistent tracking of objects between frames, maintaining IDs across video sequences. |
tracker |
str |
botsort.yaml |
Specifies the tracking algorithm to use, e.g., bytetrack.yaml ๋๋ botsort.yaml . |
conf |
float |
0.3 |
Sets the confidence threshold for detections; lower values allow more objects to be tracked but may include false positives. |
iou |
float |
0.5 |
Sets the Intersection over Union (IoU) threshold for filtering overlapping detections. |
classes |
list |
None |
Filters results by class index. For example, classes=[0, 2, 3] only tracks the specified classes. |
verbose |
bool |
True |
Controls the display of tracking results, providing a visual output of tracked objects. |
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Ultralytics YOLOv8 ์ ์ฌ์ฉํ์ฌ ๋ด ์ด๋์ ์ด๋ป๊ฒ ๋ชจ๋ํฐ๋งํ๋์?
Ultralytics YOLOv8 ์ ์ฌ์ฉํ์ฌ ์ด๋์ ๋ชจ๋ํฐ๋งํ๋ ค๋ฉด ์์ธ ์ถ์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ ์ฒด์ ์ฃผ์ ๋๋๋งํฌ์ ๊ด์ ์ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ ์์ธ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ๋ฐ๊ณ , ๋ฐ๋ณต ํ์๋ฅผ ๊ณ์ฐํ๊ณ , ์ฑ๊ณผ ์งํ๋ฅผ ์ธก์ ํ ์ ์์ต๋๋ค. ํ๊ตฝํํด๊ธฐ, ํ์ ๋๋ ๋ณต๊ทผ ์ด๋์ ๋ํด ์ ๊ณต๋ ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ํ ์ ์์ต๋๋ค:
import cv2
from ultralytics import YOLO, solutions
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 = solutions.AIGym(
line_thickness=2,
view_img=True,
pose_type="pushup",
kpts_to_check=[6, 8, 10],
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
results = model.track(im0, verbose=False)
im0 = gym_object.start_counting(im0, results)
cv2.destroyAllWindows()
์ถ๊ฐ ์ฌ์ฉ์ ์ง์ ๋ฐ ์ค์ ์ ๋ํด์๋ ์ค๋ช ์์ AIGym ์น์ ์ ์ฐธ์กฐํ์ธ์.
์ด๋ ๋ชจ๋ํฐ๋ง์ Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์๋์?
์ด๋ ๋ชจ๋ํฐ๋ง์ Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ฉด ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ด ์์ต๋๋ค:
- ์ต์ ํ๋ ํผํฌ๋จผ์ค: ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋์ ๋ง์ถคํํ๋ฉด ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ๋ชฉํ ๋ฌ์ฑ: ์ธก์ ๊ฐ๋ฅํ ์งํ ์ํฉ์ ์ํด ํผํธ๋์ค ๋ชฉํ๋ฅผ ์ฝ๊ฒ ์ถ์ ํ๊ณ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ๊ฐ์ธํ: ์ต์ ์ ํจ๊ณผ๋ฅผ ์ํด ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ถคํ ์ด๋ ๊ณํ์ ์ธ์ฐ์ธ์.
- ๊ฑด๊ฐ ์ธ์: ์ ์ฌ์ ์ธ ๊ฑด๊ฐ ๋ฌธ์ ๋๋ ๊ณผ๋ํ ํ๋ จ์ ๋ํ๋ด๋ ํจํด์ ์กฐ๊ธฐ์ ๊ฐ์งํฉ๋๋ค.
- ์ ๋ณด์ ๊ธฐ๋ฐํ ์์ฌ ๊ฒฐ์ : ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ์์ฌ ๊ฒฐ์ ์ผ๋ก ๋ฃจํด์ ์กฐ์ ํ๊ณ ํ์ค์ ์ธ ๋ชฉํ๋ฅผ ์ค์ ํ์ธ์.
YouTube ๋์์ ๋ฐ๋ชจ๋ฅผ ํตํด ์ด๋ฌํ ์ด์ ์ด ์ค์ ๋ก ์๋ํ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ ๊ฐ์ง ๋ฐ ์ถ์ ์ ์์ด์ Ultralytics YOLOv8 ์ ์ผ๋ง๋ ์ ํํ๋์?
Ultralytics YOLOv8 ๋ ์ต์ฒจ๋จ ์์ธ ์ถ์ ๊ธฐ๋ฅ์ผ๋ก ์ด๋์ ๊ฐ์งํ๊ณ ์ถ์ ํ๋ ์ ํ๋๊ฐ ๋งค์ฐ ๋์ต๋๋ค. ์ ์ฒด์ ์ฃผ์ ๋๋๋งํฌ์ ๊ด์ ์ ์ ํํ๊ฒ ์ถ์ ํ์ฌ ์ด๋ ํํ์ ์ฑ๊ณผ ์งํ์ ๋ํ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ธ์ ์ฌ์ ํ์ต๋ ๊ฐ์ค์น์ ๊ฒฌ๊ณ ํ ์ํคํ ์ฒ๋ ๋์ ์ ๋ฐ๋์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ค์ ์ฌ๋ก๋ฅผ ๋ณด๋ ค๋ฉด ํธ์์ ๋ฐ ํ์ ์นด์ดํ ์ ๋ณด์ฌ์ฃผ๋ ๋ฌธ์์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์น์ ์ ํ์ธํ์ธ์.
์ฌ์ฉ์ ์ง์ ์ด๋ ๋ฃจํด์ Ultralytics YOLOv8 ์ ์ฌ์ฉํ ์ ์๋์?
์, Ultralytics YOLOv8 ์ฌ์ฉ์ ์ง์ ์ด๋ ๋ฃจํด์ ๋ง๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. The AIGym
ํด๋์ค๋ "ํธ์์
", "ํ์
", "์ ๋ธ์ํฌ์์" ๋ฑ ๋ค์ํ ํฌ์ฆ ์ ํ์ ์ง์ํฉ๋๋ค. ํคํฌ์ธํธ์ ๊ฐ๋๋ฅผ ์ง์ ํ์ฌ ํน์ ์ด๋์ ๊ฐ์งํ ์ ์์ต๋๋ค. ๋ค์์ ์ค์ ์์์
๋๋ค:
from ultralytics import solutions
gym_object = solutions.AIGym(
line_thickness=2,
view_img=True,
pose_type="squat",
kpts_to_check=[6, 8, 10],
)
์ธ์ ์ค์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ธ์ AIGym
์น์
์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ฌํ ์ ์ฐ์ฑ์ ํตํด ๋ค์ํ ์ด๋์ ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ๋ฃจํด์ ์ฌ์ฉ์ ์ง์ ํ ์ ์์ต๋๋ค.
Ultralytics YOLOv8 ์ ์ฌ์ฉํ์ฌ ์ด๋ ๋ชจ๋ํฐ๋ง ์ถ๋ ฅ์ ์ ์ฅํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
์ด๋ ๋ชจ๋ํฐ๋ง ์ถ๋ ฅ์ ์ ์ฅํ๋ ค๋ฉด ์ฒ๋ฆฌ๋ ํ๋ ์์ ์ ์ฅํ๋ ๋น๋์ค ์์ฑ๊ธฐ๋ฅผ ํฌํจํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๋ค์์ ์์์ ๋๋ค:
import cv2
from ultralytics import YOLO, solutions
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 = solutions.AIGym(
line_thickness=2,
view_img=True,
pose_type="pushup",
kpts_to_check=[6, 8, 10],
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
results = model.track(im0, verbose=False)
im0 = gym_object.start_counting(im0, results)
video_writer.write(im0)
cv2.destroyAllWindows()
video_writer.release()
์ด ์ค์ ์ ๋ชจ๋ํฐ๋ง๋ ๋์์์ ์ถ๋ ฅ ํ์ผ์ ๊ธฐ๋กํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ถ๋ ฅ ์ ์ฅ์ ํตํ ์ด๋ ๋ชจ๋ํฐ๋ง ์น์ ์ ์ฐธ์กฐํ์ธ์.