งานเครื่องมือจุดสังเกตของ MediaPipe Pose ช่วยให้คุณตรวจหาจุดสังเกตต่างๆ ของร่างกายมนุษย์ในรูปภาพหรือ ในการสร้างสรรค์วิดีโอ คุณสามารถใช้งานนี้เพื่อระบุตำแหน่งของร่างกายที่สำคัญ วิเคราะห์ท่าทาง และจำแนกการเคลื่อนไหว งานนี้ใช้โมเดลแมชชีนเลิร์นนิง (ML) ที่ ทำงานร่วมกับรูปภาพหรือวิดีโอรายการเดียว งานจะแสดงเนื้อหาลักษณะจุดสังเกตในรูปภาพ และพิกัดโลก 3 มิติ
ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้มีอยู่ใน GitHub สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ โปรดดูภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่างงาน MediaPipe Tasks เป็นการใช้งานเครื่องมือจุดสังเกตของ Pose แบบง่ายๆ แอปสำหรับ Android ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ Android จริงเพื่อ ตรวจจับท่าทางในสตรีมวิดีโอแบบต่อเนื่อง แอปยังสามารถตรวจจับท่าทางใน รูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์
คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสำหรับแอป Android ของคุณเอง หรืออ้างอิงถึงแอปนั้น เมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างของเครื่องมือจุดสังเกตของท่าทางถูกโฮสต์บน GitHub
ดาวน์โหลดโค้ด
วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาตัวอย่างในเครื่อง โดยใช้เครื่องมือบรรทัดคำสั่ง git
วิธีดาวน์โหลดโค้ดตัวอย่าง
- โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/google-ai-edge/mediapipe-samples
- นอกจากนี้ คุณสามารถกำหนดค่าอินสแตนซ์ Git ให้ใช้การชำระเงินแบบกระจัดกระจายเพื่อให้คุณมี
เฉพาะไฟล์สำหรับแอปตัวอย่างเครื่องมือทำจุดสังเกตเท่านั้น ได้แก่
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/pose_landmarker/android
หลังจากสร้างโค้ดตัวอย่างในเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ได้ ลงใน Android Studio และเรียกใช้แอป โปรดดูวิธีการในคู่มือการตั้งค่าสำหรับ Android
องค์ประกอบสำคัญ
ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับตัวอย่างการสร้างจุดสังเกตนี้ แอปพลิเคชัน:
- PoseLandmarkerHelper.kt - เริ่มต้นเครื่องมือสร้างจุดสังเกตหลัก รวมถึงจัดการโมเดลและมอบสิทธิ์ มากมาย
- CameraFragment.kt - จัดการกล้องของอุปกรณ์และประมวลผลข้อมูลอินพุตรูปภาพและวิดีโอ
- GalleryFragment.kt - โต้ตอบกับ
OverlayView
เพื่อแสดงรูปภาพหรือวิดีโอเอาต์พุต - OverlayView.kt - ใช้จอแสดงผลสำหรับท่าทางที่ตรวจพบ
ตั้งค่า
ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ ของ Google โดยเฉพาะ เพื่อใช้ Poseจุดสังเกต สำหรับข้อมูลทั่วไปเกี่ยวกับ การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณสำหรับการใช้งาน MediaPipe ซึ่งรวมถึง ข้อกำหนดด้านเวอร์ชันของแพลตฟอร์ม โปรดดูคู่มือการตั้งค่าสำหรับ Android
การอ้างอิง
งานเครื่องมือทำจุดสังเกตใช้ไลบรารี com.google.mediapipe:tasks-vision
เพิ่ม
จะขึ้นอยู่กับไฟล์ build.gradle
ของแอป Android
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
รุ่น
งานเครื่องมือจุดสังเกตของ MediaPipe Pose ต้องการแพ็กเกจโมเดลที่ผ่านการฝึก ซึ่งสามารถทำงานร่วมกับ งานนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกและพร้อมใช้งานสำหรับเครื่องมือจุดสังเกตของท่าทาง ดูภาพรวมงานส่วนโมเดล
เลือกและดาวน์โหลดโมเดล และเก็บไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ:
<dev-project-root>/src/main/assets
ระบุเส้นทางของโมเดลภายในพารามิเตอร์ ModelAssetPath
ใน
โค้ดตัวอย่าง โมเดลจะกำหนดไว้ใน
PoseLandmarkerHelper.kt
ไฟล์:
val modelName = "pose_landmarker_lite.task"
baseOptionsBuilder.setModelAssetPath(modelName)
สร้างงาน
งานเครื่องมือจุดสังเกตของ MediaPipe Pose ใช้ฟังก์ชัน createFromOptions()
เพื่อตั้งค่า
งาน ฟังก์ชัน createFromOptions()
จะยอมรับค่าสำหรับการกำหนดค่า
ตัวเลือก โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกําหนดค่าได้ที่การกําหนดค่า
ตัวเลือกเพิ่มเติม
เครื่องมือจุดสังเกตของโพสสนับสนุนการป้อนข้อมูลประเภทต่างๆ ได้แก่ ภาพนิ่ง วิดีโอ ไฟล์ และสตรีมวิดีโอสด คุณต้องระบุโหมดการทำงาน ให้สอดคล้องกับประเภทข้อมูลที่คุณป้อนเมื่อสร้างงาน เลือกแท็บ สำหรับประเภทข้อมูลอินพุตเพื่อดูวิธีสร้างงาน
รูปภาพ
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = poseLandmarker.poseLandmarkerOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinPoseDetectionConfidence(minPoseDetectionConfidence) .setMinTrackingConfidence(minPoseTrackingConfidence) .setMinPosePresenceConfidence(minposePresenceConfidence) .setNumPoses(maxNumPoses) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() poseLandmarker = poseLandmarker.createFromOptions(context, options)
วิดีโอ
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = poseLandmarker.poseLandmarkerOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinPoseDetectionConfidence(minPoseDetectionConfidence) .setMinTrackingConfidence(minPoseTrackingConfidence) .setMinPosePresenceConfidence(minposePresenceConfidence) .setNumPoses(maxNumPoses) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() poseLandmarker = poseLandmarker.createFromOptions(context, options)
สตรีมแบบสด
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = poseLandmarker.poseLandmarkerOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinPoseDetectionConfidence(minPoseDetectionConfidence) .setMinTrackingConfidence(minPoseTrackingConfidence) .setMinPosePresenceConfidence(minposePresenceConfidence) .setNumPoses(maxNumPoses) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() poseLandmarker = poseLandmarker.createFromOptions(context, options)
การใช้โค้ดตัวอย่างเครื่องมือจุดสังเกตของโพสช่วยให้ผู้ใช้สลับระหว่าง
โหมดการประมวลผลข้อมูล วิธีนี้ทำให้โค้ดการสร้างงานซับซ้อนขึ้นและ
อาจไม่เหมาะกับกรณีการใช้งานของคุณ คุณดูรหัสนี้ได้ใน
setupPoseLandmarker()
ในฟังก์ชัน
PoseLandmarkerHelper.kt
ตัวเลือกการกำหนดค่า
งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android
ชื่อตัวเลือก | คำอธิบาย | ช่วงค่า | ค่าเริ่มต้น |
---|---|---|---|
runningMode |
ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ
โหมด: รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
numposes |
จำนวนท่าทางสูงสุดที่ตรวจพบโดย เครื่องมือแนะนำท่าโพส | Integer > 0 |
1 |
minPoseDetectionConfidence |
คะแนนความเชื่อมั่นขั้นต่ำสำหรับการตรวจจับท่าทาง ถือว่าประสบความสำเร็จ | Float [0.0,1.0] |
0.5 |
minPosePresenceConfidence |
คะแนนความเชื่อมั่นขั้นต่ำของการแสดงท่าทาง ในการตรวจหาจุดสังเกตของท่าทาง | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
คะแนนความเชื่อมั่นขั้นต่ำสำหรับการติดตามท่าทาง จะถือว่าประสบความสำเร็จ | Float [0.0,1.0] |
0.5 |
outputSegmentationMasks |
เครื่องมือจุดสังเกตของท่าทางจะแสดงมาสก์การแบ่งกลุ่มสำหรับที่ตรวจพบหรือไม่ โพสท่า | Boolean |
False |
resultListener |
ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์ของจุดสังเกต
แบบไม่พร้อมกันเมื่อเครื่องมือจุดสังเกตท่าทางอยู่ในโหมดสตรีมแบบสด
ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น |
ResultListener |
N/A |
errorListener |
ตั้งค่า Listener ข้อผิดพลาดที่ไม่บังคับ | ErrorListener |
N/A |
เตรียมข้อมูล
เครื่องมือแนะนำท่าโพสใช้ได้กับรูปภาพ ไฟล์วิดีโอ และสตรีมวิดีโอสด งาน จัดการการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการปรับขนาด การหมุน และค่า การแปลงเป็นรูปแบบมาตรฐาน
โค้ดต่อไปนี้แสดงวิธีส่งต่อข้อมูลสำหรับการประมวลผล เหล่านี้ ตัวอย่างจะให้รายละเอียดเกี่ยวกับวิธีจัดการข้อมูลจากรูปภาพ ไฟล์วิดีโอ และการเผยแพร่ สตรีมวิดีโอ
รูปภาพ
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
วิดีโอ
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
สตรีมแบบสด
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
ในโค้ดตัวอย่างของเครื่องมือจุดสังเกตของ Pose การจัดเตรียมข้อมูลจะดำเนินการใน
PoseLandmarkerHelper.kt
เรียกใช้งาน
ใช้เมธอด
poseLandmarker.detect...()
ที่เฉพาะเจาะจงสำหรับประเภทข้อมูลดังกล่าว ใช้
detect()
สำหรับรูปภาพแต่ละภาพ detectForVideo()
สำหรับเฟรมในไฟล์วิดีโอ
และ detectAsync()
สำหรับสตรีมวิดีโอ เมื่อคุณดำเนินการตรวจหาใน
สตรีมวิดีโอ โปรดตรวจสอบว่าคุณได้เรียกใช้การตรวจจับในชุดข้อความแยกต่างหากเพื่อหลีกเลี่ยงการตรวจพบ
บล็อกชุดข้อความที่ผู้ใช้แทรกเข้ามา
ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างง่ายๆ ของวิธีเรียกใช้เครื่องมือจุดสังเกตสำหรับท่าทาง ในโหมดข้อมูลที่แตกต่างกันเหล่านี้
รูปภาพ
val result = poseLandmarker.detect(mpImage)
วิดีโอ
val timestampMs = i * inferenceIntervalMs poseLandmarker.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
สตรีมแบบสด
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() poseLandmarker.detectAsync(mpImage, frameTime)
โปรดทราบดังต่อไปนี้
- เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุ การประทับเวลาของเฟรมอินพุตให้เป็นตำแหน่งเครื่องมือจุดสังเกต
- เมื่อเรียกใช้ในโหมดรูปภาพหรือวิดีโอ งานเครื่องมือจุดสังเกตสำหรับท่าทางจะบล็อก ชุดข้อความปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จสิ้น ถึง หลีกเลี่ยงการบล็อกการโต้ตอบของผู้ใช้, ดำเนินการประมวลผลในเบื้องหลัง ชุดข้อความ
- เมื่อทำงานในโหมดสตรีมแบบสด งานเครื่องมือบุ๊กมาร์กท่าโพสจะแสดงขึ้น ทันทีและไม่บล็อกชุดข้อความปัจจุบัน ซึ่งจะเรียกใช้ผลลัพธ์ Listener ของคุณพร้อมผลการตรวจหาทุกครั้งที่เสร็จสิ้นการประมวลผล เฟรมอินพุต
ในโค้ดตัวอย่างของเครื่องมือจุดสังเกตสำหรับท่าทาง detect
, detectForVideo
และ
มีการกำหนดฟังก์ชัน detectAsync
ในฟังก์ชัน
PoseLandmarkerHelper.kt
จัดการและแสดงผลลัพธ์
เครื่องมือจุดสังเกตของตำแหน่งจะแสดงออบเจ็กต์ poseLandmarkerResult
สำหรับการตรวจจับแต่ละรายการ
วิ่งได้ ออบเจ็กต์ผลลัพธ์มีพิกัดสำหรับจุดสังเกตของท่าทางแต่ละตำแหน่ง
ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้
PoseLandmarkerResult:
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : 0.129959
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
visibility : 0.999909
presence : 0.999958
... (33 landmarks per pose)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
visibility : 0.999976
presence : 0.999998
... (33 world landmarks per pose)
SegmentationMasks:
... (pictured below)
เอาต์พุตมีทั้งพิกัดมาตรฐาน (Landmarks
) และพิกัดโลก
พิกัด (WorldLandmarks
) สำหรับแต่ละจุดสังเกต
เอาต์พุตมีพิกัดมาตรฐานต่อไปนี้ (Landmarks
):
x
และy
: พิกัดแลนด์มาร์กที่ปรับให้เป็นมาตรฐานระหว่าง 0.0 ถึง 1.0 ตามค่า ความกว้าง (x
) และความสูงของรูปภาพ (y
)z
: ความลึกที่สำคัญ โดยมีความลึกที่กึ่งกลางของสะโพกเท่ากับ ยิ่งค่าน้อย จุดสังเกตก็ยิ่งอยู่ใกล้กล้อง ขนาด z ใช้สเกลใกล้เคียงกับx
visibility
: แนวโน้มที่จุดสังเกตจะปรากฏในรูปภาพ
เอาต์พุตจะมีพิกัดโลกดังต่อไปนี้ (WorldLandmarks
)
x
,y
และz
: พิกัด 3 มิติในโลกจริง หน่วยเป็นเมตร จุดกึ่งกลางของสะโพกเป็นจุดกำเนิดvisibility
: แนวโน้มที่จุดสังเกตจะปรากฏในรูปภาพ
รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน
มาสก์การแบ่งกลุ่มตัวเลือกจะแสดงแนวโน้มของพิกเซลแต่ละพิกเซลที่อยู่ใน แก่บุคคลที่ตรวจจับได้ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของ เอาต์พุตของงาน:
โค้ดตัวอย่างเครื่องมือจุดสังเกตของโพสแสดงวิธีการแสดงผลผลลัพธ์
จากงาน ให้ดู
OverlayView
เพื่อดูรายละเอียดเพิ่มเติม