การตรวจจับจุดสำคัญบนร่างกายของมนุษย์ - Pose Landmark Detection
Tags: python, ai
Published: 2024-04-11 11:05:56


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

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

---

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

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

```
!pip install -q mediapipe
```

> **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
```
> **3.Import Libary**

```
from mediapipe import solutions
from mediapipe.framework.formats import landmark_pb2
import numpy as np
```
> **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
```
ฟังก์ชันจะวาด 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)
```
โค้ดนี้ช่วยให้ผู้ใช้สามารถอัปโหลดไฟล์เข้าสู่สภาพแวดล้อม Colab ได้อย่างสะดวกและรวดเร็วโดยไม่ต้องทำการอัปโหลดไปยังโฟลเดอร์เก็บข้อมูลใด ๆ ของเซิร์ฟเวอร์ที่ใช้ในการรันโค้ดด้วยตนเอง

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

```
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
```

> **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)
```
กำหนด 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)
```
> **9.การตรวจจับ landmarks ในรูปภาพ**

```
detection_result = detector.detect(image)
```

> **10.การ Visualize detection result**

```
annotated_image = draw_landmarks_on_image(image.numpy_view(), detection_result)
cv2_imshow(cv2.cvtColor(annotated_image, cv2.COLOR_RGB2BGR))
```
เรียกใช้ฟังก์ชัน 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)
```
เริ่มต้นด้วยการเข้าถึงข้อมูลของการตรวจจับแบบเซ็กเมนเทชันของท่าทาง (pose segmentation mask) จาก detection_result ซึ่งเก็บข้อมูลการแบ่งสีของท่าทางในรูปแบบของ numpy array

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

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

---

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12i6q0t576q560d5q0cj.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/76ahjmurozdn6kkuog2e.png)

---

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

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

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

---

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

---

## **Reference**
https://developers.google.com/mediapipe/solutions/examples