GenAI Image Description API

ML Kit'in GenAI Resim Açıklaması API'si ile resimler için kısa içerik açıklamaları oluşturabilirsiniz. Bu, aşağıdaki kullanım alanlarında yararlı olabilir:

  • Resim başlıkları oluşturma
  • Görme engelli kullanıcıların görsellerin içeriğini daha iyi anlamasına yardımcı olmak için alternatif metin (alt metin) oluşturma
  • Kullanıcıların resimleri aramasına veya düzenlemesine yardımcı olmak için oluşturulan açıklamaları meta veri olarak kullanma
  • Kullanıcı ekranına bakamadığında (ör. araç kullanırken veya podcast dinlerken) resimlerin kısa açıklamalarını kullanma

Temel özellikler

  • Giriş resmi için kısa bir açıklama döndürme

Örnek sonuçlar

Giriş Çıkış
Kaktüse benzeyen bir tasarıma sahip küçük, yeşil bir Android robot siyah bir yüzeyin üzerinde duruyor. Kaktüse benzeyen bir tasarıma sahip küçük, yeşil bir Android robot siyah bir yüzeyin üzerinde duruyor.
Siyah burunlu ve pembe dilli küçük, beyaz bir köpek, arka planda köprü bulunan çimenlik bir alanda koşuyor. Siyah burunlu ve pembe dilli küçük, beyaz bir köpek, arka planda köprü bulunan çimenlik bir alanda koşuyor.

Başlarken

GenAI Image Description API'yi kullanmaya başlamak için bu bağımlılığı projenizin derleme dosyasına ekleyin.

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

Görüntü Açıklaması API'sini uygulamanıza entegre etmek için bir ImageDescriber istemcisi edinerek başlarsınız. Ardından, gerekli cihaz üzerindeki model özelliklerinin durumunu kontrol etmeniz ve cihazda yoksa modeli indirmeniz gerekir. Görüntü girişinizi ImageDescriptionRequest olarak hazırladıktan sonra, görüntü açıklaması metnini almak için istemciyi kullanarak çıkarım işlemini çalıştırın ve son olarak, kaynakları serbest bırakmak için istemciyi kapatmayı unutmayın.

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

Desteklenen özellikler ve sınırlamalar

GenAI Image Description API, İngilizce'yi destekler. Gelecekte daha fazla dil için destek eklenecektir. API, resmin kısa bir açıklamasını döndürür.

Belirli özellik yapılandırmasının (ImageDescriberOptions ile belirtilir) kullanılabilirliği, ilgili cihazın yapılandırmasına ve cihaza indirilen modellere bağlı olarak değişiklik gösterebilir.

Geliştiricilerin, istenen ImageDescriberOptions özelliğine sahip bir cihazda istenen API özelliğinin desteklenip desteklenmediğini kontrol etmenin en güvenilir yolu checkFeatureStatus() yöntemini çağırmaktır. Bu yöntem, çalışma zamanında cihazda özellik kullanılabilirliğinin kesin durumunu sağlar.

Sık karşılaşılan kurulum sorunları

ML Kit GenAI API'leri, Gemini Nano'ya erişmek için Android AICore uygulamasından yararlanır. Bir cihaz yeni kurulduğunda (sıfırlama dahil) veya AICore uygulaması yeni sıfırlandığında (ör. veriler temizlenir, uygulama kaldırılır ve yeniden yüklenir), AICore uygulamasının ilklendirmeyi tamamlaması (sunucudan en son yapılandırmaların indirilmesi dahil) için yeterli zamanı olmayabilir. Sonuç olarak ML Kit GenAI API'leri beklendiği gibi çalışmayabilir. Karşılaşabileceğiniz yaygın kurulum hata mesajları ve bunların nasıl ele alınacağı aşağıda açıklanmıştır:

Örnek hata mesajı Nasıl ele alınır?
AICore, 4-CONNECTION_ERROR hata türü ve 601-BINDING_FAILURE hata koduyla başarısız oldu: AICore hizmeti bağlanamadı. Bu durum, uygulamayı cihaz kurulumundan hemen sonra ML Kit GenAI API'lerini kullanarak yüklediğinizde veya uygulamanız yüklendikten sonra AICore'un kaldırıldığı durumlarda ortaya çıkabilir. AICore uygulamasını güncelleyip uygulamanızı yeniden yüklediğinizde sorun düzelecektir.
AICore, 3-PREPARATION_ERROR hata türü ve 606-FEATURE_NOT_FOUND hata koduyla başarısız oldu: ... özelliği kullanılamıyor. Bu durum, AICore en son yapılandırmaları indirmeyi tamamlamadığında ortaya çıkabilir. Ağ bağlantısını koruyun ve birkaç dakika ila birkaç saat bekleyin.

Cihazın önyükleyicisinin kilidi açıksa bu hatayı da göreceğinizi unutmayın. Bu API, önyükleyicisinin kilidi açık cihazları desteklemez.
AICore, 1-DOWNLOAD_ERROR hata türü ve 0-UNKNOWN hata koduyla başarısız oldu: ... özelliği, 0 hata durumu ve esz hatasıyla başarısız oldu: UNAVAILABLE: Unable to resolve host ... Ağ bağlantısını koruyun, birkaç dakika bekleyip tekrar deneyin.