API GenAI Image Description

Con l'API GenAI Image Description di ML Kit, puoi generare descrizioni brevi dei contenuti per le immagini. Questa opzione può essere utile nei seguenti casi d'uso:

  • Generazione dei titoli delle immagini
  • Generazione di testo alternativo per aiutare gli utenti con disabilità visiva a comprendere meglio il contenuto delle immagini
  • Utilizzo delle descrizioni generate come metadati per aiutare gli utenti a cercare o organizzare le immagini
  • Utilizzare brevi descrizioni delle immagini quando l'utente non può guardare lo schermo, ad esempio quando guida o ascolta un podcast

Funzionalità chiave

  • Restituisce una breve descrizione per un'immagine di input.

Risultati di esempio

Ingresso Output
Un piccolo robot Android verde con un design simile a un cactus è seduto su
             una superficie nera. Un piccolo robot Android verde con un design simile a un cactus è seduto su una superficie nera.
Un piccolo cane bianco con naso nero e lingua rosa corre
                in un campo erboso con un ponte sullo sfondo. Un piccolo cane bianco con naso nero e lingua rosa corre in un campo erboso con un ponte sullo sfondo.

Per iniziare

Per iniziare a utilizzare l'API GenAI Image Description, aggiungi questa dipendenza al file di build del progetto.

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

Per integrare l'API Image Description nella tua app, devi innanzitutto ottenere un client ImageDescriber. Dopodiché, devi controllare lo stato delle funzionalità del modello sul dispositivo necessarie e scaricare il modello se non è già presente sul dispositivo. Dopo aver preparato l'input dell'immagine in un ImageDescriptionRequest, esegui l'inferenza utilizzando il client per ottenere il testo della descrizione dell'immagine e infine, ricordati di chiudere il client per rilasciare le risorse.

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

Funzionalità supportate e limitazioni

L'API GenAI Image Description supporta l'inglese e in futuro verranno aggiunte altre lingue. L'API restituisce una breve descrizione dell'immagine.

La disponibilità della configurazione di funzionalità specifica (specificata da ImageDescriberOptions) può variare in base alla configurazione del dispositivo specifico e ai modelli scaricati sul dispositivo.

Il modo più affidabile per gli sviluppatori per assicurarsi che la funzionalità API prevista sia supportata su un dispositivo con ImageDescriberOptions richiesto è chiamare il metodo checkFeatureStatus(). Questo metodo fornisce lo stato definitivo della disponibilità delle funzionalità sul dispositivo in fase di runtime.

Problemi di configurazione comuni

Le API ML Kit GenAI si basano sull'app Android AI Core per accedere a Gemini Nano. Quando un dispositivo viene appena configurato (incluso il ripristino) o l'app AICore viene appena ripristinata (ad es. cancellazione dei dati, disinstallazione e reinstallazione), l'app AICore potrebbe non avere tempo sufficiente per completare l'inizializzazione (incluso il download delle configurazioni più recenti dal server). Di conseguenza, le API ML Kit GenAI potrebbero non funzionare come previsto. Di seguito sono riportati i messaggi di errore di configurazione comuni che potresti visualizzare e come gestirli:

Esempio di messaggio di errore Come gestirla
AICore non è riuscito a eseguire l'operazione con il tipo di errore 4-CONNECTION_ERROR e il codice di errore 601-BINDING_FAILURE: il servizio AICore non è riuscito a eseguire il binding. Ciò può accadere quando installi l'app utilizzando le API ML Kit GenAI immediatamente dopo la configurazione del dispositivo o quando AICore viene disinstallato dopo l'installazione dell'app. L'aggiornamento dell'app AICore e la reinstallazione dell'app dovrebbero risolvere il problema.
AICore non è riuscito a completare l'operazione con il tipo di errore 3 - PREPARATION_ERROR e il codice di errore 606 - FEATURE_NOT_FOUND: la funzionalità ... non è disponibile. Ciò può accadere quando AICore non ha completato il download delle configurazioni più recenti. Quando il dispositivo è connesso a internet, l'aggiornamento richiede in genere da pochi minuti a qualche ora. Il riavvio del dispositivo può velocizzare l'aggiornamento.

Tieni presente che se il bootloader del dispositivo è sbloccato, visualizzerai anche questo errore. Questa API non supporta i dispositivi con bootloader sbloccati.
AICore non è riuscito a completare l'operazione con il tipo di errore 1-DOWNLOAD_ERROR e il codice di errore 0-UNKNOWN: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... Mantieni la connessione di rete, attendi qualche minuto e riprova.