งานโปรแกรมรู้จำท่าทางสัมผัส MediaPipe ช่วยให้คุณจำท่าทางสัมผัสของมือได้แบบเรียลไทม์ และ แสดงผลลัพธ์การใช้มือที่จดจำได้ และจุดสังเกตของมือ มือที่ตรวจพบ วิธีการเหล่านี้จะแสดงวิธีใช้การรู้จำท่าทางสัมผัส กับแอป Android ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้สามารถดูได้ ใน GitHub
คุณสามารถดูการทำงานนี้โดยดูที่ เว็บเดโม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ โปรดดูภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่าง MediaPipe Tasks เป็นการใช้งานโปรแกรมรู้จำท่าทางสัมผัสแบบง่ายๆ แอปสำหรับ 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/gesture_recognizer/android
หลังจากสร้างโค้ดตัวอย่างในเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ได้ ลงใน Android Studio และเรียกใช้แอป ดูวิธีการได้ที่ คู่มือการการตั้งค่าสำหรับ Android
องค์ประกอบสำคัญ
ไฟล์ต่อไปนี้มีรหัสที่สำคัญสำหรับท่าทางสัมผัสด้วยมือนี้ แอปพลิเคชันตัวอย่างการจดจำ:
- GestureRecognizerHelper.kt เริ่มต้นระบบจดจำท่าทางสัมผัส แล้วจัดการโมเดลและมอบสิทธิ์ มากมาย
- MainActivity.kt -
นำแอปพลิเคชันไปใช้งาน รวมถึงการเรียกใช้
GestureRecognizerHelper
และGestureRecognizerResultsAdapter
- GestureRecognizerResultsAdapter.kt แฮนเดิลและจัดรูปแบบผลลัพธ์
ตั้งค่า
ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ โปรเจ็กต์โค้ดเพื่อใช้การรู้จำท่าทางสัมผัสโดยเฉพาะ สำหรับข้อมูลทั่วไปเกี่ยวกับ การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณสำหรับการใช้งาน MediaPipe ซึ่งรวมถึง โปรดดูข้อกำหนดเวอร์ชันของแพลตฟอร์ม คู่มือการตั้งค่าสำหรับ Android
การอ้างอิง
งานการจดจำท่าทางสัมผัสจะใช้ com.google.mediapipe:tasks-vision
ไลบรารี เพิ่มทรัพยากร Dependency นี้ลงในไฟล์ build.gradle
ของแอป Android
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
รุ่น
งานการจดจำท่าทางสัมผัส MediaPipe ต้องการแพ็กเกจโมเดลที่ผ่านการฝึกซึ่งสามารถทำงานร่วมกับ งานนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกอบรมเกี่ยวกับการจดจำท่าทางสัมผัส ดูภาพรวมงานส่วนโมเดล
เลือกและดาวน์โหลดโมเดล และเก็บไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ:
<dev-project-root>/src/main/assets
ระบุเส้นทางของโมเดลภายในพารามิเตอร์ ModelAssetPath
ใน
โค้ดตัวอย่าง
มีการกำหนดโมเดลใน GestureRecognizerHelper.kt
ไฟล์:
baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)
สร้างงาน
งานการรู้จำท่าทางสัมผัสของ MediaPipe ใช้ฟังก์ชัน createFromOptions()
เพื่อตั้งค่า
สร้างงาน ฟังก์ชัน createFromOptions()
ยอมรับค่าของ
ตัวเลือกการกำหนดค่า สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่า
ดูตัวเลือกการกำหนดค่า
ตัวจดจำท่าทางสัมผัสรองรับอินพุต 3 ประเภท ได้แก่ ภาพนิ่ง ไฟล์วิดีโอ และ สตรีมวิดีโอสด คุณต้องระบุโหมดการทำงานที่สอดคล้องกับ ประเภทข้อมูลอินพุตเมื่อสร้างงาน เลือกแท็บที่ตรงกับ ประเภทข้อมูลอินพุตเพื่อดูวิธีสร้างงานและเรียกใช้การอนุมาน
รูปภาพ
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
วิดีโอ
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
สตรีมแบบสด
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
การใช้โค้ดตัวอย่างโปรแกรมรู้จำท่าทางสัมผัสทำให้ผู้ใช้สามารถเปลี่ยนไปมาระหว่าง
โหมดการประมวลผลข้อมูล วิธีนี้ทำให้โค้ดการสร้างงานซับซ้อนขึ้นและ
อาจไม่เหมาะกับกรณีการใช้งานของคุณ คุณดูรหัสนี้ได้ใน
setupGestureRecognizer()
ในฟังก์ชัน
GestureRecognizerHelper.kt
ตัวเลือกการกำหนดค่า
งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android
ชื่อตัวเลือก | คำอธิบาย | ช่วงค่า | ค่าเริ่มต้น | |
---|---|---|---|---|
runningMode |
ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ
โหมด: รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
|
numHands |
จำนวนมือสูงสุดที่ตรวจจับได้ด้วย
GestureRecognizer
|
Any integer > 0 |
1 |
|
minHandDetectionConfidence |
คะแนนความเชื่อมั่นขั้นต่ำสำหรับการตรวจจับมือ โมเดลการตรวจจับฝ่ามือประสบความสำเร็จ | 0.0 - 1.0 |
0.5 |
|
minHandPresenceConfidence |
คะแนนความเชื่อมั่นขั้นต่ำสำหรับคะแนนการตรวจหาบุคคลในมือ โมเดลการตรวจจับจุดสังเกต ในโหมดวิดีโอและโหมดสตรีมแบบสดของโปรแกรมจดจำท่าทางสัมผัส หากคะแนนความเชื่อมั่นขณะแสดงด้วยมือจากรูปของมือ โมเดลจุดสังเกต อยู่ด้านล่าง เกณฑ์นี้จะทริกเกอร์โมเดลการตรวจจับฝ่ามือ มิเช่นนั้น อัลกอริทึมการติดตามมือน้ำหนักเบาใช้เพื่อระบุตำแหน่ง สำหรับการตรวจหาจุดสังเกตในภายหลัง | 0.0 - 1.0 |
0.5 |
|
minTrackingConfidence |
คะแนนความเชื่อมั่นขั้นต่ำสำหรับการติดตามมือที่จะพิจารณา สำเร็จ นี่คือเกณฑ์ IoU ของกรอบล้อมรอบระหว่างมือใน เฟรมปัจจุบันกับเฟรมสุดท้าย ในโหมดวิดีโอและโหมดสตรีมของ โปรแกรมจดจำท่าทางสัมผัส หากการติดตามล้มเหลว โปรแกรมจดจำท่าทางสัมผัสจะเรียกใช้มือ การตรวจจับ ไม่เช่นนั้นระบบจะข้ามการตรวจจับมือ | 0.0 - 1.0 |
0.5 |
|
cannedGesturesClassifierOptions |
ตัวเลือกสำหรับการกำหนดค่าลักษณะการทำงานของตัวแยกประเภทด้วยท่าทางสัมผัสสำเร็จรูป ท่าทางสัมผัสสำเร็จรูปคือ ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"] |
|
|
|
customGesturesClassifierOptions |
ตัวเลือกสำหรับการกำหนดค่าลักษณะการทำงานของตัวแยกประเภทด้วยท่าทางสัมผัสที่กำหนดเอง |
|
|
|
resultListener |
ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์การจัดประเภท
แบบไม่พร้อมกันเมื่อตัวจดจำท่าทางสัมผัสอยู่ในโหมดสตรีมแบบสด
ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น |
ResultListener |
ไม่มี | ไม่มี |
errorListener |
ตั้งค่า Listener ข้อผิดพลาดที่ไม่บังคับ | ErrorListener |
ไม่มี | ไม่มี |
เตรียมข้อมูล
ตัวจดจำท่าทางสัมผัสทำงานร่วมกับรูปภาพ ไฟล์วิดีโอ และวิดีโอสตรีมแบบสด งาน จัดการการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการปรับขนาด การหมุน และค่า การแปลงเป็นรูปแบบมาตรฐาน
โค้ดต่อไปนี้แสดงวิธีส่งต่อข้อมูลสำหรับการประมวลผล วิทยานิพนธ์ ตัวอย่างจะให้รายละเอียดเกี่ยวกับวิธีจัดการข้อมูลจากรูปภาพ ไฟล์วิดีโอ และการเผยแพร่ สตรีมวิดีโอ
รูปภาพ
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()
ใน
โค้ดตัวอย่างโปรแกรมจดจำท่าทางสัมผัส การเตรียมข้อมูลมีการจัดการใน
GestureRecognizerHelper.kt
เรียกใช้งาน
โปรแกรมจดจำท่าทางสัมผัสใช้ recognize
, recognizeForVideo
และ recognizeAsync
เพื่อทริกเกอร์การอนุมาน ในการจดจำท่าทางสัมผัส การดำเนินการนี้เกี่ยวข้องกับ
ประมวลผลข้อมูลอินพุตล่วงหน้า ตรวจจับมือในรูปภาพ การตรวจจับมือ
จุดสังเกต และจดจำท่าทางมือจากจุดสังเกต
โค้ดต่อไปนี้แสดงวิธีดำเนินการประมวลผลด้วยโมเดลงาน ตัวอย่างเหล่านี้มีรายละเอียดเกี่ยวกับวิธีจัดการข้อมูลจากรูปภาพ ไฟล์วิดีโอ และสตรีมวิดีโอสด
รูปภาพ
val result = gestureRecognizer?.recognize(mpImage)
วิดีโอ
val timestampMs = i * inferenceIntervalMs gestureRecognizer?.recognizeForVideo(mpImage, timestampMs) ?.let { recognizerResult -> resultList.add(recognizerResult) }
สตรีมแบบสด
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() gestureRecognizer?.recognizeAsync(mpImage, frameTime)
โปรดทราบดังต่อไปนี้
- เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้อง ระบุการประทับเวลาของเฟรมอินพุตในงานโปรแกรมจดจำท่าทางสัมผัส
- เมื่อใช้งานในโหมดรูปภาพหรือวิดีโอ งานการจดจำท่าทางสัมผัสจะ บล็อกชุดข้อความปัจจุบันจนกว่าจะประมวลผลรูปภาพอินพุตเสร็จสิ้น หรือ เฟรม หากต้องการหลีกเลี่ยงการบล็อกอินเทอร์เฟซผู้ใช้ ให้เรียกใช้การประมวลผลใน เทรดพื้นหลัง
- เมื่อทำงานในโหมดสตรีมแบบสด งานการจดจำท่าทางสัมผัสจะไม่บล็อก ชุดข้อความปัจจุบันแต่จะแสดงอีกครั้งทันที ระบบจะเรียกใช้ผลลัพธ์ Listener ที่มีผลลัพธ์การจดจำทุกครั้งที่ประมวลผลเสร็จสิ้น เฟรมอินพุต หากมีการเรียกใช้ฟังก์ชันการจดจำเมื่อโปรแกรมรู้จำท่าทางสัมผัส งานไม่ว่างเนื่องจากประมวลผลเฟรมอื่น งานจะไม่สนใจเฟรมอินพุตใหม่
ใน
โค้ดตัวอย่างโปรแกรมจดจำท่าทางสัมผัส ได้แก่ recognize
, recognizeForVideo
และ
มีการกำหนดฟังก์ชัน recognizeAsync
ในฟังก์ชัน
GestureRecognizerHelper.kt
จัดการและแสดงผลลัพธ์
ตัวจดจำท่าทางสัมผัสจะสร้างออบเจ็กต์ผลลัพธ์การตรวจจับท่าทางสัมผัสสำหรับแต่ละ การจดจำเสียง ออบเจ็กต์ผลลัพธ์มีจุดสังเกตของมือในพิกัดรูปภาพ จุดสังเกตในพิกัดโลก มือ(ซ้าย/ขวา) และมือ หมวดหมู่ท่าทางสัมผัสของมือที่ตรวจพบ
ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้
GestureRecognizerResult
ที่ได้จะมีคอมโพเนนต์ 4 รายการ และคอมโพเนนต์แต่ละรายการเป็นอาร์เรย์ โดยที่แต่ละองค์ประกอบจะให้ผลลัพธ์ที่ตรวจพบจากมือเดียวที่ตรวจพบ
ความถนัดของมือ
ความถนัดของมือแสดงให้เห็นว่ามือที่ตรวจพบเป็นมือซ้ายหรือมือขวา
ท่าทางสัมผัส
หมวดหมู่ท่าทางสัมผัสที่รู้จักของมือที่ตรวจพบ
จุดสังเกต
มีจุดสังเกต 21 จุด แต่ละรายการประกอบด้วยพิกัด
x
,y
และz
พิกัดx
และy
จะได้รับการปรับให้เป็น [0.0, 1.0] ตามความกว้างของภาพและ ตามลำดับ พิกัดz
แสดงความลึกของจุดสังเกต โดยมี ความลึกที่ข้อมือซึ่งเป็นจุดเริ่มต้น ยิ่งค่าน้อยเท่าไหร่ ก็ยิ่งใกล้ ที่สำคัญคือกล้อง ขนาดของz
ใช้มาตราส่วนใกล้เคียงกับx
สถานที่สำคัญของโลก
นอกจากนี้ สัญลักษณ์มือ 21 ข้างยังแสดงเป็นพิกัดของโลกด้วย จุดสังเกตแต่ละแห่ง ประกอบด้วย
x
,y
และz
ซึ่งจะแสดงพิกัด 3 มิติตามจริงใน เมตรที่มีจุดกำเนิดอยู่ที่จุดศูนย์กลางเรขาคณิตของมือ
GestureRecognizerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Gestures:
Categories #0:
score : 0.76893
categoryName : Thumb_Up
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน
ใน
รหัสตัวอย่างโปรแกรมจดจำท่าทางสัมผัส คลาส GestureRecognizerResultsAdapter
ใน
GestureRecognizerResultsAdapter.kt
จะช่วยจัดการกับผลลัพธ์ที่ได้