GenAI Image Description API

Mit der GenAI Image Description API von ML Kit können Sie kurze Inhaltsbeschreibungen für Bilder generieren. Das kann in folgenden Anwendungsfällen hilfreich sein:

  • Titel für Bilder generieren
  • Generieren von Alternativtext (Alt-Text), damit sehbehinderte Nutzer den Inhalt von Bildern besser verstehen können
  • Generierte Beschreibungen als Metadaten verwenden, um Nutzern bei der Suche oder Organisation von Bildern zu helfen
  • Kurze Bildbeschreibungen verwenden, wenn Nutzer ihren Bildschirm nicht sehen können, z. B. wenn sie fahren oder sich einen Podcast anhören

Hauptmerkmale

  • Eine kurze Beschreibung für ein Eingabebild zurückgeben

Beispielergebnisse

Eingabe Ausgabe
Ein kleiner, grüner Android-Roboter mit kaktusähnlichem Design sitzt auf einer schwarzen Oberfläche. Ein kleiner, grüner Android-Roboter mit kaktusähnlichem Design sitzt auf einer schwarzen Oberfläche.
Ein kleiner, weißer Hund mit einer schwarzen Nase und einer rosa Zunge läuft über eine Wiese mit einer Brücke im Hintergrund. Ein kleiner, weißer Hund mit einer schwarzen Nase und einer rosa Zunge läuft über eine Wiese mit einer Brücke im Hintergrund.

Erste Schritte

Wenn Sie mit der GenAI Image Description API beginnen möchten, fügen Sie der Build-Datei Ihres Projekts diese Abhängigkeit hinzu.

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

Wenn Sie die Image Description API in Ihre App einbinden möchten, müssen Sie zuerst einen ImageDescriber-Client abrufen. Prüfen Sie dann den Status der erforderlichen On-Device-Modellfunktionen und laden Sie das Modell herunter, falls es noch nicht auf dem Gerät vorhanden ist. Nachdem Sie Ihre Bilddaten in einem ImageDescriptionRequest vorbereitet haben, führen Sie die Inferenz mit dem Client aus, um den Text der Bildbeschreibung zu erhalten. Denken Sie abschließend daran, den Client zu schließen, um Ressourcen freizugeben.

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

Unterstützte Funktionen und Einschränkungen

Die GenAI Image Description API unterstützt derzeit die englische Sprache. Weitere Sprachen werden in Zukunft hinzugefügt. Die API gibt eine kurze Beschreibung des Bildes zurück.

Die Verfügbarkeit der spezifischen Funktionskonfiguration (ImageDescriberOptions) kann je nach Gerätekonfiguration und den auf das Gerät heruntergeladenen Modellen variieren.

Die zuverlässigste Methode für Entwickler, um sicherzustellen, dass die gewünschte API-Funktion auf einem Gerät mit der angeforderten ImageDescriberOptions unterstützt wird, ist das Aufrufen der Methode checkFeatureStatus(). Diese Methode liefert den endgültigen Status der Funktionsverfügbarkeit auf dem Gerät zur Laufzeit.

Häufig auftretende Probleme bei der Einrichtung

ML Kit GenAI APIs nutzen die Android AICore App, um auf Gemini Nano zuzugreifen. Wenn ein Gerät gerade eingerichtet (einschließlich Zurücksetzen) oder die AICore App gerade zurückgesetzt wurde (z.B. Daten gelöscht, deinstalliert und dann neu installiert), hat die AICore App möglicherweise nicht genug Zeit, die Initialisierung abzuschließen (einschließlich Herunterladen der neuesten Konfigurationen vom Server). Daher funktionieren die ML Kit GenAI APIs möglicherweise nicht wie erwartet. Im Folgenden finden Sie häufige Fehlermeldungen bei der Einrichtung und wie Sie damit umgehen können:

Beispiel für Fehlermeldung Vorgehensweise
AICore-Fehler vom Typ 4-CONNECTION_ERROR mit dem Fehlercode 601-BINDING_FAILURE: Die Bindung des AICore-Dienstes ist fehlgeschlagen. Das kann passieren, wenn Sie die App mit ML Kit GenAI APIs direkt nach der Geräteeinrichtung installieren oder wenn AICore nach der Installation Ihrer App deinstalliert wird. Wenn Sie die AICore App aktualisieren und dann Ihre App neu installieren, sollte das Problem behoben werden.
AICore-Fehler vom Typ 3-PREPARATION_ERROR mit dem Fehlercode 606-FEATURE_NOT_FOUND: Die Funktion „…“ ist nicht verfügbar. Das kann passieren, wenn AICore noch nicht mit dem Herunterladen der neuesten Konfigurationen fertig ist. Behalten Sie die Netzwerkverbindung aufrecht und warten Sie einige Minuten bis zu mehrere Stunden.

Hinweis: Wenn der Bootloader des Geräts entsperrt ist, wird auch dieser Fehler angezeigt. Diese API unterstützt keine Geräte mit entsperrtem Bootloader.
AICore-Fehler vom Typ „1-DOWNLOAD_ERROR“ mit dem Fehlercode „0-UNKNOWN“: Die Funktion „…“ ist mit dem Fehlerstatus „0“ und dem Fehler „esz: UNAVAILABLE: Unable to resolve host…“ fehlgeschlagen. Behalten Sie die Netzwerkverbindung aufrecht, warten Sie einige Minuten und versuchen Sie es noch einmal.