GenAI Image Description API

بااستفاده از «میانای برنامه‌سازی کاربردی شرح تصویر هوش مصنوعی زایا» در ML Kit می‌توانید شرح‌های محتوای کوتاه برای تصاویر تولید کنید. این کار در موارد استفاده زیر می‌تواند مفید باشد:

  • درحال تولید عنوان برای تصاویر
  • تولید کردن متن جایگزین (متن جایگزین) برای کمک به کاربران کم‌بینا در درک بهتر محتوای تصاویر
  • استفاده از توضیحات تولیدشده به‌عنوان فراداده برای کمک به کاربران در جستجو یا سازمان‌دهی تصاویر
  • استفاده از توضیحات کوتاه تصاویر زمانی که کاربر نمی‌تواند به صفحه‌نمایش خود نگاه کند، مثلاً وقتی درحال رانندگی است یا به پادکست گوش می‌دهد

قابلیت‌های کلیدی

  • شرح کوتاهی برای تصویر ورودی برگردانید

نتایج نمونه

ورودی برونداد
ربات Android کوچک و سبزرنگی با طراحی شبیه کاکتوس روی
             سطحی سیاه نشسته است. روبات Android کوچک و سبزرنگی با طراحی کاکتوس‌مانند روی سطحی سیاه نشسته است.
سگ سفید کوچکی با بینی سیاه و زبان صورتی در
                چمنزاری با پلی در پس‌زمینه می‌دود. سگ سفید کوچکی با بینی سیاه و زبان صورتی در چمنزاری با پلی در پس‌زمینه می‌دود.

شروع به کار

برای شروع کار با GenAI Image Description API، این وابستگی را به فایل ساخت پروژه خود اضافه کنید.

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

برای ادغام کردن «میانای برنامه‌سازی کاربردی شرح تصویر» در برنامه‌تان، ابتدا باید ImageDescriber مشتری دریافت کنید. سپس باید وضعیت ویژگی‌های مدل درون‌دستگاهی لازم را بررسی کنید و اگر مدل ازقبل در دستگاه وجود ندارد آن را بارگیری کنید. پس‌از آماده کردن ورودی تصویر در ImageDescriptionRequest، استنباط را بااستفاده از کارخواه اجرا می‌کنید تا نوشتار شرح تصویر را به‌دست آورید، و درنهایت، کارخواه را ببندید تا منابع آزاد شوند.

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

جاوا

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

ویژگی‌های پشتیبانی‌شده و محدودیت‌ها

‫GenAI Image Description API از زبان انگلیسی پشتیبانی می‌کند و در آینده از زبان‌های بیشتری پشتیبانی خواهد کرد. این «میانای برنامه‌سازی کاربردی» یک شرح کوتاه از تصویر برمی‌گرداند.

دردسترس بودن پیکربندی ویژگی خاص (مشخص‌شده توسط ImageDescriberOptions) ممکن است بسته به پیکربندی دستگاه خاص و مدل‌هایی که در دستگاه بارگیری شده‌اند متفاوت باشد.

مطمئن‌ترین راه برای توسعه‌دهندگان جهت اطمینان از اینکه ویژگی API موردنظر در دستگاهی با ImageDescriberOptions درخواستی پشتیبانی می‌شود، فراخوانی روش checkFeatureStatus() است. این روش وضعیت قطعی دردسترس بودن ویژگی در دستگاه را در زمان اجرا ارائه می‌دهد.

مشکلات رایج راه‌اندازی

«میاناهای برنامه‌سازی کاربردی GenAI در ML Kit» برای دسترسی به Gemini Nano به برنامه Android AICore متکی است. وقتی دستگاهی تازه راه‌اندازی شده باشد (ازجمله بازنشانی)، یا برنامه AICore تازه بازنشانی شده باشد (برای نمونه، پاک کردن داده‌ها، حذف نصب و سپس نصب مجدد)، ممکن است برنامه AICore زمان کافی برای تکمیل مقداردهی اولیه (ازجمله بارگیری جدیدترین پیکربندی‌ها از سرور) نداشته باشد. درنتیجه، ممکن است «میاناهای برنامه‌سازی کاربردی هوش مصنوعی زایا در ML Kit» عملکرد موردانتظار را نداشته باشند. در اینجا پیام‌های خطای رایج راه‌اندازی که ممکن است ببینید و نحوه رسیدگی به آن‌ها آورده شده است:

نمونه پیام خطا نحوه رسیدگی
‫AICore با خطای نوع ۴-CONNECTION_ERROR و کد خطای ۶۰۱-BINDING_FAILURE ناموفق بود: سرویس AICore پیوند نشد. این اتفاق ممکن است زمانی رخ دهد که برنامه را بااستفاده از ML Kit GenAI APIs بلافاصله پس‌از راه‌اندازی دستگاه نصب کنید یا زمانی که AICore پس‌از نصب برنامه شما حذف نصب شود. به‌روزرسانی برنامه AICore و سپس بازنصب کردن برنامه‌تان باید مشکل را برطرف کند.
‫AICore با خطای نوع ۳-PREPARATION_ERROR و کد خطای ۶۰۶-FEATURE_NOT_FOUND ناموفق بود: ویژگی ... دردسترس نیست. این اتفاق زمانی می‌افتد که AICore بارگیری جدیدترین پیکربندی‌ها را به‌پایان نرسانده باشد. وقتی دستگاه به اینترنت متصل باشد، معمولاً چند دقیقه تا چند ساعت طول می‌کشد تا به‌روز شود. بازراه‌اندازی دستگاه می‌تواند سرعت به‌روزرسانی را افزایش دهد.

توجه داشته باشید که اگر قفل bootloader دستگاه باز باشد، این خطا را نیز خواهید دید—این API از دستگاه‌های دارای bootloader باز پشتیبانی نمی‌کند.
‫AICore با خطای نوع ۱-DOWNLOAD_ERROR و کد خطای ۰-UNKNOWN ناموفق بود: ویژگی ... با وضعیت ناموفق ۰ و خطای esz: UNAVAILABLE ناموفق بود: میزبان ... شناسایی نشد اتصال شبکه را حفظ کنید، چند دقیقه صبر کنید و دوباره امتحان کنید.

کد نمونه