GenAI Image Description API

ML Kit'in üretken yapay zeka destekli resim açıklaması API'si ile resimler için kısa içerik açıklamaları oluşturabilirsiniz. Bu özellik aşağıdaki kullanım alanlarında faydalı olabilir:

  • Resim başlıkları oluşturma
  • Görme engelli kullanıcıların resimlerin içeriğini daha iyi anlamasına yardımcı olmak için alternatif metin oluşturma
  • Kullanıcıların resim arama veya düzenleme işlemlerine yardımcı olmak için oluşturulan açıklamaları meta veri olarak kullanma
  • Kullanıcı ekranına bakamadığında (ör. araba 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ürür.

Örnek sonuçlar

Giriş Çıkış
Kaktüs benzeri bir tasarıma sahip küçük, yeşil bir Android robot, siyah bir yüzeyin üzerinde duruyor. Kaktüs benzeri 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

Üretken Yapay Zeka Görüntü Açıklaması API'sini 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çıklama API'sini uygulamanıza entegre etmek için ImageDescriber istemcisi edinerek başlayacaksınız. Ardından, gerekli cihaz üzerinde model özelliklerinin durumunu kontrol etmeniz ve cihazda henüz yoksa modeli indirmeniz gerekir. Resim girişinizi ImageDescriptionRequest biçiminde hazırladıktan sonra, istemciyi kullanarak çıkarım işlemini çalıştırıp resim açıklaması metnini elde edin. 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

Üretken Yapay Zeka Görüntü Açıklaması API'si İngilizceyi desteklemektedir. 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, cihazın yapılandırmasına ve cihaza indirilen modellere bağlı olarak değişebilir.

Geliştiricilerin, amaçlanan API özelliğinin istenen ImageDescriberOptions ile bir cihazda desteklendiğinden emin olmasının en güvenilir yolu checkFeatureStatus() yöntemini çağırmaktır. Bu yöntem, çalışma zamanında cihazdaki özellik kullanılabilirliğiyle ilgili kesin durumu sağlar.

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

ML Kit üretken yapay zeka API'leri, Gemini Nano'ya erişmek için Android AICore uygulamasına bağlıdır. Bir cihaz yeni kurulduğunda (sıfırlama dahil) veya AICore uygulaması yeni sıfırlandığında (ör. veriler temizlendiğinde, uygulama kaldırılıp yeniden yüklendiğinde) AICore uygulaması başlatma işlemini (sunucudan en son yapılandırmaları indirme dahil) tamamlamak için yeterli zamana sahip olmayabilir. Bu nedenle, 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ı Ne yapmalı?
AICore, 4-CONNECTION_ERROR hata türü ve 601-BINDING_FAILURE hata koduyla başarısız oldu: AICore hizmeti bağlanamadı. Bu durum, cihaz kurulumundan hemen sonra ML Kit GenAI API'lerini kullanarak uygulamayı yüklediğinizde veya uygulamanız yüklendikten sonra AICore kaldırıldığında ortaya çıkabilir. AICore uygulamasını güncelleyip uygulamanızı yeniden yüklediğinizde sorun düzelir.
AICore, 3-PREPARATION_ERROR hata türü ve 606-FEATURE_NOT_FOUND hata koduyla başarısız oldu: Özellik ... kullanılamıyor. Bu durum, AICore en son yapılandırmaları indirmeyi tamamlamadığında meydana gelebilir. Cihaz internete bağlandığında güncelleme işlemi genellikle birkaç dakika ile birkaç saat arasında sürer. Cihazı yeniden başlatmak güncellemeyi hızlandırabilir.

Cihazın önyükleyicisi kilidi açılmışsa bu hatayı da görürsünüz. Bu API, önyükleyicisi kilidi açılmış cihazları desteklemez.
AICore, 1-DOWNLOAD_ERROR hata türü ve 0-UNKNOWN hata koduyla başarısız oldu: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... Ağ bağlantısını koruyun, birkaç dakika bekleyin ve tekrar deneyin.