คำแนะนำในการตรวจจับใบหน้าสำหรับ iOS

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

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

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

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

คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสำหรับแอป iOS ของคุณเอง หรืออ้างอิงถึงแอป เมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างตัวตรวจจับใบหน้าโฮสต์อยู่ใน 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_detector/ios/
    

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

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

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

  • FaceDetectorService.swift: เริ่มต้นตัวตรวจจับ จัดการการเลือกโมเดล และเรียกใช้การอนุมานเกี่ยวกับข้อมูลอินพุต
  • CameraViewController: ใช้ UI สำหรับโหมดป้อนข้อมูลฟีดกล้องแบบสดและแสดงภาพผลลัพธ์การตรวจจับ
  • MediaLibraryViewController.swift: ใช้ UI สำหรับโหมดป้อนข้อมูลภาพนิ่งและไฟล์วิดีโอ และแสดงภาพผลลัพธ์การตรวจจับ

ตั้งค่า

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

การอ้างอิง

ตัวตรวจจับใบหน้าใช้คลัง MediaPipeTasksVision ซึ่งต้องติดตั้ง ด้วยการใช้ CocoaPods ไลบรารีใช้งานได้ทั้งกับแอป Swift และ Objective-C และไม่จำเป็นต้องมีการตั้งค่าเฉพาะภาษาใดๆ เพิ่มเติม

ดูวิธีการติดตั้ง CocoaPods ใน macOS ได้ที่ CocoaPods คู่มือการติดตั้ง หากต้องการทราบวิธีการสร้าง Podfile ด้วยพ็อดที่จำเป็นสำหรับ โปรดดูที่การใช้ CocoaPods

เพิ่มพ็อด MediaPipeTasksVision ใน Podfile โดยใช้โค้ดต่อไปนี้

target 'MyFaceDetectorApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

หากแอปของคุณมีเป้าหมายการทดสอบ 1 หน่วย โปรดดูคู่มือการตั้งค่าสำหรับ iOS หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่า Podfile ของคุณ

รุ่น

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

เลือกและดาวน์โหลดโมเดล แล้วเพิ่มลงในไดเรกทอรีโปรเจ็กต์โดยใช้ Xcode โปรดดูวิธีเพิ่มไฟล์ลงในโปรเจ็กต์ Xcode ที่หัวข้อการจัดการ ไฟล์และโฟลเดอร์ใน Xcode โปรเจ็กต์

ใช้พร็อพเพอร์ตี้ BaseOptions.modelAssetPath เพื่อระบุเส้นทางไปยังโมเดล ใน App Bundle ของคุณ ดูตัวอย่างโค้ดได้ในส่วนถัดไป

สร้างงาน

คุณสร้างงานการตรวจจับใบหน้าได้โดยเรียกใช้โปรแกรมเริ่มต้นรายการใดรายการหนึ่ง เครื่องมือเริ่มต้น FaceDetector(options:) จะยอมรับค่าสำหรับการกำหนดค่านี้ ตัวเลือก

หากไม่ต้องการให้เครื่องตรวจจับใบหน้าที่เริ่มต้นโดยใช้การกำหนดค่าที่กำหนดเอง คุณสามารถใช้เครื่องมือเริ่มต้น FaceDetector(modelPath:) เพื่อสร้าง เครื่องตรวจจับใบหน้าที่มีตัวเลือกเริ่มต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า โปรดดูที่ภาพรวมการกำหนดค่า

งานการตรวจจับใบหน้ารองรับอินพุต 3 ประเภท ได้แก่ ภาพนิ่งและไฟล์วิดีโอ และสตรีมวิดีโอสด โดยค่าเริ่มต้น FaceDetector(modelPath:) จะเริ่มต้น สำหรับภาพนิ่ง เมื่อต้องการให้งานเริ่มต้นดำเนินการเพื่อประมวลผลวิดีโอ หรือสตรีมวิดีโอสด ให้ใช้ FaceDetector(options:) เพื่อระบุวิดีโอ หรือไลฟ์สตรีมโหมดทำงาน นอกจากนี้โหมดสตรีมแบบสดยังต้องใช้ส่วนเสริม ตัวเลือกการกำหนดค่า faceDetectorLiveStreamDelegate ซึ่งทำให้ ตัวตรวจจับใบหน้าเพื่อส่งผลการตรวจจับใบหน้าให้ผู้รับมอบสิทธิ์แบบไม่พร้อมกัน

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

Swift

รูปภาพ

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image

let faceDetector = try FaceDetector(options: options)
    

วิดีโอ

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video

let faceDetector = try FaceDetector(options: options)
    

ไลฟ์สด

import MediaPipeTasksVision

// Class that conforms to the `FaceDetectorLiveStreamDelegate` protocol and
// implements the method that the face detector calls once it finishes
// detecting faces in each input frame.
class FaceDetectorResultProcessor: NSObject, FaceDetectorLiveStreamDelegate {

  func faceDetector(
    _ faceDetector: FaceDetector,
    didFinishDetection result: FaceDetectorResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the face detection result or errors here.

  }
}

let modelPath = Bundle.main.path(
  forResource: "model",
  ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
let processor = FaceDetectorResultProcessor()
options.faceDetectorLiveStreamDelegate = processor

let faceDetector = try FaceDetector(options: options)
    

Objective-C

รูปภาพ

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

วิดีโอ

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

ไลฟ์สด

@import MediaPipeTasksVision;

// Class that conforms to the `MPPFaceDetectorLiveStreamDelegate` protocol
// and implements the method that the face detector calls once it finishes
// detecting faces in each input frame.

@interface APPFaceDetectorResultProcessor : NSObject 

@end

@implementation APPFaceDetectorResultProcessor

-   (void)faceDetector:(MPPFaceDetector *)faceDetector
    didFinishDetectionWithResult:(MPPFaceDetectorResult *)faceDetectorResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the face detector result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
APPFaceDetectorResultProcessor *processor = [APPFaceDetectorResultProcessor new];
options.faceDetectorLiveStreamDelegate = processor;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

หมายเหตุ: หากคุณใช้โหมดวิดีโอหรือโหมดสตรีมแบบสด ตัวตรวจจับใบหน้าจะใช้ การติดตามเพื่อหลีกเลี่ยงการทริกเกอร์โมเดลการตรวจจับในทุกเฟรม ซึ่งจะช่วย ลดเวลาในการตอบสนอง

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

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

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

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

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

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการตรวจจับใบหน้าจะถือว่าสำเร็จ Float [0,1] 0.5
minSuppressionThreshold เกณฑ์การระงับที่ไม่ใช่สูงสุดขั้นต่ำสำหรับการตรวจจับใบหน้าที่จะถือว่าซ้อนทับกัน Float [0,1] 0.3

การกำหนดค่าสตรีมแบบสด

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

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
faceDetectorLiveStreamDelegate เปิดใช้ตัวตรวจจับใบหน้าเพื่อรับผลลัพธ์การตรวจจับใบหน้าแบบไม่พร้อมกัน ในโหมดสตรีมแบบสด คลาสที่มีการตั้งค่าอินสแตนซ์เป็นพร็อพเพอร์ตี้นี้จะต้อง ติดตั้งใช้งาน faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) ไม่เกี่ยวข้อง ไม่ได้ตั้งค่า

เตรียมข้อมูล

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

เลือกรูปแบบรูปภาพ iOS ตามกรณีการใช้งานและโหมดการทำงาน แอปพลิเคชันต้องการ MPImage ยอมรับ UIImage, CVPixelBuffer และ CMSampleBuffer รูปแบบรูปภาพ iOS

UIImage

รูปแบบ UIImage เหมาะกับโหมดการวิ่งต่อไปนี้

  • รูปภาพ: รูปภาพจาก App Bundle แกลเลอรีของผู้ใช้ หรือระบบไฟล์ที่จัดรูปแบบเป็น แปลงรูปภาพ UIImage รูปเป็นวัตถุ MPImage ได้

  • วิดีโอ: ใช้ AVAssetImageGenerator เพื่อแยกเฟรมวิดีโอไปยัง CGImage รูปแบบ แล้วแปลงเป็น UIImage รูปภาพ

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

ตัวอย่างนี้จะเริ่มต้น MPImage ด้วยค่าเริ่มต้น UIImage.Orientation.Up การวางแนว คุณสามารถเริ่มต้น MPImage ด้วย UIImage.Orientation ตัวตรวจจับใบหน้าไม่รองรับการวางแนวแบบมิเรอร์ เช่น .upMirrored .downMirrored, .leftMirrored, .rightMirrored

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ UIImage โปรดดูที่ UIImage ของ Apple Developer เอกสารประกอบ

CVPixelBuffer

รูปแบบ CVPixelBuffer เหมาะกับแอปพลิเคชันที่สร้างเฟรม และใช้ CoreImage ของ iOS สำหรับการประมวลผลข้อมูล

รูปแบบ CVPixelBuffer เหมาะกับโหมดการวิ่งต่อไปนี้

  • รูปภาพ: แอปที่สร้างรูปภาพ CVPixelBuffer รูปหลังจากประมวลผล ที่ใช้เฟรมเวิร์ก CoreImage ของ iOS สามารถส่งไปยังตัวตรวจจับใบหน้าใน โหมดเรียกใช้รูปภาพ

  • วิดีโอ: แปลงเฟรมวิดีโอเป็นรูปแบบ CVPixelBuffer ได้สำหรับ การประมวลผล จากนั้นจึงส่งไปยังเครื่องตรวจจับใบหน้าในโหมดวิดีโอ

  • สตรีมแบบสด: ระบบอาจแปลงแอปที่ใช้กล้อง iOS ในการสร้างเฟรม เป็นรูปแบบ CVPixelBuffer เพื่อการประมวลผลก่อนที่จะส่งไปยัง ตัวตรวจจับใบหน้าในโหมดสตรีมแบบสด

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับ CVPixelBuffer ได้ที่ CVPixelBuffer Apple นักพัฒนาซอฟต์แวร์ เอกสารประกอบ

CMSampleBuffer

รูปแบบ CMSampleBuffer จะจัดเก็บตัวอย่างสื่อของประเภทสื่อแบบเดียวกัน และ เหมาะกับโหมดทำงานของสตรีมแบบสด เฟรมแบบสดจากกล้อง iOS ส่งแบบไม่พร้อมกันในรูปแบบ CMSampleBuffer โดย iOS AVCaptureVideoDataOutput.

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ CMSampleBuffer โปรดดู CMSampleBuffer Apple นักพัฒนาซอฟต์แวร์ เอกสารประกอบ

เรียกใช้งาน

หากต้องการเรียกใช้เครื่องตรวจจับใบหน้า ให้ใช้เมธอด detect() เฉพาะที่มอบหมาย โหมดทำงาน:

  • ภาพนิ่ง: detect(image:)
  • วิดีโอ: detect(videoFrame:timestampInMilliseconds:)
  • สตรีมสด: detectAsync(image:timestampInMilliseconds:)

ตัวตรวจจับใบหน้าจะแสดงใบหน้าที่ตรวจพบภายในรูปภาพหรือเฟรมอินพุต

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

Swift

รูปภาพ

let result = try faceDetector.detect(image: image)
    

วิดีโอ

let result = try faceDetector.detect(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

ไลฟ์สด

try faceDetector.detectAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

รูปภาพ

MPPFaceDetectorResult *result = [faceDetector detectInImage:image
                                                      error:nil];
    

วิดีโอ

MPPFaceDetectorResult *result = [faceDetector detectInVideoFrame:image
                                         timestampInMilliseconds:timestamp
                                                           error:nil];
    

ไลฟ์สด

BOOL success = [faceDetector detectAsyncInImage:image
                        timestampInMilliseconds:timestamp
                                          error:nil];
    

ตัวอย่างโค้ดตัวตรวจจับใบหน้าแสดงการใช้งานของแต่ละโหมดเหล่านี้ รายละเอียดเพิ่มเติม detect(image:), detect(videoFrame:timestampInMilliseconds:) และ detectAsync(image:timestampInMilliseconds:) โค้ดตัวอย่างนี้ช่วยให้ ผู้ใช้เพื่อเปลี่ยนโหมดการประมวลผลซึ่งอาจไม่จำเป็นสำหรับการใช้งานของคุณ

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

  • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุ การประทับเวลาของเฟรมอินพุตในงานตัวตรวจจับใบหน้า

  • เมื่อทำงานในโหมดรูปภาพหรือวิดีโอ งานตัวตรวจจับใบหน้าจะบล็อก เทรดปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จสิ้น ถึง หลีกเลี่ยงการบล็อกเทรดปัจจุบัน เรียกใช้การประมวลผลในเบื้องหลัง เทรดโดยใช้ iOS ผู้มอบหมายหรือ NSOperation ของ Google

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

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

ขณะเรียกใช้การอนุมาน งานการตรวจจับใบหน้าจะแสดง FaceDetectorResult ซึ่งมีกรอบล้อมรอบสำหรับใบหน้าและความเชื่อมั่นที่ตรวจพบ สำหรับใบหน้าที่ตรวจพบแต่ละรายการ

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

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

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

สำหรับรูปภาพที่ไม่มีกรอบล้อมรอบ โปรดดูรูปภาพต้นฉบับ

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