Ir para o console

Detectar rótulos com o ML Kit no Android

É possível usar o ML Kit para identificar objetos reconhecidos em uma imagem.

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'
    

Configurar o detector de rótulo

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 rótulo

Para identificar objetos em uma imagem, passe a imagem como um objeto ByteBuffer ao método FirebaseVisionCloudLabelDetector do detectInBuffer ou como um objeto android.graphics.Bitmap ao método detectInImage.

  1. Receba uma instância de FirebaseVisionCloudLabelDetector:

    FirebaseVisionCloudLabelDetector detector = FirebaseVision.getInstance()
        .getVisionCloudLabelDetector(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<FirebaseVisionCloudLabel>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionCloudLabel>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionCloudLabel> label) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

Receber informações sobre os objetos identificados

Se a operação de reconhecimento de rótulo for bem-sucedida, uma matriz de objetos FirebaseVisionCloudLabel será passada ao listener de êxito. Cada objeto FirebaseVisionCloudLabel representa algo que foi identificado na imagem. Para cada rótulo, é possível receber as coordenadas delimitadoras na imagem de entrada, o código da entidade do Mapa do conhecimento do rótulo (se disponível) e a pontuação de confiança da correspondência. Por exemplo:

for(int i = 0; i < labels.size(); i++) {
  FirebaseVisionCloudLabel label = labels.valueAt(i);

  Rect bounds = label.getBoundingBox();
  String label = label.getLabel();
  String entityId = label.getEntityId();
  float confidence = label.getScore();
}