GenAI Image Description API

با استفاده از رابط برنامه‌نویسی کاربردی (API) توصیف تصویر GenAI در ML Kit، می‌توانید توضیحات محتوای کوتاهی برای تصاویر ایجاد کنید. این قابلیت می‌تواند در موارد زیر مفید باشد:

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

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

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

نتایج مثال

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

شروع به کار

برای شروع کار با 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();

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

رابط برنامه‌نویسی کاربردی (API) توصیف تصویر GenAI از زبان انگلیسی پشتیبانی می‌کند و در آینده زبان‌های بیشتری نیز به آن اضافه خواهند شد. این رابط برنامه‌نویسی یک توضیح کوتاه از تصویر را برمی‌گرداند.

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

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

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

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

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

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

کد نمونه