<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ICEice333</title>
    <description>The latest articles on DEV Community by ICEice333 (@iceice333).</description>
    <link>https://dev.to/iceice333</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1418682%2F2a24f790-7334-4225-86f1-9bbcf32cb925.png</url>
      <title>DEV Community: ICEice333</title>
      <link>https://dev.to/iceice333</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iceice333"/>
    <language>en</language>
    <item>
      <title>การตรวจจับจุดสำคัญบนร่างกายของมนุษย์ - Pose Landmark Detection</title>
      <dc:creator>ICEice333</dc:creator>
      <pubDate>Thu, 11 Apr 2024 11:05:56 +0000</pubDate>
      <link>https://dev.to/iceice333/kaartrwcchcchabcchudsamkhaybnraangkaaykhngmnusy-pose-landmark-detection-14kj</link>
      <guid>https://dev.to/iceice333/kaartrwcchcchabcchudsamkhaybnraangkaaykhngmnusy-pose-landmark-detection-14kj</guid>
      <description>&lt;p&gt;&lt;strong&gt;MediaPipe คืออะไร&lt;/strong&gt;&lt;br&gt;
   MediaPipe คือโครงการโอเพนซอร์สที่พัฒนาโดย Google ซึ่งเน้นการนำเสนอเทคโนโลยีที่เกี่ยวข้องกับการประมวลผลวิดีโอและภาพในเวลาเรียลไทม์ โดย MediaPipe มุ่งเน้นการสร้างโมเดลและเครื่องมือที่ใช้งานง่ายสำหรับนักพัฒนาเพื่อพัฒนาแอปพลิเคชันที่สามารถทำงานกับวิดีโอและภาพในเวลาเป็นประโยชน์ได้หลากหลาย&lt;/p&gt;

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



&lt;p&gt;&lt;strong&gt;ขั้นตอนการทำ&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;1.ทำการดาว์โหลด MediaPipe&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!pip install -q mediapipe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2.ดาวน์โหลด off-the-shelf model bundle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!wget -O pose_landmarker.task -q https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_heavy/float16/1/pose_landmarker_heavy.task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;3.Import Libary&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from mediapipe import solutions
from mediapipe.framework.formats import landmark_pb2
import numpy as np
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;4.ฟังก์ชันสำหรับสร้างจุด Landmark&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;6.import โมดูลและคลาสที่จำเป็น&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;7.ฟังก์ชันสพหรับการสร้างอ็อบเจ็กต์ของ PoseLandmarker&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;p&gt;สร้าง PoseLandmarker โดยใช้ PoseLandmarkerOptions ที่สร้างขึ้นในขั้นตอนที่ 2&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;8.ดึงภาพที่เราเลือกไว้ก่อนหน้า&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image = mp.Image.create_from_file(IMAGE_FILE)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;9.การตรวจจับ landmarks ในรูปภาพ&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detection_result = detector.detect(image)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;10.การ Visualize detection result&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;annotated_image = draw_landmarks_on_image(image.numpy_view(), detection_result)
cv2_imshow(cv2.cvtColor(annotated_image, cv2.COLOR_RGB2BGR))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;11.การแบ่งส่วนของท่าทางด้วย Mask&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;เป็นการแบ่งส่วนของภาพออกเป็นส่วนที่เป็นท่าทางของร่างกายและส่วนอื่น ๆ ที่ไม่เป็นท่าทาง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

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




&lt;p&gt;&lt;strong&gt;ตัวอย่างการแสดงผล&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12i6q0t576q560d5q0cj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12i6q0t576q560d5q0cj.png" alt="Image description" width="407" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76ahjmurozdn6kkuog2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76ahjmurozdn6kkuog2e.png" alt="Image description" width="398" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;ประโยชน์ของการตรวจจับจุดสำคัญบนร่างกายของมนุษย์&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;การวิเคราะห์ท่าทางและการเคลื่อนไหว: ช่วยในการวิเคราะห์และเข้าใจท่าทางและการเคลื่อนไหวของมนุษย์ในภาพหรือวิดีโอ เช่น การตรวจจับท่าทางในการฝึกการออกกำลังกายหรือการประชุมออนไลน์ เพื่อช่วยให้ผู้ใช้รับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานและปรับปรุงพฤติกรรมของตนเอง&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;เทคโนโลยีช่วยในการสร้างเกมและแอพพลิเคชัน: การตรวจจับ Pose Landmark สามารถนำมาใช้ในการสร้างเกมหรือแอพพลิเคชันที่ต้องการตอบสนองต่อการเคลื่อนไหวของผู้ใช้ เช่น เกมควบคุมด้วยการเคลื่อนไหวหรือแอพพลิเคชันการแสดงการเต้น&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;สรุปผล&lt;/strong&gt;
&lt;/h2&gt;

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




&lt;h2&gt;
  
  
  &lt;strong&gt;Reference&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/mediapipe/solutions/examples"&gt;https://developers.google.com/mediapipe/solutions/examples&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
