λ€μμ μ¬μ©νμ¬ μ΄λ λͺ¨λν°λ§ 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' |
μ΄λ―Έμ§ λλ λΉλμ€μ μμ€ λλ ν 리 |
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 device=0/1/2/3 λλ device=.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 |
κ°μ²΄ μΆμ κ²°κ³Ό νμ |
μμ£Ό 묻λ μ§λ¬Έ
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()
μ΄ μ€μ μ λͺ¨λν°λ§λ λμμμ μΆλ ₯ νμΌμ κΈ°λ‘ν©λλ€. μμΈν λ΄μ©μ μΆλ ₯ μ μ₯μ ν΅ν μ΄λ λͺ¨λν°λ§ μΉμ μ μ°Έμ‘°νμΈμ.
2023-12-02 μμ±, 2024-07-05 μ λ°μ΄νΈλ¨
μμ±μ: glenn-jocher (12), ambitious-octopus (1), IvorZhu331 (1), RizwanMunawar (4)