คู่มือการตรวจหาจุดสังเกตสำหรับใบหน้าสำหรับ Android

งานเครื่องมือจุดสังเกตใบหน้าของ MediaPipe ช่วยให้คุณสามารถตรวจจับจุดสังเกตของใบหน้าและการแสดงความรู้สึกทางสีหน้าใน รูปภาพและวิดีโอ คุณสามารถใช้งานนี้เพื่อระบุการแสดงออกทางสีหน้าของมนุษย์ ใช้ฟิลเตอร์และเอฟเฟกต์ใบหน้า และสร้างรูปโปรไฟล์เสมือนจริง งานนี้ใช้ โมเดลแมชชีนเลิร์นนิง (ML) ที่สามารถทำงานกับรูปภาพเดียวหรือภาพต่อเนื่อง รูปภาพ งานจะแสดงจุดสังเกตของใบหน้า 3 มิติ ผสมผสานรูปร่าง คะแนน (ค่าสัมประสิทธิ์ที่แสดงการแสดงออกทางสีหน้า) เพื่ออนุมานรายละเอียดเกี่ยวกับใบหน้า พื้นผิวแบบเรียลไทม์ และเมทริกซ์การแปลงเพื่อประมวลผล การเปลี่ยนรูปแบบที่จําเป็นสําหรับการแสดงผลเอฟเฟกต์

ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้มีอยู่ใน GitHub สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ โปรดดูภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างงาน MediaPipe Tasks เป็นการใช้งานที่เรียบง่ายของเครื่องมือจุดสังเกตใบหน้า แอปสำหรับ Android ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ Android จริงเพื่อ ตรวจจับใบหน้าในสตรีมวิดีโอแบบต่อเนื่อง แอปยังตรวจจับใบหน้าใน รูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์

คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสำหรับแอป Android ของคุณเอง หรืออ้างอิงถึงแอปนั้น เมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างเครื่องมือจุดสังเกตใบหน้าที่โฮสต์บน GitHub

ดาวน์โหลดโค้ด

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาตัวอย่างในเครื่อง โดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. นอกจากนี้ คุณสามารถกำหนดค่าอินสแตนซ์ Git ให้ใช้การชำระเงินแบบกระจัดกระจายเพื่อให้คุณมี เฉพาะไฟล์ของแอปตัวอย่างเครื่องมือจุดสังเกตใบหน้าเท่านั้น
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

หลังจากสร้างโค้ดตัวอย่างในเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ได้ ลงใน Android Studio และเรียกใช้แอป โปรดดูวิธีการในคู่มือการตั้งค่าสำหรับ Android

องค์ประกอบสำคัญ

ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับตัวอย่างจุดสังเกตของใบหน้านี้ แอปพลิเคชัน:

  • FaceLandmarkerHelper.kt - เริ่มต้นจุดสังเกตของใบหน้า รวมถึงจัดการโมเดลและมอบสิทธิ์ มากมาย
  • CameraFragment.kt - จัดการกล้องของอุปกรณ์และประมวลผลข้อมูลอินพุตรูปภาพและวิดีโอ
  • GalleryFragment.kt - โต้ตอบกับ OverlayView เพื่อแสดงรูปภาพหรือวิดีโอเอาต์พุต
  • OverlayView.kt - ใช้จอแสดงผลที่มีตาข่ายสำหรับใบหน้าที่ตรวจพบ

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ เป็นโปรเจ็กต์โค้ดสำหรับใช้จุดสังเกตของใบหน้าโดยเฉพาะ สำหรับข้อมูลทั่วไปเกี่ยวกับ การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณสำหรับการใช้งาน MediaPipe ซึ่งรวมถึง ข้อกำหนดด้านเวอร์ชันของแพลตฟอร์ม โปรดดูคู่มือการตั้งค่าสำหรับ Android

การอ้างอิง

งานเครื่องมือจุดสังเกตใบหน้าใช้ไลบรารี com.google.mediapipe:tasks-vision เพิ่ม จะขึ้นอยู่กับไฟล์ build.gradle ของแอป Android

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

รุ่น

งานเครื่องมือจุดสังเกตใบหน้าของ MediaPipe ต้องการแพ็กเกจโมเดลที่ผ่านการฝึกซึ่งสามารถทำงานร่วมกับ งานนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกและพร้อมใช้งานในเครื่องมือจุดสังเกตใบหน้า ดูภาพรวมงานส่วนโมเดล

เลือกและดาวน์โหลดโมเดล และเก็บไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ:

<dev-project-root>/src/main/assets

ระบุเส้นทางของโมเดลภายในพารามิเตอร์ ModelAssetPath ใน โค้ดตัวอย่าง โมเดลจะกำหนดไว้ใน FaceLandmarkerHelper.kt ไฟล์:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

สร้างงาน

งานเครื่องมือจุดสังเกตใบหน้าของ MediaPipe ใช้ฟังก์ชัน createFromOptions() เพื่อตั้งค่า งาน ฟังก์ชัน createFromOptions() จะยอมรับค่าสำหรับการกำหนดค่า ตัวเลือก โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกําหนดค่าได้ที่การกําหนดค่า ตัวเลือกเพิ่มเติม

เครื่องมือเน้นใบหน้าสนับสนุนการป้อนข้อมูลประเภทต่างๆ ได้แก่ ภาพนิ่ง วิดีโอ ไฟล์ และสตรีมวิดีโอสด คุณต้องระบุโหมดการทำงาน ให้สอดคล้องกับประเภทข้อมูลที่คุณป้อนเมื่อสร้างงาน เลือกแท็บ สำหรับประเภทข้อมูลอินพุตเพื่อดูวิธีสร้างงานและเรียกใช้ การอนุมาน

รูปภาพ

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

วิดีโอ

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

สตรีมแบบสด

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

การใช้โค้ดตัวอย่างของเครื่องมือเข้ารหัสใบหน้าจะช่วยให้ผู้ใช้สลับระหว่าง โหมดการประมวลผลข้อมูล วิธีนี้ทำให้โค้ดการสร้างงานซับซ้อนขึ้นและ อาจไม่เหมาะกับกรณีการใช้งานของคุณ คุณดูรหัสนี้ได้ใน setupFaceLandmarker() ในฟังก์ชัน FaceLandmarkerHelper.kt

ตัวเลือกการกำหนดค่า

งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
runningMode ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ โหมด:

รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numFaces จำนวนใบหน้าสูงสุดที่แท็กสามารถตรวจจับได้ FaceLandmarker ใช้การปรับให้เรียบเฉพาะเมื่อ ตั้งค่า num_faces เป็น 1 Integer > 0 1
minFaceDetectionConfidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการตรวจจับใบหน้า ถือว่าประสบความสำเร็จ Float [0.0,1.0] 0.5
minFacePresenceConfidence คะแนนความเชื่อมั่นขั้นต่ำในการแสดงใบหน้า ในการตรวจจับจุดสังเกตของใบหน้า Float [0.0,1.0] 0.5
minTrackingConfidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการติดตามใบหน้า จะถือว่าประสบความสำเร็จ Float [0.0,1.0] 0.5
outputFaceBlendshapes เครื่องมือทำเครื่องหมายใบหน้าจะแสดงการเบลนด์ภาพของใบหน้าหรือไม่ ใบหน้าเบลนด์ใช้สำหรับการแสดงภาพโมเดลใบหน้า 3 มิติ Boolean False
outputFacialTransformationMatrixes FaceLandmarker แสดงเอาต์พุตใบหน้าหรือไม่ ของเมทริกซ์การเปลี่ยนรูปแบบ FaceLandmarker ใช้ เมทริกซ์ในการแปลงจุดสังเกตของใบหน้าจากรูปแบบใบหน้า Canonical เป็น ใบหน้าที่ตรวจพบ เพื่อให้ผู้ใช้สามารถใช้เอฟเฟกต์กับจุดสังเกตที่ตรวจพบ Boolean False
resultListener ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์ของจุดสังเกต ไม่พร้อมกันเมื่อ FaceLandmarker อยู่ในโหมดสตรีมแบบสด ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น 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()
    

ในโค้ดตัวอย่างของเครื่องมือทำเครื่องหมายใบหน้า การจัดเตรียมข้อมูลจะดำเนินการใน FaceLandmarkerHelper.kt

เรียกใช้งาน

ใช้เมธอด FaceLandmarker.detect...() ที่เฉพาะเจาะจงสำหรับประเภทข้อมูลดังกล่าว ใช้ detect() สำหรับรูปภาพแต่ละภาพ detectForVideo() สำหรับเฟรมในไฟล์วิดีโอ และ detectAsync() สำหรับสตรีมวิดีโอ เมื่อคุณดำเนินการตรวจหาใน สตรีมวิดีโอ โปรดตรวจสอบว่าคุณได้เรียกใช้การตรวจจับในชุดข้อความแยกต่างหากเพื่อหลีกเลี่ยงการตรวจพบ บล็อกชุดข้อความอินเทอร์เฟซผู้ใช้

ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างง่ายๆ ของวิธีเรียกใช้เครื่องมือจุดสังเกตใบหน้า ในโหมดข้อมูลที่แตกต่างกันเหล่านี้

รูปภาพ

val result = FaceLandmarker.detect(mpImage)
    

วิดีโอ

val timestampMs = i * inferenceIntervalMs

FaceLandmarker.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

สตรีมแบบสด

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

FaceLandmarker.detectAsync(mpImage, frameTime)
    

โปรดทราบดังต่อไปนี้

  • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุ การประทับเวลาของเฟรมอินพุตเป็นงานเครื่องมือจุดสังเกตใบหน้า
  • เมื่อทำงานในโหมดภาพหรือวิดีโอ งานเครื่องมือไฮไลต์ใบหน้าจะบล็อก ชุดข้อความปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จสิ้น ถึง หลีกเลี่ยงการบล็อกอินเทอร์เฟซผู้ใช้ ใช้การประมวลผลในเบื้องหลัง ชุดข้อความ
  • เมื่อทำงานในโหมดสตรีมแบบสด งานเครื่องมือจุดสังเกตใบหน้าจะส่งคืน ทันทีและไม่บล็อกชุดข้อความปัจจุบัน ซึ่งจะเรียกใช้ผลลัพธ์ Listener ของคุณพร้อมผลการตรวจหาทุกครั้งที่เสร็จสิ้นการประมวลผล เฟรมอินพุต

ในโค้ดตัวอย่างของเครื่องมือจุดสังเกตใบหน้า ค่า detect, detectForVideo และ มีการกำหนดฟังก์ชัน detectAsync ในฟังก์ชัน FaceLandmarkerHelper.kt

จัดการและแสดงผลลัพธ์

เครื่องมือจุดสังเกตใบหน้าจะแสดงออบเจ็กต์ FaceLandmarkerResult สำหรับการตรวจจับแต่ละรายการ วิ่งได้ วัตถุผลลัพธ์มีตาข่ายใบหน้าสำหรับใบหน้าที่ตรวจพบแต่ละรายการ พิกัดสำหรับจุดสังเกตของใบหน้าแต่ละจุด (ไม่บังคับ) ออบเจ็กต์ผลลัพธ์ยังสามารถ มีรูปร่างผสมซึ่งแสดงถึงการแสดงออกทางสีหน้าและใบหน้า เมทริกซ์การเปลี่ยนรูปแบบเพื่อใช้เอฟเฟ็กต์ใบหน้ากับจุดสังเกตที่ตรวจพบ

ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน

โค้ดตัวอย่างเครื่องมือจุดสังเกตใบหน้าแสดงวิธีแสดงผลลัพธ์ จากงาน ให้ดู OverlayView เพื่อดูรายละเอียดเพิ่มเติม