Mit der GenAI Image Description API von ML Kit können Sie kurze Inhaltsbeschreibungen für Bilder generieren. Das kann in folgenden Anwendungsfällen nützlich 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 Beschreibungen von Bildern, wenn der Nutzer nicht auf den Bildschirm schauen kann, z. B. beim Autofahren oder beim Anhören eines Podcasts
Hauptmerkmale
- Gibt eine kurze Beschreibung für ein Eingabebild zurück
Beispielergebnisse
Eingabe | Ausgabe |
![]() |
Ein kleiner, grüner Android-Roboter mit kaktusartigem Design sitzt auf einer schwarzen Oberfläche. |
![]() |
Ein kleiner, weißer Hund mit schwarzer Nase und rosa Zunge rennt über eine Wiese mit einer Brücke im Hintergrund. |
Erste Schritte
Wenn Sie die GenAI Image Description API verwenden möchten, fügen Sie diese Abhängigkeit der Build-Datei Ihres Projekts hinzu.
implementation("com.google.mlkit:genai-image-description:1.0.0-beta1")
Um die Image Description API in Ihre App einzubinden, müssen Sie zuerst einen ImageDescriber
-Client abrufen. Anschließend müssen Sie den Status der erforderlichen On-Device-Modellfunktionen prüfen und das Modell herunterladen, falls es noch nicht auf dem Gerät vorhanden ist. Nachdem Sie die Bildeingabe in einem ImageDescriptionRequest
vorbereitet haben, führen Sie die Inferenz mit dem Client aus, um den Text der Bildbeschreibung zu erhalten. Schließen Sie den Client schließlich, 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 Englisch. Weitere Sprachen werden in Zukunft hinzugefügt. Die API gibt eine kurze Beschreibung des Bildes zurück.
Die Verfügbarkeit der spezifischen Funktionskonfiguration (angegeben durch ImageDescriberOptions
) kann je nach Konfiguration des jeweiligen Geräts 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 dem angeforderten ImageDescriberOptions
unterstützt wird, ist der Aufruf der Methode checkFeatureStatus()
. Diese Methode liefert den endgültigen Status der Verfügbarkeit von Funktionen auf dem Gerät zur Laufzeit.
Häufig auftretende Probleme bei der Einrichtung
Für den Zugriff auf Gemini Nano sind die ML Kit GenAI-APIs auf die Android AICore App angewiesen. Wenn ein Gerät gerade eingerichtet (einschließlich Zurücksetzen) oder die AICore App gerade zurückgesetzt wurde (z.B. Daten löschen, deinstallieren und neu installieren), hat die AICore App möglicherweise nicht genügend Zeit, die Initialisierung abzuschließen (einschließlich des Herunterladens der neuesten Konfigurationen vom Server). Daher funktionieren die ML Kit GenAI-APIs möglicherweise nicht wie erwartet. Hier finden Sie häufige Fehlermeldungen, die während der Einrichtung angezeigt werden, und Informationen dazu, wie Sie sie beheben können:
Beispiel für Fehlermeldung | Vorgehensweise |
AICore ist mit dem Fehlertyp 4-CONNECTION_ERROR und dem Fehlercode 601-BINDING_FAILURE fehlgeschlagen: Der AICore-Dienst konnte nicht gebunden werden. | Das kann passieren, wenn Sie die App mit ML Kit GenAI-APIs unmittelbar nach der Einrichtung des Geräts installieren oder wenn AICore nach der Installation Ihrer App deinstalliert wird. Wenn Sie die AICore App aktualisieren und Ihre App dann neu installieren, sollte das Problem behoben sein. |
AICore ist mit dem Fehlertyp 3-PREPARATION_ERROR und dem Fehlercode 606-FEATURE_NOT_FOUND fehlgeschlagen: Das Feature … ist nicht verfügbar. |
Das kann passieren, wenn AICore die neuesten Konfigurationen noch nicht vollständig heruntergeladen hat. Wenn das Gerät mit dem Internet verbunden ist, dauert die Aktualisierung in der Regel einige Minuten bis einige Stunden. Ein Neustart des Geräts kann das Update beschleunigen.
Hinweis: Wenn der Bootloader des Geräts entsperrt ist, wird dieser Fehler ebenfalls angezeigt. Diese API unterstützt keine Geräte mit entsperrten Bootloadern. |
AICore ist mit dem Fehlertyp 1-DOWNLOAD_ERROR und dem Fehlercode 0-UNKNOWN fehlgeschlagen: Die Funktion ... ist mit dem Fehlerstatus 0 und dem Fehler esz: UNAVAILABLE fehlgeschlagen: Der Host ... konnte nicht aufgelöst werden. | Lassen Sie die Netzwerkverbindung bestehen, warten Sie einige Minuten und versuchen Sie es dann noch einmal. |