GenAI Image Description API

با استفاده از GenAI Image Description API کیت ML، می توانید توضیحات محتوای کوتاهی را برای تصاویر ایجاد کنید. این می تواند در موارد استفاده زیر مفید باشد:

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

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

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

نتایج نمونه

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

شروع به کار

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

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

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

کاتلین

// 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 از زبان انگلیسی پشتیبانی می‌کند و از زبان‌های بیشتری که در آینده اضافه خواهند شد، پشتیبانی می‌کند. API یک توضیح کوتاه از تصویر را برمی گرداند.

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

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

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

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

نمونه پیام خطا نحوه رسیدگی
AICore با نوع خطای 4-CONNECTION_ERROR و کد خطای 601-BINDING_FAILURE ناموفق بود: سرویس AICore متصل نشد. این ممکن است زمانی اتفاق بیفتد که برنامه را با استفاده از ML Kit GenAI API بلافاصله پس از راه‌اندازی دستگاه نصب کنید یا زمانی که AICore پس از نصب برنامه شما حذف نصب شود. به روز رسانی برنامه AICore و سپس نصب مجدد برنامه باید آن را برطرف کند.
AICore با نوع خطای 3-PREPARATION_ERROR و کد خطا 606-FEATURE_NOT_FOUND ناموفق بود: ویژگی ... در دسترس نیست. این ممکن است زمانی اتفاق بیفتد که AICore دانلود آخرین تنظیمات را تمام نکرده باشد. اتصال شبکه را حفظ کنید و چند دقیقه تا چند ساعت صبر کنید.

توجه داشته باشید که اگر بوت لودر دستگاه باز باشد، این خطا را نیز مشاهده خواهید کرد—این API از دستگاه هایی با بوت لودر قفل نشده پشتیبانی نمی کند.
AICore با خطای نوع 1-DOWNLOAD_ERROR و کد خطا 0-ناشناخته ناموفق بود: ویژگی ... با وضعیت خرابی 0 ناموفق بود و خطا esz: غیرقابل دسترس: قادر به رفع میزبان نیست ... اتصال شبکه را حفظ کنید، چند دقیقه صبر کنید و دوباره امتحان کنید.