转到控制台

在 iOS 上使用机器学习套件检测面部

利用机器学习套件,您可以使用基于设备的模型或云端模型检测图片和视频中的面部。要了解每种方法的优势,请参阅概览

准备工作

  1. (EAP) 通过运行 CPDC EAP 网站中所示的命令,对 Git 进行身份验证并获取 Cookie。
  2. (EAP) 将 EAP 代码库添加到项目的 Podfile 中:
    source ‘https://cpdc-eap.googlesource.com/spec.git’
  3. 完成将 Firebase 添加到您的 iOS 项目中的步骤。除核心库之外,在 Podfile 中添加机器学习套件库:
    pod 'FirebaseML'
  4. (EAP) 在应用中,导入 FirebaseML 模块:

    Swift

    import FirebaseML

    Objective-C

    @import FirebaseML;

现在,您就可以使用基于设备的模型云端模型检测面部了。

基于设备的面部检测

配置面部检测器

在对图片应用面部检测之前,如果您想更改面部检测器的任何默认设置,请使用 VisionFaceDetectorOptions 对象指定这些设置。您可以更改以下设置:

设置
检测模式 fast(默认值)| accurate

在检测面部时更注重速度还是准确性。

检测标志 none(默认值)| all

是否尝试识别面部“标志”:眼睛、耳朵、鼻子、脸颊、嘴巴。

对面部分类 none(默认值)| all

是否将面部分为不同类别(例如“微笑”和“睁眼”)。

面部大小下限 CGFloat(默认值:0.1

要检测的面部的大小下限(相对于图片)。

启用面部跟踪 false(默认值)| true

是否为面部分配 ID,以用于跨图片跟踪面部。

例如,要更改所有默认设置,请按照以下示例构建 VisionFaceDetectorOptions 对象:

Swift

let options = VisionFaceDetectorOptions()
options.modeType = .accurate
options.landmarkType = .all
options.classificationType = .all
options.minFaceSize = CGFloat(0.2)
options.isTrackingEnabled = true

Objective-C

FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.modeType = FIRVisionFaceDetectorModeAccurate;
options.landmarkType =  FIRVisionFaceDetectorLandmarkAll;
options.classificationType = FIRVisionFaceDetectorClassificationAll;
options.minFaceSize = (CGFloat) 0.2f;
options.isTrackingEnabled = YES;

运行面部检测器

要识别图片中的面部,请将图片作为 CMSampleBufferRef 对递给 VisionFaceDetectordetect(buffer:metadata:) 方法,或将图片作为 UIImage 传递给 detect(image:metadata:) 方法。

  1. 获取 VisionFaceDetector 的一个实例:

    Swift

    do {
      let faceDetector = try FirebaseMachineLearning.machineLearning().faceDetector()
    } catch let error as NSError {
      print("Error: \(error)")
    }
    

    Objective-C

    NSError *error;
    FIRMachineLearning *machineLearning = [FIRMachineLearning machineLearning];
    FIRVisionFaceDetector *faceDetector = [machineLearning faceDetectorWithError:&error];
    
    if (error != nil) {
      NSLog(@"Face detector creation error: %@", error.localizedDescription);
    }
    
  2. 如果图片的第一行和第一列未定向于左上角,则可以通过创建 VisionImageMetadata 对象来指定图片的方向:

    Swift

    let metadata = VisionImageMetadata()
    metadata.orientation = VisionDetectorImageOrientation.topRight
    

    Objective-C

    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    metadata.orientation = FIRVisionDetectorImageOrientationTopRight;
    
    如果图片的第一行和第一列定向于左上角,则只需传递 nil,而非元数据对象。
  3. 然后,将图片传递给 detect(buffer:metadata:)detect(image:metadata:) 方法:

    Swift

    do {
      faces = try faceDetector.detect(buffer: buffer!, metadata: nil)  // or detect(image:...)
    } catch let error as NSError {
      print("Error: \(error)")
    }
    

    Objective-C

    NSError *faceDetectError = nil;
    NSArray *faces =
        [faceDetector detectInBuffer:buffer  // or detectInImage:...
                            metadata:nil
                               error:&error];
    if (error != nil) {
      NSLog(@"Face detection error: %@", error.localizedDescription);
      return 0;
    }
    

获取检测到的面部的相关信息

如果面部检测操作成功,面部检测器会返回一组 VisionFaceFeature 对象。每个 VisionFaceFeature 对象代表一张在图片中检测到的面孔。对于每张面孔,您可以获取它在输入图片中的边界坐标,以及您已配置面部检测器查找的任何其他信息。例如:

Swift

for face in faces {
  let frame = face.frame
  if face.hasHeadEulerAngleY {
    let rotY = face.headEulerAngleY  // Head is rotated to the right rotY degrees
  }
  if face.hasHeadEulerAngleZ {
    let rotZ = face.headEulerAngleZ  // Head is rotated upward rotZ degrees
  }

  // If landmark detection was enabled (mouth, ears, eyes, cheeks, and
  // nose available):
  if face.hasLeftEarPosition {
    let leftEarPos = face.leftEarPosition
  }
  if face.hasNoseBasePosition {
    let nosePos = face.noseBasePosition
  }

  // If classification was enabled:
  if face.hasSmilingProbability {
    let smileProb = face.smilingProbability
  }
  if face.hasRightEyeOpenProbability {
    let rightEyeOpenProb = face.rightEyeOpenProbability
  }

  // If face tracking was enabled:
  if face.hasTrackingId {
    let trackingId = face.trackingId
  }
}

Objective-C

for (id face in faces) {
  CGRect frame = face.frame;
  if (face.hasHeadEulerAngleY) {
    CGFloat rotY = face.headEulerAngleY;  // Head is rotated to the right rotY degrees
  }
  if (face.hasHeadEulerAngleZ) {
    CGFloat rotZ = face.headEulerAngleZ;  // Head is rotated upward rotZ degrees
  }

  // If landmark detection was enabled (mouth, ears, eyes, cheeks, and
  // nose available):
  if (face.hasLeftEarPosition) {
    CGFloat leftEarPos = face.leftEarPosition;
  }
  if (face.hasNoseBasePosition) {
    CGFloat nosePos = face.noseBasePosition;
  }

  // If classification was enabled:
  if (face.hasSmilingProbability) {
    CGFloat smileProb = face.smilingProbability;
  }
  if (face.hasRightEyeOpenProbability) {
    CGFloat rightEyeOpenProb = face.rightEyeOpenProbability;
  }

  // If face tracking was enabled:
  if (face.hasTrackingId) {
    NSInteger trackingId = face.trackingId;
  }
}

Cloud 面部检测

即将推出!