Com a API GenAI Image Description do Kit de ML, é possível gerar descrições de conteúdo curtas para imagens. Isso pode ser útil nos seguintes casos de uso:
- Gerar títulos de imagens
- Gerar texto alternativo (alt text) para ajudar usuários com deficiência visual a entender melhor o conteúdo das imagens
- Usar descrições geradas como metadados para ajudar os usuários a pesquisar ou organizar imagens
- Usar descrições curtas de imagens quando o usuário não pode olhar para a tela, como quando está dirigindo ou ouvindo um podcast
Principais recursos
- Retorna uma breve descrição de uma imagem de entrada
Resultados de exemplo
Entrada | Saída |
![]() |
Um robô Android verde pequeno com um design semelhante a um cacto está sobre uma superfície preta. |
![]() |
Um cachorro pequeno e branco com o focinho preto e a língua rosa corre por um campo gramado com uma ponte ao fundo. |
Primeiros passos
Para começar a usar a API GenAI Image Description, adicione essa dependência ao arquivo de build do projeto.
implementation("com.google.mlkit:genai-image-description:1.0.0-beta1")
Para integrar a API Image Description ao seu app, comece por conseguir
um cliente ImageDescriber
. Em seguida, verifique o status dos recursos necessários
do modelo no dispositivo e faça o download do modelo, se ele ainda não estiver no
dispositivo. Depois de preparar a entrada de imagem em um ImageDescriptionRequest
,
execute a inferência usando o cliente para receber o texto da descrição da imagem e, por fim, lembre-se de fechar o cliente para liberar os 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();
Recursos compatíveis e limitações
A API GenAI Image Description oferece suporte ao inglês, e outros idiomas serão adicionados no futuro. A API retorna uma breve descrição da imagem.
A disponibilidade da configuração específica do recurso (especificada por
ImageDescriberOptions
) pode variar dependendo da configuração do dispositivo
e dos modelos que foram transferidos por download para ele.
A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido tenha
suporte em um dispositivo com o ImageDescriberOptions
solicitado é chamar o método
checkFeatureStatus()
. Esse método fornece o status definitivo
da disponibilidade do recurso no dispositivo no momento da execução.
Problemas comuns de configuração
As APIs GenAI do Kit de ML dependem do app Android AICore para acessar o Gemini Nano. Quando um dispositivo é configurado (incluindo redefinição) ou o app AICore é redefinido (por exemplo, dados limpos, desinstalado e reinstalado), o app AICore pode não ter tempo suficiente para concluir a inicialização, incluindo o download das configurações mais recentes do servidor. Como resultado, as APIs do ML Kit GenAI podem não funcionar como esperado. Confira as mensagens de erro comuns de configuração e como lidar com elas:
Exemplo de mensagem de erro | Como lidar com |
O AICore falhou com o tipo de erro 4-CONNECTION_ERROR e o código de erro 601-BINDING_FAILURE: o serviço AICore falhou na vinculação. | Isso pode acontecer quando você instala o app usando as APIs do ML Kit GenAI imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado após a instalação do app. Atualize o app AICore e reinstale o app para corrigir o problema. |
O AICore falhou com o tipo de erro 3-PREPARATION_ERROR e o código de erro 606-FEATURE_NOT_FOUND: o recurso ... não está disponível. |
Isso pode acontecer quando o AICore não termina de fazer o download das configurações mais recentes. Mantenha a conexão de rede e aguarde de alguns minutos a algumas horas.
Se o carregador de inicialização do dispositivo estiver desbloqueado, esse erro também vai aparecer. Essa API não oferece suporte a dispositivos com carregador de inicialização desbloqueado. |
O AICore falhou com o tipo de erro 1-DOWNLOAD_ERROR e o código de erro 0-UNKNOWN: o recurso ... falhou com o status de falha 0 e o erro esz: INDISPONÍVEL: não foi possível resolver o host ... | Mantenha a conexão de rede, aguarde alguns minutos e tente novamente. |