GenAI Image Description API

ML Kit-এর GenAI Image Description API-এর সাহায্যে, আপনি ছবির জন্য ছোট কন্টেন্ট বিবরণ তৈরি করতে পারবেন। নিম্নলিখিত ব্যবহারের ক্ষেত্রে এটি কাজে লাগতে পারে:

  • ছবির শীর্ষক তৈরি করা
  • দৃষ্টিশক্তি ক্ষীণ ব্যবহারকারীদের ছবি কন্টেন্ট আরও ভালোভাবে বোঝার ব্যাপারে সাহায্য করতে বিকল্প টেক্সট (অল্ট টেক্সট) তৈরি করা
  • ব্যবহারকারীদের ছবি সার্চ বা সাজাতে সাহায্য করার জন্য মেটাডেটা হিসেবে জেনারেট করা বিবরণ ব্যবহার করা
  • ব্যবহারকারী যখন স্ক্রিনের দিকে তাকাতে পারেন না, যেমন গাড়ি চালানোর সময় বা পডকাস্ট শোনার সময়, তখন ছবির সংক্ষিপ্ত বিবরণ ব্যবহার করা

গুরুত্বপূর্ণ ক্ষমতা

  • ইনপুট ছবির জন্য সংক্ষিপ্ত বিবরণ দাও

ফলাফলের উদাহরণ

ইনপুট আউটপুট
ক্যাকটাসের মতো ডিজাইন করা একটি ছোট, সবুজ Android রোবট কালো সারফেসের
             উপর বসে আছে। ক্যাকটাসের মতো ডিজাইন সহ একটি ছোট, সবুজ Android রোবট একটি কালো সারফেসে বসে আছে।
কালো নাক ও গোলাপি জিভ সহ একটি ছোট, সাদা কুকুর
                ঘাসের মাঠের উপর দিয়ে দৌড়াচ্ছে এবং ব্যাকগ্রাউন্ডে একটি ব্রিজ দেখা যাচ্ছে। কালো নাক ও গোলাপি জিভযুক্ত একটি ছোট সাদা কুকুর ঘাসে ঢাকা মাঠের উপর দিয়ে দৌড়াচ্ছে, ব্যাকগ্রাউন্ডে একটি ব্রিজ দেখা যাচ্ছে।

শুরু করা

GenAI Image Description API ব্যবহার করা শুরু করতে, আপনার প্রোজেক্টের বিল্ড ফাইলে এই ডিপেন্ডেন্সি যোগ করুন।

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

আপনার অ্যাপে Image Description API ইন্টিগ্রেট করতে, আপনাকে প্রথমে একটি 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()

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

কাজ করে এমন ফিচার ও সীমাবদ্ধতা

GenAI ইমেজ বিবরণ API ইংরেজিতে কাজ করে এবং ভবিষ্যতে আরও ভাষায় কাজ করবে। API, ছবির একটি সংক্ষিপ্ত বিবরণ রিটার্ন করে।

নির্দিষ্ট ফিচার কনফিগারেশনের (যা ImageDescriberOptions দ্বারা নির্দিষ্ট করা হয়েছে) উপলভ্যতা নির্দিষ্ট ডিভাইসের কনফিগারেশন এবং ডিভাইসে ডাউনলোড করা মডেলের উপর নির্ভর করে আলাদা হতে পারে।

অনুরোধ করা ImageDescriberOptions সহ কোনও ডিভাইসে কাঙ্ক্ষিত API ফিচার কাজ করে কিনা তা নিশ্চিত করার জন্য ডেভেলপারদের কাছে সবচেয়ে নির্ভরযোগ্য উপায় হল checkFeatureStatus() পদ্ধতি কল করা। এই পদ্ধতি রানটাইমে ডিভাইসে ফিচারের উপলভ্যতা সম্পর্কে নিশ্চিত তথ্য প্রদান করে।

সেট-আপ সংক্রান্ত সাধারণ সমস্যা

Gemini Nano অ্যাক্সেস করার জন্য ML Kit GenAI API, Android AICore অ্যাপের উপর নির্ভর করে। কোনও ডিভাইস সেট-আপ (রিসেট সহ) করা হলে অথবা AICore অ্যাপ রিসেট (যেমন, ডেটা মুছে দেওয়া, আনইনস্টল করে আবার ইনস্টল করা) করা হলে, AICore অ্যাপের কাছে ইনিশিয়ালাইজেশন (সার্ভার থেকে লেটেস্ট কনফিগারেশন ডাউনলোড করা সহ) সম্পূর্ণ করার জন্য পর্যাপ্ত সময় নাও থাকতে পারে। এর ফলে, ML Kit GenAI API প্রত্যাশা অনুযায়ী কাজ নাও করতে পারে। সেট-আপ করার সময় আপনি যেসব সাধারণ সমস্যার মেসেজ দেখতে পেতে পারেন এবং সেগুলি কীভাবে সমাধান করবেন তা এখানে দেওয়া হল:

সমস্যার মেসেজের উদাহরণ কীভাবে ম্যানেজ করবেন
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-UNKNOWN: ফিচার ... কাজ করেনি, স্ট্যাটাস 0 এবং সমস্যার esz: UNAVAILABLE: হোস্ট ... সমাধান করা যায়নি নেটওয়ার্ক কানেকশন চালু রেখে কয়েক মিনিট অপেক্ষা করে আবার চেষ্টা করুন।

নমুনা কোড