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)

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])'Data_Analysis_Track_33 > Python' 카테고리의 다른 글
| Python_Computer_vision_03(yolov8_segmentation) (0) | 2023.11.09 |
|---|---|
| Python_Computer_vision_02(yolov8_customdataset_train 실습) (0) | 2023.11.08 |
| Python_Computer_vision_01(yolov8_object_detection) (0) | 2023.11.08 |
| Python_Deeplearning_pytorch_12(DCGan_실습) (1) | 2023.11.03 |
| Python_Deeplearning_pytorch_11(LSTM을 활용한 주가예측) (1) | 2023.11.03 |