GenAI Image Description API

С помощью GenAI Image Description API в ML Kit можно генерировать короткие описания изображений. Это может быть полезно в следующих случаях:

  • Генерирование названий изображений
  • Создание альтернативного текста, чтобы помочь пользователям с нарушениями зрения лучше понимать содержание изображений.
  • Использование сгенерированных описаний в качестве метаданных, чтобы пользователям было проще искать и упорядочивать изображения.
  • Использование кратких описаний изображений, когда пользователь не может смотреть на экран, например когда он за рулем или слушает подкаст.

Основные возможности

  • Возвращает краткое описание для входного изображения.

Пример результатов

Ввод данных Выходные данные
Маленький зеленый робот Android, похожий на кактус, сидит на черной поверхности. Маленький зеленый робот Android, похожий на кактус, сидит на черной поверхности.
Маленькая белая собака с черным носом и розовым языком бежит по траве. На заднем плане виден мост. Маленькая белая собака с черным носом и розовым языком бежит по траве. На заднем плане виден мост.

Начало работы

Чтобы начать работу с GenAI Image Description API, добавьте эту зависимость в файл сборки проекта.

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

Чтобы интегрировать Image Description API в приложение, сначала получите клиент ImageDescriber. Затем необходимо проверить статус нужных функций модели на устройстве и скачать модель, если она ещё не установлена. Подготовив входные данные изображения в ImageDescriptionRequest, вы запускаете инференс с помощью клиента, чтобы получить текстовое описание изображения, и, наконец, не забудьте закрыть клиент, чтобы освободить ресурсы.

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();

Поддерживаемые функции и ограничения

API описания изображений на основе ИИ поддерживает английский язык. В будущем мы планируем добавить поддержку других языков. API возвращает краткое описание изображения.

Доступность определенной конфигурации функции (указанной в ImageDescriberOptions) может зависеть от конфигурации конкретного устройства и моделей, которые были на него скачаны.

Чтобы убедиться, что на устройстве с запрошенной версией ImageDescriberOptions поддерживается нужная функция API, разработчики могут вызвать метод checkFeatureStatus(). Этот метод позволяет определить, доступна ли функция на устройстве во время выполнения.

Распространенные проблемы с настройкой

API GenAI в ML Kit используют приложение Android AICore для доступа к Gemini Nano. Если устройство только что настроено (в том числе после сброса) или приложение AICore только что сброшено (например, удалены данные, а затем приложение удалено и установлено заново), у приложения AICore может не быть достаточно времени для завершения инициализации (включая скачивание последних конфигураций с сервера). В результате API генеративного ИИ ML Kit могут работать неправильно. Ниже приведены распространенные сообщения об ошибках, которые могут появляться при настройке, и способы их устранения.

Пример сообщения об ошибке Как действовать
AICore не удалось запустить из-за ошибки типа 4 (CONNECTION_ERROR) и кода ошибки 601 (BINDING_FAILURE): не удалось привязать сервис AICore. Это может произойти, если вы установите приложение, использующее ML Kit GenAI API, сразу после настройки устройства или если AICore будет удален после установки приложения. Обновите приложение AICore, а затем переустановите свое приложение.
AICore не удалось запустить из-за ошибки типа 3 (PREPARATION_ERROR) и кода ошибки 606 (FEATURE_NOT_FOUND): функция "..." недоступна. Это может произойти, если AICore ещё не скачал последние конфигурации. Когда устройство подключено к интернету, обновление обычно занимает от нескольких минут до нескольких часов. Перезагрузка устройства может ускорить обновление.

Обратите внимание, что если загрузчик операционной системы устройства разблокирован, вы также увидите эту ошибку. API не поддерживает устройства с разблокированными загрузчиками операционной системы.
Ошибка AICore типа 1 (DOWNLOAD_ERROR) с кодом ошибки 0 (UNKNOWN): функция ... не выполнена со статусом 0 и ошибкой esz: UNAVAILABLE: не удается разрешить хост ... Сохраните подключение к сети, подождите несколько минут и повторите попытку.

Образец кода