API de GenAI Image Description

Con la API de GenAI Image Description de ML Kit, puedes generar descripciones de contenido breves para las imágenes. Esto puede ser útil en los siguientes casos de uso:

  • Generar títulos de imágenes
  • Generar texto alternativo (alt text) para ayudar a los usuarios con discapacidad visual a comprender mejor el contenido de las imágenes
  • Usar descripciones generadas como metadatos para ayudar a los usuarios a buscar o organizar imágenes
  • Usar descripciones breves de las imágenes cuando el usuario no puede mirar la pantalla, por ejemplo, cuando conduce o escucha un podcast

Funciones clave

  • Muestra una descripción breve de una imagen de entrada

Resultados de ejemplo

Entrada Resultado
Un pequeño robot verde de Android con un diseño similar al de un cactus se encuentra sobre una superficie negra. Un pequeño robot verde de Android con un diseño similar al de un cactus se encuentra sobre una superficie negra.
Un perro pequeño y blanco con la nariz negra y la lengua rosada corre por un campo cubierto de hierba con un puente en el fondo. Un perro pequeño y blanco con la nariz negra y la lengua rosada corre por un campo cubierto de hierba con un puente en el fondo.

Comenzar

Para comenzar a usar la API de GenAI Image Description, agrega esta dependencia al archivo de compilación de tu proyecto.

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

Para integrar la API de Image Description en tu app, primero debes obtener un cliente de ImageDescriber. Luego, debes verificar el estado de las funciones necesarias del modelo integrado en el dispositivo y descargarlo si aún no está en el dispositivo. Después de preparar la entrada de imagen en un ImageDescriptionRequest, ejecutas la inferencia con el cliente para obtener el texto de la descripción de la imagen y, por último, recuerda cerrar el cliente para liberar 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();

Funciones admitidas y limitaciones

La API de GenAI Image Description admite el inglés y se agregará compatibilidad con más idiomas en el futuro. La API muestra una descripción breve de la imagen.

La disponibilidad de la configuración de la función específica (especificada por ImageDescriberOptions) puede variar según la configuración del dispositivo en particular y los modelos que se descargaron en él.

La forma más confiable para que los desarrolladores se aseguren de que la función de API prevista sea compatible con un dispositivo con el ImageDescriberOptions solicitado es llamar al método checkFeatureStatus(). Este método proporciona el estado definitivo de la disponibilidad de funciones en el dispositivo durante el tiempo de ejecución.

Problemas comunes de configuración

Las APIs de IA generativa de ML Kit dependen de la app de Android AICore para acceder a Gemini Nano. Cuando un dispositivo se acaba de configurar (incluidos los restablecimientos) o se acaba de restablecer la app de AICore (p.ej., se borraron los datos, se desinstaló y se volvió a instalar), es posible que la app de AICore no tenga suficiente tiempo para terminar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de GenAI de ML Kit no funcionen como se espera. Estos son los mensajes de error de configuración comunes que podrías ver y cómo manejarlos:

Ejemplo de mensaje de error Cómo manejar
AICore falló con el tipo de error 4-CONNECTION_ERROR y el código de error 601-BINDING_FAILURE: No se pudo vincular el servicio de AICore. Esto puede ocurrir cuando instalas la app con las APIs de GenAI de ML Kit inmediatamente después de la configuración del dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar la tuya debería solucionar el problema.
AICore falló con el tipo de error 3-PREPARATION_ERROR y el código de error 606-FEATURE_NOT_FOUND: La función ... no está disponible. Esto puede suceder cuando AICore no terminó de descargar las configuraciones más recientes. Mantén la conexión de red y espera unos minutos o unas horas.

Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error. Esta API no es compatible con dispositivos con bootloaders desbloqueados.
AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: Feature ... falló con el estado de error 0 y el error esz: UNAVAILABLE: Unable to resolve host ... Mantén la conexión de red, espera unos minutos y vuelve a intentarlo.