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 ซึ่งเป็นภาพของการตรวจจับแบบเซ็กเมนเทชัน ให้ผู้ใช้เห็นภาพรวมของการแบ่งสีที่บอกถึงส่วนที่เป็นท่าทางของร่างกายอย่างชัดเจน
ตัวอย่างการแสดงผล
ประโยชน์ของการตรวจจับจุดสำคัญบนร่างกายของมนุษย์
การวิเคราะห์ท่าทางและการเคลื่อนไหว: ช่วยในการวิเคราะห์และเข้าใจท่าทางและการเคลื่อนไหวของมนุษย์ในภาพหรือวิดีโอ เช่น การตรวจจับท่าทางในการฝึกการออกกำลังกายหรือการประชุมออนไลน์ เพื่อช่วยให้ผู้ใช้รับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานและปรับปรุงพฤติกรรมของตนเอง
เทคโนโลยีช่วยในการสร้างเกมและแอพพลิเคชัน: การตรวจจับ Pose Landmark สามารถนำมาใช้ในการสร้างเกมหรือแอพพลิเคชันที่ต้องการตอบสนองต่อการเคลื่อนไหวของผู้ใช้ เช่น เกมควบคุมด้วยการเคลื่อนไหวหรือแอพพลิเคชันการแสดงการเต้น
สรุปผล
การตรวจจับ Pose Landmark เป็นเทคโนโลยีที่มีประโยชน์มากในหลายด้าน เช่นในการวิเคราะห์ท่าทางและการเคลื่อนไหวของมนุษย์ เพื่อสนับสนุนในการฝึกหรือการปรับปรุงพฤติกรรม การสร้างเกมและแอพพลิเคชันที่ตอบสนองต่อการเคลื่อนไหวของผู้ใช้ การตรวจสอบความถูกต้องในการฝึกหรือทำงาน การควบคุมอุปกรณ์ การพัฒนาเทคโนโลยีการช่วยเหลือทางการแพทย์ และการวิจัยทางด้านทรัพยากรมนุษย์และโซเชียล
Top comments (0)