DEV Community

ICEice333
ICEice333

Posted on

การตรวจจับจุดสำคัญบนร่างกายของมนุษย์ - Pose Landmark Detection

MediaPipe คืออะไร
MediaPipe คือโครงการโอเพนซอร์สที่พัฒนาโดย Google ซึ่งเน้นการนำเสนอเทคโนโลยีที่เกี่ยวข้องกับการประมวลผลวิดีโอและภาพในเวลาเรียลไทม์ โดย MediaPipe มุ่งเน้นการสร้างโมเดลและเครื่องมือที่ใช้งานง่ายสำหรับนักพัฒนาเพื่อพัฒนาแอปพลิเคชันที่สามารถทำงานกับวิดีโอและภาพในเวลาเป็นประโยชน์ได้หลากหลาย

cv2 หรือ Opencv คืออะไร
เป็นไลบรารีที่มีเนื้อหาที่สำคัญสำหรับการประมวลผลภาพและวิดีโอในภาษา Python ซึ่งเป็นโครงการโอเพนซอร์สที่พัฒนาขึ้นโดย Intel และในภายหลังถูกส่งมอบให้กับชุมชน Open Source


ขั้นตอนการทำ

1.ทำการดาว์โหลด MediaPipe

!pip install -q mediapipe
Enter fullscreen mode Exit fullscreen mode

2.ดาวน์โหลด off-the-shelf model bundle

off-the-shelf model bundle คือชุดโมเดลที่พร้อมใช้งานจาก MediaPipe เพื่อใช้ในการตรวจจับและวิเคราะห์ท่าทางของมนุษย์ ในขั้นตอนนี้เราใช้คำสั่ง wget เพื่อดาวน์โหลดไฟล์โมเดลจาก URL ที่กำหนดไว้

!wget -O pose_landmarker.task -q https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_heavy/float16/1/pose_landmarker_heavy.task
Enter fullscreen mode Exit fullscreen mode

3.Import Libary

from mediapipe import solutions
from mediapipe.framework.formats import landmark_pb2
import numpy as np
Enter fullscreen mode Exit fullscreen mode

4.ฟังก์ชันสำหรับสร้างจุด Landmark

ใช้สำหรับวาด landmark หรือจุดสำคัญบนภาพที่ตรวจจับได้ด้วย MediaPipe Pose Landmarker API บนภาพที่ให้มา

def draw_landmarks_on_image(rgb_image, detection_result):
  pose_landmarks_list = detection_result.pose_landmarks
  annotated_image = np.copy(rgb_image)

  # Loop through the detected poses to visualize.
  for idx in range(len(pose_landmarks_list)):
    pose_landmarks = pose_landmarks_list[idx]

    # Draw the pose landmarks.
    pose_landmarks_proto = landmark_pb2.NormalizedLandmarkList()
    pose_landmarks_proto.landmark.extend([
      landmark_pb2.NormalizedLandmark(x=landmark.x, y=landmark.y, z=landmark.z) for landmark in pose_landmarks
    ])
    solutions.drawing_utils.draw_landmarks(
      annotated_image,
      pose_landmarks_proto,
      solutions.pose.POSE_CONNECTIONS,
      solutions.drawing_styles.get_default_pose_landmarks_style())
  return annotated_image
Enter fullscreen mode Exit fullscreen mode

ฟังก์ชันจะวาด landmark หรือจุดสำคัญบนภาพโดยใช้ draw_landmarks ซึ่งเป็นเครื่องมือการวาด landmark ที่มีให้จาก MediaPipe โดยมีการระบุการเชื่อมต่อระหว่างจุดสำคัญเพื่อแสดงความสัมพันธ์ระหว่างพวกเขาด้วย

5.ฟังก์ชันสำหรับอัปโหลดไฟล์ภาพจากคอมพิวเตอร์เข้าสู่ Colab environment

from google.colab import files
uploaded = files.upload()

for filename in uploaded:
  content = uploaded[filename]
  with open(filename, 'wb') as f:
    f.write(content)

if len(uploaded.keys()):
  IMAGE_FILE = next(iter(uploaded))
  print('Uploaded file:', IMAGE_FILE)
Enter fullscreen mode Exit fullscreen mode

โค้ดนี้ช่วยให้ผู้ใช้สามารถอัปโหลดไฟล์เข้าสู่สภาพแวดล้อม Colab ได้อย่างสะดวกและรวดเร็วโดยไม่ต้องทำการอัปโหลดไปยังโฟลเดอร์เก็บข้อมูลใด ๆ ของเซิร์ฟเวอร์ที่ใช้ในการรันโค้ดด้วยตนเอง

6.import โมดูลและคลาสที่จำเป็น

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Enter fullscreen mode Exit fullscreen mode

7.ฟังก์ชันสพหรับการสร้างอ็อบเจ็กต์ของ PoseLandmarker

base_options = python.BaseOptions(model_asset_path='pose_landmarker.task')
options = vision.PoseLandmarkerOptions(
    base_options=base_options,
    output_segmentation_masks=True)
detector = vision.PoseLandmarker.create_from_options(options)
Enter fullscreen mode Exit fullscreen mode

กำหนด BaseOptions โดยระบุพาธของโมเดล 'pose_landmarker.task' ที่เรียกว่า model_asset_path

สร้าง PoseLandmarkerOptions โดยให้ base_options เป็น BaseOptions ที่เรากำหนดไว้ในขั้นตอนที่ 1 และกำหนด output_segmentation_masks เป็น True เพื่อเก็บข้อมูลการเซ็กเมนเทชัน

สร้าง PoseLandmarker โดยใช้ PoseLandmarkerOptions ที่สร้างขึ้นในขั้นตอนที่ 2

8.ดึงภาพที่เราเลือกไว้ก่อนหน้า

image = mp.Image.create_from_file(IMAGE_FILE)
Enter fullscreen mode Exit fullscreen mode

9.การตรวจจับ landmarks ในรูปภาพ

detection_result = detector.detect(image)
Enter fullscreen mode Exit fullscreen mode

10.การ Visualize detection result

annotated_image = draw_landmarks_on_image(image.numpy_view(), detection_result)
cv2_imshow(cv2.cvtColor(annotated_image, cv2.COLOR_RGB2BGR))
Enter fullscreen mode Exit fullscreen mode

เรียกใช้ฟังก์ชัน draw_landmarks_on_image() เพื่อวาด landmarks ลงบนภาพ โดยส่งภาพในรูปแบบ numpy array (image.numpy_view()) และผลลัพธ์จากการตรวจจับ landmarks (detection_result) เข้าไปเป็นพารามิเตอร์

นำภาพที่มี landmarks วาดอยู่แล้วมาแสดงผลโดยใช้ฟังก์ชัน cv2_imshow() โดยแปลงรูปแบบสีจาก RGB เป็น BGR ก่อนแสดงผล

11.การแบ่งส่วนของท่าทางด้วย Mask

เป็นการแบ่งส่วนของภาพออกเป็นส่วนที่เป็นท่าทางของร่างกายและส่วนอื่น ๆ ที่ไม่เป็นท่าทาง

segmentation_mask = detection_result.segmentation_masks[0].numpy_view()
visualized_mask = np.repeat(segmentation_mask[:, :, np.newaxis], 3, axis=2) * 255
cv2_imshow(visualized_mask)
Enter fullscreen mode Exit fullscreen mode

เริ่มต้นด้วยการเข้าถึงข้อมูลของการตรวจจับแบบเซ็กเมนเทชันของท่าทาง (pose segmentation mask) จาก detection_result ซึ่งเก็บข้อมูลการแบ่งสีของท่าทางในรูปแบบของ numpy array

จากนั้นทำการสร้าง visualized_mask โดยทำการสร้างภาพสีขาว-ดำของการตรวจจับแบบเซ็กเมนเทชัน โดยใช้ฟังก์ชัน np.repeat เพื่อเติมค่าสีของท่าทางไปยังทุกๆ ช่องสี (R, G, B) ของภาพ

สุดท้ายแสดงผล visualized_mask ซึ่งเป็นภาพของการตรวจจับแบบเซ็กเมนเทชัน ให้ผู้ใช้เห็นภาพรวมของการแบ่งสีที่บอกถึงส่วนที่เป็นท่าทางของร่างกายอย่างชัดเจน


ตัวอย่างการแสดงผล

Image description

Image description


ประโยชน์ของการตรวจจับจุดสำคัญบนร่างกายของมนุษย์

  • การวิเคราะห์ท่าทางและการเคลื่อนไหว: ช่วยในการวิเคราะห์และเข้าใจท่าทางและการเคลื่อนไหวของมนุษย์ในภาพหรือวิดีโอ เช่น การตรวจจับท่าทางในการฝึกการออกกำลังกายหรือการประชุมออนไลน์ เพื่อช่วยให้ผู้ใช้รับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานและปรับปรุงพฤติกรรมของตนเอง

  • เทคโนโลยีช่วยในการสร้างเกมและแอพพลิเคชัน: การตรวจจับ Pose Landmark สามารถนำมาใช้ในการสร้างเกมหรือแอพพลิเคชันที่ต้องการตอบสนองต่อการเคลื่อนไหวของผู้ใช้ เช่น เกมควบคุมด้วยการเคลื่อนไหวหรือแอพพลิเคชันการแสดงการเต้น


สรุปผล

การตรวจจับ Pose Landmark เป็นเทคโนโลยีที่มีประโยชน์มากในหลายด้าน เช่นในการวิเคราะห์ท่าทางและการเคลื่อนไหวของมนุษย์ เพื่อสนับสนุนในการฝึกหรือการปรับปรุงพฤติกรรม การสร้างเกมและแอพพลิเคชันที่ตอบสนองต่อการเคลื่อนไหวของผู้ใช้ การตรวจสอบความถูกต้องในการฝึกหรือทำงาน การควบคุมอุปกรณ์ การพัฒนาเทคโนโลยีการช่วยเหลือทางการแพทย์ และการวิจัยทางด้านทรัพยากรมนุษย์และโซเชียล


Reference

https://developers.google.com/mediapipe/solutions/examples

Top comments (0)