API GenAI Image Description

Com a API GenAI Image Description do Kit de ML, é possível gerar descrições de conteúdo curtas para imagens. Isso pode ser útil nos seguintes casos de uso:

  • Gerar títulos de imagens
  • Gerar texto alternativo (alt text) para ajudar usuários com deficiência visual a entender melhor o conteúdo das imagens
  • Usar descrições geradas como metadados para ajudar os usuários a pesquisar ou organizar imagens
  • Usar descrições curtas de imagens quando o usuário não pode olhar para a tela, como quando está dirigindo ou ouvindo um podcast

Principais recursos

  • Retorna uma breve descrição de uma imagem de entrada

Resultados de exemplo

Entrada Saída
Um robô Android verde pequeno com um design semelhante a um cacto está sobre
             uma superfície preta. Um robô Android verde pequeno com um design semelhante a um cacto está sobre uma superfície preta.
Um cachorro pequeno e branco com o focinho preto e a língua rosa corre
                por um campo gramado com uma ponte ao fundo. Um cachorro pequeno e branco com o focinho preto e a língua rosa corre por um campo gramado com uma ponte ao fundo.

Primeiros passos

Para começar a usar a API GenAI Image Description, adicione essa dependência ao arquivo de build do projeto.

implementation("com.google.mlkit:genai-image-description:1.0.0-beta1")

Para integrar a API Image Description ao seu app, comece por conseguir um cliente ImageDescriber. Em seguida, verifique o status dos recursos necessários do modelo no dispositivo e faça o download do modelo, se ele ainda não estiver no dispositivo. Depois de preparar a entrada de imagem em um ImageDescriptionRequest, execute a inferência usando o cliente para receber o texto da descrição da imagem e, por fim, lembre-se de fechar o cliente para liberar os recursos.

Kotlin

// Create an image describer
val options = ImageDescriberOptions.builder(context).build()
val imageDescriber = ImageDescription.getClient(options)

suspend fun prepareAndStartImageDescription(
    bitmap: Bitmap
) {
  // Check feature availability, status will be one of the following:
  // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
  val featureStatus = imageDescriber.checkFeatureStatus().await()

  if (featureStatus == FeatureStatus.DOWNLOADABLE) {
      // Download feature if necessary.
      // If downloadFeature is not called, the first inference request
      // will also trigger the feature to be downloaded if it's not
      // already downloaded.
      imageDescriber.downloadFeature(object : DownloadCallback {
          override fun onDownloadStarted(bytesToDownload: Long) { }

          override fun onDownloadFailed(e: GenAiException) { }

          override fun onDownloadProgress(totalBytesDownloaded: Long) {}

          override fun onDownloadCompleted() {
              startImageDescriptionRequest(bitmap, imageDescriber)
          }
      })
  } else if (featureStatus == FeatureStatus.DOWNLOADING) {
      // Inference request will automatically run once feature is
      // downloaded.
      // If Gemini Nano is already downloaded on the device, the
      // feature-specific LoRA adapter model will be downloaded
      // very quickly. However, if Gemini Nano is not already
      // downloaded, the download process may take longer.
      startImageDescriptionRequest(bitmap, imageDescriber)
  } else if (featureStatus == FeatureStatus.AVAILABLE) {
      startImageDescriptionRequest(bitmap, imageDescriber)
  }
}

fun startImageDescriptionRequest(
    bitmap: Bitmap,
    imageDescriber: ImageDescriber
) {
    // Create task request
    val imageDescriptionRequest = ImageDescriptionRequest
        .builder(bitmap)
        .build()
}

  // Run inference with a streaming callback
  val imageDescriptionResultStreaming =
      imageDescriber.runInference(imageDescriptionRequest) { outputText ->
          // Append new output text to show in UI
          // This callback is called incrementally as the description
          // is generated
      }

  // You can also get a non-streaming response from the request
  // val imageDescription = imageDescriber.runInference(
  //        imageDescriptionRequest).await().description
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
imageDescriber.close()

Java

// Create an image describer
ImageDescriberOptions options = ImageDescriberOptions.builder(context).build();
ImageDescriber imageDescriber = ImageDescription.getClient(options);

void prepareAndStartImageDescription(
      Bitmap bitmap
) throws ExecutionException, InterruptedException {
  // Check feature availability, status will be one of the following:
  // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
  try {
      int featureStatus = imageDescriber.checkFeatureStatus().get();
      if (featureStatus == FeatureStatus.DOWNLOADABLE) {
          // Download feature if necessary.
          // If downloadFeature is not called, the first inference request
          // will also trigger the feature to be downloaded if it's not
          // already downloaded.
          imageDescriber.downloadFeature(new DownloadCallback() {
              @Override
              public void onDownloadCompleted() {
                  startImageDescriptionRequest(bitmap, imageDescriber);
              }

              @Override
              public void onDownloadFailed(GenAIException e) {}

              @Override
              public void onDownloadProgress(long totalBytesDownloaded) {}

              @Override
              public void onDownloadStarted(long bytesDownloaded) {}
          });
      } else if (featureStatus == FeatureStatus.DOWNLOADING) {
          // Inference request will automatically run once feature is
          // downloaded.
          // If Gemini Nano is already downloaded on the device, the
          // feature-specific LoRA adapter model will be downloaded
          // very quickly. However, if Gemini Nano is not already
          // downloaded, the download process may take longer.
          startImageDescriptionRequest(bitmap, imageDescriber);
      } else if (featureStatus == FeatureStatus.AVAILABLE) {
          startImageDescriptionRequest(bitmap, imageDescriber);
      }
  } catch (ExecutionException | InterruptedException e) {
      e.printStackTrace();
  }
}

void startImageDescriptionRequest(
     Bitmap bitmap,
     ImageDescriber imageDescriber
) {
  // Create task request
  ImageDescriptionRequest imageDescriptionRequest =
          ImageDescriptionRequest.builder(bitmap).build();

  // Start image description request with streaming response
  imageDescriber.runInference(imageDescriptionRequest, newText -> {
      // Append new output text to show in UI
      // This callback is called incrementally as the description
      // is generated
  });

  // You can also get a non-streaming response from the request
  // String imageDescription = imageDescriber.runInference(
  //        imageDescriptionRequest).get().getDescription();
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
imageDescriber.close();

Recursos compatíveis e limitações

A API GenAI Image Description oferece suporte ao inglês, e outros idiomas serão adicionados no futuro. A API retorna uma breve descrição da imagem.

A disponibilidade da configuração específica do recurso (especificada por ImageDescriberOptions) pode variar dependendo da configuração do dispositivo e dos modelos que foram transferidos por download para ele.

A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido tenha suporte em um dispositivo com o ImageDescriberOptions solicitado é chamar o método checkFeatureStatus(). Esse método fornece o status definitivo da disponibilidade do recurso no dispositivo no momento da execução.

Problemas comuns de configuração

As APIs GenAI do Kit de ML dependem do app Android AICore para acessar o Gemini Nano. Quando um dispositivo é configurado (incluindo redefinição) ou o app AICore é redefinido (por exemplo, dados limpos, desinstalado e reinstalado), o app AICore pode não ter tempo suficiente para concluir a inicialização, incluindo o download das configurações mais recentes do servidor. Como resultado, as APIs do ML Kit GenAI podem não funcionar como esperado. Confira as mensagens de erro comuns de configuração e como lidar com elas:

Exemplo de mensagem de erro Como lidar com
O AICore falhou com o tipo de erro 4-CONNECTION_ERROR e o código de erro 601-BINDING_FAILURE: o serviço AICore falhou na vinculação. Isso pode acontecer quando você instala o app usando as APIs do ML Kit GenAI imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado após a instalação do app. Atualize o app AICore e reinstale o app para corrigir o problema.
O AICore falhou com o tipo de erro 3-PREPARATION_ERROR e o código de erro 606-FEATURE_NOT_FOUND: o recurso ... não está disponível. Isso pode acontecer quando o AICore não termina de fazer o download das configurações mais recentes. Mantenha a conexão de rede e aguarde de alguns minutos a algumas horas.

Se o carregador de inicialização do dispositivo estiver desbloqueado, esse erro também vai aparecer. Essa API não oferece suporte a dispositivos com carregador de inicialização desbloqueado.
O AICore falhou com o tipo de erro 1-DOWNLOAD_ERROR e o código de erro 0-UNKNOWN: o recurso ... falhou com o status de falha 0 e o erro esz: INDISPONÍVEL: não foi possível resolver o host ... Mantenha a conexão de rede, aguarde alguns minutos e tente novamente.