Dzięki interfejsowi GenAI Image Description API w ML Kit możesz generować krótkie opisy obrazów. Może to być przydatne w tych przypadkach:
- generowanie tytułów obrazów;
- generowanie tekstu alternatywnego, aby pomóc użytkownikom niedowidzącym lepiej zrozumieć zawartość obrazów;
- używanie wygenerowanych opisów jako metadanych, aby ułatwić użytkownikom wyszukiwanie i porządkowanie obrazów;
- wykorzystywanie krótkich opisów obrazów, gdy użytkownik nie może patrzeć na ekran, np. podczas jazdy lub słuchania podcastu.
Najważniejsze funkcje
- Zwracanie krótkiego opisu obrazu wejściowego.
Przykładowe wyniki
| Wejście | Wyjście |
|
Mały, zielony robot Android o wyglądzie kaktusa siedzi na czarnej powierzchni. |
|
Mały, biały pies z czarnym nosem i różowym językiem biegnie po trawiastym polu z mostem w tle. |
Pierwsze kroki
Aby rozpocząć korzystanie z interfejsu GenAI Image Description API, dodaj tę zależność do pliku kompilacji projektu.
implementation("com.google.mlkit:genai-image-description:1.0.0-beta1")
Aby zintegrować interfejs Image Description API z aplikacją, zacznij od pobrania
klienta ImageDescriber. Następnie musisz sprawdzić stan niezbędnych funkcji modelu na urządzeniu i pobrać model, jeśli nie ma go jeszcze na urządzeniu. Po przygotowaniu obrazu wejściowego w ImageDescriptionRequest,
uruchom wnioskowanie za pomocą klienta, aby uzyskać tekst opisu obrazu. Na
koniec zamknij klienta, aby zwolnić zasoby.
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();
Obsługiwane funkcje i ograniczenia
Interfejs GenAI Image Description API obsługuje język angielski. W przyszłości dodamy obsługę kolejnych języków. Interfejs API zwraca krótki opis obrazu.
Dostępność konkretnej konfiguracji funkcji (określonej przez ImageDescriberOptions) może się różnić w zależności od konfiguracji urządzenia i modeli pobranych na urządzenie.
Najbardziej niezawodnym sposobem, aby deweloperzy mogli się upewnić, że żądana funkcja interfejsu API jest
obsługiwana na urządzeniu z żądanymi ImageDescriberOptions jest wywołanie metody
checkFeatureStatus(). Ta metoda podaje ostateczny stan dostępności funkcji na urządzeniu w czasie działania.
Typowe problemy z konfiguracją
Interfejsy ML Kit GenAI API korzystają z aplikacji Android AICore, aby uzyskać dostęp do Gemini Nano. Gdy urządzenie jest dopiero skonfigurowane (w tym zresetowane) lub aplikacja AICore jest dopiero zresetowana (np. wyczyszczono dane, odinstalowano i ponownie zainstalowano), aplikacja AICore może nie mieć wystarczająco dużo czasu na zakończenie inicjowania (w tym pobranie najnowszych konfiguracji z serwera). W rezultacie interfejsy ML Kit GenAI API mogą nie działać zgodnie z oczekiwaniami. Oto typowe komunikaty o błędach konfiguracji, które mogą się pojawić, oraz sposoby ich obsługi:
| Przykładowy komunikat o błędzie | Jak odpowiedzieć |
| AICore failed with error type 4-CONNECTION_ERROR and error code 601-BINDING_FAILURE: AICore service failed to bind. | Może się to zdarzyć, gdy zainstalujesz aplikację za pomocą interfejsów ML Kit GenAI API natychmiast po skonfigurowaniu urządzenia lub gdy aplikacja AICore zostanie odinstalowana po zainstalowaniu aplikacji. Problem powinien rozwiązać się po zaktualizowaniu aplikacji AICore i ponownym zainstalowaniu aplikacji. |
| AICore failed with error type 3-PREPARATION_ERROR and error code 606-FEATURE_NOT_FOUND: Feature ... is not available. |
Może się to zdarzyć, gdy aplikacja AICore nie zakończyła pobierania najnowszych konfiguracji. Gdy urządzenie jest połączone z internetem, aktualizacja trwa zwykle od kilku minut do kilku godzin. Ponowne uruchomienie urządzenia może przyspieszyć aktualizację.
Pamiętaj, że jeśli program rozruchowy urządzenia jest bez blokady SIM, też zobaczysz ten błąd – ten interfejs API nie obsługuje urządzeń z programem rozruchowym bez blokady SIM. |
| AICore failed with error type 1-DOWNLOAD_ERROR and error code 0-UNKNOWN: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... | Utrzymuj połączenie z siecią, poczekaj kilka minut i spróbuj ponownie. |