Ir a la consola

Detecta rostros con el Kit de AA en iOS

Puedes usar el Kit de AA para detectar rostros en imágenes y videos, mediante un modelo en el dispositivo o uno en la nube. Consulta la descripción general para obtener más información sobre los beneficios de cada enfoque.

Antes de comenzar

  1. (EAP) Autentica y obtén una cookie para Git, mediante la ejecución del comando que se muestra en el sitio CPDC EAP.
  2. (EAP) Agrega el repositorio de EAP al Podfile de tu proyecto:
    source ‘https://cpdc-eap.googlesource.com/spec.git’
  3. Completa los pasos en Agrega Firebase a tu proyecto de iOS. Además de la biblioteca principal, incluye la biblioteca del Kit de AA en tu Podfile:
    pod 'FirebaseML'
  4. (EAP) En tu app, importa el módulo FirebaseML:

    Swift

    import FirebaseML

    Objective-C

    @import FirebaseML;

Ahora estás listo para detectar rostros mediante un modelo en el dispositivo o un modelo basado en la nube.

Detección de rostros en el dispositivo

Configura el detector de rostros

Antes de aplicar la detección de rostros a una imagen, si deseas modificar la configuración predeterminada del detector de rostros, especifica la configuración con un objeto VisionFaceDetectorOptions. Puedes cambiar las siguientes opciones de configuración:

Configuración
Modo de detección fast (predeterminado) | accurate

Prefiere la velocidad o la precisión en la detección de rostros.

Detecta puntos de referencia none (predeterminado) | all

Indica si se debe intentar identificar "puntos de referencia" faciales: ojos, orejas, nariz, mejillas, boca.

Clasificar rostros none (predeterminado) | all

Indica si se deben clasificar los rostros en categorías como "sonriente" y "ojos abiertos".

Tamaño mínimo del rostro CGFloat (predeterminado: 0.1)

El tamaño mínimo, en relación con la imagen, de los rostros que se detectarán.

Habilitar el seguimiento de rostros false (predeterminado) | true

Indica si se deben asignar ID a los rostros, que se pueden usar para seguir los rostros entre imágenes.

Por ejemplo, para cambiar todos los elementos de la configuración predeterminada, compila un objeto VisionFaceDetectorOptions como el siguiente:

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;

Ejecuta el detector de rostros

Para reconocer rostros en una imagen, pasa la imagen como un CMSampleBufferRef al método detect(buffer:metadata:) de VisionFaceDetector o como una UIImage al método detect(image:metadata:).

  1. Obtén una instancia de 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. Si tu imagen no está orientada con la primera fila y columna de la esquina superior izquierda, crea un objeto VisionImageMetadata para especificar también la orientación de la imagen:

    Swift

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

    Objective-C

    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    metadata.orientation = FIRVisionDetectorImageOrientationTopRight;
    
    Si tu imagen está orientada con la primera fila y columna en la esquina superior izquierda, simplemente puedes pasar nil en lugar de un objeto de metadatos:
  3. Luego, pasa la imagen al método detect(buffer:metadata:) o 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;
    }
    

Obtén información sobre los rostros detectados

Si la operación de reconocimiento de rostros se ejecuta correctamente, el detector de rostros mostrará un arreglo de objetos VisionFaceFeature. Cada objeto VisionFaceFeature representa un rostro que se detectó en la imagen. Para cada rostro, puedes obtener las coordenadas de sus límites en la imagen de entrada, junto con cualquier otra información que encuentre el detector de rostros según la configuración que le asignaste. Por ejemplo:

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;
  }
}

Detección de rostros en la nube

Disponible próximamente