Pose Detection เป็นเทคโนโลยีคอมพิวเตอร์วิทัศน์ที่กำหนดตำแหน่งของร่างกายมนุษย์โดยใช้จุดสำคัญ (landmarks): ศีรษะ, ไหล่, ข้อศอก, ข้อมือ, สะโพก, หัวเข่า, ข้อเท้า แต่ละจุดมีพิกัด (x, y) ในพื้นที่ 2D และโมเดลขั้นสูง (MediaPipe BlazePose 3D) เพิ่มพิกัด z สำหรับความลึก ในแอปพลิเคชันมือถือ Pose Detection ถูกใช้ในตัวติดตามฟิตเนส, แอปโยคะ, ฟิลเตอร์ AR, โปรแกรมฟื้นฟูสมรรถภาพ และระบบวิเคราะห์กีฬา ตามข้อมูลจาก Google ML Kit, 2025, Pose Detection บนอุปกรณ์ประมวลผลได้ถึง 30 เฟรมต่อวินาทีด้วยความแม่นยำ 94% PCK
ประเด็นสำคัญ
Pose Detection (หรือ Pose Estimation) หมายถึงงานในการกำหนดจุดสำคัญเชิงความหมายของร่างกายมนุษย์จากภาพหรือวิดีโอ วิธีการ Top-down ตรวจจับบุคคลก่อน (Object Detection) จากนั้นกำหนดท่าทาง วิธีการ Bottom-up ค้นหา landmarks ทั้งหมดในภาพ จากนั้นจัดกลุ่มตามบุคคล (OpenPose) สำหรับอุปกรณ์มือถือ ใช้ bottom-up — เร็วกว่าเมื่อมีหลายคนในเฟรม ML Kit และ BlazePose ใช้วิธีการแบบขั้นตอนเดียว — การตรวจจับ + ท่าทางในครั้งเดียว
COCO Keypoints — ชุดมาตรฐานของ 17 จุด: จมูก, ตา (2), หู (2), ไหล่ (2), ข้อศอก (2), ข้อมือ (2), สะโพก (2), หัวเข่า (2), ข้อเท้า (2) MediaPipe BlazePose ใช้ 33 จุด เพิ่ม: นิ้วเท้า, ส้นเท้า, ศูนย์กลางลำตัว, จุดบนใบหน้า ยิ่งมีจุดมาก การวิเคราะห์ท่าทางยิ่งแม่นยำ แต่ภาระการคำนวณยิ่งสูง สำหรับแอปฟิตเนส 17–20 จุดก็เพียงพอ สำหรับการวิเคราะห์เต็มรูปแบบ (โยคะ, เต้นรำ) — 33 จุด สำหรับฟิลเตอร์ AR — 33 จุด + 468 จุดบนใบหน้า (MediaPipe Face Mesh)
PCK (Percentage of Correct Keypoints) — เมทริกความแม่นยำของ Pose Detection คำนวณสัดส่วนของจุดที่ทำนายภายในระยะห่างจาก ground truth (ปกติ 0.05–0.15 ของขนาดกล่องขอบเขตของบุคคล) ML Kit Pose Detection: 94% PCK@0.1 BlazePose Full: 96% PCK@0.1 MoveNet Lightning: 91% PCK@0.1 OKS (Object Keypoint Similarity) — เมทริกที่ใช้ใน COCO ซึ่งคำนึงถึงขนาดของบุคคลและความยากของจุด mAP@OKS — เมทริกมาตรฐานสำหรับเกณฑ์วัด
| โมเดล | จุดอ้างอิง | PCK@0.1 | เวลาแฝง (GPU) | ขนาด |
|---|---|---|---|---|
| ML Kit Pose Acc | 33 | 94% | 15–30 ms | 14 MB |
| BlazePose Full | 33 + 3D | 96% | 10–20 ms | 12 MB |
| BlazePose Lite | 33 | 91% | 5–10 ms | 5 MB |
| MoveNet Lightning | 17 | 91% | 8–15 ms | 8 MB |
| MoveNet Thunder | 17 | 95% | 25–40 ms | 13 MB |
การมองเห็นจุดสำคัญ: แต่ละ landmark มีคะแนน (0..1) ที่บ่งชี้ว่าโมเดลมั่นใจในจุดนั้นเพียงใดและมองเห็นได้หรือไม่ จุดที่มีคะแนน < 0.5 ถือว่ามองไม่เห็น (ถูกบดบัง, อยู่นอกเฟรม) สำหรับการวิเคราะห์ท่าทาง ให้ใช้เฉพาะจุดที่มองเห็นเท่านั้น สำหรับการประเมินการจัดแนว — คำนวณระยะทางที่ถ่วงน้ำหนักด้วยความเชื่อมั่น โดยจุดที่มีคะแนนต่ำจะมีน้ำหนักน้อยกว่าในเมทริก
ML Kit Pose Detection — ไลบรารีจาก Google สำหรับการตรวจจับท่าทางบนอุปกรณ์ รองรับ 33 จุดอ้างอิง รวมถึงจุดบนใบหน้า, นิ้วเท้าและส้นเท้า โหมด: Accurate Mode (โมเดล 14 MB, 15–30 ms, ความแม่นยำสูง) และ Streaming Mode (5 MB, 5–10 ms, สำหรับเวลาจริง) Streaming Mode ใช้โมเดลน้ำหนักเบาพร้อมการติดตาม — หลังจากเฟรมแรก จะติดตามการเคลื่อนไหวโดยไม่ตรวจจับตำแหน่งที่แน่นอนซ้ำ ทำให้ได้สูงสุด 60 FPS
API ของ ML Kit Pose Detection: PoseDetector (ตัวเลือก: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>) แต่ละ PoseLandmark มี: landmarkType (38 ชนิด), position (PointF3D), inFrameLikelihood (0..1) Pose ยังให้: boundingBox ของบุคคล, รายการ landmarks, เมธอด getLandmark(type) สำหรับการจำแนกท่าทาง ให้ใช้มุมระหว่างกระดูก: shoulderAngle, elbowAngle, hipAngle — คำนวณผ่าน Vector3D ระหว่าง landmarks ที่อยู่ติดกัน
val options = PoseDetectorOptions.Builder()
.setDetectorMode(PoseDetectorOptions.STREAM_MODE)
.setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
.build()
val detector = PoseDetection.getClient(options)
detector.process(inputImage)
.addOnSuccessListener { pose ->
val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
val elbowAngle = calculateAngle(
leftShoulder.position, leftElbow.position, leftWrist.position
)
}
ML Kit บน iOS: Pose Detection พร้อมใช้งานผ่าน ML Kit CocoaPods API เหมือนกับ Android: PoseDetector → UIImage → Pose → PoseLandmark บน iOS ML Kit ใช้ Core ML และ ANE (A12+) ทำให้มีความหน่วง 10–20 ms ในโหมด Accurate Mode บน iPhone 15 Pro Streaming Mode — 3–8 ms, สูงสุด 120 FPS บน iOS ML Kit Pose Detection เร็วกว่า MediaPipe BlazePose (การเร่ง Core ML) แต่ด้อยกว่า BlazePose ในด้าน FPS บนอุปกรณ์รุ่นเก่า (iPhone X–11)
MediaPipe BlazePose — โมเดลประสิทธิภาพสูงสำหรับ Pose Detection จาก Google Research ใช้สถาปัตยกรรมแบบไฮบริด: ท่อส่ง detector-decoder บนพื้นฐาน MobileNetV2 + Feature Pyramid Network BlazePose Full: 33 จุดอ้างอิง + พิกัด 3D (ความลึก z) BlazePose Lite: 33 จุดอ้างอิง (2D) ไม่มีความลึก ทั้งสองโมเดลพร้อมใช้งานใน MediaPipe Tasks Vision บน Android, iOS, Python และ Web BlazePose Full ประมวลผล 30–60 FPS บน GPU, Lite — 60+ FPS
การประมาณท่าทาง 3D ด้วย BlazePose: โมเดลทำนายพิกัด z สำหรับแต่ละ landmark ทำให้สามารถประมาณความลึก (การเข้าใกล้/ถอยห่างของแขนขา) โดยไม่ต้องใช้กล้องสเตอริโอ พิกัด z คำนวณในพื้นที่เมตริก (เมตร) สัมพันธ์กับกล้อง ความแม่นยำของ BlazePose 3D: 37 มม. MPJPE (Mean Per Joint Position Error) บนเกณฑ์วัดสาธารณะ — เพียงพอสำหรับฟิตเนสและ AR ไม่เพียงพอสำหรับการวินิจฉัยทางการแพทย์ สำหรับ ARKit/ARFoundation BlazePose 3D ให้ความลึกที่เป็นธรรมชาติ
// MediaPipe Pose Detection Tasks Vision
val options = PoseLandmarkerOptions.Builder()
.setBaseOptions(BaseOptions.builder()
.setModelAssetPath("pose_landmarker_full.task")
.build())
.setDelegate(Delegate.GPU)
.build()
val landmaker = PoseLandmarker.createFromOptions(context, options)
val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
pose.forEach { landmark ->
drawLandmark(landmark.x, landmark.y, landmark.z)
}
}
BlazePose เทียบกับ ML Kit Pose Detection: BlazePose เร็วกว่า (60+ FPS เทียบกับ 30 FPS), รองรับพิกัด 3D, ทำงานข้ามแพลตฟอร์มผ่าน MediaPipe ML Kit บูรณาการง่ายกว่า (ไม่ต้องใช้ MediaPipe SDK), รวมโมเดลที่ผ่านการฝึกล่วงหน้าด้วยความแม่นยำสูง สำหรับโปรเจกต์ iOS ดั้งเดิม — ML Kit Pose Detection (การปรับแต่ง ANE ที่ดีที่สุด) สำหรับโปรเจกต์ข้ามแพลตฟอร์ม (Flutter, React Native) — MediaPipe BlazePose (โมเดลรวมสำหรับทุกแพลตฟอร์ม) สำหรับความแม่นยำในฉากที่ต้องการ — ทั้งสองโมเดลเทียบเคียงได้
MoveNet — ตระกูลโมเดล Pose Detection จาก TensorFlow ที่ปรับให้เหมาะสมสำหรับ TFLite Lightning (8 MB, INT8 — 4 MB): 17 จุดสำคัญ COCO, 91% PCK, เวลาแฝง 8–15 ms, 30+ FPS Thunder (13 MB, INT8 — 6 MB): 17 จุดสำคัญ, 95% PCK, เวลาแฝง 25–40 ms, 20+ FPS MoveNet ใช้สถาปัตยกรรม CenterNet + การประมาณค่าแบบทวิภาคสำหรับแผนที่ความร้อนความละเอียดสูง MoveNet รองรับการตรวจจับหลายท่าทาง (สูงสุด 6 คน) โมเดลพร้อมใช้งานบน TensorFlow Hub
MoveNet Lightning เทียบกับ Thunder: Lightning — สำหรับแอปพลิเคชันเวลาจริงที่มี FPS สูง (ฟิตเนส, ฟิลเตอร์ AR) Thunder — สำหรับการวิเคราะห์ท่าทางที่แม่นยำ (การฟื้นฟูสมรรถภาพ, การวิเคราะห์กีฬา) บนอุปกรณ์ที่มี GPU ทั้งสองโมเดลแปลงเป็น Core ML ผ่าน tf-coreml สำหรับ iOS MoveNet ยังพร้อมใช้งานผ่าน API TFLite Task Vision PoseLandmarker คำแนะนำ: เริ่มต้นด้วย Lightning หากความแม่นยำไม่เพียงพอ — เปลี่ยนเป็น Thunder (ค่าใช้จ่ายเวลาแฝงเพิ่มเพียง +15 ms)
// การอนุมาน MoveNet ด้วย TFLite
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));
float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);
float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
float y = keypoints[i * 3];
float x = keypoints[i * 3 + 1];
float score = keypoints[i * 3 + 2];
drawKeypoint(x, y, score);
}
MoveNet หลายท่าทาง: การตรวจจับสูงสุด 6 คนในเฟรม แทนที่จะใช้วิธีการแผนที่ความร้อนมาตรฐาน MoveNet ใช้การตรวจจับบุคคล + การปรับแต่งท่าทาง: ขั้นแรกตรวจจับบุคคล (แบบ centroid-based) จากนั้นประมาณท่าทางแต่ละคน โหมดหลายท่าทางช้ากว่าโหมดเดี่ยว 2–3 เท่า: Lightning — 25–50 ms (6 คน) สำหรับแอปฟิตเนสที่มีผู้ใช้คนเดียว ให้ใช้โหมดเดี่ยว สำหรับกิจกรรมกลุ่ม (โยคะ, ครอสฟิต) — หลายท่าทางพร้อมจำกัดอัตราเฟรมเพื่อประหยัดแบตเตอรี่
Pose Classification — ขั้นตอนหลังการตรวจจับ: การแปลง landmarks ไปสู่การกระทำเชิงความหมาย (ยืน, นั่ง, ยกมือ, หมอบ) วิธีการ: Rule-based (กฎ manual — มุมระหว่างกระดูก), ML-based (การถดถอยโลจิสติกหรือ Random Forest บนเวกเตอร์ landmark), DL-based (ตัวจำแนก LSTM ของลำดับท่าทางข้ามเฟรม) Rule-based — ความแม่นยำ 50–80%, ง่ายและรวดเร็ว ML-based — ความแม่นยำ 85–95% ด้วยตัวอย่างที่มีป้ายกำกับ 200+ ตัวอย่าง LSTM — ความแม่นยำ 90–98% บนอนุกรมเวลา (วิดีโอ)
มุมระหว่างกระดูก: สำหรับแต่ละจุด คำนวณมุมกับจุดใกล้เคียง ตัวอย่าง: มุมข้อศอกขวา (ไหล่ → ข้อศอก → ข้อมือ), มุมเข่าขวา (สะโพก → เข่า → ข้อเท้า), มุมลำตัว (จุดกึ่งกลางไหล่ → จุดกึ่งกลางสะโพก) มุมไม่แปรเปลี่ยนตามขนาดและตำแหน่งของบุคคลบนหน้าจอ การทำให้มุมเป็นปกติในช่วง [0, 1] ช่วยให้จำแนกท่าทางด้วยกฎเกณฑ์ง่าย ๆ: ถ้า elbowAngle < 30° — วงแตรงอ, ถ้า > 150° — เหยียดตรง
// ตัวจำแนกสควอทตามกฎ
fun classifySquat(pose: Pose): SquatPhase {
val kneeAngle = angle(
pose.getLandmark(PoseLandmark.LEFT_HIP),
pose.getLandmark(PoseLandmark.LEFT_KNEE),
pose.getLandmark(PoseLandmark.LEFT_ANKLE)
)
return when {
kneeAngle > 140f -> SquatPhase.STANDING
kneeAngle < 90f -> SquatPhase.SQUAT
else -> SquatPhase.TRANSITION
}
}
MediaPipe Pose Classification — ตัวจำแนกที่ผ่านการฝึกล่วงหน้าใน MediaPipe Tasks: สควอท, วิดพื้น, แผ่นกระดาน, ยกขา ตัวจำแนกรับรายการ landmarks และส่งคืนการกระทำ + ความเชื่อมั่น รวมการปรับเรียบตามเวลา (ตัวกรองเวลา): HED (Holt Exponential Double Smoothing) สำหรับการเปลี่ยนผ่านระหว่างท่าทางอย่างราบรื่น สำหรับการกระทำที่กำหนดเอง — ฝึกตัวจำแนกด้วย 100–500 ตัวอย่างผ่าน MediaPipe Model Maker (TensorFlow Lite + ข้อมูลเมตา)
ตัวติดตามฟิตเนสพร้อมการแก้ไขเทคนิค — แอปวิเคราะห์ท่าทางของผู้ใช้ระหว่างการออกกำลังกายและให้คำแนะนำด้วยเสียง: “ลดสะโพกลง”, “อย่าเอนลำตัวไปข้างหน้า” ML Kit Pose Detection + ตัวจำแนกตามกฎนับจำนวนครั้งและประเมินคุณภาพ สควอท: มุมเข่า < 90° — สควอทถูกต้อง, มุมหลัง < 45° — การเอียงลำตัวที่เป็นอันตราย วิดพื้น: มุมข้อศอก < 90° ที่จุดต่ำสุด — วิดพื้นเต็มที่ ดึงข้อ: คางเหนือระดับบาร์
การฟื้นฟูสมรรถภาพและกายภาพบำบัด — Pose Detection ใช้สำหรับการติดตามระยะไกลของการออกกำลังกายกายภาพบำบัด แพทย์กำหนดท่าอ้างอิง (เช่น การกางไหล่ที่ 45°), แอปวัดมุมปัจจุบันและค่าเบี่ยงเบน BlazePose 3D ให้ความแม่นยำของมุม ±3° — เพียงพอสำหรับการประเมินทางคลินิก ความถี่: 1 เฟรมต่อ 3–5 วินาที (ประหยัดแบตเตอรี่) บนอุปกรณ์ — ความเป็นส่วนตัวของข้อมูลทางการแพทย์ของผู้ป่วย การฟื้นฟูหลังโรคหลอดเลือดสมอง: การติดตาม มือ-ถึง-ไหล่, การเหยียดข้อศอก, การงอสะโพก
ฟิลเตอร์ AR และเอฟเฟกต์ — Pose Detection เป็นพื้นฐานของฟิลเตอร์ AR ในโซเชียลเน็ตเวิร์ก (TikTok, Instagram, Snapchat) จุดอ้างอิงของศีรษะ, ไหล่และมือใช้สำหรับซ้อนทับหน้ากาก, อนิเมชัน, องค์ประกอบตกแต่ง MediaPipe BlazePose Full + Face Mesh (468 จุด) ให้ 120+ FPS บนอุปกรณ์เรือธง ARKit/ARCore Face Tracking + Pose Detection — การรวมกันสำหรับ AR เต็มตัว ข้อกำหนด: FPS > 30, เวลาแฝง motion-to-photon < 20 ms
// ฟิลเตอร์ AR กับจุดอ้างอิงท่าทาง
let request = VNDetectHumanBodyPoseRequest { req, _ in
guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
let keypoints = try observation.recognizedPoints(.all)
let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
DispatchQueue.main.async {
arView.placeFilter(at: rightShoulder?.location ?? .zero)
}
}
การวิเคราะห์กีฬา — การประเมินเทคนิคระดับมืออาชีพ: การวิเคราะห์เชิงกลศาสตร์ชีวภาพของการวิ่ง (จังหวะ, ความยาวก้าว, ความสมมาตรของการแกว่งแขน), การว่ายน้ำ (การหมุนตัว, มุมข้อศอกขณะพาย), เทนนิส (การหมุนไหล่, การดีดข้อมือ) MoveNet Thunder พร้อมการประมวลผลภายหลังให้ความแม่นยำเพียงพอสำหรับการวิเคราะห์ที่ไม่ใช่มืออาชีพ กีฬามืออาชีพต้องการการจับการเคลื่อนไหว 3D (Vicon, OptiTrack) แต่ Pose Detection บนโทรศัพท์เป็นทางเลือกที่ประหยัดสำหรับตลาดมวลชน การซิงโครไนซ์มุมระหว่างเฟรมเป็นองค์ประกอบสำคัญ
คำถามที่พบบ่อย
ใช้การปรับเรียบตามเวลา: One Euro Filter (ตัวกรอง 1€) — ความถี่ตัดที่ปรับได้สำหรับแต่ละ landmark แยกกัน, ระงับสัญญาณรบกวนความถี่สูง (การสั่น) ในขณะที่รักษาการเคลื่อนไหวจริง (เวลาแฝงต่ำ) MediaPipe BlazePose มี HED ในตัว (Holt Exponential Double Smoothing) — การปรับเรียบแบบปรับตัวพร้อมการทำนายการเคลื่อนไหว สำหรับ ML Kit ให้ใช้ตัวกรอง 1€ ด้วยตนเอง: ตัวกรองมีสองพารามิเตอร์ — beta (ความเร็ว) และ minCutoff (เกณฑ์ความถี่) ที่แนะนำ: beta = 0.04, minCutoff = 0.5 (Android)
ML Kit Pose Detection — หนึ่งคน (โหมดเดี่ยว) MoveNet Lightning — สูงสุด 6 คน (หลายท่าทาง) MediaPipe BlazePose — สูงสุด 2–3 คนผ่าน MediaPipe Tasks (หลายท่าทาง) สำหรับแอปกิจกรรมกลุ่ม ให้ใช้ MoveNet Lightning หรือ BlazePose สำหรับแอปฟิตเนสที่มีผู้ใช้คนเดียว — ML Kit (บูรณาการง่ายกว่า, ความแม่นยำโหมดเดี่ยวสูงกว่า) สำหรับการโทรวิดีโอด้วยฟิลเตอร์ AR — BlazePose Lite แบบหลายท่าทาง (FPS สูง) เพียงพอ
มุมระหว่างกระดูกสองชิ้น: นำสาม landmarks — ข้อต่อ A, ข้อต่อ B (จุดยอดของมุม), ข้อต่อ C คำนวณเวกเตอร์ BA = (A - B) และ BC = (C - B) มุม = atan2(cross(BA, BC), dot(BA, BC)) Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))) มุมในช่วง 0–180° สำหรับพิกัดสามมิติ (BlazePose 3D) ให้ใช้ Vector3D ทำให้มุมเป็นปกติในช่วง [0,1] สำหรับตัวจำแนก ML
ใช่ โมเดลหลักทั้งหมด (ML Kit, BlazePose, MoveNet) ตรวจจับ landmarks ของมือทั้งสองข้างพร้อมกัน: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST สำหรับการตรวจจับมือเพิ่มเติม ให้รวม Pose Detection + Hand Landmarker (21 จุดต่อมือ) MediaPipe Hands + BlazePose เป็นการรวมมาตรฐานสำหรับทั้งตัว + มือ บน iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest
ML Kit Pose Detection: กล่องขอบเขตขั้นต่ำของบุคคล — 100x100 พิกเซล (อัตราส่วนภาพ ~1:1) MoveNet Lightning: 120x120 พิกเซล BlazePose: 80x160 พิกเซล (กล่องขอบเขตแนวตั้ง) สำหรับบุคคลเต็มตัวที่ระยะ 3 เมตรจากกล้อง (1920x1080) — ประมาณ 250x600 px ซึ่งเพียงพอ ที่ระยะ > 5 เมตร ความแม่นยำลดลง — ใช้หลายท่าทาง + อินพุตความละเอียดสูง สำหรับวัตถุที่อยู่ไกล Object Detection + Pose Estimation (สองขั้นตอน) ดีกว่า
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ