μ½˜ν…μΈ λ‘œ κ±΄λ„ˆλ›°κΈ°

λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μš΄λ™ λͺ¨λ‹ˆν„°λ§ 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()
지원

"ν‘Έμ‹œμ—…", "ν’€μ—…" 및 "볡근 μš΄λ™" 지원

ν‚€ν¬μΈνŠΈ 맡

ν‚€ν¬μΈνŠΈ μ£Όλ¬Έ Ultralytics YOLOv8  포즈

인수 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)

λŒ“κΈ€