এমএল কিট-এর জেনএআই ইমেজ ডেসক্রিপশন এপিআই (GenAI Image Description API) ব্যবহার করে আপনি ছবির জন্য সংক্ষিপ্ত বিবরণ তৈরি করতে পারেন। এটি নিম্নলিখিত ক্ষেত্রগুলিতে কার্যকর হতে পারে:
- ছবির শিরোনাম তৈরি করা
- দৃষ্টি প্রতিবন্ধী ব্যবহারকারীদের ছবির বিষয়বস্তু আরও ভালোভাবে বুঝতে সাহায্য করার জন্য বিকল্প পাঠ্য (alt text) তৈরি করা।
- ব্যবহারকারীদের ছবি অনুসন্ধান বা সংগঠিত করতে সাহায্য করার জন্য মেটাডেটা হিসাবে তৈরি করা বিবরণ ব্যবহার করা।
- যখন ব্যবহারকারী তার স্ক্রিনের দিকে তাকাতে পারেন না, যেমন গাড়ি চালানোর সময় বা পডকাস্ট শোনার সময়, তখন ছবিগুলোর সংক্ষিপ্ত বিবরণ ব্যবহার করা।
মূল সক্ষমতা
- ইনপুট ছবির জন্য একটি সংক্ষিপ্ত বিবরণ ফেরত দিন
উদাহরণ ফলাফল
| ইনপুট | আউটপুট |
![]() | ক্যাকটাসের মতো নকশার একটি ছোট সবুজ অ্যান্ড্রয়েড রোবট একটি কালো পৃষ্ঠের উপর বসে আছে। |
![]() | কালো নাক ও গোলাপি জিভওয়ালা একটি ছোট সাদা কুকুর ঘাসভরা মাঠের ওপর দিয়ে দৌড়ে যাচ্ছে, পেছনে একটি সেতু দেখা যাচ্ছে। |
শুরু করা
GenAI ইমেজ ডেসক্রিপশন 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 ইমেজ ডেসক্রিপশন এপিআই ইংরেজি ভাষা সমর্থন করে এবং ভবিষ্যতে আরও ভাষা যুক্ত করা হবে। এই এপিআই ছবিটির একটি সংক্ষিপ্ত বিবরণ প্রদান করে।
নির্দিষ্ট ফিচার কনফিগারেশনের ( ImageDescriberOptions দ্বারা নির্ধারিত) প্রাপ্যতা, নির্দিষ্ট ডিভাইসের কনফিগারেশন এবং ডিভাইসে ডাউনলোড করা মডেলগুলোর উপর নির্ভর করে পরিবর্তিত হতে পারে।
ডেভেলপারদের জন্য, অনুরোধ করা ImageDescriberOptions সহ কোনো ডিভাইসে উদ্দিষ্ট API ফিচারটি সমর্থিত কিনা তা নিশ্চিত করার সবচেয়ে নির্ভরযোগ্য উপায় হলো checkFeatureStatus() মেথডটি কল করা। এই মেথডটি রানটাইমে ডিভাইসে ফিচারটির উপলব্ধতার চূড়ান্ত অবস্থা প্রদান করে।
সাধারণ সেটআপ সমস্যা
এমএল কিট জেনএআই এপিআই (ML Kit GenAI APIs) জেমিনি ন্যানো (Gemini Nano) অ্যাক্সেস করার জন্য অ্যান্ড্রয়েড এআইকোর (Android AICore) অ্যাপের উপর নির্ভর করে। যখন কোনো ডিভাইস সবেমাত্র সেটআপ করা হয় (রিসেট সহ), অথবা এআইকোর অ্যাপটি সবেমাত্র রিসেট করা হয় (যেমন ডেটা মুছে ফেলা, আনইনস্টল করে আবার ইনস্টল করা), তখন এআইকোর অ্যাপটি ইনিশিয়ালাইজেশন (সার্ভার থেকে সর্বশেষ কনফিগারেশন ডাউনলোড করা সহ) শেষ করার জন্য যথেষ্ট সময় নাও পেতে পারে। এর ফলে, এমএল কিট জেনএআই এপিআইগুলো প্রত্যাশিতভাবে কাজ নাও করতে পারে। নিচে সাধারণ কিছু সেটআপ ত্রুটির বার্তা এবং সেগুলো কীভাবে সমাধান করবেন তা দেওয়া হলো:
| ত্রুটির বার্তার উদাহরণ | কীভাবে সামলাতে হবে |
| AICore ৪-CONNECTION_ERROR এরর টাইপ এবং ৬০১-BINDING_FAILURE এরর কোড সহ ব্যর্থ হয়েছে: AICore সার্ভিস বাইন্ড করতে ব্যর্থ হয়েছে। | ডিভাইস সেটআপের ঠিক পরেই ML Kit GenAI API ব্যবহার করে অ্যাপটি ইনস্টল করলে, অথবা আপনার অ্যাপটি ইনস্টল করার পর AICore আনইনস্টল করা হলে এমনটা হতে পারে। AICore অ্যাপটি আপডেট করে তারপর আপনার অ্যাপটি পুনরায় ইনস্টল করলে সমস্যাটির সমাধান হয়ে যাবে। |
| AICore ৩-PREPARATION_ERROR এরর টাইপ এবং ৬০৬-FEATURE_NOT_FOUND এরর কোড সহ ব্যর্থ হয়েছে: ফিচার ... উপলব্ধ নয়। | AICore সর্বশেষ কনফিগারেশনগুলো ডাউনলোড করা শেষ না করলে এমনটা হতে পারে। ডিভাইসটি ইন্টারনেটের সাথে সংযুক্ত থাকলে, আপডেট হতে সাধারণত কয়েক মিনিট থেকে কয়েক ঘণ্টা সময় লাগে। ডিভাইসটি রিস্টার্ট করলে আপডেটটি দ্রুত হতে পারে। মনে রাখবেন যে, যদি ডিভাইসটির বুটলোডার আনলক করা থাকে, তাহলে আপনি এই ত্রুটিটিও দেখতে পাবেন—এই API আনলক করা বুটলোডারযুক্ত ডিভাইস সমর্থন করে না। |
| AICore ১-ডাউনলোড_এরর (1-DOWNLOAD_ERROR) এরর টাইপ এবং ০-আননোন (0-UNKNOWN) এরর কোড সহ ব্যর্থ হয়েছে: ফিচার ... ফেইলর স্ট্যাটাস ০ (0) এবং esz: আনঅ্যাভেইলেবল (UNAVAILABLE) এরর সহ ব্যর্থ হয়েছে: হোস্ট ... রিজলভ করতে অক্ষম। | নেটওয়ার্ক সংযোগ চালু রাখুন, কয়েক মিনিট অপেক্ষা করুন এবং আবার চেষ্টা করুন। |

