Ir para o console

Detectar faces com o ML Kit no Android

Você pode usar o ML Kit para detectar faces em imagens e vídeos usando um modelo no dispositivo ou um modelo em nuvem. Consulte a visão geral para saber mais sobre os benefícios de cada abordagem.

Antes de começar

  1. Configure um projeto do Firebase:
    1. Crie um projeto do Firebase no Firebase console, caso você ainda não tenha um. Se você já tiver um projeto do Google associado ao aplicativo para dispositivos móveis, clique em Importar projeto do Google. Do contrário, clique em Adicionar projeto.
    2. Clique em Adicionar o Firebase ao aplicativo para Android e siga as etapas de configuração. Se você estiver importando um projeto existente do Google, isso poderá acontecer automaticamente. Basta fazer o download do arquivo de configuração.
    3. Quando solicitado, digite o nome do pacote do app. É importante inserir o nome do pacote que o app está usando. Isso só poderá ser definido quando você adicionar um app ao projeto do Firebase.
    4. Ao final, você fará o download de um arquivo google-services.json. É possível fazer o download do arquivo de configuração novamente a qualquer momento.
    5. Caso ainda não tenha feito isso, copie o arquivo para a pasta do módulo do projeto, normalmente app/.
  2. Extraia o SDK recebido do contato EAP:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. Adicione o diretório no qual você incluiu o SDK e o plug-in google-services ao build.gradle do nível do projeto:
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. Em seguida, inclua a dependência do ML Kit e adicione a linha apply plugin ao arquivo build.gradle do nível do projeto:

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

Você já pode detectar faces usando um modelo no dispositivo ou baseado na nuvem.

Detecção de face no dispositivo

Configurar o detector de face

Antes de aplicar a detecção de face a uma imagem, se você quiser alterar as configurações padrão do detector de face, especifique essas configurações com um objeto FirebaseVisionFaceDetectorOptions. É possível alterar as seguintes configurações:

Configurações
Modo de detecção FAST_MODE (padrão) | ACCURATE_MODE

Favoreça a velocidade ou a precisão durante a detecção de faces.

Detectar pontos de referência NO_LANDMARKS (padrão) | ALL_LANDMARKS

Se é necessário identificar ou não "pontos de referência" faciais: olhos, orelhas, narizes, bochechas e bocas.

Classificar faces NO_CLASSIFICATIONS (padrão) | ALL_CLASSIFICATIONS

Se é necessário classificar faces em categorias como "sorrindo" e "olhos abertos".

Tamanho mínimo da face float (padrão: 0.1f)

O tamanho mínimo, relativo à imagem, de faces a serem detectadas.

Ativar rastreamento de face false (padrão) | true

Se é necessário atribuir um código a faces, que pode ser usado para rastrear faces em imagens.

Por exemplo, para alterar todas as configurações padrão, crie um objeto FirebaseVisionFaceDetectorOptions como no seguinte exemplo:

FirebaseVisionFaceDetectorOptions options =
    new FirebaseVisionFaceDetectorOptions.Builder()
        .setModeType(FirebaseVisionFaceDetectorOptions.ACCURATE_MODE)
        .setLandmarkType(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
        .setClassificationType(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
        .setMinFaceSize(0.2f)
        .setTrackingEnabled(true)
        .build();

Executar o detector de face

Para reconhecer faces em uma imagem, passe a imagem como um objeto ByteBuffer ao método FirebaseVisionFaceDetector do detectInBuffer ou a imagem como um objeto android.graphics.Bitmap ao método detectInImage.

  1. Receba uma instância de FirebaseVisionFaceDetector:

    FirebaseVisionFaceDetector detector = FirebaseVision.getInstance()
        .getVisionFaceDetector(options);
    
  2. Crie um objeto FirebaseVisionImageMetadata que contenha os metadados da imagem.

    Se estiver passando a imagem como um ByteBuffer, você precisará especificar a altura, a largura, o formato de codificação da cor e a orientação da imagem:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    Se você estiver passando a imagem como um Bitmap, bastará especificar a orientação da imagem:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Por fim, passe a imagem ao método detectInBuffer ou detectInImage:

    Task<SparseArray<FirebaseVisionFace>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionFace>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionFace> faces) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

Receber informações sobre faces detectadas

Se a operação de reconhecimento de face for bem-sucedida, uma matriz de objetos FirebaseVisionFace será passada para o listener de êxito. Cada objeto FirebaseVisionFace representa uma face detectada na imagem. Para cada face, é possível receber as coordenadas delimitadoras na imagem de entrada, bem como qualquer outra informação configurada no detector de face a ser encontrada. Por exemplo:

for(int i = 0; i < faces.size(); i++) {
  FirebaseVisionFace face = faces.valueAt(i);

  Rect bounds = face.getBoundingBox();
  if (face.hasHeadEulerAngleY()) {
    float rotY = face.getHeadEulerAngleY();  // Head is rotated to the right rotY degrees
  }
  if (face.hasHeadEulerAngleZ()) {
    float rotZ = face.getHeadEulerAngleZ();  // Head is rotated upward rotZ degrees
  }

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

  // If classification was enabled:
  if (face.hasSmilingProbability()) {
    float smileProb = face.getSmilingProbability();
  }
  if (face.hasRightEyeOpenProbability()) {
    float rightEyeOpenProb = face.getRightEyeOpenProbability();
  }

  // If face tracking was enabled:
  if (face.hasTrackingId()) {
    int id = face.getTrackingId();
  }
}

Detecção de face em nuvem

Configurar o detector de face

Por padrão, o detector do Cloud usa a versão STABLE do modelo e retorna até 10 resultados. Se você quiser alterar alguma dessas configurações, especifique-as com um objeto FirebaseVisionCloudDetectorOptions.

Por exemplo, para alterar as duas configurações padrão, crie um objeto FirebaseVisionCloudDetectorOptions como é mostrado a seguir:

FirebaseVisionCloudDetectorOptions options =
    new FirebaseVisionCloudDetectorOptions.Builder()
        .setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
        .setMaxResults(15)
        .build();

Para aplicar as configurações padrão, é possível usar FirebaseVisionCloudDetectorOptions.DEFAULT na próxima etapa.

Executar o detector de face

Para reconhecer faces em uma imagem, passe a imagem como um objeto ByteBuffer ao método FirebaseVisionCloudFaceDetector do detectInBuffer ou como um objeto android.graphics.Bitmap ao método detectInImage.

  1. Receba uma instância de FirebaseVisionCloudFaceDetector:

    FirebaseVisionCloudFaceDetector detector = FirebaseMachineLearning.getInstance()
        .getVisionFaceDetector(options);
    
  2. Crie um objeto FirebaseVisionImageMetadata que contenha os metadados da imagem.

    Se estiver passando a imagem como um ByteBuffer, você precisará especificar a altura, a largura, o formato de codificação da cor e a orientação da imagem:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    Se você estiver passando a imagem como um Bitmap, bastará especificar a orientação da imagem:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Por fim, passe a imagem ao método detectInBuffer ou detectInImage:

    Task<SparseArray<FirebaseVisionCloudFace>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionCloudFace>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionCloudFace> faces) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

Receber informações sobre faces detectadas

Se a operação de reconhecimento de face for bem-sucedida, uma matriz de objetos FirebaseVisionCloudFace será passada para o listener de êxito. Cada objeto FirebaseVisionCloudFace representa uma face detectada na imagem. Para cada face, é possível receber as coordenadas delimitadoras na imagem de entrada, a rotação relativa à câmera e o local de traços faciais reconhecidos. Por exemplo:

for(int i = 0; i < faces.size(); i++) {
  FirebaseVisionFace face = faces.valueAt(i);

  // Face position and rotation
  Rect bounds = face.getBoundingBox();
  float rotY = face.getHeadEulerAngleY();  // Head is rotated to the right rotY degrees
  float rotZ = face.getHeadEulerAngleZ();  // Head is rotated upward rotZ degrees

  // Facial features
  PointF leftEarPos = face.getLeftEarPosition();
  PointF nosePos = face.getNoseBasePosition();

  // Face classification
  float sorrowProb = face.getSorrowProbability();
  float rightEyeOpenProb = face.getRightEyeOpenProbability();
}