본문 바로가기

Data_Analysis_Track_33/Python

Python_Computer_vision_04(yolov8_pose)

Pose estimation

- model: yolov8?-pose

 

추론결과

  • - YOLO Pose는 사람의 주요 관절의 위치 keypoint 정보와 사람의 bounding box를 추론한다.
        - keypoints는 Results.keypoint 속성으로 조회한다.
        - bounding box 결과는 Results.boxes 속성으로 조회한다.
    - ultralytics.engine.results.Keypoints
        - Keypoint 추론 결과 타입 class.
        - https://docs.ultralytics.com/reference/engine/results/#ultralytics.engine.results.Keypoints
    - Keypoints 속성
        - xy: 각 keypoint 들의 좌표. (사람수, 17:keypoints, 2:좌표)
        - xyn: 각 keypoint 들의 normalize 된 좌표. (이미지 크기 대비 비율)
        - conf: 각 keypoint들의 confidence score. (batch, 17)

 

Keypoints

 

import

from ultralytics import YOLO
import cv2
import matplotlib.pyplot as plt

 

 

model 선언 및 사진추론 -> results 

model = YOLO("models/yolov8l-pose.pt")
results = model("03_test_image_pose/pose.jpg", save=True, save_txt=True)

 

 

결과 확인

cv2.imshow("frame",results[0].plot())
cv2.waitKey()
cv2.destroyAllWindows()

 

 

이미지 1장 추론 -> len: 1

len(results) # 이미지 1장 추론 -> len: 1

 

 

여러 이미지 추론

- 디렉토리의 모든 이미지들을 추론

# directory -> 디렉토리의 모든 이미지들을 추론
results2 = model("03_test_image_pose/", save=True)

 

 

이미지 n장 추론 -> len: n

len(results2)

 

 

keypoint 들 조회

result = results[0] # 첫번째 이미지 추론결과
boxes = result.boxes # bbox 정보 - bbox위치, 분류
keypoints = result.keypoints # keypoint 정보
type(boxes), type(keypoints)

 

 

keypoint의 결과

# keypoint의 결과
xy = keypoints.xy
print(type(xy), xy.shape) # [1:사람수, 17:keypoint들, 2:좌표(x,y)]
xy

 

 

xyn -> 이미지 대비 비율

keypoints.xyn # 이미지 대비 비율

 

 

각 keypoint의 확률

# 각 keypoint의 확률
conf = keypoints.conf
print(type(conf), conf.shape) # [1:사람수, 17:keypoint들]
conf

 

 

idx, keypoints, 좌표, 확률 출력

# keypoints 데이터 정보 출력
for idx, (coord, conf) in enumerate(zip(keypoints.xy[0], keypoints.conf[0])): # [0]: 첫번째 사람의 추론결과
    # x, y 좌표값을 나눠서 저장 -> Tensor->float(item())->int
    x_coord, y_coord = int(coord[0].item()), int(coord[1].item())
    conf = conf.item() * 100 # %로 변환
    # idx, keypoints, 좌표, 확률 출력
    print(f"{idx} - {idx2keypoints[idx]} - [{x_coord},{y_coord}] {conf:.3f}%")

 

 

두명 이상 detection

# 두명 이상 detection
results3 = model("03_test_image_pose/1.jpg")
len(results3)

 

 

result3 = results3[0]
keypoints3 = result3.keypoints
len(keypoints3), len(result3.boxes) # len(boxes|masks|keypoints) -> 찾은 object 개수

 

 

keypoints3.xy.shape # [2:사람수, 17, 2]

 

 

여러 object를 찾은 경우
- Keypoints, Masks, Boxes -> iterable -> for in 문에서 반복하면 한 object에 대한 결과를 조회.

for per_idx, keypoints in enumerate(keypoints3, start=1):
    # print(per_idx, type(keypoints))
    print(f"{per_idx}번째 사람 추론결과")
    for idx, (coord, conf) in enumerate(zip(keypoints.xy[0], keypoints.conf[0])): # [0]: 첫번째 사람의 추론결과
        # x, y 좌표값을 나눠서 저장 -> Tensor->float(item())->int
        x_coord, y_coord = int(coord[0].item()), int(coord[1].item())
        conf = conf.item() * 100 # %로 변환
        # idx, keypoints, 좌표, 확률 출력
        print(f"{idx} - {idx2keypoints[idx]} - [{x_coord},{y_coord}] {conf:.3f}%")

 

 

결과 확인

plt.imshow(result3.plot()[:,:,::-1])